@wisewandtools/mcp-server 2.0.13 → 2.0.15
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/index.d.ts +0 -1
- package/dist/index.js +1 -228
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/config/index.ts","../src/utils/logger.ts","../src/server/WisewandMCPServer.ts","../src/clients/WisewandAPIClient.ts","../src/services/CacheManager.ts","../src/services/RateLimiter.ts","../src/monitoring/MetricsCollector.ts","../src/monitoring/HealthChecker.ts","../src/handlers/tools/ArticleToolHandler.ts","../src/handlers/tools/ProjectToolHandler.ts","../src/handlers/tools/PublishingToolHandler.ts","../src/handlers/tools/PersonaToolHandler.ts","../src/handlers/tools/BulkOperationsToolHandler.ts","../src/handlers/tools/ConnectionsToolHandler.ts","../src/handlers/tools/UtilityToolHandler.ts","../src/handlers/tools/CategoryPagesToolHandler.ts","../src/handlers/tools/ProductPagesToolHandler.ts","../src/handlers/tools/DiscoverToolHandler.ts","../src/handlers/tools/RSSToolHandler.ts","../src/handlers/tools/UpdatePostsToolHandler.ts","../src/handlers/tools/TransactionsToolHandler.ts","../src/handlers/tools/JobsToolHandler.ts","../src/handlers/resources/ResourceHandler.ts","../src/handlers/prompts/PromptHandler.ts","../src/utils/shutdown.ts"],"sourcesContent":["/**\n * Wisewand MCP Server\n * Production-ready Model Context Protocol server for Wisewand API\n */\n\n// import { Server } from '@modelcontextprotocol/sdk/server/index';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { config } from './config/index';\nimport { logger, logCriticalError } from './utils/logger';\nimport { WisewandMCPServer } from './server/WisewandMCPServer';\nimport { gracefulShutdown } from './utils/shutdown';\n\nasync function main() {\n try {\n logger.info('Starting Wisewand MCP Server', {\n version: process.env.npm_package_version,\n environment: config.environment,\n nodeVersion: process.version\n });\n\n // Create and initialize server\n const server = new WisewandMCPServer(config);\n\n // Validate API connectivity before starting\n logger.info('Testing API connectivity...');\n try {\n const apiHealth = await server.testAPIConnection();\n if (!apiHealth.ok) {\n console.error('❌ FATAL: Cannot connect to Wisewand API');\n console.error(` Reason: ${apiHealth.error}`);\n console.error(' Check your WISEWAND_API_KEY and network connection');\n console.error(' Get your API key from: https://app.wisewand.ai/api');\n process.exit(1);\n }\n logger.info('✓ API connectivity verified');\n } catch (error: any) {\n console.error('❌ FATAL: Failed to validate API connection');\n console.error(` Error: ${error.message}`);\n console.error(' Check your WISEWAND_API_KEY and network connection');\n process.exit(1);\n }\n\n // Set up transport based on environment\n const transport = new StdioServerTransport();\n\n // Connect and start\n await server.connect(transport);\n \n logger.info('Wisewand MCP Server started successfully', {\n tools: server.getToolCount(),\n resources: server.getResourceCount(),\n prompts: server.getPromptCount()\n });\n\n // Set up graceful shutdown\n gracefulShutdown(server);\n \n } catch (error: any) {\n logCriticalError('Failed to start Wisewand MCP Server', error);\n process.exit(1);\n }\n}\n\n// Handle uncaught errors\nprocess.on('uncaughtException', (error) => {\n logCriticalError('Uncaught Exception', error);\n process.exit(1);\n});\n\nprocess.on('unhandledRejection', (reason: any) => {\n logCriticalError('Unhandled Rejection', reason);\n process.exit(1);\n});\n\n// Start the server\nmain();\n\nexport { WisewandMCPServer };","/**\n * Configuration management with validation\n */\n\nimport { z } from 'zod';\nimport dotenv from 'dotenv';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\n\n// Load environment variables\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Load .env file if it exists (optional for npx installations)\nconst envPath = join(__dirname, '../../.env');\nconst result = dotenv.config({ path: envPath });\nif (result.error && (result.error as any).code !== 'ENOENT') {\n // Only warn if error is NOT \"file not found\"\n console.warn('Warning: .env file could not be loaded:', result.error.message);\n}\n\n// Configuration schema\nconst ConfigSchema = z.object({\n // Environment\n environment: z.enum(['development', 'staging', 'production']).default('production'),\n \n // Wisewand API\n wisewand: z.object({\n apiKey: z.string().min(1, 'WISEWAND_API_KEY is required'),\n apiUrl: z.string().url().default('https://api.wisewand.ai'),\n timeout: z.number().default(30000),\n retryAttempts: z.number().default(3),\n retryDelay: z.number().default(1000)\n }),\n \n // Server\n server: z.object({\n port: z.number().default(3000),\n host: z.string().default('0.0.0.0'),\n logLevel: z.enum(['error', 'warn', 'info', 'debug']).default('info')\n }),\n \n // Redis (optional)\n redis: z.object({\n enabled: z.boolean().default(false),\n host: z.string().default('localhost'),\n port: z.number().default(6379),\n password: z.string().optional(),\n tls: z.boolean().default(false),\n db: z.number().default(0),\n keyPrefix: z.string().default('wisewand:mcp:')\n }).optional(),\n \n // Security\n security: z.object({\n enableRateLimiting: z.boolean().default(true),\n maxRequestsPerMinute: z.number().default(60),\n enableRequestValidation: z.boolean().default(true),\n trustedOrigins: z.array(z.string()).default([]),\n enableApiKeyRotation: z.boolean().default(false),\n apiKeyRotationInterval: z.number().default(86400000) // 24 hours\n }),\n \n // Cache\n cache: z.object({\n enabled: z.boolean().default(true),\n ttlSeconds: z.number().default(300),\n maxSizeMB: z.number().default(100),\n strategy: z.enum(['memory', 'redis', 'hybrid']).default('memory')\n }),\n \n // Monitoring\n monitoring: z.object({\n enableMetrics: z.boolean().default(true),\n metricsPort: z.number().default(9090),\n enableTracing: z.boolean().default(false),\n tracingEndpoint: z.string().optional(),\n enableHealthCheck: z.boolean().default(true),\n healthCheckInterval: z.number().default(30000)\n }),\n \n // Features\n features: z.object({\n enableBulkOperations: z.boolean().default(true),\n enableWebhooks: z.boolean().default(true),\n enableWordPress: z.boolean().default(true),\n enableRSSAutomation: z.boolean().default(true),\n enableContentDiscovery: z.boolean().default(true),\n maxBulkSize: z.number().default(100),\n maxConcurrentGenerations: z.number().default(5)\n })\n});\n\n// Parse and validate configuration\nconst parseConfig = () => {\n // Validate API key format before parsing full config\n const apiKey = process.env.WISEWAND_API_KEY;\n if (!apiKey) {\n console.error('❌ FATAL: WISEWAND_API_KEY environment variable not set');\n console.error(' Get your API key from: https://app.wisewand.ai/api');\n process.exit(1);\n }\n if (!apiKey.startsWith('sk_live_') && !apiKey.startsWith('sk_test_')) {\n console.error('❌ FATAL: WISEWAND_API_KEY has invalid format');\n console.error(' Expected: sk_live_... or sk_test_...');\n console.error(` Got: ${apiKey.substring(0, 10)}...`);\n console.error(' Get your API key from: https://app.wisewand.ai/api');\n process.exit(1);\n }\n\n try {\n const config = ConfigSchema.parse({\n environment: process.env.NODE_ENV,\n \n wisewand: {\n apiKey: process.env.WISEWAND_API_KEY,\n apiUrl: process.env.WISEWAND_API_URL,\n timeout: process.env.WISEWAND_TIMEOUT ? parseInt(process.env.WISEWAND_TIMEOUT) : undefined,\n retryAttempts: process.env.WISEWAND_RETRY_ATTEMPTS ? parseInt(process.env.WISEWAND_RETRY_ATTEMPTS) : undefined,\n retryDelay: process.env.WISEWAND_RETRY_DELAY ? parseInt(process.env.WISEWAND_RETRY_DELAY) : undefined\n },\n \n server: {\n port: process.env.PORT ? parseInt(process.env.PORT) : undefined,\n host: process.env.HOST,\n logLevel: process.env.LOG_LEVEL as any\n },\n \n redis: process.env.REDIS_HOST ? {\n enabled: true,\n host: process.env.REDIS_HOST,\n port: process.env.REDIS_PORT ? parseInt(process.env.REDIS_PORT) : undefined,\n password: process.env.REDIS_PASSWORD,\n tls: process.env.REDIS_TLS === 'true',\n db: process.env.REDIS_DB ? parseInt(process.env.REDIS_DB) : undefined,\n keyPrefix: process.env.REDIS_KEY_PREFIX\n } : undefined,\n \n security: {\n enableRateLimiting: process.env.ENABLE_RATE_LIMITING !== 'false',\n maxRequestsPerMinute: process.env.MAX_REQUESTS_PER_MINUTE ? \n parseInt(process.env.MAX_REQUESTS_PER_MINUTE) : undefined,\n enableRequestValidation: process.env.ENABLE_REQUEST_VALIDATION !== 'false',\n trustedOrigins: process.env.TRUSTED_ORIGINS?.split(',') || [],\n enableApiKeyRotation: process.env.ENABLE_API_KEY_ROTATION === 'true',\n apiKeyRotationInterval: process.env.API_KEY_ROTATION_INTERVAL ? \n parseInt(process.env.API_KEY_ROTATION_INTERVAL) : undefined\n },\n \n cache: {\n enabled: process.env.ENABLE_CACHE !== 'false',\n ttlSeconds: process.env.CACHE_TTL_SECONDS ? \n parseInt(process.env.CACHE_TTL_SECONDS) : undefined,\n maxSizeMB: process.env.MAX_CACHE_SIZE_MB ? \n parseInt(process.env.MAX_CACHE_SIZE_MB) : undefined,\n strategy: process.env.CACHE_STRATEGY as any\n },\n \n monitoring: {\n enableMetrics: process.env.ENABLE_METRICS !== 'false',\n metricsPort: process.env.METRICS_PORT ? \n parseInt(process.env.METRICS_PORT) : undefined,\n enableTracing: process.env.ENABLE_TRACING === 'true',\n tracingEndpoint: process.env.TRACING_ENDPOINT,\n enableHealthCheck: process.env.ENABLE_HEALTH_CHECK !== 'false',\n healthCheckInterval: process.env.HEALTH_CHECK_INTERVAL ? \n parseInt(process.env.HEALTH_CHECK_INTERVAL) : undefined\n },\n \n features: {\n enableBulkOperations: process.env.ENABLE_BULK_OPERATIONS !== 'false',\n enableWebhooks: process.env.ENABLE_WEBHOOKS !== 'false',\n enableWordPress: process.env.ENABLE_WORDPRESS !== 'false',\n enableRSSAutomation: process.env.ENABLE_RSS_AUTOMATION !== 'false',\n enableContentDiscovery: process.env.ENABLE_CONTENT_DISCOVERY !== 'false',\n maxBulkSize: process.env.MAX_BULK_SIZE ? \n parseInt(process.env.MAX_BULK_SIZE) : undefined,\n maxConcurrentGenerations: process.env.MAX_CONCURRENT_GENERATIONS ? \n parseInt(process.env.MAX_CONCURRENT_GENERATIONS) : undefined\n }\n });\n \n return config;\n } catch (error) {\n if (error instanceof z.ZodError) {\n console.error('Configuration validation failed:');\n error.errors.forEach(err => {\n console.error(` - ${err.path.join('.')}: ${err.message}`);\n });\n process.exit(1);\n }\n throw error;\n }\n};\n\nexport const config = parseConfig();\nexport type Config = z.infer<typeof ConfigSchema>;","/**\n * Logger configuration\n */\n\nimport winston from 'winston';\nimport { config } from '../config/index';\n\n// Detect if running as MCP server (stdio transport)\nconst isMCPServer = !process.stdout.isTTY || process.env.MCP_MODE === 'stdio';\n\nconst logFormat = winston.format.combine(\n winston.format.timestamp({\n format: 'YYYY-MM-DD HH:mm:ss'\n }),\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n winston.format.json()\n);\n\nconst consoleFormat = winston.format.combine(\n winston.format.colorize(),\n winston.format.timestamp({\n format: 'HH:mm:ss'\n }),\n winston.format.printf(({ timestamp, level, message, ...meta }) => {\n const metaStr = Object.keys(meta).length ? JSON.stringify(meta, null, 2) : '';\n return `${timestamp} ${level}: ${message} ${metaStr}`;\n })\n);\n\n// Configure transports based on environment\nconst transports: winston.transport[] = [];\n\n// Only add console transport if NOT running as MCP server\nif (!isMCPServer) {\n transports.push(\n new winston.transports.Console({\n format: config.environment === 'development' ? consoleFormat : logFormat,\n silent: process.env.NODE_ENV === 'test'\n })\n );\n}\n\n// Always log to stderr when in MCP mode (for debugging)\nif (isMCPServer && config.environment === 'development') {\n transports.push(\n new winston.transports.Stream({\n stream: process.stderr,\n format: winston.format.simple()\n })\n );\n}\n\nexport const logger = winston.createLogger({\n level: config.server.logLevel,\n format: logFormat,\n defaultMeta: { \n service: 'wisewand-mcp',\n environment: config.environment \n },\n transports,\n silent: isMCPServer && config.environment === 'production'\n});\n\n// Production file logging\nif (config.environment === 'production' && !isMCPServer) {\n logger.add(new winston.transports.File({\n filename: 'logs/error.log',\n level: 'error',\n maxsize: 5242880, // 5MB\n maxFiles: 5\n }));\n \n logger.add(new winston.transports.File({\n filename: 'logs/combined.log',\n maxsize: 5242880, // 5MB\n maxFiles: 5\n }));\n}\n\n// Error handling\nlogger.on('error', (error) => {\n if (!isMCPServer) {\n console.error('Logger error:', error);\n }\n});\n\n/**\n * Log critical errors that must always be visible to the user\n * This bypasses Winston's silent mode and writes directly to stderr\n * Use this for startup failures, configuration errors, and fatal issues\n */\nexport function logCriticalError(message: string, error?: any): void {\n // Always write to stderr, even when logger is silent\n console.error(`[CRITICAL] ${message}`);\n if (error) {\n if (error.message) console.error(` Error: ${error.message}`);\n if (error.stack) console.error(error.stack);\n }\n}","/**\n * Main MCP Server implementation\n */\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport {\n CallToolRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n ListPromptsRequestSchema,\n GetPromptRequestSchema,\n ListToolsRequestSchema,\n ServerCapabilities\n} from '@modelcontextprotocol/sdk/types.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\nimport { Config } from '../config/index';\nimport { logger } from '../utils/logger';\nimport { WisewandAPIClient } from '../clients/WisewandAPIClient';\nimport { CacheManager } from '../services/CacheManager';\nimport { RateLimiter } from '../services/RateLimiter';\nimport { MetricsCollector } from '../monitoring/MetricsCollector';\nimport { HealthChecker } from '../monitoring/HealthChecker';\n\n// Tool Handlers\nimport { ArticleToolHandler } from '../handlers/tools/ArticleToolHandler';\nimport { ProjectToolHandler } from '../handlers/tools/ProjectToolHandler';\nimport { PublishingToolHandler } from '../handlers/tools/PublishingToolHandler';\nimport { PersonaToolHandler } from '../handlers/tools/PersonaToolHandler';\nimport { BulkOperationsToolHandler } from '../handlers/tools/BulkOperationsToolHandler';\nimport { ConnectionsToolHandler } from '../handlers/tools/ConnectionsToolHandler';\nimport { UtilityToolHandler } from '../handlers/tools/UtilityToolHandler';\nimport { CategoryPagesToolHandler } from '../handlers/tools/CategoryPagesToolHandler';\nimport { ProductPagesToolHandler } from '../handlers/tools/ProductPagesToolHandler';\nimport { DiscoverToolHandler } from '../handlers/tools/DiscoverToolHandler';\nimport { RSSToolHandler } from '../handlers/tools/RSSToolHandler';\nimport { UpdatePostsToolHandler } from '../handlers/tools/UpdatePostsToolHandler';\nimport { TransactionsToolHandler } from '../handlers/tools/TransactionsToolHandler';\nimport { JobsToolHandler } from '../handlers/tools/JobsToolHandler';\n\n// Resource Handlers\nimport { ResourceHandler } from '../handlers/resources/ResourceHandler';\n\n// Prompt Handlers\nimport { PromptHandler } from '../handlers/prompts/PromptHandler';\n\nexport class WisewandMCPServer {\n private server: Server;\n private apiClient: WisewandAPIClient;\n private cacheManager: CacheManager;\n private rateLimiter: RateLimiter;\n private metrics: MetricsCollector;\n private healthChecker: HealthChecker;\n\n // Handlers\n private articleHandler: ArticleToolHandler;\n private projectHandler: ProjectToolHandler;\n private publishingHandler: PublishingToolHandler;\n private personaHandler: PersonaToolHandler;\n private bulkHandler: BulkOperationsToolHandler;\n private connectionsHandler: ConnectionsToolHandler;\n private utilityHandler: UtilityToolHandler;\n private categoryPagesHandler: CategoryPagesToolHandler;\n private productPagesHandler: ProductPagesToolHandler;\n private discoverHandler: DiscoverToolHandler;\n private rssHandler: RSSToolHandler;\n private updatePostsHandler: UpdatePostsToolHandler;\n private transactionsHandler: TransactionsToolHandler;\n private jobsHandler: JobsToolHandler;\n private resourceHandler: ResourceHandler;\n private promptHandler: PromptHandler;\n\n constructor(private config: Config) {\n // Initialize server with capabilities\n const capabilities: ServerCapabilities = {\n tools: {},\n resources: {},\n prompts: {}\n };\n\n this.server = new Server(\n {\n name: 'wisewand-mcp',\n version: '1.0.0'\n },\n {\n capabilities\n }\n );\n\n // Initialize services\n this.apiClient = new WisewandAPIClient(config.wisewand);\n this.cacheManager = new CacheManager(config.cache);\n this.rateLimiter = new RateLimiter(config.security);\n this.metrics = new MetricsCollector();\n this.healthChecker = new HealthChecker(this.apiClient, this.cacheManager);\n\n // Initialize handlers\n this.articleHandler = new ArticleToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.projectHandler = new ProjectToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.publishingHandler = new PublishingToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.personaHandler = new PersonaToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.bulkHandler = new BulkOperationsToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.connectionsHandler = new ConnectionsToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.utilityHandler = new UtilityToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.categoryPagesHandler = new CategoryPagesToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.productPagesHandler = new ProductPagesToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.discoverHandler = new DiscoverToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.rssHandler = new RSSToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.updatePostsHandler = new UpdatePostsToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.transactionsHandler = new TransactionsToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.jobsHandler = new JobsToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.resourceHandler = new ResourceHandler(this.apiClient, this.cacheManager);\n this.promptHandler = new PromptHandler();\n\n // Register all handlers\n this.registerHandlers();\n\n logger.info('WisewandMCPServer initialized', {\n toolsRegistered: this.getToolCount(),\n resourcesRegistered: this.getResourceCount(),\n promptsRegistered: this.getPromptCount()\n });\n }\n\n private getAllTools() {\n return [\n ...this.articleHandler.getTools(),\n ...this.projectHandler.getTools(),\n ...this.publishingHandler.getTools(),\n ...this.personaHandler.getTools(),\n ...this.bulkHandler.getTools(),\n ...this.connectionsHandler.getTools(),\n ...this.utilityHandler.getTools(),\n ...this.categoryPagesHandler.getTools(),\n ...this.productPagesHandler.getTools(),\n ...this.discoverHandler.getTools(),\n ...this.rssHandler.getTools(),\n ...this.updatePostsHandler.getTools(),\n ...this.transactionsHandler.getTools(),\n ...this.jobsHandler.getTools()\n ];\n }\n\n private registerHandlers() {\n // Register tool list handler\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n const tools = this.getAllTools();\n\n return {\n tools: tools.map(tool => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema\n }))\n };\n });\n\n // Register tool call handler\n this.server.setRequestHandler(CallToolRequestSchema, async (request: any) => {\n const startTime = Date.now();\n const { name, arguments: args } = request.params;\n\n try {\n // Rate limiting\n if (this.config.security.enableRateLimiting) {\n const allowed = await this.rateLimiter.checkLimit('global');\n if (!allowed) {\n throw new Error('Rate limit exceeded. Please try again later.');\n }\n }\n\n // Find and execute tool\n const tool = this.findTool(name);\n if (!tool) {\n throw new Error(`Tool not found: ${name}`);\n }\n\n logger.info('Executing tool', { tool: name });\n\n const result = await tool.handler(args);\n\n // Record metrics\n this.metrics.recordToolCall(name, 'success', Date.now() - startTime);\n\n return result;\n\n } catch (error: any) {\n logger.error('Tool execution failed', { tool: name, error: error.message });\n this.metrics.recordToolCall(name, 'error', Date.now() - startTime);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'An unexpected error occurred',\n tool: name\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n });\n\n // Register resource handlers\n this.server.setRequestHandler(ListResourcesRequestSchema, async () => {\n const resources = this.resourceHandler.getResources();\n\n return {\n resources: resources.map(r => ({\n uri: r.uri,\n name: r.name,\n description: r.description,\n mimeType: r.mimeType\n }))\n };\n });\n\n this.server.setRequestHandler(ReadResourceRequestSchema, async (request: any) => {\n const { uri } = request.params;\n\n try {\n const resource = await this.resourceHandler.readResource(uri);\n return resource;\n } catch (error: any) {\n logger.error('Resource read failed', { uri, error: error.message });\n throw error;\n }\n });\n\n // Register prompt handlers\n this.server.setRequestHandler(ListPromptsRequestSchema, async () => {\n const prompts = this.promptHandler.getPrompts();\n\n return {\n prompts: prompts.map(p => ({\n name: p.name,\n description: p.description,\n arguments: p.arguments\n }))\n };\n });\n\n this.server.setRequestHandler(GetPromptRequestSchema, async (request: any) => {\n const { name, arguments: args } = request.params;\n\n try {\n const prompt = await this.promptHandler.getPrompt(name, args);\n return prompt;\n } catch (error: any) {\n logger.error('Prompt generation failed', { name, error: error.message });\n throw error;\n }\n });\n }\n\n private findTool(name: string) {\n return this.getAllTools().find(tool => tool.name === name);\n }\n\n async connect(transport: StdioServerTransport) {\n await this.server.connect(transport);\n\n // Start health checker if enabled\n if (this.config.monitoring.enableHealthCheck) {\n this.healthChecker.startMonitoring(this.config.monitoring.healthCheckInterval);\n }\n\n // Start metrics server if enabled\n if (this.config.monitoring.enableMetrics) {\n this.metrics.startServer(this.config.monitoring.metricsPort);\n }\n }\n\n async shutdown() {\n logger.info('Shutting down WisewandMCPServer...');\n\n // Stop health monitoring\n this.healthChecker.stopMonitoring();\n\n // Stop metrics server\n if (this.config.monitoring.enableMetrics) {\n await this.metrics.stopServer();\n }\n\n // Clean up cache\n await this.cacheManager.cleanup();\n\n // Close server\n await this.server.close();\n\n logger.info('WisewandMCPServer shutdown complete');\n }\n\n getToolCount(): number {\n return this.getAllTools().length;\n }\n\n getResourceCount(): number {\n return this.resourceHandler.getResources().length;\n }\n\n getPromptCount(): number {\n return this.promptHandler.getPrompts().length;\n }\n\n getHealth() {\n return this.healthChecker.getStatus();\n }\n\n getMetrics() {\n return this.metrics.getMetrics();\n }\n\n /**\n * Test API connection during startup\n * Returns {ok: boolean, error?: string}\n */\n async testAPIConnection(): Promise<{ok: boolean, error?: string}> {\n try {\n const health = await this.healthChecker.checkHealth();\n if (health.checks.api) {\n return { ok: true };\n } else {\n return {\n ok: false,\n error: 'API health check failed - check API key and network connection'\n };\n }\n } catch (error: any) {\n return {\n ok: false,\n error: error.message || 'Unknown error'\n };\n }\n }\n}\n","/**\n * Wisewand API Client with retry logic and error handling\n */\n\nimport pRetry from 'p-retry';\nimport { logger } from '../utils/logger';\nimport {\n Article,\n Project,\n Persona,\n Connection,\n CategoryPage,\n ProductPage,\n DiscoverArticle,\n DiscoverArticleInput,\n Feed,\n CreateFeedInput,\n UpdatePost,\n Transaction,\n Job,\n CreateArticleInput,\n CreateProjectInput,\n CreatePersonaInput,\n CreateCategoryPageInput,\n CreateProductPageInput,\n PublishOptions,\n BulkArticleInput,\n ListParams,\n ArticleOutput,\n CostEstimate\n} from '../types/api';\n\nexport interface WisewandAPIConfig {\n apiKey: string;\n apiUrl: string;\n timeout: number;\n retryAttempts: number;\n retryDelay: number;\n}\n\nexport class WisewandAPIClient {\n private headers: Record<string, string>;\n private abortController: AbortController;\n\n constructor(private config: WisewandAPIConfig) {\n this.headers = {\n 'Authorization': `Bearer ${config.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': 'Wisewand-MCP/1.0.0',\n 'Accept': 'application/json'\n };\n\n this.abortController = new AbortController();\n }\n\n /**\n * Make HTTP request with retry logic\n */\n private async request<T>(\n method: string,\n endpoint: string,\n body?: any,\n options: RequestInit = {}\n ): Promise<T> {\n const url = `${this.config.apiUrl}${endpoint}`;\n\n return pRetry(\n async () => {\n const timeoutId = setTimeout(() => {\n this.abortController.abort();\n }, this.config.timeout);\n\n try {\n const bodyJSON = body ? JSON.stringify(body) : undefined;\n\n // Production logging\n logger.info('API HTTP REQUEST - EXACT JSON', {\n method,\n endpoint,\n url,\n bodyJSON, // The EXACT string being sent over HTTP\n body_includes_apply_project_brief_config: bodyJSON?.includes('apply_project_brief_config'),\n body_apply_project_brief_config_value: bodyJSON?.match(/\"apply_project_brief_config\":(true|false)/)?.[1]\n });\n\n const response = await fetch(url, {\n method,\n headers: this.headers,\n body: bodyJSON,\n signal: this.abortController.signal,\n ...options\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new APIError(response.status, errorBody, endpoint);\n }\n\n const data = await response.json();\n\n logger.debug('API response', { method, endpoint, status: response.status });\n\n return data as T;\n\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n // Reset abort controller for next request\n this.abortController = new AbortController();\n throw new Error(`Request timeout after ${this.config.timeout}ms`);\n }\n\n throw error;\n }\n },\n {\n retries: this.config.retryAttempts,\n minTimeout: this.config.retryDelay,\n maxTimeout: this.config.retryDelay * 10,\n onFailedAttempt: (error) => {\n logger.warn('API request failed, retrying...', {\n attempt: error.attemptNumber,\n retriesLeft: error.retriesLeft,\n error: error.message\n });\n }\n }\n );\n }\n\n private buildQuery(params: Record<string, any>): string {\n const query = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n query.append(key, String(value));\n }\n });\n return query.toString();\n }\n\n // ============= Article Operations =============\n\n async createArticle(input: CreateArticleInput): Promise<Article> {\n return this.request<Article>('POST', '/v1/articles/', input);\n }\n\n async getArticle(id: string): Promise<Article> {\n return this.request<Article>('GET', `/v1/articles/${id}`);\n }\n\n async updateArticle(id: string, updates: Partial<CreateArticleInput>): Promise<Article> {\n return this.request<Article>('PATCH', `/v1/articles/${id}`, updates);\n }\n\n async listArticles(params: ListParams = {}): Promise<{\n items: Article[];\n total: number;\n skip: number;\n take: number;\n }> {\n const query = this.buildQuery(params);\n return this.request('GET', `/v1/articles/?${query}`);\n }\n\n async runArticleGeneration(id: string): Promise<{ success: boolean; message: string }> {\n return this.request('POST', `/v1/articles/${id}/run`, {});\n }\n\n async getArticleOutput(id: string): Promise<ArticleOutput> {\n return this.request<ArticleOutput>('GET', `/v1/articles/${id}/output`);\n }\n\n async updateArticleOutput(id: string, outputId: string, updates: any): Promise<any> {\n return this.request('PATCH', `/v1/articles/${id}/output/${outputId}`, updates);\n }\n\n async getArticleStatus(id: string): Promise<string> {\n const article = await this.getArticle(id);\n return article.status || 'unknown';\n }\n\n async calculateArticleCost(input: CreateArticleInput): Promise<CostEstimate> {\n return this.request<CostEstimate>('POST', '/v1/articles/cost', input);\n }\n\n async createBulkArticles(articles: BulkArticleInput[]): Promise<{\n items: Article[];\n errors: any[];\n }> {\n return this.request('POST', '/v1/articles/bulk', { articles });\n }\n\n async calculateBulkCost(articles: BulkArticleInput[]): Promise<{\n total: number;\n breakdown: CostEstimate[];\n }> {\n return this.request('POST', '/v1/articles/bulk/cost', { articles });\n }\n\n // ============= Project Operations =============\n\n async createProject(input: CreateProjectInput): Promise<Project> {\n return this.request<Project>('POST', '/v1/projects/', input);\n }\n\n async getProject(id: string): Promise<Project> {\n return this.request<Project>('GET', `/v1/projects/${id}`);\n }\n\n async updateProject(id: string, updates: Partial<CreateProjectInput>): Promise<Project> {\n return this.request<Project>('PATCH', `/v1/projects/${id}`, updates);\n }\n\n async deleteProject(id: string): Promise<{ success: boolean }> {\n return this.request('DELETE', `/v1/projects/${id}`);\n }\n\n async listProjects(params: ListParams = {}): Promise<{\n items: Project[];\n total: number;\n }> {\n const query = this.buildQuery(params);\n return this.request('GET', `/v1/projects/?${query}`);\n }\n\n // ============= Persona Operations =============\n\n async createPersona(input: CreatePersonaInput): Promise<Persona> {\n return this.request<Persona>('POST', '/v1/personas/', input);\n }\n\n async getPersona(id: string): Promise<Persona> {\n return this.request<Persona>('GET', `/v1/personas/${id}`);\n }\n\n async updatePersona(id: string, updates: Partial<CreatePersonaInput>): Promise<Persona> {\n return this.request<Persona>('PATCH', `/v1/personas/${id}`, updates);\n }\n\n async deletePersona(id: string): Promise<{ success: boolean }> {\n return this.request('DELETE', `/v1/personas/${id}`);\n }\n\n async listPersonas(params: ListParams = {}): Promise<{\n items: Persona[];\n total: number;\n }> {\n const query = this.buildQuery(params);\n return this.request('GET', `/v1/personas/?${query}`);\n }\n\n // ============= Connection Operations =============\n\n async createConnection(input: any): Promise<Connection> {\n return this.request<Connection>('POST', '/v1/connections/', input);\n }\n\n async getConnection(id: string): Promise<Connection> {\n return this.request<Connection>('GET', `/v1/connections/${id}`);\n }\n\n async updateConnection(id: string, updates: any): Promise<Connection> {\n return this.request<Connection>('PATCH', `/v1/connections/${id}`, updates);\n }\n\n async deleteConnection(id: string): Promise<{ success: boolean }> {\n return this.request('DELETE', `/v1/connections/${id}`);\n }\n\n async listConnections(params: ListParams = {}): Promise<{\n items: Connection[];\n total: number;\n }> {\n const query = this.buildQuery(params);\n return this.request('GET', `/v1/connections/?${query}`);\n }\n\n // ============= Publishing Operations =============\n\n async publishToWordPress(\n entityId: string,\n options: PublishOptions\n ): Promise<{ success: boolean; url?: string; error?: string }> {\n return this.request('POST', `/v1/publish/wordpress/${entityId}`, options);\n }\n\n async triggerWebhook(\n entityId: string,\n webhookId: string\n ): Promise<{ success: boolean; response?: any; error?: string }> {\n return this.request('POST', `/v1/publish/webhook/${entityId}`, {\n webhook_id: webhookId\n });\n }\n\n async publishToShopify(\n entityId: string,\n options?: any\n ): Promise<{ success: boolean; url?: string; error?: string }> {\n return this.request('POST', `/v1/publish/shopify/${entityId}`, options || {});\n }\n\n async publishToPrestashop(\n entityId: string,\n options?: any\n ): Promise<{ success: boolean; url?: string; error?: string }> {\n return this.request('POST', `/v1/publish/prestashop/${entityId}`, options || {});\n }\n\n async publishToWoocommerce(\n entityId: string,\n options?: any\n ): Promise<{ success: boolean; url?: string; error?: string }> {\n return this.request('POST', `/v1/publish/woocommerce/${entityId}`, options || {});\n }\n\n // ============= Category Pages =============\n\n async createCategoryPage(input: CreateCategoryPageInput): Promise<CategoryPage> {\n return this.request<CategoryPage>('POST', '/v1/categorypages/', input);\n }\n\n async getCategoryPage(id: string): Promise<CategoryPage> {\n return this.request<CategoryPage>('GET', `/v1/categorypages/${id}`);\n }\n\n async listCategoryPages(params: ListParams = {}): Promise<{\n items: CategoryPage[];\n total: number;\n }> {\n const query = this.buildQuery(params);\n return this.request('GET', `/v1/categorypages/?${query}`);\n }\n\n async updateCategoryPage(id: string, updates: any): Promise<CategoryPage> {\n return this.request<CategoryPage>('PATCH', `/v1/categorypages/${id}`, updates);\n }\n\n async runCategoryPageGeneration(id: string): Promise<{ success: boolean }> {\n return this.request('POST', `/v1/categorypages/${id}/run`, {});\n }\n\n async getCategoryPageOutput(id: string): Promise<any> {\n return this.request('GET', `/v1/categorypages/${id}/output`);\n }\n\n async calculateCategoryPageCost(input: any): Promise<CostEstimate> {\n return this.request<CostEstimate>('POST', '/v1/categorypages/cost', input);\n }\n\n async createBulkCategoryPages(items: any[]): Promise<any> {\n return this.request('POST', '/v1/categorypages/bulk', { items });\n }\n\n // ============= Product Pages =============\n\n async createProductPage(input: CreateProductPageInput): Promise<ProductPage> {\n return this.request<ProductPage>('POST', '/v1/productpages/', input);\n }\n\n async getProductPage(id: string): Promise<ProductPage> {\n return this.request<ProductPage>('GET', `/v1/productpages/${id}`);\n }\n\n async listProductPages(params: ListParams = {}): Promise<{\n items: ProductPage[];\n total: number;\n }> {\n const query = this.buildQuery(params);\n return this.request('GET', `/v1/productpages/?${query}`);\n }\n\n async updateProductPage(id: string, updates: any): Promise<ProductPage> {\n return this.request<ProductPage>('PATCH', `/v1/productpages/${id}`, updates);\n }\n\n async runProductPageGeneration(id: string): Promise<{ success: boolean }> {\n return this.request('POST', `/v1/productpages/${id}/run`, {});\n }\n\n async getProductPageOutput(id: string): Promise<any> {\n return this.request('GET', `/v1/productpages/${id}/output`);\n }\n\n async calculateProductPageCost(input: any): Promise<CostEstimate> {\n return this.request<CostEstimate>('POST', '/v1/productpages/cost', input);\n }\n\n async createBulkProductPages(items: any[]): Promise<any> {\n return this.request('POST', '/v1/productpages/bulk', { items });\n }\n\n // ============= Content Discovery =============\n\n async discoverArticles(input: DiscoverArticleInput): Promise<DiscoverArticle> {\n return this.request<DiscoverArticle>('POST', '/v1/discoverarticles/', input);\n }\n\n async getDiscoverArticle(id: string): Promise<DiscoverArticle> {\n return this.request<DiscoverArticle>('GET', `/v1/discoverarticles/${id}`);\n }\n\n async listDiscoverArticles(params: ListParams = {}): Promise<{\n items: DiscoverArticle[];\n total: number;\n }> {\n const query = this.buildQuery(params);\n return this.request('GET', `/v1/discoverarticles/?${query}`);\n }\n\n async updateDiscoverArticle(id: string, updates: any): Promise<DiscoverArticle> {\n return this.request<DiscoverArticle>('PATCH', `/v1/discoverarticles/${id}`, updates);\n }\n\n async runDiscovery(id: string): Promise<{ success: boolean }> {\n return this.request('POST', `/v1/discoverarticles/${id}/run`, {});\n }\n\n async getDiscoverArticleOutput(id: string): Promise<any> {\n return this.request('GET', `/v1/discoverarticles/${id}/output`);\n }\n\n async calculateDiscoverCost(input: any): Promise<CostEstimate> {\n return this.request<CostEstimate>('POST', '/v1/discoverarticles/cost', input);\n }\n\n async createBulkDiscoverArticles(items: any[]): Promise<any> {\n return this.request('POST', '/v1/discoverarticles/bulk', { items });\n }\n\n // ============= Feeds (was RSS Feed Triggers) =============\n\n async createFeed(input: CreateFeedInput): Promise<Feed> {\n return this.request<Feed>('POST', '/v1/feeds/', input);\n }\n\n async getFeed(id: string): Promise<Feed> {\n return this.request<Feed>('GET', `/v1/feeds/${id}`);\n }\n\n async listFeeds(params: ListParams = {}): Promise<{\n items: Feed[];\n total: number;\n }> {\n const query = this.buildQuery(params);\n return this.request('GET', `/v1/feeds/?${query}`);\n }\n\n async updateFeed(id: string, updates: Partial<CreateFeedInput>): Promise<Feed> {\n return this.request<Feed>('PATCH', `/v1/feeds/${id}`, updates);\n }\n\n async deleteFeed(id: string): Promise<{ success: boolean }> {\n return this.request('DELETE', `/v1/feeds/${id}`);\n }\n\n // ============= Update Posts =============\n\n async createUpdatePost(input: any): Promise<UpdatePost> {\n return this.request<UpdatePost>('POST', '/v1/updateposts/', input);\n }\n\n async getUpdatePost(id: string): Promise<UpdatePost> {\n return this.request<UpdatePost>('GET', `/v1/updateposts/${id}`);\n }\n\n async listUpdatePosts(params: ListParams = {}): Promise<{\n items: UpdatePost[];\n total: number;\n }> {\n const query = this.buildQuery(params);\n return this.request('GET', `/v1/updateposts/?${query}`);\n }\n\n async updateUpdatePost(id: string, updates: any): Promise<UpdatePost> {\n return this.request<UpdatePost>('PATCH', `/v1/updateposts/${id}`, updates);\n }\n\n async getUpdatePostOutput(id: string): Promise<any> {\n return this.request('GET', `/v1/updateposts/${id}/output`);\n }\n\n async runUpdatePost(id: string): Promise<{ success: boolean }> {\n return this.request('POST', `/v1/updateposts/${id}/run`, {});\n }\n\n async calculateUpdatePostCost(input: any): Promise<CostEstimate> {\n return this.request<CostEstimate>('POST', '/v1/updateposts/cost', input);\n }\n\n async createBulkUpdatePosts(items: any[]): Promise<any> {\n return this.request('POST', '/v1/updateposts/bulk', { items });\n }\n\n // ============= Transactions =============\n\n async listTransactions(params: ListParams = {}): Promise<{\n items: Transaction[];\n total: number;\n }> {\n const query = this.buildQuery(params);\n return this.request('GET', `/v1/transactions/?${query}`);\n }\n\n async getDailyTransactions(): Promise<any> {\n return this.request('GET', '/v1/transactions/daily');\n }\n\n // ============= Jobs =============\n\n async getJob(id: string): Promise<Job> {\n return this.request<Job>('GET', `/v1/jobs/${id}`);\n }\n\n async triggerJob(name: string): Promise<Job> {\n return this.request<Job>('POST', `/v1/jobs/${name}`, {});\n }\n\n // ============= Utility Operations =============\n\n async getAuthors(): Promise<{ items: any[]; total: number }> {\n return this.request('GET', '/v1/authors/');\n }\n\n async getCategories(): Promise<{ items: any[]; total: number }> {\n return this.request('GET', '/v1/categories/');\n }\n\n async getUsageSummary(): Promise<any> {\n return this.request('GET', '/v1/entities/summary/');\n }\n\n async checkHealth(): Promise<boolean> {\n try {\n // Use /v1/projects/ endpoint as health check since /health doesn't exist\n const response = await fetch(`${this.config.apiUrl}/v1/projects/?take=1`, {\n headers: {\n 'Authorization': `Bearer ${this.config.apiKey}`,\n 'Content-Type': 'application/json'\n },\n signal: AbortSignal.timeout(5000)\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n}\n\n/**\n * Custom API Error class\n */\nexport class APIError extends Error {\n constructor(\n public status: number,\n public body: string,\n public endpoint: string\n ) {\n super(`API Error ${status}: ${body}`);\n this.name = 'APIError';\n }\n\n get isRateLimited(): boolean {\n return this.status === 429;\n }\n\n get isUnauthorized(): boolean {\n return this.status === 401 || this.status === 403;\n }\n\n get isNotFound(): boolean {\n return this.status === 404;\n }\n\n get isServerError(): boolean {\n return this.status >= 500;\n }\n}\n","/**\n * Cache Manager\n * Handles caching with multiple strategies (memory, Redis, hybrid)\n */\n\nimport NodeCache from 'node-cache';\nimport Redis from 'ioredis';\nimport { logger } from '../utils/logger';\n\nexport interface CacheConfig {\n enabled: boolean;\n ttlSeconds: number;\n maxSizeMB: number;\n strategy: 'memory' | 'redis' | 'hybrid';\n}\n\nexport class CacheManager {\n private memoryCache?: NodeCache;\n private redisClient?: Redis;\n private enabled: boolean;\n private strategy: string;\n private defaultTTL: number;\n \n constructor(private config: CacheConfig, private redisConfig?: any) {\n this.enabled = config.enabled;\n this.strategy = config.strategy;\n this.defaultTTL = config.ttlSeconds;\n \n if (!this.enabled) {\n logger.info('Cache disabled');\n return;\n }\n \n // Initialize memory cache\n if (this.strategy === 'memory' || this.strategy === 'hybrid') {\n this.memoryCache = new NodeCache({\n stdTTL: this.defaultTTL,\n checkperiod: 120,\n useClones: false,\n deleteOnExpire: true,\n maxKeys: Math.floor(this.config.maxSizeMB * 1000) // Rough estimate\n });\n \n logger.info('Memory cache initialized', {\n ttl: this.defaultTTL,\n maxSizeMB: this.config.maxSizeMB\n });\n }\n \n // Initialize Redis cache\n if ((this.strategy === 'redis' || this.strategy === 'hybrid') && this.redisConfig) {\n this.redisClient = new Redis({\n host: this.redisConfig.host,\n port: this.redisConfig.port,\n password: this.redisConfig.password,\n db: this.redisConfig.db,\n keyPrefix: this.redisConfig.keyPrefix,\n retryStrategy: (times: number) => {\n if (times > 3) {\n logger.error('Redis connection failed after 3 retries');\n return null;\n }\n return Math.min(times * 100, 3000);\n }\n });\n \n this.redisClient.on('connect', () => {\n logger.info('Redis cache connected');\n });\n \n this.redisClient.on('error', (error) => {\n logger.error('Redis cache error', error);\n });\n }\n }\n \n async get<T>(key: string): Promise<T | null> {\n if (!this.enabled) return null;\n \n try {\n // Try memory cache first\n if (this.memoryCache) {\n const memoryResult = this.memoryCache.get<T>(key);\n if (memoryResult !== undefined) {\n logger.debug('Cache hit (memory)', { key });\n return memoryResult;\n }\n }\n \n // Try Redis cache\n if (this.redisClient) {\n const redisResult = await this.redisClient.get(key);\n if (redisResult) {\n logger.debug('Cache hit (redis)', { key });\n const parsed = JSON.parse(redisResult) as T;\n \n // Store in memory cache for hybrid strategy\n if (this.strategy === 'hybrid' && this.memoryCache) {\n this.memoryCache.set(key, parsed, 60); // Short TTL for memory\n }\n \n return parsed;\n }\n }\n \n logger.debug('Cache miss', { key });\n return null;\n \n } catch (error) {\n logger.error('Cache get error', { key, error });\n return null;\n }\n }\n \n async set<T>(key: string, value: T, ttl?: number): Promise<void> {\n if (!this.enabled) return;\n \n const ttlSeconds = ttl || this.defaultTTL;\n \n try {\n // Set in memory cache\n if (this.memoryCache) {\n this.memoryCache.set(key, value, ttlSeconds);\n logger.debug('Cache set (memory)', { key, ttl: ttlSeconds });\n }\n \n // Set in Redis cache\n if (this.redisClient) {\n await this.redisClient.setex(\n key,\n ttlSeconds,\n JSON.stringify(value)\n );\n logger.debug('Cache set (redis)', { key, ttl: ttlSeconds });\n }\n \n } catch (error) {\n logger.error('Cache set error', { key, error });\n }\n }\n \n async delete(key: string): Promise<void> {\n if (!this.enabled) return;\n \n try {\n // Delete from memory cache\n if (this.memoryCache) {\n this.memoryCache.del(key);\n }\n \n // Delete from Redis cache\n if (this.redisClient) {\n await this.redisClient.del(key);\n }\n \n logger.debug('Cache delete', { key });\n \n } catch (error) {\n logger.error('Cache delete error', { key, error });\n }\n }\n \n async flush(): Promise<void> {\n if (!this.enabled) return;\n \n try {\n // Flush memory cache\n if (this.memoryCache) {\n this.memoryCache.flushAll();\n }\n \n // Flush Redis cache (only keys with our prefix)\n if (this.redisClient) {\n const keys = await this.redisClient.keys('*');\n if (keys.length > 0) {\n await this.redisClient.del(...keys);\n }\n }\n \n logger.info('Cache flushed');\n \n } catch (error) {\n logger.error('Cache flush error', error);\n }\n }\n \n async cleanup(): Promise<void> {\n try {\n // Close memory cache\n if (this.memoryCache) {\n this.memoryCache.flushAll();\n this.memoryCache.close();\n }\n \n // Close Redis connection\n if (this.redisClient) {\n await this.redisClient.quit();\n }\n \n logger.info('Cache cleanup completed');\n \n } catch (error) {\n logger.error('Cache cleanup error', error);\n }\n }\n \n getStats(): any {\n const stats: any = {\n enabled: this.enabled,\n strategy: this.strategy\n };\n \n if (this.memoryCache) {\n stats.memory = {\n keys: this.memoryCache.keys().length,\n hits: this.memoryCache.getStats().hits,\n misses: this.memoryCache.getStats().misses\n };\n }\n \n if (this.redisClient) {\n stats.redis = {\n status: this.redisClient.status\n };\n }\n \n return stats;\n }\n}","/**\n * Rate Limiter Service\n * Implements token bucket algorithm for rate limiting\n */\n\nimport { logger } from '../utils/logger';\n\ninterface RateLimitConfig {\n enableRateLimiting: boolean;\n maxRequestsPerMinute: number;\n}\n\ninterface TokenBucket {\n tokens: number;\n lastRefill: number;\n maxTokens: number;\n refillRate: number;\n}\n\nexport class RateLimiter {\n private buckets: Map<string, TokenBucket> = new Map();\n private cleanupInterval: NodeJS.Timeout | null = null;\n \n constructor(private config: RateLimitConfig) {\n if (this.config.enableRateLimiting) {\n // Clean up old buckets every 5 minutes\n this.cleanupInterval = setInterval(() => {\n this.cleanup();\n }, 5 * 60 * 1000);\n \n logger.info('Rate limiter initialized', {\n maxRequestsPerMinute: config.maxRequestsPerMinute\n });\n }\n }\n \n async checkLimit(identifier: string = 'global'): Promise<boolean> {\n if (!this.config.enableRateLimiting) {\n return true;\n }\n \n const now = Date.now();\n let bucket = this.buckets.get(identifier);\n \n if (!bucket) {\n // Create new bucket\n bucket = {\n tokens: this.config.maxRequestsPerMinute,\n lastRefill: now,\n maxTokens: this.config.maxRequestsPerMinute,\n refillRate: this.config.maxRequestsPerMinute / 60000 // tokens per ms\n };\n this.buckets.set(identifier, bucket);\n }\n \n // Refill tokens based on time passed\n const timePassed = now - bucket.lastRefill;\n const tokensToAdd = timePassed * bucket.refillRate;\n bucket.tokens = Math.min(bucket.maxTokens, bucket.tokens + tokensToAdd);\n bucket.lastRefill = now;\n \n // Check if request can be made\n if (bucket.tokens >= 1) {\n bucket.tokens -= 1;\n return true;\n }\n \n logger.warn('Rate limit exceeded', {\n identifier,\n tokensRemaining: bucket.tokens\n });\n \n return false;\n }\n \n getRemainingLimit(identifier: string = 'global'): number {\n const bucket = this.buckets.get(identifier);\n if (!bucket) {\n return this.config.maxRequestsPerMinute;\n }\n \n // Calculate current tokens\n const now = Date.now();\n const timePassed = now - bucket.lastRefill;\n const tokensToAdd = timePassed * bucket.refillRate;\n const currentTokens = Math.min(bucket.maxTokens, bucket.tokens + tokensToAdd);\n \n return Math.floor(currentTokens);\n }\n \n resetLimit(identifier: string = 'global'): void {\n this.buckets.delete(identifier);\n }\n \n private cleanup(): void {\n const now = Date.now();\n const maxAge = 10 * 60 * 1000; // 10 minutes\n \n for (const [identifier, bucket] of this.buckets.entries()) {\n if (now - bucket.lastRefill > maxAge) {\n this.buckets.delete(identifier);\n logger.debug('Cleaned up rate limit bucket', { identifier });\n }\n }\n }\n \n stop(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = null;\n }\n }\n}","/**\n * Metrics Collector\n * Collects and exposes metrics for monitoring\n */\n\nimport { Counter, Histogram, Gauge, Registry, collectDefaultMetrics } from 'prom-client';\nimport express from 'express';\nimport { logger } from '../utils/logger';\n\nexport class MetricsCollector {\n private registry: Registry;\n private app?: express.Application;\n private server?: any;\n \n // Metrics\n private toolCallCounter: Counter;\n private toolCallDuration: Histogram;\n private apiCallCounter: Counter;\n private apiCallDuration: Histogram;\n private cacheHitCounter: Counter;\n private cacheMissCounter: Counter;\n private activeConnections: Gauge;\n private errorCounter: Counter;\n \n constructor() {\n this.registry = new Registry();\n \n // Collect default metrics (CPU, memory, etc.)\n collectDefaultMetrics({ register: this.registry });\n \n // Tool metrics\n this.toolCallCounter = new Counter({\n name: 'mcp_tool_calls_total',\n help: 'Total number of tool calls',\n labelNames: ['tool', 'status'],\n registers: [this.registry]\n });\n \n this.toolCallDuration = new Histogram({\n name: 'mcp_tool_call_duration_ms',\n help: 'Tool call duration in milliseconds',\n labelNames: ['tool'],\n buckets: [10, 50, 100, 500, 1000, 5000, 10000],\n registers: [this.registry]\n });\n \n // API metrics\n this.apiCallCounter = new Counter({\n name: 'wisewand_api_calls_total',\n help: 'Total number of Wisewand API calls',\n labelNames: ['endpoint', 'status'],\n registers: [this.registry]\n });\n \n this.apiCallDuration = new Histogram({\n name: 'wisewand_api_call_duration_ms',\n help: 'Wisewand API call duration in milliseconds',\n labelNames: ['endpoint'],\n buckets: [100, 500, 1000, 2000, 5000, 10000, 30000],\n registers: [this.registry]\n });\n \n // Cache metrics\n this.cacheHitCounter = new Counter({\n name: 'cache_hits_total',\n help: 'Total number of cache hits',\n labelNames: ['cache_type'],\n registers: [this.registry]\n });\n \n this.cacheMissCounter = new Counter({\n name: 'cache_misses_total',\n help: 'Total number of cache misses',\n labelNames: ['cache_type'],\n registers: [this.registry]\n });\n \n // Connection metrics\n this.activeConnections = new Gauge({\n name: 'mcp_active_connections',\n help: 'Number of active MCP connections',\n registers: [this.registry]\n });\n \n // Error metrics\n this.errorCounter = new Counter({\n name: 'mcp_errors_total',\n help: 'Total number of errors',\n labelNames: ['type', 'source'],\n registers: [this.registry]\n });\n \n logger.info('Metrics collector initialized');\n }\n \n recordToolCall(tool: string, status: 'success' | 'error', durationMs: number): void {\n this.toolCallCounter.inc({ tool, status });\n this.toolCallDuration.observe({ tool }, durationMs);\n }\n \n recordAPICall(endpoint: string, status: 'success' | 'error', durationMs?: number): void {\n this.apiCallCounter.inc({ endpoint, status });\n if (durationMs) {\n this.apiCallDuration.observe({ endpoint }, durationMs);\n }\n }\n \n recordCacheHit(cacheType: 'memory' | 'redis' = 'memory'): void {\n this.cacheHitCounter.inc({ cache_type: cacheType });\n }\n \n recordCacheMiss(cacheType: 'memory' | 'redis' = 'memory'): void {\n this.cacheMissCounter.inc({ cache_type: cacheType });\n }\n \n setActiveConnections(count: number): void {\n this.activeConnections.set(count);\n }\n \n incrementActiveConnections(): void {\n this.activeConnections.inc();\n }\n \n decrementActiveConnections(): void {\n this.activeConnections.dec();\n }\n \n recordError(type: string, source: string): void {\n this.errorCounter.inc({ type, source });\n }\n \n async getMetrics(): Promise<string> {\n return await this.registry.metrics();\n }\n \n getMetricsContentType(): string {\n return this.registry.contentType;\n }\n \n startServer(port: number): void {\n if (this.server) {\n logger.warn('Metrics server already running');\n return;\n }\n \n this.app = express();\n \n // Health check endpoint\n this.app.get('/health', (_req, res) => {\n res.status(200).json({ status: 'healthy' });\n });\n \n // Metrics endpoint\n this.app.get('/metrics', async (_req, res) => {\n try {\n res.set('Content-Type', this.getMetricsContentType());\n const metrics = await this.getMetrics();\n res.end(metrics);\n } catch (error) {\n logger.error('Error collecting metrics', error);\n res.status(500).end();\n }\n });\n \n this.server = this.app.listen(port, () => {\n logger.info(`Metrics server started on port ${port}`);\n });\n }\n \n async stopServer(): Promise<void> {\n if (this.server) {\n return new Promise((resolve) => {\n this.server.close(() => {\n logger.info('Metrics server stopped');\n resolve();\n });\n });\n }\n }\n \n reset(): void {\n this.registry.clear();\n }\n}","/**\n * Health Checker\n * Monitors system health and dependencies\n */\n\nimport { WisewandAPIClient } from '../clients/WisewandAPIClient';\nimport { CacheManager } from '../services/CacheManager';\nimport { logger } from '../utils/logger';\n\nexport interface HealthStatus {\n status: 'healthy' | 'degraded' | 'unhealthy';\n timestamp: string;\n checks: {\n api: boolean;\n cache: boolean;\n memory: boolean;\n uptime: number;\n };\n details?: any;\n}\n\nexport class HealthChecker {\n private interval: NodeJS.Timeout | null = null;\n private lastStatus: HealthStatus | null = null;\n private startTime: number = Date.now();\n \n constructor(\n private apiClient: WisewandAPIClient,\n private cacheManager: CacheManager\n ) {}\n \n async checkHealth(): Promise<HealthStatus> {\n const checks = {\n api: false,\n cache: false,\n memory: false,\n uptime: Math.floor((Date.now() - this.startTime) / 1000)\n };\n \n // Check API health\n try {\n checks.api = await this.apiClient.checkHealth();\n } catch (error) {\n logger.error('API health check failed', error);\n }\n \n // Check cache health\n try {\n await this.cacheManager.set('health:check', { timestamp: Date.now() }, 10);\n const cached = await this.cacheManager.get('health:check');\n checks.cache = cached !== null;\n } catch (error) {\n logger.error('Cache health check failed', error);\n }\n \n // Check memory usage\n const memUsage = process.memoryUsage();\n const maxHeap = 4 * 1024 * 1024 * 1024; // 4GB\n checks.memory = memUsage.heapUsed < maxHeap * 0.9; // Alert at 90%\n \n // Determine overall status\n let status: 'healthy' | 'degraded' | 'unhealthy';\n if (checks.api && checks.cache && checks.memory) {\n status = 'healthy';\n } else if (checks.api || checks.cache) {\n status = 'degraded';\n } else {\n status = 'unhealthy';\n }\n \n const healthStatus: HealthStatus = {\n status,\n timestamp: new Date().toISOString(),\n checks,\n details: {\n memory: {\n heapUsed: Math.round(memUsage.heapUsed / 1024 / 1024),\n heapTotal: Math.round(memUsage.heapTotal / 1024 / 1024),\n external: Math.round(memUsage.external / 1024 / 1024),\n rss: Math.round(memUsage.rss / 1024 / 1024)\n },\n cache: this.cacheManager.getStats(),\n process: {\n pid: process.pid,\n version: process.version,\n platform: process.platform,\n uptime: checks.uptime\n }\n }\n };\n \n this.lastStatus = healthStatus;\n \n if (status !== 'healthy') {\n logger.warn('Health check detected issues', healthStatus);\n }\n \n return healthStatus;\n }\n \n startMonitoring(intervalMs: number = 30000): void {\n if (this.interval) {\n logger.warn('Health monitoring already started');\n return;\n }\n \n // Initial check\n this.checkHealth().catch(error => {\n logger.error('Initial health check failed', error);\n });\n \n // Periodic checks\n this.interval = setInterval(async () => {\n try {\n await this.checkHealth();\n } catch (error) {\n logger.error('Health check failed', error);\n }\n }, intervalMs);\n \n logger.info('Health monitoring started', { interval: intervalMs });\n }\n \n stopMonitoring(): void {\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n logger.info('Health monitoring stopped');\n }\n }\n \n getStatus(): HealthStatus | null {\n return this.lastStatus;\n }\n \n isHealthy(): boolean {\n return this.lastStatus?.status === 'healthy';\n }\n \n isDegraded(): boolean {\n return this.lastStatus?.status === 'degraded';\n }\n \n isUnhealthy(): boolean {\n return this.lastStatus?.status === 'unhealthy';\n }\n}","/**\n * Article Tool Handler\n * Handles all article-related operations\n */\n\nimport { z } from 'zod';\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nconst boolField = z.union([z.boolean(), z.string()]).transform(val =>\n typeof val === 'string' ? val === 'true' : val\n).optional().default(false);\n\nconst numField = z.union([z.number(), z.string()]).transform(val =>\n typeof val === 'string' ? parseInt(val, 10) : val\n).optional();\n\nconst LANG_ENUM = ['de', 'en', 'es', 'fr', 'it', 'nl', 'pl', 'pt', 'ro'] as const;\nconst COUNTRY_ENUM = ['ad', 'ae', 'ar', 'at', 'au', 'be', 'br', 'ca', 'ch', 'cl', 'co', 'de', 'eg', 'es', 'fr', 'gb', 'in', 'it', 'lu', 'ma', 'mx', 'nl', 'pe', 'pl', 'pt', 'ro', 'us', 'za'] as const;\n\nconst AffiliationLinkSchema = z.object({\n url: z.string(),\n anchor: z.string()\n});\n\nconst AffiliationTopProductSchema = z.object({\n name: z.string(),\n urls: z.array(z.string()).optional(),\n affiliation_links: z.array(AffiliationLinkSchema).optional(),\n promo_code: z.string().optional(),\n promo_percentage: z.string().optional()\n});\n\nconst CTASchema = z.object({\n anchor: z.string(),\n url: z.string()\n});\n\nconst CreateArticleSchema = z.object({\n // Basic article fields\n subject: z.string().min(1, 'Subject is required'),\n title: z.string().optional(),\n keep_title: boolField,\n type: z.enum(['blog', 'affiliation-product-review', 'affiliation-compare-products', 'affiliation-top-product']).optional().default('blog'),\n lang: z.enum(LANG_ENUM).optional().default('en'),\n country: z.enum(COUNTRY_ENUM).optional(),\n length: z.union([z.number().max(5000), z.literal('auto')]).optional().default('auto'),\n target_keyword: z.string().optional(),\n keywords_secondary: z.string().optional(),\n search_intention_answer: z.string().optional(),\n additional_information: z.string().optional(),\n avoid_information: z.string().optional(),\n project_id: z.string().uuid().optional(),\n writing_style_mode: z.enum(['auto', 'persona']).optional().default('auto'),\n persona_id: z.string().uuid().optional(),\n apply_project_brief_config: boolField,\n\n // CTA\n use_cta: boolField,\n ctas: z.array(CTASchema).optional(),\n\n // SEO Features\n use_faq: boolField,\n faq_questions: z.string().optional(),\n use_toc: boolField,\n use_boldkeywords: boolField,\n use_internallinks: boolField,\n\n // Internal Links\n use_indexed_pages_internal_links: boolField,\n use_wp_internal_links: boolField,\n use_app_internal_links: boolField,\n use_list_internal_links: boolField,\n internal_links_wp_connection: z.string().optional(),\n internal_links_wp_status: z.array(z.string()).optional(),\n internal_links_list: z.string().optional(),\n\n // Image Features\n use_image: boolField,\n image_ratio: z.enum(['landscape', 'portrait', '16:9', '4:3', '1:1']).optional(),\n image_prompt: z.string().optional(),\n image_use_palette: boolField,\n image_primary_color: z.string().regex(/^#[0-9A-Fa-f]{6}$/).optional(),\n image_secondary_color: z.string().regex(/^#[0-9A-Fa-f]{6}$/).optional(),\n\n // Inline images (API uses \"inlineimages\")\n use_inlineimages: boolField,\n inlineimages_count: z.number().min(1).max(10).optional(),\n inline_images_ratio: z.enum(['landscape', 'portrait', '16:9', '4:3', '1:1']).optional(),\n inline_images_use_palette: boolField,\n inline_images_primary_color: z.string().regex(/^#[0-9A-Fa-f]{6}$/).optional(),\n inline_images_secondary_color: z.string().regex(/^#[0-9A-Fa-f]{6}$/).optional(),\n\n // Enhanced formatting & widgets\n use_enhancedformatting: boolField,\n use_widget: boolField,\n\n // Webhook\n use_webhook: boolField,\n webhook_connection_id: z.string().optional(),\n\n // WordPress Publishing\n use_publishwordpress: boolField,\n publishwordpress_date: z.string().optional(),\n publishwordpress_status: z.enum(['draft', 'publish', 'future']).optional(),\n publishwordpress_category: numField,\n publishwordpress_author: numField,\n publishwordpress_connection: z.string().uuid().optional(),\n\n // Shopify Publishing\n use_publishshopify: boolField,\n publishshopify_connection_id: z.string().optional(),\n\n // PrestaShop Publishing\n use_publishprestashop: boolField,\n publishprestashop_connection_id: z.string().optional(),\n\n // WooCommerce Publishing\n use_publishwoocommerce: boolField,\n publishwoocommerce_connection_id: z.string().optional(),\n\n // Content Features\n use_infotable: boolField,\n use_bulletlist: boolField,\n use_externalsources: boolField,\n use_blockquotes: boolField,\n use_summary: boolField,\n\n // Audio Features\n use_audio: boolField,\n audio_voice_id: z.string().optional(),\n\n // Social Media Generation\n use_social: boolField,\n social_networks: z.union([z.array(z.string()), z.string()]).optional(),\n\n // Information Search Control\n information_search_only_from_subject_sources: boolField,\n\n // Affiliation Product Review params\n affiliation_product_name: z.string().optional(),\n affiliation_product_review_urls: z.array(z.string()).optional(),\n affiliation_links: z.array(AffiliationLinkSchema).optional(),\n affiliation_promo_code: z.string().optional(),\n affiliation_promo_percentage: z.string().optional(),\n\n // Affiliation Compare Products params\n affiliation_product_1_name: z.string().optional(),\n affiliation_product_1_review_urls: z.array(z.string()).optional(),\n affiliation_links_product_1: z.array(AffiliationLinkSchema).optional(),\n affiliation_promo_code_1: z.string().optional(),\n affiliation_promo_percentage_1: z.string().optional(),\n affiliation_product_2_name: z.string().optional(),\n affiliation_product_2_review_urls: z.array(z.string()).optional(),\n affiliation_links_product_2: z.array(AffiliationLinkSchema).optional(),\n affiliation_promo_code_2: z.string().optional(),\n affiliation_promo_percentage_2: z.string().optional(),\n\n // Affiliation Top Products params\n affiliation_top_products: z.array(AffiliationTopProductSchema).optional()\n});\n\n// All article param keys for building inputSchema and addParam calls\nconst ARTICLE_PARAM_KEYS = [\n 'subject', 'title', 'keep_title', 'type', 'lang', 'country', 'length',\n 'target_keyword', 'keywords_secondary', 'search_intention_answer',\n 'additional_information', 'avoid_information', 'project_id',\n 'writing_style_mode', 'persona_id', 'apply_project_brief_config',\n 'use_cta', 'ctas',\n 'use_faq', 'faq_questions', 'use_toc', 'use_boldkeywords', 'use_internallinks',\n 'use_indexed_pages_internal_links', 'use_wp_internal_links', 'use_app_internal_links',\n 'use_list_internal_links', 'internal_links_wp_connection', 'internal_links_wp_status',\n 'internal_links_list',\n 'use_image', 'image_ratio', 'image_prompt', 'image_use_palette',\n 'image_primary_color', 'image_secondary_color',\n 'use_inlineimages', 'inlineimages_count', 'inline_images_ratio',\n 'inline_images_use_palette', 'inline_images_primary_color', 'inline_images_secondary_color',\n 'use_enhancedformatting', 'use_widget',\n 'use_webhook', 'webhook_connection_id',\n 'use_publishwordpress', 'publishwordpress_date', 'publishwordpress_status',\n 'publishwordpress_category', 'publishwordpress_author', 'publishwordpress_connection',\n 'use_publishshopify', 'publishshopify_connection_id',\n 'use_publishprestashop', 'publishprestashop_connection_id',\n 'use_publishwoocommerce', 'publishwoocommerce_connection_id',\n 'use_infotable', 'use_bulletlist', 'use_externalsources',\n 'use_blockquotes', 'use_summary',\n 'use_audio', 'audio_voice_id',\n 'use_social', 'social_networks',\n 'information_search_only_from_subject_sources',\n 'affiliation_product_name', 'affiliation_product_review_urls',\n 'affiliation_links', 'affiliation_promo_code', 'affiliation_promo_percentage',\n 'affiliation_product_1_name', 'affiliation_product_1_review_urls',\n 'affiliation_links_product_1', 'affiliation_promo_code_1', 'affiliation_promo_percentage_1',\n 'affiliation_product_2_name', 'affiliation_product_2_review_urls',\n 'affiliation_links_product_2', 'affiliation_promo_code_2', 'affiliation_promo_percentage_2',\n 'affiliation_top_products'\n] as const;\n\nexport class ArticleToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n private cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n\n getTools(): Tool[] {\n return [\n this.createArticleTool(),\n this.generateArticleTool(),\n this.getArticleTool(),\n this.listArticlesTool(),\n this.updateArticleTool(),\n this.getArticleOutputTool(),\n this.updateArticleOutputTool(),\n this.estimateCostTool()\n ];\n }\n\n private buildArticleInputSchema(): Record<string, any> {\n return {\n // Basic Article Fields\n subject: { type: 'string', description: 'The main subject or topic of the article', minLength: 1 },\n title: { type: 'string', description: 'Optional custom title (auto-generated if not provided)' },\n keep_title: { type: 'boolean', description: 'Whether to keep the provided title or allow AI to modify it' },\n type: { type: 'string', enum: ['blog', 'affiliation-product-review', 'affiliation-compare-products', 'affiliation-top-product'], description: 'Type of article to generate', default: 'blog' },\n lang: { type: 'string', enum: [...LANG_ENUM], description: 'Language for the article', default: 'en' },\n country: { type: 'string', enum: [...COUNTRY_ENUM], description: 'Target country for localization' },\n length: { oneOf: [{ type: 'number', maximum: 5000 }, { type: 'string', const: 'auto' }], description: 'Article length in words or \"auto\"', default: 'auto' },\n target_keyword: { type: 'string', description: 'Primary SEO keyword to target' },\n keywords_secondary: { type: 'string', description: 'Secondary keywords (comma-separated)' },\n search_intention_answer: { type: 'string', description: 'Expected search intention answer' },\n additional_information: { type: 'string', description: 'Additional context or requirements for the article' },\n avoid_information: { type: 'string', description: 'Information to avoid in the article' },\n project_id: { type: 'string', format: 'uuid', description: 'Project ID to associate with the article' },\n writing_style_mode: { type: 'string', enum: ['auto', 'persona'], description: 'Writing style mode', default: 'auto' },\n persona_id: { type: 'string', format: 'uuid', description: 'Persona ID for writing style (required if writing_style_mode is \"persona\")' },\n apply_project_brief_config: { type: 'boolean', description: 'Apply the project brief configuration', default: false },\n\n // CTA\n use_cta: { type: 'boolean', description: 'Include call-to-action buttons' },\n ctas: { type: 'array', items: { type: 'object', properties: { anchor: { type: 'string' }, url: { type: 'string' } }, required: ['anchor', 'url'] }, description: 'Call-to-action items with anchor text and URL' },\n\n // SEO Features\n use_faq: { type: 'boolean', description: 'Generate FAQ section' },\n faq_questions: { type: 'string', description: 'Custom FAQ questions (one per line)' },\n use_toc: { type: 'boolean', description: 'Generate table of contents' },\n use_boldkeywords: { type: 'boolean', description: 'Bold important keywords in content' },\n use_internallinks: { type: 'boolean', description: 'Add internal links automatically' },\n\n // Internal Links\n use_indexed_pages_internal_links: { type: 'boolean', description: 'Use indexed pages for internal linking' },\n use_wp_internal_links: { type: 'boolean', description: 'Use WordPress pages for internal linking' },\n use_app_internal_links: { type: 'boolean', description: 'Use app-managed internal links' },\n use_list_internal_links: { type: 'boolean', description: 'Use custom internal links from provided list' },\n internal_links_wp_connection: { type: 'string', description: 'WordPress connection ID for internal links' },\n internal_links_wp_status: { type: 'array', items: { type: 'string' }, description: 'WordPress post statuses to consider for internal links (default: [\"publish\"])' },\n internal_links_list: { type: 'string', description: 'Custom internal links list (comma-separated URLs or keywords)' },\n\n // Image Features\n use_image: { type: 'boolean', description: 'Generate featured image' },\n image_ratio: { type: 'string', enum: ['landscape', 'portrait', '16:9', '4:3', '1:1'], description: 'Image aspect ratio' },\n image_prompt: { type: 'string', description: 'Custom prompt for image generation' },\n image_use_palette: { type: 'boolean', description: 'Use color palette for featured image' },\n image_primary_color: { type: 'string', pattern: '^#[0-9A-Fa-f]{6}$', description: 'Primary color for featured image palette (hex code like #FF9F67)' },\n image_secondary_color: { type: 'string', pattern: '^#[0-9A-Fa-f]{6}$', description: 'Secondary color for featured image palette (hex code like #FFB584)' },\n\n // Inline Images\n use_inlineimages: { type: 'boolean', description: 'Generate inline images within content' },\n inlineimages_count: { type: 'number', minimum: 1, maximum: 10, description: 'Number of inline images to generate (1-10)' },\n inline_images_ratio: { type: 'string', enum: ['landscape', 'portrait', '16:9', '4:3', '1:1'], description: 'Aspect ratio for inline images' },\n inline_images_use_palette: { type: 'boolean', description: 'Use color palette for inline images' },\n inline_images_primary_color: { type: 'string', pattern: '^#[0-9A-Fa-f]{6}$', description: 'Primary color for inline images palette (hex code)' },\n inline_images_secondary_color: { type: 'string', pattern: '^#[0-9A-Fa-f]{6}$', description: 'Secondary color for inline images palette (hex code)' },\n\n // Enhanced formatting & widgets\n use_enhancedformatting: { type: 'boolean', description: 'Enable enhanced formatting (styled elements, callouts, etc.)' },\n use_widget: { type: 'boolean', description: 'Generate interactive widget' },\n\n // Webhook\n use_webhook: { type: 'boolean', description: 'Trigger webhook after generation' },\n webhook_connection_id: { type: 'string', description: 'Webhook connection ID' },\n\n // WordPress Publishing\n use_publishwordpress: { type: 'boolean', description: 'Automatically publish to WordPress' },\n publishwordpress_date: { type: 'string', description: 'WordPress publish date (ISO 8601)' },\n publishwordpress_status: { type: 'string', enum: ['draft', 'publish', 'future'], description: 'WordPress post status', default: 'draft' },\n publishwordpress_category: { type: 'number', description: 'WordPress category ID' },\n publishwordpress_author: { type: 'number', description: 'WordPress author ID' },\n publishwordpress_connection: { type: 'string', format: 'uuid', description: 'WordPress connection ID' },\n\n // Shopify Publishing\n use_publishshopify: { type: 'boolean', description: 'Automatically publish to Shopify' },\n publishshopify_connection_id: { type: 'string', description: 'Shopify connection ID' },\n\n // PrestaShop Publishing\n use_publishprestashop: { type: 'boolean', description: 'Automatically publish to PrestaShop' },\n publishprestashop_connection_id: { type: 'string', description: 'PrestaShop connection ID' },\n\n // WooCommerce Publishing\n use_publishwoocommerce: { type: 'boolean', description: 'Automatically publish to WooCommerce' },\n publishwoocommerce_connection_id: { type: 'string', description: 'WooCommerce connection ID' },\n\n // Content Enhancement Features\n use_infotable: { type: 'boolean', description: 'Include information tables' },\n use_bulletlist: { type: 'boolean', description: 'Use bullet point lists' },\n use_externalsources: { type: 'boolean', description: 'Include external source references' },\n use_blockquotes: { type: 'boolean', description: 'Add blockquotes for emphasis' },\n use_summary: { type: 'boolean', description: 'Include article summary' },\n\n // Audio Features\n use_audio: { type: 'boolean', description: 'Generate audio version of the article' },\n audio_voice_id: { type: 'string', description: 'Voice ID for audio generation' },\n\n // Social Media Generation\n use_social: { type: 'boolean', description: 'Generate social media posts for the article' },\n social_networks: { oneOf: [{ type: 'array', items: { type: 'string' } }, { type: 'string' }], description: 'Social networks to generate posts for (instagram, facebook, x, linkedin)' },\n\n // Information Search Control\n information_search_only_from_subject_sources: { type: 'boolean', description: 'Only use sources/links from the subject field for information search' },\n\n // Affiliation Product Review\n affiliation_product_name: { type: 'string', description: 'Product name for affiliation review' },\n affiliation_product_review_urls: { type: 'array', items: { type: 'string' }, description: 'Review URLs for affiliation product' },\n affiliation_links: { type: 'array', items: { type: 'object', properties: { url: { type: 'string' }, anchor: { type: 'string' } }, required: ['url', 'anchor'] }, description: 'Affiliation links with URL and anchor text' },\n affiliation_promo_code: { type: 'string', description: 'Promo code for affiliation product' },\n affiliation_promo_percentage: { type: 'string', description: 'Promo percentage for affiliation product' },\n\n // Affiliation Compare Products\n affiliation_product_1_name: { type: 'string', description: 'First product name for comparison' },\n affiliation_product_1_review_urls: { type: 'array', items: { type: 'string' }, description: 'Review URLs for first comparison product' },\n affiliation_links_product_1: { type: 'array', items: { type: 'object', properties: { url: { type: 'string' }, anchor: { type: 'string' } }, required: ['url', 'anchor'] }, description: 'Affiliation links for first comparison product' },\n affiliation_promo_code_1: { type: 'string', description: 'Promo code for first comparison product' },\n affiliation_promo_percentage_1: { type: 'string', description: 'Promo percentage for first comparison product' },\n affiliation_product_2_name: { type: 'string', description: 'Second product name for comparison' },\n affiliation_product_2_review_urls: { type: 'array', items: { type: 'string' }, description: 'Review URLs for second comparison product' },\n affiliation_links_product_2: { type: 'array', items: { type: 'object', properties: { url: { type: 'string' }, anchor: { type: 'string' } }, required: ['url', 'anchor'] }, description: 'Affiliation links for second comparison product' },\n affiliation_promo_code_2: { type: 'string', description: 'Promo code for second comparison product' },\n affiliation_promo_percentage_2: { type: 'string', description: 'Promo percentage for second comparison product' },\n\n // Affiliation Top Products\n affiliation_top_products: { type: 'array', items: { type: 'object', properties: { name: { type: 'string' }, urls: { type: 'array', items: { type: 'string' } }, affiliation_links: { type: 'array', items: { type: 'object', properties: { url: { type: 'string' }, anchor: { type: 'string' } } } }, promo_code: { type: 'string' }, promo_percentage: { type: 'string' } }, required: ['name'] }, description: 'Top products for affiliation article' }\n };\n }\n\n private buildApiInput(validated: any): any {\n const apiInput: any = {};\n const addParam = (key: string, value: any) => {\n if (value !== undefined && value !== null) {\n apiInput[key] = value;\n }\n };\n\n for (const key of ARTICLE_PARAM_KEYS) {\n addParam(key, validated[key]);\n }\n\n return apiInput;\n }\n\n private createArticleTool(): Tool {\n return {\n name: 'create_article',\n description: 'Create a new SEO-optimized article with Wisewand',\n inputSchema: {\n type: 'object',\n properties: this.buildArticleInputSchema(),\n required: ['subject', 'apply_project_brief_config']\n },\n handler: async (args) => {\n try {\n const validated = CreateArticleSchema.parse(args);\n const apiInput = this.buildApiInput(validated);\n\n const article = await this.apiClient.createArticle(apiInput);\n await this.cache.set(`article:${article.id}`, article, 300);\n this.metrics.recordAPICall('create_article', 'success');\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n success: true,\n article_id: article.id,\n title: article.title || 'Article created',\n message: `Article \"${article.title || validated.subject}\" created successfully.`,\n next_steps: [\n `Use 'generate_article' with article_id: ${article.id} to start content generation`,\n `Use 'get_article' with article_id: ${article.id} to check status`\n ]\n }, null, 2)\n }]\n };\n } catch (error: any) {\n logger.error('Failed to create article', { error: error.message });\n this.metrics.recordAPICall('create_article', 'error');\n return {\n content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to create article', details: error.issues || undefined }, null, 2) }],\n isError: true\n };\n }\n }\n };\n }\n\n private generateArticleTool(): Tool {\n return {\n name: 'generate_article',\n description: 'Generate content for an existing article',\n inputSchema: {\n type: 'object',\n properties: {\n article_id: { type: 'string', format: 'uuid', description: 'ID of the article to generate' },\n wait_for_completion: { type: 'boolean', description: 'Wait for generation to complete (may take several minutes)', default: true },\n max_wait_time: { type: 'number', description: 'Maximum time to wait in seconds', default: 300, maximum: 600 }\n },\n required: ['article_id']\n },\n handler: async (args) => {\n try {\n const { article_id, wait_for_completion = true, max_wait_time = 300 } = args;\n await this.apiClient.runArticleGeneration(article_id);\n\n if (!wait_for_completion) {\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Article generation started', article_id, next_step: `Use 'get_article' or 'get_article_output' to check status` }, null, 2) }] };\n }\n\n const startTime = Date.now();\n const pollInterval = 5000;\n const maxAttempts = Math.floor((max_wait_time * 1000) / pollInterval);\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n const status = await this.apiClient.getArticleStatus(article_id);\n\n if (status === 'completed' || status === 'success') {\n const output = await this.apiClient.getArticleOutput(article_id);\n await this.cache.set(`article:output:${article_id}`, output, 600);\n this.metrics.recordAPICall('generate_article', 'success');\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n success: true, status: 'completed', article_id,\n generation_time: Math.round((Date.now() - startTime) / 1000),\n output: { title: output.title, word_count: output.word_count, seo_score: output.seo_score, excerpt: output.excerpt?.substring(0, 200) + '...', has_faq: !!output.faq?.length, has_image: !!output.featured_image },\n message: 'Article generated successfully',\n next_steps: [`Use 'get_article_output' to get full content`, `Use 'publish_to_wordpress' to publish the article`]\n }, null, 2)\n }]\n };\n } else if (status === 'failed' || status === 'error') {\n throw new Error('Article generation failed');\n }\n\n if (attempt % 6 === 0) {\n logger.info('Article generation in progress', { article_id, elapsed: Math.round((Date.now() - startTime) / 1000), status });\n }\n }\n throw new Error(`Generation timeout after ${max_wait_time} seconds`);\n } catch (error: any) {\n logger.error('Failed to generate article', { error: error.message });\n this.metrics.recordAPICall('generate_article', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to generate article' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private getArticleTool(): Tool {\n return {\n name: 'get_article',\n description: 'Get article details and status',\n inputSchema: {\n type: 'object',\n properties: { article_id: { type: 'string', format: 'uuid', description: 'ID of the article to retrieve' } },\n required: ['article_id']\n },\n handler: async (args) => {\n try {\n const { article_id } = args;\n const cached = await this.cache.get(`article:${article_id}`);\n if (cached) {\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, article: cached, from_cache: true }, null, 2) }] };\n }\n const article = await this.apiClient.getArticle(article_id);\n await this.cache.set(`article:${article_id}`, article, 300);\n this.metrics.recordAPICall('get_article', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, article }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get article', { error: error.message });\n this.metrics.recordAPICall('get_article', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to retrieve article' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private listArticlesTool(): Tool {\n return {\n name: 'list_articles',\n description: 'List and search articles',\n inputSchema: {\n type: 'object',\n properties: {\n search: { type: 'string', description: 'Search term to filter articles' },\n status: { type: 'string', description: 'Filter by status' },\n projectId: { type: 'string', format: 'uuid', description: 'Filter by project (camelCase as per API)' },\n project_id: { type: 'string', format: 'uuid', description: 'Filter by project (alias)' },\n maker: { type: 'string', description: 'Filter by maker' },\n persona: { type: 'string', description: 'Filter by persona' },\n author: { type: 'string', description: 'Filter by author' },\n category: { type: 'string', description: 'Filter by category' },\n published: { type: 'string', description: 'Filter by published status' },\n skip: { type: 'number', description: 'Number of items to skip', default: 0, minimum: 0 },\n take: { type: 'number', description: 'Number of items to retrieve', default: 10, minimum: 1, maximum: 50 },\n sort: { type: 'string', description: 'Sort field' },\n order: { type: 'string', enum: ['asc', 'desc'], description: 'Sort order' }\n }\n },\n handler: async (args) => {\n try {\n const result = await this.apiClient.listArticles(args);\n this.metrics.recordAPICall('list_articles', 'success');\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n success: true, total: result.total, count: result.items.length,\n articles: result.items.map(a => ({ id: a.id, title: a.title, status: a.status, created_at: a.created_at, type: a.data?.input?.type })),\n pagination: { skip: result.skip, take: result.take, has_more: result.skip + result.take < result.total }\n }, null, 2)\n }]\n };\n } catch (error: any) {\n logger.error('Failed to list articles', { error: error.message });\n this.metrics.recordAPICall('list_articles', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to list articles' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private updateArticleTool(): Tool {\n return {\n name: 'update_article',\n description: 'Update an existing article. Supports ALL article parameters (same as create_article).',\n inputSchema: {\n type: 'object',\n properties: {\n article_id: { type: 'string', format: 'uuid', description: 'ID of the article to update' },\n updates: {\n type: 'object',\n description: 'Fields to update (supports all create_article parameters)',\n properties: this.buildArticleInputSchema()\n }\n },\n required: ['article_id', 'updates']\n },\n handler: async (args) => {\n try {\n const { article_id, updates } = args;\n await this.apiClient.updateArticle(article_id, updates);\n await this.cache.delete(`article:${article_id}`);\n this.metrics.recordAPICall('update_article', 'success');\n return {\n content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Article updated successfully', article_id, updated_fields: Object.keys(updates) }, null, 2) }]\n };\n } catch (error: any) {\n logger.error('Failed to update article', { error: error.message });\n this.metrics.recordAPICall('update_article', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to update article' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private getArticleOutputTool(): Tool {\n return {\n name: 'get_article_output',\n description: 'Get the generated content of an article',\n inputSchema: {\n type: 'object',\n properties: {\n article_id: { type: 'string', format: 'uuid', description: 'ID of the article' },\n format: { type: 'string', enum: ['full', 'html', 'markdown', 'summary'], description: 'Output format', default: 'full' }\n },\n required: ['article_id']\n },\n handler: async (args) => {\n try {\n const { article_id, format = 'full' } = args;\n const cacheKey = `article:output:${article_id}`;\n const cached = await this.cache.get(cacheKey);\n const output = (cached || await this.apiClient.getArticleOutput(article_id)) as any;\n if (!cached && output) { await this.cache.set(cacheKey, output, 600); }\n this.metrics.recordAPICall('get_article_output', 'success');\n\n let formattedOutput;\n switch (format) {\n case 'html': formattedOutput = { html: output.html_content, title: output.title }; break;\n case 'markdown': formattedOutput = { content: output.content, title: output.title }; break;\n case 'summary': formattedOutput = { title: output.title, excerpt: output.excerpt, word_count: output.word_count, seo_score: output.seo_score }; break;\n default: formattedOutput = output;\n }\n\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, article_id, format, output: formattedOutput, from_cache: !!cached }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get article output', { error: error.message });\n this.metrics.recordAPICall('get_article_output', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to get article output' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private updateArticleOutputTool(): Tool {\n return {\n name: 'update_article_output',\n description: 'Update the generated output of an article',\n inputSchema: {\n type: 'object',\n properties: {\n article_id: { type: 'string', format: 'uuid', description: 'ID of the article' },\n output_id: { type: 'string', format: 'uuid', description: 'ID of the output to update' },\n updates: { type: 'object', description: 'Fields to update in the output' }\n },\n required: ['article_id', 'output_id', 'updates']\n },\n handler: async (args) => {\n try {\n const { article_id, output_id, updates } = args;\n const result = await this.apiClient.updateArticleOutput(article_id, output_id, updates);\n await this.cache.delete(`article:output:${article_id}`);\n this.metrics.recordAPICall('update_article_output', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Article output updated successfully', article_id, output_id, result }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to update article output', { error: error.message });\n this.metrics.recordAPICall('update_article_output', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to update article output' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private estimateCostTool(): Tool {\n return {\n name: 'estimate_article_cost',\n description: 'Estimate the cost of generating an article',\n inputSchema: {\n type: 'object',\n properties: {\n subject: { type: 'string', description: 'Article subject', minLength: 1 },\n length: { oneOf: [{ type: 'number', maximum: 5000 }, { type: 'string', const: 'auto' }], default: 'auto' },\n use_image: { type: 'boolean', default: false },\n use_seo_features: { type: 'boolean', default: false }\n },\n required: ['subject']\n },\n handler: async (args) => {\n try {\n const cost = await this.apiClient.calculateArticleCost(args as any);\n this.metrics.recordAPICall('estimate_cost', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, cost_estimate: cost, message: `Estimated cost: ${cost.credits} credits ($${cost.cost_usd})` }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to estimate cost', { error: error.message });\n this.metrics.recordAPICall('estimate_cost', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to estimate cost' }, null, 2) }], isError: true };\n }\n }\n };\n }\n}\n","/**\n * Project Tool Handler\n */\n\nimport { z } from 'zod';\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nconst CreateProjectSchema = z.object({\n name: z.string().min(1, 'Project name is required'),\n website_url: z.string().url().optional(),\n description: z.string().optional(),\n default_lang: z.enum(['fr', 'en']).optional(),\n default_country: z.enum(['fr', 'be', 'ch', 'ca', 'us', 'gb']).optional(),\n default_persona_id: z.string().uuid().optional(),\n default_settings: z.record(z.any()).optional()\n});\n\nexport class ProjectToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n private cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n \n getTools(): Tool[] {\n return [\n this.createProjectTool(),\n this.getProjectTool(),\n this.listProjectsTool(),\n this.updateProjectTool(),\n this.deleteProjectTool()\n ];\n }\n \n private createProjectTool(): Tool {\n return {\n name: 'create_project',\n description: 'Create a new project for organizing content',\n inputSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Project name',\n minLength: 1\n },\n website_url: {\n type: 'string',\n format: 'uri',\n description: 'Associated website URL'\n },\n description: {\n type: 'string',\n description: 'Project description'\n },\n default_lang: {\n type: 'string',\n enum: ['fr', 'en'],\n description: 'Default language for content'\n },\n default_country: {\n type: 'string',\n enum: ['fr', 'be', 'ch', 'ca', 'us', 'gb'],\n description: 'Default target country'\n },\n default_persona_id: {\n type: 'string',\n format: 'uuid',\n description: 'Default writing persona'\n }\n },\n required: ['name']\n },\n handler: async (args) => {\n try {\n const validated = CreateProjectSchema.parse(args);\n const project = await this.apiClient.createProject(validated);\n \n await this.cache.set(`project:${project.id}`, project, 600);\n this.metrics.recordAPICall('create_project', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n project_id: project.id,\n name: project.name,\n message: `Project \"${project.name}\" created successfully`\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to create project', { error: error.message });\n this.metrics.recordAPICall('create_project', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to create project'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n \n private getProjectTool(): Tool {\n return {\n name: 'get_project',\n description: 'Get project details',\n inputSchema: {\n type: 'object',\n properties: {\n project_id: {\n type: 'string',\n format: 'uuid',\n description: 'Project ID'\n }\n },\n required: ['project_id']\n },\n handler: async (args) => {\n try {\n const { project_id } = args;\n \n const cached = await this.cache.get(`project:${project_id}`);\n if (cached) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n project: cached,\n from_cache: true\n }, null, 2)\n }\n ]\n };\n }\n \n const project = await this.apiClient.getProject(project_id);\n await this.cache.set(`project:${project_id}`, project, 600);\n this.metrics.recordAPICall('get_project', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n project\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to get project', { error: error.message });\n this.metrics.recordAPICall('get_project', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to get project'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n \n private listProjectsTool(): Tool {\n return {\n name: 'list_projects',\n description: 'List all projects',\n inputSchema: {\n type: 'object',\n properties: {\n search: {\n type: 'string',\n description: 'Search term'\n },\n skip: {\n type: 'number',\n default: 0,\n minimum: 0\n },\n take: {\n type: 'number',\n default: 10,\n minimum: 1,\n maximum: 50\n }\n }\n },\n handler: async (args) => {\n try {\n const result = await this.apiClient.listProjects(args);\n this.metrics.recordAPICall('list_projects', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n total: result.total,\n count: result.items.length,\n projects: result.items.map(p => ({\n id: p.id,\n name: p.name,\n website_url: p.website_url,\n created_at: p.created_at\n }))\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to list projects', { error: error.message });\n this.metrics.recordAPICall('list_projects', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to list projects'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n \n private updateProjectTool(): Tool {\n return {\n name: 'update_project',\n description: 'Update project settings',\n inputSchema: {\n type: 'object',\n properties: {\n project_id: {\n type: 'string',\n format: 'uuid',\n description: 'Project ID'\n },\n updates: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n website_url: { type: 'string', format: 'uri' },\n description: { type: 'string' },\n default_lang: { type: 'string', enum: ['fr', 'en'] },\n default_country: { type: 'string', enum: ['fr', 'be', 'ch', 'ca', 'us', 'gb'] },\n default_persona_id: { type: 'string', format: 'uuid' }\n }\n }\n },\n required: ['project_id', 'updates']\n },\n handler: async (args) => {\n try {\n const { project_id, updates } = args;\n await this.apiClient.updateProject(project_id, updates);\n \n await this.cache.delete(`project:${project_id}`);\n this.metrics.recordAPICall('update_project', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n message: 'Project updated successfully',\n project_id,\n updated_fields: Object.keys(updates)\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to update project', { error: error.message });\n this.metrics.recordAPICall('update_project', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to update project'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n \n private deleteProjectTool(): Tool {\n return {\n name: 'delete_project',\n description: 'Delete a project',\n inputSchema: {\n type: 'object',\n properties: {\n project_id: {\n type: 'string',\n format: 'uuid',\n description: 'Project ID to delete'\n },\n confirm: {\n type: 'boolean',\n description: 'Confirm deletion',\n const: true\n }\n },\n required: ['project_id', 'confirm']\n },\n handler: async (args) => {\n try {\n const { project_id, confirm } = args;\n \n if (!confirm) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: 'Deletion not confirmed. Set confirm: true to proceed.'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n \n await this.apiClient.deleteProject(project_id);\n await this.cache.delete(`project:${project_id}`);\n this.metrics.recordAPICall('delete_project', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n message: 'Project deleted successfully',\n project_id\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to delete project', { error: error.message });\n this.metrics.recordAPICall('delete_project', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to delete project'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n}","/**\n * Publishing Tool Handler\n */\n\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nexport class PublishingToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n _cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n\n getTools(): Tool[] {\n return [\n this.publishToWordPressTool(),\n this.triggerWebhookTool(),\n this.publishToShopifyTool(),\n this.publishToPrestashopTool(),\n this.publishToWoocommerceTool()\n ];\n }\n\n private publishToWordPressTool(): Tool {\n return {\n name: 'publish_to_wordpress',\n description: 'Publish content to WordPress',\n inputSchema: {\n type: 'object',\n properties: {\n entity_id: { type: 'string', format: 'uuid', description: 'ID of the article/content to publish' },\n status: { type: 'string', enum: ['draft', 'publish', 'future'], description: 'Publishing status', default: 'draft' },\n schedule_date: { type: 'string', format: 'date-time', description: 'Schedule date for future publishing (ISO 8601)' },\n category_id: { type: 'number', description: 'WordPress category ID' },\n author_id: { type: 'number', description: 'WordPress author ID' },\n connection_id: { type: 'string', format: 'uuid', description: 'WordPress connection ID' }\n },\n required: ['entity_id']\n },\n handler: async (args) => {\n try {\n const { entity_id, ...options } = args;\n const result = await this.apiClient.publishToWordPress(entity_id, options);\n this.metrics.recordAPICall('publish_wordpress', result.success ? 'success' : 'error');\n if (result.success) {\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Content published to WordPress successfully', entity_id, wordpress_url: result.url, status: options.status || 'draft' }, null, 2) }] };\n } else {\n throw new Error(result.error || 'Publishing failed');\n }\n } catch (error: any) {\n logger.error('Failed to publish to WordPress', { error: error.message });\n this.metrics.recordAPICall('publish_wordpress', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to publish to WordPress' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private triggerWebhookTool(): Tool {\n return {\n name: 'trigger_webhook',\n description: 'Send content via webhook',\n inputSchema: {\n type: 'object',\n properties: {\n entity_id: { type: 'string', format: 'uuid', description: 'ID of the content to send' },\n webhook_id: { type: 'string', format: 'uuid', description: 'ID of the webhook configuration' }\n },\n required: ['entity_id', 'webhook_id']\n },\n handler: async (args) => {\n try {\n const { entity_id, webhook_id } = args;\n const result = await this.apiClient.triggerWebhook(entity_id, webhook_id);\n this.metrics.recordAPICall('trigger_webhook', result.success ? 'success' : 'error');\n if (result.success) {\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Webhook triggered successfully', entity_id, webhook_id, response: result.response }, null, 2) }] };\n } else {\n throw new Error(result.error || 'Webhook trigger failed');\n }\n } catch (error: any) {\n logger.error('Failed to trigger webhook', { error: error.message });\n this.metrics.recordAPICall('trigger_webhook', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to trigger webhook' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private publishToShopifyTool(): Tool {\n return {\n name: 'publish_to_shopify',\n description: 'Publish content to Shopify',\n inputSchema: {\n type: 'object',\n properties: {\n entity_id: { type: 'string', format: 'uuid', description: 'ID of the content to publish' },\n connection_id: { type: 'string', format: 'uuid', description: 'Shopify connection ID' }\n },\n required: ['entity_id']\n },\n handler: async (args) => {\n try {\n const { entity_id, ...options } = args;\n const result = await this.apiClient.publishToShopify(entity_id, options);\n this.metrics.recordAPICall('publish_shopify', result.success ? 'success' : 'error');\n if (result.success) {\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Content published to Shopify successfully', entity_id, url: result.url }, null, 2) }] };\n } else {\n throw new Error(result.error || 'Shopify publishing failed');\n }\n } catch (error: any) {\n logger.error('Failed to publish to Shopify', { error: error.message });\n this.metrics.recordAPICall('publish_shopify', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to publish to Shopify' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private publishToPrestashopTool(): Tool {\n return {\n name: 'publish_to_prestashop',\n description: 'Publish content to PrestaShop',\n inputSchema: {\n type: 'object',\n properties: {\n entity_id: { type: 'string', format: 'uuid', description: 'ID of the content to publish' },\n connection_id: { type: 'string', format: 'uuid', description: 'PrestaShop connection ID' }\n },\n required: ['entity_id']\n },\n handler: async (args) => {\n try {\n const { entity_id, ...options } = args;\n const result = await this.apiClient.publishToPrestashop(entity_id, options);\n this.metrics.recordAPICall('publish_prestashop', result.success ? 'success' : 'error');\n if (result.success) {\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Content published to PrestaShop successfully', entity_id, url: result.url }, null, 2) }] };\n } else {\n throw new Error(result.error || 'PrestaShop publishing failed');\n }\n } catch (error: any) {\n logger.error('Failed to publish to PrestaShop', { error: error.message });\n this.metrics.recordAPICall('publish_prestashop', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to publish to PrestaShop' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private publishToWoocommerceTool(): Tool {\n return {\n name: 'publish_to_woocommerce',\n description: 'Publish content to WooCommerce',\n inputSchema: {\n type: 'object',\n properties: {\n entity_id: { type: 'string', format: 'uuid', description: 'ID of the content to publish' },\n connection_id: { type: 'string', format: 'uuid', description: 'WooCommerce connection ID' }\n },\n required: ['entity_id']\n },\n handler: async (args) => {\n try {\n const { entity_id, ...options } = args;\n const result = await this.apiClient.publishToWoocommerce(entity_id, options);\n this.metrics.recordAPICall('publish_woocommerce', result.success ? 'success' : 'error');\n if (result.success) {\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Content published to WooCommerce successfully', entity_id, url: result.url }, null, 2) }] };\n } else {\n throw new Error(result.error || 'WooCommerce publishing failed');\n }\n } catch (error: any) {\n logger.error('Failed to publish to WooCommerce', { error: error.message });\n this.metrics.recordAPICall('publish_woocommerce', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to publish to WooCommerce' }, null, 2) }], isError: true };\n }\n }\n };\n }\n}\n","/**\n * Persona Tool Handler\n */\n\nimport { z } from 'zod';\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nconst CreatePersonaSchema = z.object({\n name: z.string().min(1, 'Persona name is required'),\n description: z.string().optional(),\n tone: z.string().optional(),\n style: z.string().optional(),\n voice: z.string().optional(),\n examples: z.array(z.string()).optional(),\n guidelines: z.string().optional()\n});\n\nexport class PersonaToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n private cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n \n getTools(): Tool[] {\n return [\n this.createPersonaTool(),\n this.getPersonaTool(),\n this.listPersonasTool(),\n this.updatePersonaTool(),\n this.deletePersonaTool()\n ];\n }\n \n private createPersonaTool(): Tool {\n return {\n name: 'create_persona',\n description: 'Create a writing persona for content style',\n inputSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Persona name',\n minLength: 1\n },\n description: {\n type: 'string',\n description: 'Description of the persona'\n },\n tone: {\n type: 'string',\n description: 'Writing tone (e.g., professional, casual, friendly)'\n },\n style: {\n type: 'string',\n description: 'Writing style (e.g., informative, persuasive, narrative)'\n },\n voice: {\n type: 'string',\n description: 'Writing voice (e.g., first person, third person)'\n },\n examples: {\n type: 'array',\n items: { type: 'string' },\n description: 'Example sentences in this persona\\'s style'\n },\n guidelines: {\n type: 'string',\n description: 'Additional guidelines for this persona'\n }\n },\n required: ['name']\n },\n handler: async (args) => {\n try {\n const validated = CreatePersonaSchema.parse(args);\n const persona = await this.apiClient.createPersona(validated);\n \n await this.cache.set(`persona:${persona.id}`, persona, 600);\n this.metrics.recordAPICall('create_persona', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n persona_id: persona.id,\n name: persona.name,\n message: `Persona \"${persona.name}\" created successfully`\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to create persona', { error: error.message });\n this.metrics.recordAPICall('create_persona', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to create persona'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n \n private getPersonaTool(): Tool {\n return {\n name: 'get_persona',\n description: 'Get persona details',\n inputSchema: {\n type: 'object',\n properties: {\n persona_id: {\n type: 'string',\n format: 'uuid',\n description: 'Persona ID'\n }\n },\n required: ['persona_id']\n },\n handler: async (args) => {\n try {\n const { persona_id } = args;\n \n const cached = await this.cache.get(`persona:${persona_id}`);\n if (cached) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n persona: cached,\n from_cache: true\n }, null, 2)\n }\n ]\n };\n }\n \n const persona = await this.apiClient.getPersona(persona_id);\n await this.cache.set(`persona:${persona_id}`, persona, 600);\n this.metrics.recordAPICall('get_persona', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n persona\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to get persona', { error: error.message });\n this.metrics.recordAPICall('get_persona', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to get persona'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n \n private listPersonasTool(): Tool {\n return {\n name: 'list_personas',\n description: 'List all personas',\n inputSchema: {\n type: 'object',\n properties: {\n search: {\n type: 'string',\n description: 'Search term'\n },\n skip: {\n type: 'number',\n default: 0,\n minimum: 0\n },\n take: {\n type: 'number',\n default: 10,\n minimum: 1,\n maximum: 50\n }\n }\n },\n handler: async (args) => {\n try {\n const result = await this.apiClient.listPersonas(args);\n this.metrics.recordAPICall('list_personas', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n total: result.total,\n count: result.items.length,\n personas: result.items.map(p => ({\n id: p.id,\n name: p.name,\n tone: p.tone,\n style: p.style,\n created_at: p.created_at\n }))\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to list personas', { error: error.message });\n this.metrics.recordAPICall('list_personas', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to list personas'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n \n private updatePersonaTool(): Tool {\n return {\n name: 'update_persona',\n description: 'Update persona settings',\n inputSchema: {\n type: 'object',\n properties: {\n persona_id: {\n type: 'string',\n format: 'uuid',\n description: 'Persona ID'\n },\n updates: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n description: { type: 'string' },\n tone: { type: 'string' },\n style: { type: 'string' },\n voice: { type: 'string' },\n examples: {\n type: 'array',\n items: { type: 'string' }\n },\n guidelines: { type: 'string' }\n }\n }\n },\n required: ['persona_id', 'updates']\n },\n handler: async (args) => {\n try {\n const { persona_id, updates } = args;\n await this.apiClient.updatePersona(persona_id, updates);\n \n await this.cache.delete(`persona:${persona_id}`);\n this.metrics.recordAPICall('update_persona', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n message: 'Persona updated successfully',\n persona_id,\n updated_fields: Object.keys(updates)\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to update persona', { error: error.message });\n this.metrics.recordAPICall('update_persona', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to update persona'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n \n private deletePersonaTool(): Tool {\n return {\n name: 'delete_persona',\n description: 'Delete a persona',\n inputSchema: {\n type: 'object',\n properties: {\n persona_id: {\n type: 'string',\n format: 'uuid',\n description: 'Persona ID to delete'\n },\n confirm: {\n type: 'boolean',\n description: 'Confirm deletion',\n const: true\n }\n },\n required: ['persona_id', 'confirm']\n },\n handler: async (args) => {\n try {\n const { persona_id, confirm } = args;\n \n if (!confirm) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: 'Deletion not confirmed. Set confirm: true to proceed.'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n \n await this.apiClient.deletePersona(persona_id);\n await this.cache.delete(`persona:${persona_id}`);\n this.metrics.recordAPICall('delete_persona', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n message: 'Persona deleted successfully',\n persona_id\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to delete persona', { error: error.message });\n this.metrics.recordAPICall('delete_persona', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to delete persona'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n}","/**\n * Bulk Operations Tool Handler\n */\n\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\nimport PQueue from 'p-queue';\n\nexport class BulkOperationsToolHandler implements ToolHandler {\n private queue: PQueue;\n \n constructor(\n private apiClient: WisewandAPIClient,\n _cache: CacheManager,\n private metrics: MetricsCollector\n ) {\n this.queue = new PQueue({ concurrency: 5 });\n }\n \n getTools(): Tool[] {\n return [\n this.bulkCreateArticlesTool(),\n this.bulkEstimateCostTool()\n ];\n }\n \n private bulkCreateArticlesTool(): Tool {\n return {\n name: 'bulk_create_articles',\n description: 'Create multiple articles in batch',\n inputSchema: {\n type: 'object',\n properties: {\n articles: {\n type: 'array',\n description: 'Array of article configurations',\n items: {\n type: 'object',\n properties: {\n subject: { type: 'string', minLength: 1 },\n title: { type: 'string' },\n type: {\n type: 'string',\n enum: ['blog', 'affiliation-product-review', 'affiliation-compare-products', 'affiliation-top-product']\n },\n lang: { type: 'string', enum: ['fr', 'en'] },\n target_keyword: { type: 'string' },\n project_id: { type: 'string', format: 'uuid' }\n },\n required: ['subject']\n },\n minItems: 1,\n maxItems: 100\n },\n auto_generate: {\n type: 'boolean',\n description: 'Automatically generate content after creation',\n default: false\n }\n },\n required: ['articles']\n },\n handler: async (args) => {\n try {\n const { articles, auto_generate = false } = args;\n \n logger.info('Starting bulk article creation', { count: articles.length });\n \n // Create articles\n const createResult = await this.apiClient.createBulkArticles(articles);\n \n const results = {\n total: articles.length,\n created: createResult.items.length,\n failed: createResult.errors?.length || 0,\n articles: createResult.items.map(a => ({\n id: a.id,\n title: a.title,\n status: a.status\n })),\n errors: createResult.errors\n };\n \n // Auto-generate if requested\n if (auto_generate && createResult.items.length > 0) {\n logger.info('Starting auto-generation for bulk articles');\n \n const generationPromises = createResult.items.map(article =>\n this.queue.add(async () => {\n try {\n await this.apiClient.runArticleGeneration(article.id);\n return { id: article.id, status: 'generation_started' };\n } catch (error) {\n return { id: article.id, status: 'generation_failed', error };\n }\n })\n );\n \n const generationResults = await Promise.all(generationPromises);\n (results as any)['generation'] = generationResults;\n }\n \n this.metrics.recordAPICall('bulk_create_articles', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n message: `Created ${results.created} articles successfully`,\n results,\n auto_generate\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed bulk article creation', { error: error.message });\n this.metrics.recordAPICall('bulk_create_articles', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to create articles in bulk'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n \n private bulkEstimateCostTool(): Tool {\n return {\n name: 'bulk_estimate_cost',\n description: 'Estimate cost for bulk article generation',\n inputSchema: {\n type: 'object',\n properties: {\n articles: {\n type: 'array',\n description: 'Array of article configurations',\n items: {\n type: 'object',\n properties: {\n subject: { type: 'string', minLength: 1 },\n length: {\n oneOf: [\n { type: 'number', maximum: 5000 },\n { type: 'string', const: 'auto' }\n ]\n },\n use_image: { type: 'boolean' },\n use_seo_features: { type: 'boolean' }\n },\n required: ['subject']\n },\n minItems: 1,\n maxItems: 100\n }\n },\n required: ['articles']\n },\n handler: async (args) => {\n try {\n const { articles } = args;\n \n const result = await this.apiClient.calculateBulkCost(articles);\n \n this.metrics.recordAPICall('bulk_estimate_cost', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n total_cost: {\n credits: result.total,\n usd: (result.total * 0.01).toFixed(2) // Assuming 1 credit = $0.01\n },\n article_count: articles.length,\n average_cost_per_article: {\n credits: Math.round(result.total / articles.length),\n usd: ((result.total / articles.length) * 0.01).toFixed(2)\n },\n breakdown: result.breakdown\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to estimate bulk cost', { error: error.message });\n this.metrics.recordAPICall('bulk_estimate_cost', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to estimate bulk cost'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n}","/**\n * Connections Tool Handler\n * Manages WordPress and Webhook connections\n */\n\nimport { z } from 'zod';\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nconst CreateConnectionSchema = z.object({\n name: z.string().min(1, 'Connection name is required'),\n type: z.enum(['wordpress', 'webhook', 'other']),\n configuration: z.record(z.any())\n});\n\nexport class ConnectionsToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n private cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n\n getTools(): Tool[] {\n return [\n this.listConnectionsTool(),\n this.getConnectionTool(),\n this.createConnectionTool(),\n this.updateConnectionTool(),\n this.deleteConnectionTool()\n ];\n }\n\n private listConnectionsTool(): Tool {\n return {\n name: 'list_connections',\n description: 'List all WordPress and webhook connections',\n inputSchema: {\n type: 'object',\n properties: {\n search: {\n type: 'string',\n description: 'Search term'\n },\n skip: {\n type: 'number',\n default: 0,\n minimum: 0\n },\n take: {\n type: 'number',\n default: 10,\n minimum: 1,\n maximum: 50\n }\n }\n },\n handler: async (args) => {\n try {\n const result = await this.apiClient.listConnections(args);\n this.metrics.recordAPICall('list_connections', 'success');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n total: result.total,\n count: result.items.length,\n connections: result.items.map(c => ({\n id: c.id,\n name: c.name,\n type: c.type,\n status: c.status,\n created_at: c.created_at\n }))\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to list connections', { error: error.message });\n this.metrics.recordAPICall('list_connections', 'error');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to list connections'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n\n private getConnectionTool(): Tool {\n return {\n name: 'get_connection',\n description: 'Get connection details by ID',\n inputSchema: {\n type: 'object',\n properties: {\n connection_id: {\n type: 'string',\n format: 'uuid',\n description: 'Connection ID'\n }\n },\n required: ['connection_id']\n },\n handler: async (args) => {\n try {\n const { connection_id } = args;\n\n const cached = await this.cache.get(`connection:${connection_id}`);\n if (cached) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n connection: cached,\n from_cache: true\n }, null, 2)\n }\n ]\n };\n }\n\n const connection = await this.apiClient.getConnection(connection_id);\n await this.cache.set(`connection:${connection_id}`, connection, 600);\n this.metrics.recordAPICall('get_connection', 'success');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n connection\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to get connection', { error: error.message });\n this.metrics.recordAPICall('get_connection', 'error');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to get connection'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n\n private createConnectionTool(): Tool {\n return {\n name: 'create_connection',\n description: 'Create a new WordPress or webhook connection',\n inputSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Connection name',\n minLength: 1\n },\n type: {\n type: 'string',\n enum: ['wordpress', 'webhook', 'other'],\n description: 'Connection type'\n },\n configuration: {\n type: 'object',\n description: 'Connection configuration (WordPress credentials, webhook URL, etc.)',\n additionalProperties: true\n }\n },\n required: ['name', 'type', 'configuration']\n },\n handler: async (args) => {\n try {\n const validated = CreateConnectionSchema.parse(args);\n const connection = await this.apiClient.createConnection(validated);\n\n await this.cache.set(`connection:${connection.id}`, connection, 600);\n this.metrics.recordAPICall('create_connection', 'success');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n connection_id: connection.id,\n name: connection.name,\n type: connection.type,\n message: `Connection \"${connection.name}\" created successfully`\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to create connection', { error: error.message });\n this.metrics.recordAPICall('create_connection', 'error');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to create connection'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n\n private updateConnectionTool(): Tool {\n return {\n name: 'update_connection',\n description: 'Update an existing connection',\n inputSchema: {\n type: 'object',\n properties: {\n connection_id: {\n type: 'string',\n format: 'uuid',\n description: 'Connection ID'\n },\n updates: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n configuration: { type: 'object', additionalProperties: true }\n }\n }\n },\n required: ['connection_id', 'updates']\n },\n handler: async (args) => {\n try {\n const { connection_id, updates } = args;\n await this.apiClient.updateConnection(connection_id, updates);\n\n await this.cache.delete(`connection:${connection_id}`);\n this.metrics.recordAPICall('update_connection', 'success');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n message: 'Connection updated successfully',\n connection_id\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to update connection', { error: error.message });\n this.metrics.recordAPICall('update_connection', 'error');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to update connection'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n\n private deleteConnectionTool(): Tool {\n return {\n name: 'delete_connection',\n description: 'Delete a connection',\n inputSchema: {\n type: 'object',\n properties: {\n connection_id: {\n type: 'string',\n format: 'uuid',\n description: 'Connection ID to delete'\n },\n confirm: {\n type: 'boolean',\n description: 'Confirm deletion',\n const: true\n }\n },\n required: ['connection_id', 'confirm']\n },\n handler: async (args) => {\n try {\n const { connection_id, confirm } = args;\n\n if (!confirm) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: 'Deletion not confirmed. Set confirm: true to proceed.'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n\n await this.apiClient.deleteConnection(connection_id);\n await this.cache.delete(`connection:${connection_id}`);\n this.metrics.recordAPICall('delete_connection', 'success');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n message: 'Connection deleted successfully',\n connection_id\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to delete connection', { error: error.message });\n this.metrics.recordAPICall('delete_connection', 'error');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to delete connection'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n}","/**\n * Utility Tool Handler\n * Provides access to authors, categories, and usage statistics\n */\n\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nexport class UtilityToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n private cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n\n getTools(): Tool[] {\n return [\n this.getAuthorsTool(),\n this.getCategoriesTool(),\n this.getUsageSummaryTool()\n ];\n }\n\n private getAuthorsTool(): Tool {\n return {\n name: 'get_authors',\n description: 'Get list of available authors for WordPress publishing',\n inputSchema: {\n type: 'object',\n properties: {}\n },\n handler: async (_args) => {\n try {\n const cacheKey = 'utility:authors';\n const cached = await this.cache.get(cacheKey);\n\n const result = (cached || await this.apiClient.getAuthors()) as any;\n\n if (!cached && result) {\n await this.cache.set(cacheKey, result, 300); // 5 min cache\n }\n\n this.metrics.recordAPICall('get_authors', 'success');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n total: result.total || result.items?.length || 0,\n authors: result.items || result,\n from_cache: !!cached\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to get authors', { error: error.message });\n this.metrics.recordAPICall('get_authors', 'error');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to get authors'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n\n private getCategoriesTool(): Tool {\n return {\n name: 'get_categories',\n description: 'Get list of available categories for WordPress publishing',\n inputSchema: {\n type: 'object',\n properties: {}\n },\n handler: async (_args) => {\n try {\n const cacheKey = 'utility:categories';\n const cached = await this.cache.get(cacheKey);\n\n const result = (cached || await this.apiClient.getCategories()) as any;\n\n if (!cached && result) {\n await this.cache.set(cacheKey, result, 300); // 5 min cache\n }\n\n this.metrics.recordAPICall('get_categories', 'success');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n total: result.total || result.items?.length || 0,\n categories: result.items || result,\n from_cache: !!cached\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to get categories', { error: error.message });\n this.metrics.recordAPICall('get_categories', 'error');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to get categories'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n\n private getUsageSummaryTool(): Tool {\n return {\n name: 'get_usage_summary',\n description: 'Get account usage statistics and limits',\n inputSchema: {\n type: 'object',\n properties: {}\n },\n handler: async (_args) => {\n try {\n const usage = await this.apiClient.getUsageSummary();\n this.metrics.recordAPICall('get_usage_summary', 'success');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n usage\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to get usage summary', { error: error.message });\n this.metrics.recordAPICall('get_usage_summary', 'error');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to get usage summary'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n}","/**\n * Category Pages Tool Handler\n * Handles category page CRUD and generation operations\n */\n\nimport { z } from 'zod';\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nconst boolField = z.union([z.boolean(), z.string()]).transform(val =>\n typeof val === 'string' ? val === 'true' : val\n).optional().default(false);\n\nconst numField = z.union([z.number(), z.string()]).transform(val =>\n typeof val === 'string' ? parseInt(val, 10) : val\n).optional();\n\nconst LANG_ENUM = ['de', 'en', 'es', 'fr', 'it', 'nl', 'pl', 'pt', 'ro'] as const;\nconst COUNTRY_ENUM = ['ad', 'ae', 'ar', 'at', 'au', 'be', 'br', 'ca', 'ch', 'cl', 'co', 'de', 'eg', 'es', 'fr', 'gb', 'in', 'it', 'lu', 'ma', 'mx', 'nl', 'pe', 'pl', 'pt', 'ro', 'us', 'za'] as const;\n\nconst CreateCategoryPageSchema = z.object({\n // Basic fields\n name: z.string().min(1, 'Name is required'),\n subject: z.string().min(1, 'Subject is required'),\n title: z.string().optional(),\n category: z.string().optional(),\n\n // Standard fields\n lang: z.enum(LANG_ENUM).optional().default('en'),\n country: z.enum(COUNTRY_ENUM).optional(),\n project_id: z.string().uuid().optional(),\n persona_id: z.string().uuid().optional(),\n apply_project_brief_config: boolField,\n\n // SEO features\n use_faq: boolField,\n use_toc: boolField,\n use_image: boolField,\n use_inlineimages: boolField,\n\n // Additional fields that might be relevant\n target_keyword: z.string().optional(),\n keywords_secondary: z.string().optional(),\n additional_information: z.string().optional(),\n length: z.union([z.number().max(5000), z.literal('auto')]).optional().default('auto'),\n\n // Publishing options\n use_publishwordpress: boolField,\n publishwordpress_date: z.string().optional(),\n publishwordpress_status: z.enum(['draft', 'publish', 'future']).optional(),\n publishwordpress_category: numField,\n publishwordpress_author: numField,\n publishwordpress_connection: z.string().uuid().optional()\n});\n\nexport class CategoryPagesToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n private cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n\n getTools(): Tool[] {\n return [\n this.createCategoryPageTool(),\n this.getCategoryPageTool(),\n this.listCategoryPagesTool(),\n this.updateCategoryPageTool(),\n this.generateCategoryPageTool(),\n this.getCategoryPageOutputTool(),\n this.estimateCategoryPageCostTool(),\n this.bulkCreateCategoryPagesTool()\n ];\n }\n\n private createCategoryPageTool(): Tool {\n return {\n name: 'create_category_page',\n description: 'Create a new category page',\n inputSchema: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Name/identifier of the category page', minLength: 1 },\n subject: { type: 'string', description: 'Category subject/topic', minLength: 1 },\n title: { type: 'string', description: 'Category page title' },\n category: { type: 'string', description: 'Category name/slug' },\n lang: { type: 'string', enum: [...LANG_ENUM], description: 'Language for the category page', default: 'en' },\n country: { type: 'string', enum: [...COUNTRY_ENUM], description: 'Target country for localization' },\n project_id: { type: 'string', format: 'uuid', description: 'Project UUID' },\n persona_id: { type: 'string', format: 'uuid', description: 'Persona UUID' },\n apply_project_brief_config: { type: 'boolean', description: 'Apply project configuration', default: false },\n use_faq: { type: 'boolean', description: 'Generate FAQ section', default: false },\n use_toc: { type: 'boolean', description: 'Generate table of contents', default: false },\n use_image: { type: 'boolean', description: 'Generate featured image', default: false },\n use_inlineimages: { type: 'boolean', description: 'Generate inline images', default: false },\n target_keyword: { type: 'string', description: 'Target SEO keyword' },\n keywords_secondary: { type: 'string', description: 'Secondary keywords (comma-separated)' },\n additional_information: { type: 'string', description: 'Additional context or instructions' },\n length: { description: 'Content length in words or \"auto\"', oneOf: [{ type: 'number', maximum: 5000 }, { type: 'string', enum: ['auto'] }], default: 'auto' },\n use_publishwordpress: { type: 'boolean', description: 'Publish to WordPress', default: false },\n publishwordpress_date: { type: 'string', description: 'Publication date (ISO 8601 or WordPress format)' },\n publishwordpress_status: { type: 'string', enum: ['draft', 'publish', 'future'], description: 'WordPress post status' },\n publishwordpress_category: { type: 'number', description: 'WordPress category ID' },\n publishwordpress_author: { type: 'number', description: 'WordPress author ID' },\n publishwordpress_connection: { type: 'string', format: 'uuid', description: 'WordPress connection UUID' }\n },\n required: ['name', 'subject']\n },\n handler: async (args) => {\n try {\n const validated = CreateCategoryPageSchema.parse(args);\n const categoryPage = await this.apiClient.createCategoryPage(validated);\n await this.cache.set(`category_page:${categoryPage.id}`, categoryPage, 300);\n this.metrics.recordAPICall('create_category_page', 'success');\n return {\n content: [{ type: 'text', text: JSON.stringify({ success: true, category_page_id: categoryPage.id, name: categoryPage.name, message: `Category page \"${categoryPage.name}\" created successfully`, next_steps: [`Use 'generate_category_page' with id: ${categoryPage.id}`, `Use 'get_category_page' with id: ${categoryPage.id}`] }, null, 2) }]\n };\n } catch (error: any) {\n logger.error('Failed to create category page', { error: error.message });\n this.metrics.recordAPICall('create_category_page', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to create category page', details: error.issues || undefined }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private getCategoryPageTool(): Tool {\n return {\n name: 'get_category_page',\n description: 'Get category page details and status',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid', description: 'ID of the category page' } }, required: ['id'] },\n handler: async (args) => {\n try {\n const { id } = args;\n const cached = await this.cache.get(`category_page:${id}`);\n if (cached) { return { content: [{ type: 'text', text: JSON.stringify({ success: true, category_page: cached, from_cache: true }, null, 2) }] }; }\n const categoryPage = await this.apiClient.getCategoryPage(id);\n await this.cache.set(`category_page:${id}`, categoryPage, 300);\n this.metrics.recordAPICall('get_category_page', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, category_page: categoryPage }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get category page', { error: error.message });\n this.metrics.recordAPICall('get_category_page', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to retrieve category page' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private listCategoryPagesTool(): Tool {\n return {\n name: 'list_category_pages',\n description: 'List all category pages',\n inputSchema: {\n type: 'object',\n properties: {\n skip: { type: 'number', default: 0 },\n take: { type: 'number', default: 10 },\n search: { type: 'string', description: 'Search term' },\n status: { type: 'string', description: 'Filter by status' },\n project_id: { type: 'string', format: 'uuid', description: 'Filter by project' }\n }\n },\n handler: async (args) => {\n try {\n const result = await this.apiClient.listCategoryPages(args);\n this.metrics.recordAPICall('list_category_pages', 'success');\n return {\n content: [{ type: 'text', text: JSON.stringify({ success: true, total: result.total, count: result.items.length, category_pages: result.items.map(c => ({ id: c.id, name: c.name, status: c.status, created_at: c.created_at })) }, null, 2) }]\n };\n } catch (error: any) {\n logger.error('Failed to list category pages', { error: error.message });\n this.metrics.recordAPICall('list_category_pages', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to list category pages' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private updateCategoryPageTool(): Tool {\n return {\n name: 'update_category_page',\n description: 'Update an existing category page',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid', description: 'ID of the category page to update' },\n updates: { type: 'object', description: 'Fields to update' }\n },\n required: ['id', 'updates']\n },\n handler: async (args) => {\n try {\n const { id, updates } = args;\n await this.apiClient.updateCategoryPage(id, updates);\n await this.cache.delete(`category_page:${id}`);\n this.metrics.recordAPICall('update_category_page', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Category page updated successfully', id, updated_fields: Object.keys(updates) }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to update category page', { error: error.message });\n this.metrics.recordAPICall('update_category_page', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to update category page' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private generateCategoryPageTool(): Tool {\n return {\n name: 'generate_category_page',\n description: 'Generate content for an existing category page',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid', description: 'ID of the category page to generate' },\n wait_for_completion: { type: 'boolean', default: true },\n max_wait_time: { type: 'number', default: 300, maximum: 600 }\n },\n required: ['id']\n },\n handler: async (args) => {\n try {\n const { id, wait_for_completion = true, max_wait_time = 300 } = args;\n await this.apiClient.runCategoryPageGeneration(id);\n if (!wait_for_completion) {\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Category page generation started', category_page_id: id }, null, 2) }] };\n }\n const startTime = Date.now();\n const pollInterval = 5000;\n const maxAttempts = Math.floor((max_wait_time * 1000) / pollInterval);\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n const categoryPage = await this.apiClient.getCategoryPage(id);\n if (categoryPage.status === 'completed' || categoryPage.status === 'success') {\n const output = await this.apiClient.getCategoryPageOutput(id);\n await this.cache.set(`category_page:output:${id}`, output, 600);\n this.metrics.recordAPICall('generate_category_page', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, status: 'completed', category_page_id: id, generation_time: Math.round((Date.now() - startTime) / 1000), message: 'Category page generated successfully' }, null, 2) }] };\n } else if (categoryPage.status === 'failed' || categoryPage.status === 'error') {\n throw new Error('Category page generation failed');\n }\n }\n throw new Error(`Generation timeout after ${max_wait_time} seconds`);\n } catch (error: any) {\n logger.error('Failed to generate category page', { error: error.message });\n this.metrics.recordAPICall('generate_category_page', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to generate category page' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private getCategoryPageOutputTool(): Tool {\n return {\n name: 'get_category_page_output',\n description: 'Get the generated content of a category page',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid', description: 'ID of the category page' } }, required: ['id'] },\n handler: async (args) => {\n try {\n const { id } = args;\n const cacheKey = `category_page:output:${id}`;\n const cached = await this.cache.get(cacheKey);\n const output = (cached || await this.apiClient.getCategoryPageOutput(id)) as any;\n if (!cached && output) { await this.cache.set(cacheKey, output, 600); }\n this.metrics.recordAPICall('get_category_page_output', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, category_page_id: id, output, from_cache: !!cached }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get category page output', { error: error.message });\n this.metrics.recordAPICall('get_category_page_output', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to get category page output' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private estimateCategoryPageCostTool(): Tool {\n return {\n name: 'estimate_category_page_cost',\n description: 'Estimate the cost of generating a category page',\n inputSchema: { type: 'object', properties: { data: { type: 'object', description: 'Category page configuration for cost estimation' } }, required: ['data'] },\n handler: async (args) => {\n try {\n const cost = await this.apiClient.calculateCategoryPageCost(args);\n this.metrics.recordAPICall('estimate_category_page_cost', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, cost_estimate: cost }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to estimate category page cost', { error: error.message });\n this.metrics.recordAPICall('estimate_category_page_cost', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to estimate cost' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private bulkCreateCategoryPagesTool(): Tool {\n return {\n name: 'bulk_create_category_pages',\n description: 'Create multiple category pages at once',\n inputSchema: { type: 'object', properties: { items: { type: 'array', items: { type: 'object' }, description: 'Array of category page configurations' } }, required: ['items'] },\n handler: async (args) => {\n try {\n const { items } = args;\n const result = await this.apiClient.createBulkCategoryPages(items);\n this.metrics.recordAPICall('bulk_create_category_pages', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: `Bulk created ${items.length} category pages`, result }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to bulk create category pages', { error: error.message });\n this.metrics.recordAPICall('bulk_create_category_pages', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to bulk create category pages' }, null, 2) }], isError: true };\n }\n }\n };\n }\n}\n","/**\n * Product Pages Tool Handler\n * Handles product page CRUD and generation operations\n */\n\nimport { z } from 'zod';\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nconst boolField = z.union([z.boolean(), z.string()]).transform(val =>\n typeof val === 'string' ? val === 'true' : val\n).optional().default(false);\n\nconst numField = z.union([z.number(), z.string()]).transform(val =>\n typeof val === 'string' ? parseInt(val, 10) : val\n).optional();\n\nconst LANG_ENUM = ['de', 'en', 'es', 'fr', 'it', 'nl', 'pl', 'pt', 'ro'] as const;\nconst COUNTRY_ENUM = ['ad', 'ae', 'ar', 'at', 'au', 'be', 'br', 'ca', 'ch', 'cl', 'co', 'de', 'eg', 'es', 'fr', 'gb', 'in', 'it', 'lu', 'ma', 'mx', 'nl', 'pe', 'pl', 'pt', 'ro', 'us', 'za'] as const;\n\nconst CreateProductPageSchema = z.object({\n // Basic fields\n name: z.string().min(1, 'Name is required'),\n subject: z.string().min(1, 'Subject is required'),\n title: z.string().optional(),\n product_name: z.string().optional(),\n\n // Product-specific fields\n product_url: z.string().url().optional(),\n product_description: z.string().optional(),\n\n // Standard fields\n lang: z.enum(LANG_ENUM).optional().default('en'),\n country: z.enum(COUNTRY_ENUM).optional(),\n project_id: z.string().uuid().optional(),\n persona_id: z.string().uuid().optional(),\n apply_project_brief_config: boolField,\n\n // SEO features\n use_faq: boolField,\n use_toc: boolField,\n use_image: boolField,\n use_inlineimages: boolField,\n\n // Additional fields that might be relevant\n target_keyword: z.string().optional(),\n keywords_secondary: z.string().optional(),\n additional_information: z.string().optional(),\n length: z.union([z.number().max(5000), z.literal('auto')]).optional().default('auto'),\n\n // Publishing options\n use_publishwordpress: boolField,\n publishwordpress_date: z.string().optional(),\n publishwordpress_status: z.enum(['draft', 'publish', 'future']).optional(),\n publishwordpress_category: numField,\n publishwordpress_author: numField,\n publishwordpress_connection: z.string().uuid().optional()\n});\n\nexport class ProductPagesToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n private cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n\n getTools(): Tool[] {\n return [\n this.createProductPageTool(),\n this.getProductPageTool(),\n this.listProductPagesTool(),\n this.updateProductPageTool(),\n this.generateProductPageTool(),\n this.getProductPageOutputTool(),\n this.estimateProductPageCostTool(),\n this.bulkCreateProductPagesTool()\n ];\n }\n\n private createProductPageTool(): Tool {\n return {\n name: 'create_product_page',\n description: 'Create a new product page',\n inputSchema: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Name/identifier of the product page', minLength: 1 },\n subject: { type: 'string', description: 'Product subject/topic', minLength: 1 },\n title: { type: 'string', description: 'Product page title' },\n product_name: { type: 'string', description: 'Name of the product' },\n product_url: { type: 'string', format: 'uri', description: 'URL of the product' },\n product_description: { type: 'string', description: 'Product description' },\n lang: { type: 'string', enum: [...LANG_ENUM], description: 'Language for the product page', default: 'en' },\n country: { type: 'string', enum: [...COUNTRY_ENUM], description: 'Target country for localization' },\n project_id: { type: 'string', format: 'uuid', description: 'Project UUID' },\n persona_id: { type: 'string', format: 'uuid', description: 'Persona UUID' },\n apply_project_brief_config: { type: 'boolean', description: 'Apply project configuration', default: false },\n use_faq: { type: 'boolean', description: 'Generate FAQ section', default: false },\n use_toc: { type: 'boolean', description: 'Generate table of contents', default: false },\n use_image: { type: 'boolean', description: 'Generate featured image', default: false },\n use_inlineimages: { type: 'boolean', description: 'Generate inline images', default: false },\n target_keyword: { type: 'string', description: 'Target SEO keyword' },\n keywords_secondary: { type: 'string', description: 'Secondary keywords (comma-separated)' },\n additional_information: { type: 'string', description: 'Additional context or instructions' },\n length: { description: 'Content length in words or \"auto\"', oneOf: [{ type: 'number', maximum: 5000 }, { type: 'string', enum: ['auto'] }], default: 'auto' },\n use_publishwordpress: { type: 'boolean', description: 'Publish to WordPress', default: false },\n publishwordpress_date: { type: 'string', description: 'Publication date (ISO 8601 or WordPress format)' },\n publishwordpress_status: { type: 'string', enum: ['draft', 'publish', 'future'], description: 'WordPress post status' },\n publishwordpress_category: { type: 'number', description: 'WordPress category ID' },\n publishwordpress_author: { type: 'number', description: 'WordPress author ID' },\n publishwordpress_connection: { type: 'string', format: 'uuid', description: 'WordPress connection UUID' }\n },\n required: ['name', 'subject']\n },\n handler: async (args) => {\n try {\n const validated = CreateProductPageSchema.parse(args);\n const productPage = await this.apiClient.createProductPage(validated);\n await this.cache.set(`product_page:${productPage.id}`, productPage, 300);\n this.metrics.recordAPICall('create_product_page', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, product_page_id: productPage.id, name: productPage.name, message: `Product page \"${productPage.name}\" created successfully`, next_steps: [`Use 'generate_product_page' with id: ${productPage.id}`, `Use 'get_product_page' with id: ${productPage.id}`] }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to create product page', { error: error.message });\n this.metrics.recordAPICall('create_product_page', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to create product page', details: error.issues || undefined }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private getProductPageTool(): Tool {\n return {\n name: 'get_product_page',\n description: 'Get product page details and status',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid', description: 'ID of the product page' } }, required: ['id'] },\n handler: async (args) => {\n try {\n const { id } = args;\n const cached = await this.cache.get(`product_page:${id}`);\n if (cached) { return { content: [{ type: 'text', text: JSON.stringify({ success: true, product_page: cached, from_cache: true }, null, 2) }] }; }\n const productPage = await this.apiClient.getProductPage(id);\n await this.cache.set(`product_page:${id}`, productPage, 300);\n this.metrics.recordAPICall('get_product_page', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, product_page: productPage }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get product page', { error: error.message });\n this.metrics.recordAPICall('get_product_page', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to retrieve product page' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private listProductPagesTool(): Tool {\n return {\n name: 'list_product_pages',\n description: 'List all product pages',\n inputSchema: {\n type: 'object',\n properties: {\n skip: { type: 'number', default: 0 },\n take: { type: 'number', default: 10 },\n search: { type: 'string', description: 'Search term' },\n status: { type: 'string', description: 'Filter by status' },\n project_id: { type: 'string', format: 'uuid', description: 'Filter by project' }\n }\n },\n handler: async (args) => {\n try {\n const result = await this.apiClient.listProductPages(args);\n this.metrics.recordAPICall('list_product_pages', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, total: result.total, count: result.items.length, product_pages: result.items.map(p => ({ id: p.id, name: p.name, status: p.status, created_at: p.created_at })) }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to list product pages', { error: error.message });\n this.metrics.recordAPICall('list_product_pages', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to list product pages' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private updateProductPageTool(): Tool {\n return {\n name: 'update_product_page',\n description: 'Update an existing product page',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid', description: 'ID of the product page to update' }, updates: { type: 'object', description: 'Fields to update' } }, required: ['id', 'updates'] },\n handler: async (args) => {\n try {\n const { id, updates } = args;\n await this.apiClient.updateProductPage(id, updates);\n await this.cache.delete(`product_page:${id}`);\n this.metrics.recordAPICall('update_product_page', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Product page updated successfully', id, updated_fields: Object.keys(updates) }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to update product page', { error: error.message });\n this.metrics.recordAPICall('update_product_page', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to update product page' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private generateProductPageTool(): Tool {\n return {\n name: 'generate_product_page',\n description: 'Generate content for an existing product page',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid' }, wait_for_completion: { type: 'boolean', default: true }, max_wait_time: { type: 'number', default: 300, maximum: 600 } }, required: ['id'] },\n handler: async (args) => {\n try {\n const { id, wait_for_completion = true, max_wait_time = 300 } = args;\n await this.apiClient.runProductPageGeneration(id);\n if (!wait_for_completion) { return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Product page generation started', product_page_id: id }, null, 2) }] }; }\n const startTime = Date.now();\n const pollInterval = 5000;\n const maxAttempts = Math.floor((max_wait_time * 1000) / pollInterval);\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n const productPage = await this.apiClient.getProductPage(id);\n if (productPage.status === 'completed' || productPage.status === 'success') {\n const output = await this.apiClient.getProductPageOutput(id);\n await this.cache.set(`product_page:output:${id}`, output, 600);\n this.metrics.recordAPICall('generate_product_page', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, status: 'completed', product_page_id: id, generation_time: Math.round((Date.now() - startTime) / 1000), message: 'Product page generated successfully' }, null, 2) }] };\n } else if (productPage.status === 'failed' || productPage.status === 'error') { throw new Error('Product page generation failed'); }\n }\n throw new Error(`Generation timeout after ${max_wait_time} seconds`);\n } catch (error: any) {\n logger.error('Failed to generate product page', { error: error.message });\n this.metrics.recordAPICall('generate_product_page', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to generate product page' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private getProductPageOutputTool(): Tool {\n return {\n name: 'get_product_page_output',\n description: 'Get the generated content of a product page',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid' } }, required: ['id'] },\n handler: async (args) => {\n try {\n const { id } = args;\n const cacheKey = `product_page:output:${id}`;\n const cached = await this.cache.get(cacheKey);\n const output = (cached || await this.apiClient.getProductPageOutput(id)) as any;\n if (!cached && output) { await this.cache.set(cacheKey, output, 600); }\n this.metrics.recordAPICall('get_product_page_output', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, product_page_id: id, output, from_cache: !!cached }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get product page output', { error: error.message });\n this.metrics.recordAPICall('get_product_page_output', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to get product page output' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private estimateProductPageCostTool(): Tool {\n return {\n name: 'estimate_product_page_cost',\n description: 'Estimate the cost of generating a product page',\n inputSchema: { type: 'object', properties: { data: { type: 'object', description: 'Product page configuration for cost estimation' } }, required: ['data'] },\n handler: async (args) => {\n try {\n const cost = await this.apiClient.calculateProductPageCost(args);\n this.metrics.recordAPICall('estimate_product_page_cost', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, cost_estimate: cost }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to estimate product page cost', { error: error.message });\n this.metrics.recordAPICall('estimate_product_page_cost', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to estimate cost' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private bulkCreateProductPagesTool(): Tool {\n return {\n name: 'bulk_create_product_pages',\n description: 'Create multiple product pages at once',\n inputSchema: { type: 'object', properties: { items: { type: 'array', items: { type: 'object' }, description: 'Array of product page configurations' } }, required: ['items'] },\n handler: async (args) => {\n try {\n const { items } = args;\n const result = await this.apiClient.createBulkProductPages(items);\n this.metrics.recordAPICall('bulk_create_product_pages', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: `Bulk created ${items.length} product pages`, result }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to bulk create product pages', { error: error.message });\n this.metrics.recordAPICall('bulk_create_product_pages', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to bulk create product pages' }, null, 2) }], isError: true };\n }\n }\n };\n }\n}\n","/**\n * Discover Tool Handler\n * Handles content discovery CRUD and generation operations\n */\n\nimport { z } from 'zod';\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\n// Boolean field transformer - accepts both boolean and string values\nconst boolField = z.union([z.boolean(), z.string()]).transform(val =>\n typeof val === 'string' ? val === 'true' : val\n).optional().default(false);\n\nconst DiscoverContentSchema = z.object({\n subject: z.string().min(1),\n target_keyword: z.string().optional(),\n keywords_secondary: z.string().optional(),\n project_id: z.string().uuid().optional(),\n persona_id: z.string().uuid().optional(),\n apply_project_brief_config: boolField,\n lang: z.enum(['fr', 'en']).optional(),\n country: z.enum(['fr', 'be', 'ch', 'ca', 'us', 'gb']).optional(),\n length: z.union([z.number().max(2000), z.literal('auto')]).optional(),\n title: z.string().optional(),\n additional_information: z.string().optional(),\n writing_style: z.string().optional(),\n website: z.string().optional(),\n writing_style_mode: z.enum(['auto', 'persona']).optional(),\n // SEO Features\n use_cta: z.boolean().optional(),\n ctas: z.array(z.object({\n anchor: z.string(),\n url: z.string()\n })).optional(),\n use_boldkeywords: z.boolean().optional(),\n use_faq: z.boolean().optional(),\n faq_questions: z.string().optional(),\n use_toc: z.boolean().optional(),\n // Image options\n use_image: z.boolean().optional(),\n image_ratio: z.enum(['landscape', 'portrait', '16:9', '4:3', '1:1']).optional(),\n image_prompt: z.string().optional(),\n image_use_palette: z.boolean().optional(),\n image_primary_color: z.string().optional(),\n image_secondary_color: z.string().optional(),\n use_inline_images: z.boolean().optional(),\n inline_images_ratio: z.enum(['landscape', 'portrait', '16:9', '4:3', '1:1']).optional(),\n inline_images_use_palette: z.boolean().optional(),\n inline_images_primary_color: z.string().optional(),\n inline_images_secondary_color: z.string().optional(),\n // Internal links\n use_internallinks: z.boolean().optional(),\n use_indexed_pages_internal_links: z.boolean().optional(),\n use_wp_internal_links: z.boolean().optional(),\n use_app_internal_links: z.boolean().optional(),\n use_list_internal_links: z.boolean().optional(),\n internal_links_wp_status: z.array(z.string()).optional(),\n internal_links_list: z.string().optional(),\n internal_links_wp_connection: z.string().optional(),\n // WordPress publishing\n use_publishwordpress: z.boolean().optional(),\n publishwordpress_date: z.string().optional(),\n publishwordpress_status: z.enum(['draft', 'publish', 'future']).optional(),\n publishwordpress_category: z.number().optional(),\n publishwordpress_author: z.number().optional(),\n publishwordpress_connection: z.string().optional(),\n // Additional features\n use_infotable: z.boolean().optional(),\n use_bulletlist: z.boolean().optional(),\n use_externalsources: z.boolean().optional(),\n use_audio: z.boolean().optional(),\n audio_voice_id: z.string().optional(),\n use_social: z.boolean().optional(),\n social_networks: z.union([\n z.array(z.string()),\n z.string()\n ]).optional(),\n use_blockquotes: z.boolean().optional(),\n use_summary: z.boolean().optional(),\n use_webhook: z.boolean().optional(),\n webhook_connection_id: z.string().optional()\n});\n\nexport class DiscoverToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n private cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n\n getTools(): Tool[] {\n return [\n this.discoverContentTool(),\n this.getDiscoverResultTool(),\n this.listDiscoverArticlesTool(),\n this.updateDiscoverArticleTool(),\n this.runDiscoveryTool(),\n this.getDiscoverOutputTool(),\n this.estimateDiscoverCostTool(),\n this.bulkCreateDiscoverArticlesTool()\n ];\n }\n\n private discoverContentTool(): Tool {\n return {\n name: 'discover_content',\n description: 'Create a Google Discover article optimized for ranking in Google Discover feed. Requires subject field. Supports all standard article features like FAQ, TOC, images, and WordPress publishing.',\n inputSchema: {\n type: 'object',\n properties: {\n subject: { type: 'string', description: 'The subject of the discover article (required)' },\n target_keyword: { type: 'string', description: 'SERP target keyword' },\n keywords_secondary: { type: 'string', description: 'Secondary keywords' },\n project_id: { type: 'string', format: 'uuid', description: 'Project UUID' },\n persona_id: { type: 'string', format: 'uuid', description: 'Persona UUID' },\n apply_project_brief_config: { type: 'boolean', description: 'Apply project brief configuration settings. When true, inherits all feature flags and settings from the project brief (use_faq, use_toc, use_inline_images, internal links, etc.). Recommended for consistency.', default: false },\n lang: { type: 'string', enum: ['fr', 'en'], description: 'Language code' },\n country: { type: 'string', enum: ['fr', 'be', 'ch', 'ca', 'us', 'gb'], description: 'Country code' },\n length: { description: 'Number (max 2000) or \"auto\"' },\n title: { type: 'string', description: 'Article title' },\n additional_information: { type: 'string', description: 'Additional context' },\n writing_style: { type: 'string', description: 'Writing style' },\n website: { type: 'string', description: 'Website URL' },\n writing_style_mode: { type: 'string', enum: ['auto', 'persona'], description: 'Writing style mode' },\n // SEO Features\n use_cta: { type: 'boolean', description: 'Add CTA' },\n ctas: { type: 'array', items: { type: 'object', properties: { anchor: { type: 'string' }, url: { type: 'string' } } }, description: 'Call-to-action links' },\n use_boldkeywords: { type: 'boolean', description: 'Bold keywords' },\n use_faq: { type: 'boolean', description: 'Add FAQ section' },\n faq_questions: { type: 'string', description: 'FAQ questions' },\n use_toc: { type: 'boolean', description: 'Add table of contents' },\n // Image options\n use_image: { type: 'boolean', description: 'Generate cover image' },\n image_ratio: { type: 'string', enum: ['landscape', 'portrait', '16:9', '4:3', '1:1'], description: 'Image aspect ratio' },\n image_prompt: { type: 'string', description: 'Image generation prompt' },\n image_use_palette: { type: 'boolean', description: 'Use color palette for image' },\n image_primary_color: { type: 'string', description: 'Primary color for image' },\n image_secondary_color: { type: 'string', description: 'Secondary color for image' },\n use_inline_images: { type: 'boolean', description: 'Generate inline images' },\n inline_images_ratio: { type: 'string', enum: ['landscape', 'portrait', '16:9', '4:3', '1:1'], description: 'Inline images aspect ratio' },\n inline_images_use_palette: { type: 'boolean', description: 'Use color palette for inline images' },\n inline_images_primary_color: { type: 'string', description: 'Primary color for inline images' },\n inline_images_secondary_color: { type: 'string', description: 'Secondary color for inline images' },\n // Internal links\n use_internallinks: { type: 'boolean', description: 'Add internal links' },\n use_indexed_pages_internal_links: { type: 'boolean', description: 'Use indexed pages for internal links' },\n use_wp_internal_links: { type: 'boolean', description: 'Use WordPress internal links' },\n use_app_internal_links: { type: 'boolean', description: 'Use app internal links' },\n use_list_internal_links: { type: 'boolean', description: 'Use list internal links' },\n internal_links_wp_status: { type: 'array', items: { type: 'string' }, description: 'WordPress post status for internal links' },\n internal_links_list: { type: 'string', description: 'Internal links list' },\n internal_links_wp_connection: { type: 'string', description: 'WordPress connection ID for internal links' },\n // WordPress publishing\n use_publishwordpress: { type: 'boolean', description: 'Auto-publish to WordPress' },\n publishwordpress_date: { type: 'string', description: 'WordPress publish date' },\n publishwordpress_status: { type: 'string', enum: ['draft', 'publish', 'future'], description: 'WordPress post status' },\n publishwordpress_category: { type: 'number', description: 'WordPress category ID' },\n publishwordpress_author: { type: 'number', description: 'WordPress author ID' },\n publishwordpress_connection: { type: 'string', description: 'WordPress connection ID' },\n // Additional features\n use_infotable: { type: 'boolean', description: 'Add info table' },\n use_bulletlist: { type: 'boolean', description: 'Add bullet list' },\n use_externalsources: { type: 'boolean', description: 'Use external sources' },\n use_audio: { type: 'boolean', description: 'Generate audio' },\n audio_voice_id: { type: 'string', description: 'Audio voice ID' },\n use_social: { type: 'boolean', description: 'Generate social media posts' },\n social_networks: { description: 'Social networks (array or comma-separated string)' },\n use_blockquotes: { type: 'boolean', description: 'Add blockquotes' },\n use_summary: { type: 'boolean', description: 'Add summary' },\n use_webhook: { type: 'boolean', description: 'Trigger webhook' },\n webhook_connection_id: { type: 'string', description: 'Webhook connection ID' }\n },\n required: ['subject', 'apply_project_brief_config']\n },\n handler: async (args) => {\n try {\n // Log raw input BEFORE validation\n logger.info('discover_content RAW INPUT', {\n raw_args: args,\n apply_project_brief_config_raw: args.apply_project_brief_config,\n apply_project_brief_config_raw_type: typeof args.apply_project_brief_config\n });\n\n const validated = DiscoverContentSchema.parse(args);\n\n // Log AFTER validation/transformation\n logger.info('discover_content VALIDATED (after boolField transform)', {\n apply_project_brief_config: validated.apply_project_brief_config,\n apply_project_brief_config_type: typeof validated.apply_project_brief_config,\n has_project_id: !!validated.project_id,\n full_validated: validated\n });\n\n // Clean undefined/null values before sending to API\n const cleanedInput: Record<string, any> = {};\n for (const [key, value] of Object.entries(validated)) {\n if (value !== undefined && value !== null) {\n cleanedInput[key] = value;\n }\n }\n\n logger.info('discover_content CLEANED INPUT (undefined removed)', {\n before_cleaning_keys: Object.keys(validated).length,\n after_cleaning_keys: Object.keys(cleanedInput).length,\n apply_project_brief_config_included: 'apply_project_brief_config' in cleanedInput,\n apply_project_brief_config_value: cleanedInput.apply_project_brief_config\n });\n\n const discovery = await this.apiClient.discoverArticles(cleanedInput as DiscoverArticleInput);\n\n await this.cache.set(`discover:${discovery.id}`, discovery, 300);\n this.metrics.recordAPICall('discover_content', 'success');\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n success: true,\n discovery_id: discovery.id,\n message: 'Content discovery created successfully',\n next_steps: [\n `Use 'run_discovery' with id: ${discovery.id}`,\n `Use 'get_discover_result' with id: ${discovery.id}`\n ]\n }, null, 2)\n }]\n };\n } catch (error: any) {\n logger.error('Failed to create discovery', { error: error.message });\n this.metrics.recordAPICall('discover_content', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to create discovery', details: error.issues || undefined }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private getDiscoverResultTool(): Tool {\n return {\n name: 'get_discover_result',\n description: 'Get content discovery results and status',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid' } }, required: ['id'] },\n handler: async (args) => {\n try {\n const { id } = args;\n const cached = await this.cache.get(`discover:${id}`);\n if (cached) { return { content: [{ type: 'text', text: JSON.stringify({ success: true, discovery: cached, from_cache: true }, null, 2) }] }; }\n const discovery = await this.apiClient.getDiscoverArticle(id);\n await this.cache.set(`discover:${id}`, discovery, 300);\n this.metrics.recordAPICall('get_discover_result', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, discovery }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get discovery result', { error: error.message });\n this.metrics.recordAPICall('get_discover_result', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to retrieve discovery result' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private listDiscoverArticlesTool(): Tool {\n return {\n name: 'list_discover_articles',\n description: 'List all discover articles',\n inputSchema: {\n type: 'object',\n properties: {\n skip: { type: 'number', default: 0 },\n take: { type: 'number', default: 10 },\n search: { type: 'string', description: 'Search term' },\n status: { type: 'string', description: 'Filter by status' },\n project_id: { type: 'string', format: 'uuid', description: 'Filter by project' }\n }\n },\n handler: async (args) => {\n try {\n const result = await this.apiClient.listDiscoverArticles(args);\n this.metrics.recordAPICall('list_discover_articles', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, total: result.total, count: result.items.length, discover_articles: result.items.map(d => ({ id: d.id, name: d.name, status: d.status, created_at: d.created_at })) }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to list discover articles', { error: error.message });\n this.metrics.recordAPICall('list_discover_articles', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to list discover articles' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private updateDiscoverArticleTool(): Tool {\n return {\n name: 'update_discover_article',\n description: 'Update an existing discover article',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid' }, updates: { type: 'object', description: 'Fields to update' } }, required: ['id', 'updates'] },\n handler: async (args) => {\n try {\n const { id, updates } = args;\n await this.apiClient.updateDiscoverArticle(id, updates);\n await this.cache.delete(`discover:${id}`);\n this.metrics.recordAPICall('update_discover_article', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Discover article updated successfully', id, updated_fields: Object.keys(updates) }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to update discover article', { error: error.message });\n this.metrics.recordAPICall('update_discover_article', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to update discover article' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private runDiscoveryTool(): Tool {\n return {\n name: 'run_discovery',\n description: 'Run content discovery process',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid' } }, required: ['id'] },\n handler: async (args) => {\n try {\n const { id } = args;\n await this.apiClient.runDiscovery(id);\n await this.cache.delete(`discover:${id}`);\n this.metrics.recordAPICall('run_discovery', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Discovery started successfully', discovery_id: id, next_step: `Use 'get_discover_result' to check status and get results` }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to run discovery', { error: error.message });\n this.metrics.recordAPICall('run_discovery', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to run discovery' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private getDiscoverOutputTool(): Tool {\n return {\n name: 'get_discover_output',\n description: 'Get the generated output of a discover article',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid' } }, required: ['id'] },\n handler: async (args) => {\n try {\n const { id } = args;\n const cacheKey = `discover:output:${id}`;\n const cached = await this.cache.get(cacheKey);\n const output = (cached || await this.apiClient.getDiscoverArticleOutput(id)) as any;\n if (!cached && output) { await this.cache.set(cacheKey, output, 600); }\n this.metrics.recordAPICall('get_discover_output', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, discovery_id: id, output, from_cache: !!cached }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get discover output', { error: error.message });\n this.metrics.recordAPICall('get_discover_output', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to get discover output' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private estimateDiscoverCostTool(): Tool {\n return {\n name: 'estimate_discover_cost',\n description: 'Estimate the cost of a discover article',\n inputSchema: { type: 'object', properties: { data: { type: 'object', description: 'Discovery configuration for cost estimation' } }, required: ['data'] },\n handler: async (args) => {\n try {\n const cost = await this.apiClient.calculateDiscoverCost(args);\n this.metrics.recordAPICall('estimate_discover_cost', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, cost_estimate: cost }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to estimate discover cost', { error: error.message });\n this.metrics.recordAPICall('estimate_discover_cost', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to estimate cost' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private bulkCreateDiscoverArticlesTool(): Tool {\n return {\n name: 'bulk_create_discover_articles',\n description: 'Create multiple discover articles at once',\n inputSchema: { type: 'object', properties: { items: { type: 'array', items: { type: 'object' }, description: 'Array of discover article configurations' } }, required: ['items'] },\n handler: async (args) => {\n try {\n const { items } = args;\n const result = await this.apiClient.createBulkDiscoverArticles(items);\n this.metrics.recordAPICall('bulk_create_discover_articles', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: `Bulk created ${items.length} discover articles`, result }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to bulk create discover articles', { error: error.message });\n this.metrics.recordAPICall('bulk_create_discover_articles', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to bulk create discover articles' }, null, 2) }], isError: true };\n }\n }\n };\n }\n}\n","/**\n * Feeds Tool Handler (was RSS Tool Handler)\n * Handles feed operations via /v1/feeds/ API\n */\n\nimport { z } from 'zod';\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nconst CreateFeedSchema = z.object({\n url: z.string().url('Valid feed URL is required'),\n title: z.string().optional(),\n entity_type: z.enum(['articles', 'discoverarticles']).optional().default('articles'),\n frequency: z.enum(['30min', '1h', '3h', '6h', '12h', '24h', '48h', '72h']).optional().default('24h'),\n limit: z.number().min(1).max(50).optional().default(10),\n sort_by: z.enum(['newest', 'oldest', 'most_relevant']).optional().default('most_relevant'),\n filtering_brief: z.string().optional(),\n is_active: z.boolean().optional().default(true),\n enable_generation: z.boolean().optional().default(false),\n project_id: z.string().uuid().optional(),\n config: z.record(z.any()).optional()\n});\n\n// Keep the class name for backwards compatibility with server registration\nexport class RSSToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n private cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n\n getTools(): Tool[] {\n return [\n this.createFeedTool(),\n this.getFeedTool(),\n this.listFeedsTool(),\n this.updateFeedTool(),\n this.deleteFeedTool()\n ];\n }\n\n private createFeedTool(): Tool {\n return {\n name: 'create_feed',\n description: 'Create a new RSS/Atom feed for automated content monitoring and generation',\n inputSchema: {\n type: 'object',\n properties: {\n url: { type: 'string', format: 'uri', description: 'URL of the RSS/Atom feed to monitor' },\n title: { type: 'string', description: 'Title for this feed configuration' },\n entity_type: { type: 'string', enum: ['articles', 'discoverarticles'], description: 'Type of entity to create from feed items', default: 'articles' },\n frequency: { type: 'string', enum: ['30min', '1h', '3h', '6h', '12h', '24h', '48h', '72h'], description: 'How often to check for new feed items', default: '24h' },\n limit: { type: 'number', minimum: 1, maximum: 50, description: 'Maximum number of feed items to process per check', default: 10 },\n sort_by: { type: 'string', enum: ['newest', 'oldest', 'most_relevant'], description: 'How to sort feed items', default: 'most_relevant' },\n filtering_brief: { type: 'string', description: 'Description of how to filter RSS items (e.g., \"only tech-related articles\")' },\n is_active: { type: 'boolean', description: 'Whether the feed is active', default: true },\n enable_generation: { type: 'boolean', description: 'Auto-generate content from feed items', default: false },\n project_id: { type: 'string', format: 'uuid', description: 'Project ID to associate feed items with' },\n config: { type: 'object', description: 'Additional feed configuration' }\n },\n required: ['url']\n },\n handler: async (args) => {\n try {\n const validated = CreateFeedSchema.parse(args);\n const feed = await this.apiClient.createFeed(validated);\n await this.cache.set(`feed:${feed.id}`, feed, 300);\n this.metrics.recordAPICall('create_feed', 'success');\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n success: true,\n feed_id: feed.id,\n title: feed.title || feed.url,\n message: `Feed \"${feed.title || feed.url}\" created successfully`,\n next_steps: [\n `Use 'get_feed' with id: ${feed.id} to check status`,\n `Use 'update_feed' with id: ${feed.id} to modify settings`,\n `Use 'list_feeds' to see all feeds`\n ]\n }, null, 2)\n }]\n };\n } catch (error: any) {\n logger.error('Failed to create feed', { error: error.message });\n this.metrics.recordAPICall('create_feed', 'error');\n return {\n content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to create feed', details: error.issues || undefined }, null, 2) }],\n isError: true\n };\n }\n }\n };\n }\n\n private getFeedTool(): Tool {\n return {\n name: 'get_feed',\n description: 'Get feed details and status',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid', description: 'ID of the feed to retrieve' }\n },\n required: ['id']\n },\n handler: async (args) => {\n try {\n const { id } = args;\n const cached = await this.cache.get(`feed:${id}`);\n if (cached) {\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, feed: cached, from_cache: true }, null, 2) }] };\n }\n const feed = await this.apiClient.getFeed(id);\n await this.cache.set(`feed:${id}`, feed, 300);\n this.metrics.recordAPICall('get_feed', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, feed }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get feed', { error: error.message });\n this.metrics.recordAPICall('get_feed', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to retrieve feed' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private listFeedsTool(): Tool {\n return {\n name: 'list_feeds',\n description: 'List all configured feeds',\n inputSchema: {\n type: 'object',\n properties: {\n skip: { type: 'number', description: 'Number of items to skip', default: 0 },\n take: { type: 'number', description: 'Number of items to retrieve', default: 10 },\n search: { type: 'string', description: 'Search term to filter feeds' }\n }\n },\n handler: async (args) => {\n try {\n const result = await this.apiClient.listFeeds(args);\n this.metrics.recordAPICall('list_feeds', 'success');\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n success: true,\n total: result.total,\n count: result.items.length,\n feeds: result.items.map(f => ({\n id: f.id, url: f.url, title: f.title,\n entity_type: f.entity_type, frequency: f.frequency,\n is_active: f.is_active, enable_generation: f.enable_generation\n }))\n }, null, 2)\n }]\n };\n } catch (error: any) {\n logger.error('Failed to list feeds', { error: error.message });\n this.metrics.recordAPICall('list_feeds', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to list feeds' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private updateFeedTool(): Tool {\n return {\n name: 'update_feed',\n description: 'Update an existing feed configuration',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid', description: 'ID of the feed to update' },\n updates: {\n type: 'object',\n description: 'Fields to update',\n properties: {\n url: { type: 'string', format: 'uri', description: 'Feed URL' },\n title: { type: 'string', description: 'Feed title' },\n entity_type: { type: 'string', enum: ['articles', 'discoverarticles'] },\n frequency: { type: 'string', enum: ['30min', '1h', '3h', '6h', '12h', '24h', '48h', '72h'] },\n limit: { type: 'number', minimum: 1, maximum: 50 },\n sort_by: { type: 'string', enum: ['newest', 'oldest', 'most_relevant'] },\n filtering_brief: { type: 'string' },\n is_active: { type: 'boolean' },\n enable_generation: { type: 'boolean' },\n project_id: { type: 'string', format: 'uuid' },\n config: { type: 'object' }\n }\n }\n },\n required: ['id', 'updates']\n },\n handler: async (args) => {\n try {\n const { id, updates } = args;\n await this.apiClient.updateFeed(id, updates);\n await this.cache.delete(`feed:${id}`);\n this.metrics.recordAPICall('update_feed', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Feed updated successfully', feed_id: id, updated_fields: Object.keys(updates) }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to update feed', { error: error.message });\n this.metrics.recordAPICall('update_feed', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to update feed' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private deleteFeedTool(): Tool {\n return {\n name: 'delete_feed',\n description: 'Delete a feed configuration',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid', description: 'ID of the feed to delete' }\n },\n required: ['id']\n },\n handler: async (args) => {\n try {\n const { id } = args;\n await this.apiClient.deleteFeed(id);\n await this.cache.delete(`feed:${id}`);\n this.metrics.recordAPICall('delete_feed', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Feed deleted successfully', feed_id: id }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to delete feed', { error: error.message });\n this.metrics.recordAPICall('delete_feed', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to delete feed' }, null, 2) }], isError: true };\n }\n }\n };\n }\n}\n","/**\n * Update Posts Tool Handler\n * Handles update post CRUD and generation operations\n */\n\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nexport class UpdatePostsToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n private cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n\n getTools(): Tool[] {\n return [\n this.createUpdatePostTool(),\n this.getUpdatePostTool(),\n this.listUpdatePostsTool(),\n this.updateUpdatePostTool(),\n this.runUpdatePostTool(),\n this.getUpdatePostOutputTool(),\n this.estimateUpdatePostCostTool(),\n this.bulkCreateUpdatePostsTool()\n ];\n }\n\n private createUpdatePostTool(): Tool {\n return {\n name: 'create_update_post',\n description: 'Create a new update post for refreshing existing content',\n inputSchema: {\n type: 'object',\n properties: {\n data: { type: 'object', description: 'Update post configuration', properties: { input: { type: 'object', description: 'Update post input configuration' } }, required: ['input'] }\n },\n required: ['data']\n },\n handler: async (args) => {\n try {\n const updatePost = await this.apiClient.createUpdatePost(args);\n await this.cache.set(`update_post:${updatePost.id}`, updatePost, 300);\n this.metrics.recordAPICall('create_update_post', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, update_post_id: updatePost.id, message: 'Update post created successfully', next_steps: [`Use 'run_update_post' with id: ${updatePost.id}`, `Use 'get_update_post' with id: ${updatePost.id}`] }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to create update post', { error: error.message });\n this.metrics.recordAPICall('create_update_post', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to create update post' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private getUpdatePostTool(): Tool {\n return {\n name: 'get_update_post',\n description: 'Get update post details and status',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid' } }, required: ['id'] },\n handler: async (args) => {\n try {\n const { id } = args;\n const cached = await this.cache.get(`update_post:${id}`);\n if (cached) { return { content: [{ type: 'text', text: JSON.stringify({ success: true, update_post: cached, from_cache: true }, null, 2) }] }; }\n const updatePost = await this.apiClient.getUpdatePost(id);\n await this.cache.set(`update_post:${id}`, updatePost, 300);\n this.metrics.recordAPICall('get_update_post', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, update_post: updatePost }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get update post', { error: error.message });\n this.metrics.recordAPICall('get_update_post', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to get update post' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private listUpdatePostsTool(): Tool {\n return {\n name: 'list_update_posts',\n description: 'List all update posts',\n inputSchema: { type: 'object', properties: { skip: { type: 'number', default: 0 }, take: { type: 'number', default: 10 }, search: { type: 'string' }, status: { type: 'string' }, project_id: { type: 'string', format: 'uuid' } } },\n handler: async (args) => {\n try {\n const result = await this.apiClient.listUpdatePosts(args);\n this.metrics.recordAPICall('list_update_posts', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, total: result.total, count: result.items.length, update_posts: result.items.map(u => ({ id: u.id, name: u.name, status: u.status, created_at: u.created_at })) }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to list update posts', { error: error.message });\n this.metrics.recordAPICall('list_update_posts', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to list update posts' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private updateUpdatePostTool(): Tool {\n return {\n name: 'update_update_post',\n description: 'Update an existing update post',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid' }, updates: { type: 'object', description: 'Fields to update' } }, required: ['id', 'updates'] },\n handler: async (args) => {\n try {\n const { id, updates } = args;\n await this.apiClient.updateUpdatePost(id, updates);\n await this.cache.delete(`update_post:${id}`);\n this.metrics.recordAPICall('update_update_post', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Update post updated successfully', id, updated_fields: Object.keys(updates) }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to update update post', { error: error.message });\n this.metrics.recordAPICall('update_update_post', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to update update post' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private runUpdatePostTool(): Tool {\n return {\n name: 'run_update_post',\n description: 'Run generation for an update post',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid' } }, required: ['id'] },\n handler: async (args) => {\n try {\n const { id } = args;\n await this.apiClient.runUpdatePost(id);\n await this.cache.delete(`update_post:${id}`);\n this.metrics.recordAPICall('run_update_post', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Update post generation started', update_post_id: id, next_step: `Use 'get_update_post' or 'get_update_post_output' to check status` }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to run update post', { error: error.message });\n this.metrics.recordAPICall('run_update_post', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to run update post' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private getUpdatePostOutputTool(): Tool {\n return {\n name: 'get_update_post_output',\n description: 'Get the generated output of an update post',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid' } }, required: ['id'] },\n handler: async (args) => {\n try {\n const { id } = args;\n const cacheKey = `update_post:output:${id}`;\n const cached = await this.cache.get(cacheKey);\n const output = (cached || await this.apiClient.getUpdatePostOutput(id)) as any;\n if (!cached && output) { await this.cache.set(cacheKey, output, 600); }\n this.metrics.recordAPICall('get_update_post_output', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, update_post_id: id, output, from_cache: !!cached }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get update post output', { error: error.message });\n this.metrics.recordAPICall('get_update_post_output', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to get update post output' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private estimateUpdatePostCostTool(): Tool {\n return {\n name: 'estimate_update_post_cost',\n description: 'Estimate the cost of an update post',\n inputSchema: { type: 'object', properties: { data: { type: 'object', description: 'Update post configuration for cost estimation' } }, required: ['data'] },\n handler: async (args) => {\n try {\n const cost = await this.apiClient.calculateUpdatePostCost(args);\n this.metrics.recordAPICall('estimate_update_post_cost', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, cost_estimate: cost }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to estimate update post cost', { error: error.message });\n this.metrics.recordAPICall('estimate_update_post_cost', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to estimate cost' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private bulkCreateUpdatePostsTool(): Tool {\n return {\n name: 'bulk_create_update_posts',\n description: 'Create multiple update posts at once',\n inputSchema: { type: 'object', properties: { items: { type: 'array', items: { type: 'object' } } }, required: ['items'] },\n handler: async (args) => {\n try {\n const { items } = args;\n const result = await this.apiClient.createBulkUpdatePosts(items);\n this.metrics.recordAPICall('bulk_create_update_posts', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: `Bulk created ${items.length} update posts`, result }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to bulk create update posts', { error: error.message });\n this.metrics.recordAPICall('bulk_create_update_posts', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to bulk create update posts' }, null, 2) }], isError: true };\n }\n }\n };\n }\n}\n","/**\n * Transactions Tool Handler\n * Handles transaction listing and daily summary\n */\n\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nexport class TransactionsToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n _cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n\n getTools(): Tool[] {\n return [\n this.listTransactionsTool(),\n this.getDailyTransactionsTool()\n ];\n }\n\n private listTransactionsTool(): Tool {\n return {\n name: 'list_transactions',\n description: 'List credit transactions and usage history',\n inputSchema: {\n type: 'object',\n properties: {\n skip: { type: 'number', description: 'Number of items to skip', default: 0 },\n take: { type: 'number', description: 'Number of items to retrieve', default: 10 },\n search: { type: 'string', description: 'Search term' }\n }\n },\n handler: async (args) => {\n try {\n const result = await this.apiClient.listTransactions(args);\n this.metrics.recordAPICall('list_transactions', 'success');\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n success: true,\n total: result.total,\n count: result.items.length,\n transactions: result.items.map(t => ({\n id: t.id, type: t.type, amount: t.amount, credits: t.credits,\n description: t.description, entity_id: t.entity_id,\n entity_type: t.entity_type, created_at: t.created_at\n }))\n }, null, 2)\n }]\n };\n } catch (error: any) {\n logger.error('Failed to list transactions', { error: error.message });\n this.metrics.recordAPICall('list_transactions', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to list transactions' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private getDailyTransactionsTool(): Tool {\n return {\n name: 'get_daily_transactions',\n description: 'Get daily transaction summary',\n inputSchema: { type: 'object', properties: {} },\n handler: async () => {\n try {\n const result = await this.apiClient.getDailyTransactions();\n this.metrics.recordAPICall('get_daily_transactions', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, daily_summary: result }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get daily transactions', { error: error.message });\n this.metrics.recordAPICall('get_daily_transactions', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to get daily transactions' }, null, 2) }], isError: true };\n }\n }\n };\n }\n}\n","/**\n * Jobs Tool Handler\n * Handles job status checking and triggering\n */\n\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nexport class JobsToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n _cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n\n getTools(): Tool[] {\n return [\n this.getJobTool(),\n this.triggerJobTool()\n ];\n }\n\n private getJobTool(): Tool {\n return {\n name: 'get_job',\n description: 'Get the status of a background job',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'ID of the job to check' }\n },\n required: ['id']\n },\n handler: async (args) => {\n try {\n const { id } = args;\n const job = await this.apiClient.getJob(id);\n this.metrics.recordAPICall('get_job', 'success');\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n success: true,\n job: {\n id: job.id, name: job.name, status: job.status,\n progress: job.progress, result: job.result, error: job.error,\n created_at: job.created_at, updated_at: job.updated_at\n }\n }, null, 2)\n }]\n };\n } catch (error: any) {\n logger.error('Failed to get job', { error: error.message });\n this.metrics.recordAPICall('get_job', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to get job status' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private triggerJobTool(): Tool {\n return {\n name: 'trigger_job',\n description: 'Trigger a named background job',\n inputSchema: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Name of the job to trigger' }\n },\n required: ['name']\n },\n handler: async (args) => {\n try {\n const { name } = args;\n const job = await this.apiClient.triggerJob(name);\n this.metrics.recordAPICall('trigger_job', 'success');\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n success: true,\n message: `Job \"${name}\" triggered successfully`,\n job_id: job.id,\n status: job.status,\n next_step: `Use 'get_job' with id: ${job.id} to check progress`\n }, null, 2)\n }]\n };\n } catch (error: any) {\n logger.error('Failed to trigger job', { error: error.message });\n this.metrics.recordAPICall('trigger_job', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to trigger job' }, null, 2) }], isError: true };\n }\n }\n };\n }\n}\n","/**\n * Resource Handler\n * Provides static and dynamic resources\n */\n\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { logger } from '../../utils/logger';\nimport { Resource } from '../../types/mcp';\n\nexport class ResourceHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n _cache: CacheManager\n ) {}\n \n getResources(): Resource[] {\n return [\n {\n uri: 'wisewand://schemas/article',\n name: 'Article Schema',\n description: 'Complete schema for article creation',\n mimeType: 'application/json'\n },\n {\n uri: 'wisewand://schemas/project',\n name: 'Project Schema',\n description: 'Schema for project configuration',\n mimeType: 'application/json'\n },\n {\n uri: 'wisewand://schemas/persona',\n name: 'Persona Schema',\n description: 'Schema for writing personas',\n mimeType: 'application/json'\n },\n {\n uri: 'wisewand://docs/quickstart',\n name: 'Quick Start Guide',\n description: 'Getting started with Wisewand MCP',\n mimeType: 'text/markdown'\n },\n {\n uri: 'wisewand://docs/workflows',\n name: 'Common Workflows',\n description: 'Example workflows for content generation',\n mimeType: 'text/markdown'\n },\n {\n uri: 'wisewand://stats/usage',\n name: 'Usage Statistics',\n description: 'Current API usage and limits',\n mimeType: 'application/json'\n }\n ];\n }\n \n async readResource(uri: string): Promise<any> {\n logger.debug('Reading resource', { uri });\n \n // Parse URI\n const url = new URL(uri);\n const path = url.pathname;\n \n switch (path) {\n case '/schemas/article':\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(this.getArticleSchema(), null, 2)\n }\n ]\n };\n \n case '/schemas/project':\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(this.getProjectSchema(), null, 2)\n }\n ]\n };\n \n case '/schemas/persona':\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(this.getPersonaSchema(), null, 2)\n }\n ]\n };\n \n case '/docs/quickstart':\n return {\n contents: [\n {\n uri,\n mimeType: 'text/markdown',\n text: this.getQuickStartGuide()\n }\n ]\n };\n \n case '/docs/workflows':\n return {\n contents: [\n {\n uri,\n mimeType: 'text/markdown',\n text: this.getWorkflowsGuide()\n }\n ]\n };\n \n case '/stats/usage':\n const usage = await this.apiClient.getUsageSummary();\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(usage, null, 2)\n }\n ]\n };\n \n default:\n throw new Error(`Resource not found: ${uri}`);\n }\n }\n \n private getArticleSchema() {\n return {\n type: 'object',\n properties: {\n subject: {\n type: 'string',\n description: 'Main topic of the article',\n minLength: 1\n },\n title: {\n type: 'string',\n description: 'Custom title (optional)'\n },\n type: {\n type: 'string',\n enum: ['blog', 'affiliation-product-review', 'affiliation-compare-products', 'affiliation-top-product'],\n default: 'blog'\n },\n lang: {\n type: 'string',\n enum: ['fr', 'en'],\n default: 'en'\n },\n country: {\n type: 'string',\n enum: ['fr', 'be', 'ch', 'ca', 'us', 'gb']\n },\n length: {\n oneOf: [\n { type: 'number', maximum: 5000 },\n { type: 'string', const: 'auto' }\n ],\n default: 'auto'\n },\n target_keyword: {\n type: 'string',\n description: 'Primary SEO keyword'\n },\n keywords_secondary: {\n type: 'string',\n description: 'Secondary keywords (comma-separated)'\n },\n seo_features: {\n type: 'object',\n properties: {\n use_faq: { type: 'boolean', default: false },\n use_toc: { type: 'boolean', default: false },\n use_boldkeywords: { type: 'boolean', default: false },\n use_internallinks: { type: 'boolean', default: false }\n }\n },\n image_generation: {\n type: 'object',\n properties: {\n use_image: { type: 'boolean', default: false },\n image_ratio: {\n type: 'string',\n enum: ['landscape', 'portrait', '16:9', '4:3', '1:1'],\n default: 'landscape'\n },\n image_prompt: { type: 'string' }\n }\n }\n },\n required: ['subject']\n };\n }\n \n private getProjectSchema() {\n return {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Project name',\n minLength: 1\n },\n website_url: {\n type: 'string',\n format: 'uri',\n description: 'Associated website'\n },\n description: {\n type: 'string',\n description: 'Project description'\n },\n default_lang: {\n type: 'string',\n enum: ['fr', 'en']\n },\n default_country: {\n type: 'string',\n enum: ['fr', 'be', 'ch', 'ca', 'us', 'gb']\n },\n default_persona_id: {\n type: 'string',\n format: 'uuid'\n }\n },\n required: ['name']\n };\n }\n \n private getPersonaSchema() {\n return {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Persona name',\n minLength: 1\n },\n description: {\n type: 'string'\n },\n tone: {\n type: 'string',\n description: 'Writing tone'\n },\n style: {\n type: 'string',\n description: 'Writing style'\n },\n voice: {\n type: 'string',\n description: 'Writing voice'\n },\n examples: {\n type: 'array',\n items: { type: 'string' }\n },\n guidelines: {\n type: 'string'\n }\n },\n required: ['name']\n };\n }\n \n private getQuickStartGuide(): string {\n return `# Wisewand MCP Quick Start Guide\n\n## 🎉 New to Wisewand? Start Here!\n\n**First time using Wisewand MCP?** Get comprehensive onboarding:\n\n\\`\\`\\`\nUse the onboarding wizard\n\\`\\`\\`\n\nThis interactive guide teaches you:\n- ✅ What all 74 tools can do (organized by category)\n- ✅ How to create your first article (step-by-step with examples)\n- ✅ 5 powerful real-world workflows\n- ✅ Best practices for SEO, cost management, and publishing\n\n**Takes 10-15 minutes and you'll be an expert!**\n\n---\n\n## Quick Reference\n\nFor experienced users, here's a quick workflow:\n\n### Step 1: Create a Project\n\nFirst, create a project to organize your content:\n\n\\`\\`\\`\ncreate_project({\n \"name\": \"My Blog\",\n \"website_url\": \"https://myblog.com\",\n \"default_lang\": \"en\"\n})\n\\`\\`\\`\n\n### Step 2: Create a Persona (Optional)\n\nDefine a writing style for consistent voice:\n\n\\`\\`\\`\ncreate_persona({\n \"name\": \"Professional Writer\",\n \"tone\": \"professional\",\n \"style\": \"informative\"\n})\n\\`\\`\\`\n\n### Step 3: Create an Article\n\nCreate your first article:\n\n\\`\\`\\`\ncreate_article({\n \"subject\": \"10 Tips for Better Content Marketing\",\n \"type\": \"blog\",\n \"target_keyword\": \"content marketing tips\",\n \"project_id\": \"<your-project-id>\",\n \"seo_features\": {\n \"use_faq\": true,\n \"use_toc\": true\n }\n})\n\\`\\`\\`\n\n### Step 4: Generate Content\n\nGenerate the article content:\n\n\\`\\`\\`\ngenerate_article({\n \"article_id\": \"<article-id>\",\n \"wait_for_completion\": true\n})\n\\`\\`\\`\n\n### Step 5: Retrieve Output\n\nGet the generated content:\n\n\\`\\`\\`\nget_article_output({\n \"article_id\": \"<article-id>\",\n \"format\": \"full\"\n})\n\\`\\`\\`\n\n### Step 6: Publish (Optional)\n\nPublish to WordPress:\n\n\\`\\`\\`\npublish_to_wordpress({\n \"entity_id\": \"<article-id>\",\n \"status\": \"publish\"\n})\n\\`\\`\\`\n\n## Common Commands\n\n- \\`list_articles\\` - View all articles\n- \\`list_projects\\` - View all projects\n- \\`estimate_article_cost\\` - Check generation cost\n- \\`bulk_create_articles\\` - Create multiple articles\n\n## Need Help?\n\n- Check the workflows guide: \\`wisewand://docs/workflows\\`\n- View API schemas: \\`wisewand://schemas/article\\`\n- Check usage: \\`wisewand://stats/usage\\`\n`;\n }\n \n private getWorkflowsGuide(): string {\n return `# Wisewand Common Workflows\n\n## 1. SEO-Optimized Blog Post\n\n\\`\\`\\`javascript\n// 1. Research keywords\nconst article = await create_article({\n subject: \"Ultimate Guide to SEO in 2024\",\n target_keyword: \"SEO guide 2024\",\n keywords_secondary: \"search engine optimization, SEO tips, Google ranking\",\n length: 2000,\n seo_features: {\n use_faq: true,\n use_toc: true,\n use_boldkeywords: true,\n use_internallinks: true\n },\n image_generation: {\n use_image: true,\n image_ratio: \"16:9\"\n }\n});\n\n// 2. Generate content\nawait generate_article({\n article_id: article.article_id,\n wait_for_completion: true\n});\n\n// 3. Publish\nawait publish_to_wordpress({\n entity_id: article.article_id,\n status: \"publish\"\n});\n\\`\\`\\`\n\n## 2. Bulk Content Campaign\n\n\\`\\`\\`javascript\n// 1. Prepare articles\nconst articles = [\n { subject: \"Topic 1\", target_keyword: \"keyword1\" },\n { subject: \"Topic 2\", target_keyword: \"keyword2\" },\n { subject: \"Topic 3\", target_keyword: \"keyword3\" }\n];\n\n// 2. Estimate cost\nconst cost = await bulk_estimate_cost({ articles });\n\n// 3. Create and generate\nawait bulk_create_articles({\n articles,\n auto_generate: true\n});\n\\`\\`\\`\n\n## 3. Multi-Language Content\n\n\\`\\`\\`javascript\n// Create same article in multiple languages\nconst languages = ['en', 'fr'];\nconst countries = { en: 'us', fr: 'fr' };\n\nfor (const lang of languages) {\n await create_article({\n subject: \"Product Launch Announcement\",\n lang,\n country: countries[lang],\n project_id: project.id\n });\n}\n\\`\\`\\`\n\n## 4. Product Review Article\n\n\\`\\`\\`javascript\nawait create_article({\n subject: \"iPhone 15 Pro Max Review\",\n type: \"affiliation-product-review\",\n target_keyword: \"iPhone 15 Pro Max review\",\n length: 3000,\n use_cta: true,\n ctas: [\n {\n anchor: \"Buy on Amazon\",\n url: \"https://amazon.com/...\"\n }\n ],\n image_generation: {\n use_image: true,\n image_prompt: \"Modern smartphone review setup\"\n }\n});\n\\`\\`\\`\n\n## 5. Content Series with Persona\n\n\\`\\`\\`javascript\n// 1. Create persona\nconst persona = await create_persona({\n name: \"Tech Expert\",\n tone: \"authoritative\",\n style: \"technical\",\n voice: \"first person plural\"\n});\n\n// 2. Create series\nconst topics = [\n \"AI Basics\",\n \"Machine Learning\",\n \"Neural Networks\",\n \"Deep Learning\"\n];\n\nfor (const topic of topics) {\n const article = await create_article({\n subject: \\`Understanding \\${topic}: A Comprehensive Guide\\`,\n persona_id: persona.persona_id,\n project_id: project.id\n });\n \n await generate_article({\n article_id: article.article_id\n });\n}\n\\`\\`\\`\n`;\n }\n}","/**\n * Prompt Handler\n * Provides interactive prompt templates\n */\n\nimport { logger } from '../../utils/logger';\nimport { Prompt } from '../../types/mcp';\n\nexport class PromptHandler {\n getPrompts(): Prompt[] {\n return [\n {\n name: 'blog_post_wizard',\n description: 'Interactive wizard for creating a blog post',\n arguments: [\n { name: 'topic', description: 'Blog post topic' },\n { name: 'keywords', description: 'Target keywords' },\n { name: 'length', description: 'Desired word count' }\n ]\n },\n {\n name: 'seo_optimization',\n description: 'SEO-focused content generation wizard',\n arguments: [\n { name: 'keyword', description: 'Primary keyword' },\n { name: 'competitors', description: 'Competitor URLs' }\n ]\n },\n {\n name: 'content_campaign',\n description: 'Plan and execute a content campaign',\n arguments: [\n { name: 'theme', description: 'Campaign theme' },\n { name: 'num_articles', description: 'Number of articles' },\n { name: 'schedule', description: 'Publishing schedule' }\n ]\n },\n {\n name: 'onboarding_wizard',\n description: 'Interactive guide for first-time users - learn tools, create your first article, discover workflows',\n arguments: [\n { name: 'focus_area', description: 'Optional: Focus on specific area (articles, publishing, discovery, bulk)' },\n { name: 'skip_to', description: 'Optional: Jump to section (tools, first-article, workflows, tips)' }\n ]\n }\n ];\n }\n \n async getPrompt(name: string, args: any): Promise<any> {\n logger.debug('Getting prompt', { name, args });\n \n switch (name) {\n case 'blog_post_wizard':\n return this.getBlogPostWizardPrompt(args);\n \n case 'seo_optimization':\n return this.getSEOOptimizationPrompt(args);\n \n case 'content_campaign':\n return this.getContentCampaignPrompt(args);\n\n case 'onboarding_wizard':\n return this.getOnboardingWizardPrompt(args);\n\n default:\n throw new Error(`Prompt not found: ${name}`);\n }\n }\n \n private getBlogPostWizardPrompt(args: any): any {\n const { topic, keywords, length } = args || {};\n \n const messages = [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `I want to create a blog post about: ${topic || '[topic]'}`\n }\n },\n {\n role: 'assistant',\n content: {\n type: 'text',\n text: `I'll help you create an optimized blog post about \"${topic || '[topic]'}\". Let me set this up for you.\n\nFirst, I'll create the article with these specifications:\n- Topic: ${topic || '[topic]'}\n- Target Keywords: ${keywords || '[keywords]'}\n- Length: ${length || 'auto'} words\n- Type: Blog post\n- SEO Features: FAQ, Table of Contents, Bold Keywords\n\nHere's what I'll do:\n1. Create the article with optimal SEO settings\n2. Generate high-quality content\n3. Include relevant internal links\n4. Add a featured image\n5. Optimize meta description\n\nLet me start by creating the article...`\n }\n }\n ];\n \n return {\n description: `Create a blog post about \"${topic || '[topic]'}\"`,\n messages\n };\n }\n \n private getSEOOptimizationPrompt(args: any): any {\n const { keyword, competitors } = args || {};\n \n const messages = [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `I want to rank for: ${keyword || '[keyword]'}`\n }\n },\n {\n role: 'assistant',\n content: {\n type: 'text',\n text: `I'll help you create content optimized to rank for \"${keyword || '[keyword]'}\".\n\nSEO Strategy:\n1. **Keyword Research**\n - Primary: ${keyword || '[keyword]'}\n - LSI keywords will be automatically identified\n - Search intent analysis\n\n2. **Content Structure**\n - Comprehensive guide format\n - FAQ section for voice search\n - Table of contents for easy navigation\n - Strategic keyword placement\n\n3. **Competitive Analysis**\n ${competitors ? `- Analyzing: ${competitors}` : '- Identifying top-ranking content'}\n - Finding content gaps\n - Improving on existing content\n\n4. **Technical SEO**\n - Optimized meta description\n - Proper heading structure\n - Internal linking strategy\n - Schema markup ready\n\nLet me create this SEO-optimized content for you...`\n }\n }\n ];\n \n return {\n description: `SEO-optimized content for \"${keyword || '[keyword]'}\"`,\n messages\n };\n }\n \n private getContentCampaignPrompt(args: any): any {\n const { theme, num_articles, schedule } = args || {};\n \n const messages = [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `I want to create a content campaign: ${theme || '[theme]'}`\n }\n },\n {\n role: 'assistant',\n content: {\n type: 'text',\n text: `I'll help you plan and execute a content campaign for \"${theme || '[theme]'}\".\n\nCampaign Overview:\n- Theme: ${theme || '[theme]'}\n- Articles: ${num_articles || '10'} pieces\n- Schedule: ${schedule || 'Weekly releases'}\n\nContent Strategy:\n\n1. **Pillar Content** (2 articles)\n - Comprehensive guides (3000+ words)\n - Main topic coverage\n - High-value, evergreen content\n\n2. **Supporting Content** (${(num_articles || 10) - 2} articles)\n - Related subtopics (1500-2000 words)\n - Linking to pillar content\n - Targeting long-tail keywords\n\n3. **Content Types**\n - How-to guides\n - Listicles\n - Case studies\n - Comparison articles\n - FAQ compilations\n\n4. **Publishing Schedule**\n ${schedule === 'daily' ? '- Daily releases for maximum impact' : ''}\n ${schedule === 'weekly' ? '- Weekly releases for consistent engagement' : ''}\n ${!schedule ? '- Optimized schedule based on your audience' : ''}\n\n5. **Cross-Promotion**\n - Internal linking strategy\n - Social media snippets\n - Email newsletter content\n\nLet me start creating this campaign for you...`\n }\n }\n ];\n \n return {\n description: `Content campaign: \"${theme || '[theme]'}\"`,\n messages\n };\n }\n\n private getOnboardingWizardPrompt(args: any): any {\n const { focus_area, skip_to } = args || {};\n\n const messages = [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `I want to learn how to use Wisewand MCP`\n }\n },\n {\n role: 'assistant',\n content: {\n type: 'text',\n text: `Welcome to Wisewand MCP! 🎉\n\nI'm excited to guide you through this powerful AI-powered content generation platform. With 74 tools across 14 categories, Wisewand helps you create high-quality SEO-optimized content at scale.\n\n**What we'll cover:**\n\n1. **Tool Categories Overview** - Understand what Wisewand can do\n2. **Create Your First Article** - Step-by-step walkthrough with examples\n3. **Common Workflows** - Real-world scenarios and complete flows\n4. **Best Practices & Tips** - Maximize quality and efficiency\n\nThis guide will take about 10-15 minutes. You'll leave knowing how to create professional content, publish to WordPress, and leverage powerful automation workflows.\n\nReady to get started?`\n }\n },\n {\n role: 'user',\n content: {\n type: 'text',\n text: `Yes, let's go through the full onboarding`\n }\n },\n {\n role: 'assistant',\n content: {\n type: 'text',\n text: `## 1. Tool Categories Overview\n\nWisewand's 74 tools are organized into **7 logical categories** by use case:\n\n### 🎨 Content Creation Powerhouse\n**Core tools for generating different content types:**\n- **Articles** (16 tools) - Blog posts, guides, tutorials with advanced SEO\n- **Category Pages** (9 tools) - Category and pillar content\n- **Product Pages** (9 tools) - Product reviews and comparisons\n- **Discover** (6 tools) - Content ideas and topic research\n\n### 📁 Organization & Branding\n**Structure your content library:**\n- **Projects** (7 tools) - Organize content by project/website\n- **Personas** (6 tools) - Create branded writing voices\n\n### 🚀 Publishing & Distribution\n**Get content live:**\n- **Publishing** (9 tools) - WordPress integration, direct publishing\n- **RSS/Feeds** (5 tools) - Auto-generate content from RSS feeds\n\n### ⚡ Scale & Efficiency\n**Bulk operations for serious content creators:**\n- **Bulk Operations** (3 tools) - Create multiple articles simultaneously\n- **Jobs** (3 tools) - Monitor background processing\n- **Update Posts** (3 tools) - Refresh existing content\n\n### 🔗 WordPress Power Features\n**Advanced WordPress capabilities:**\n- **Connections** (4 tools) - Manage WordPress sites\n- **Internal Links** (2 tools) - Auto-link content intelligently\n\n### 📊 Monitoring & Cost Control\n**Track usage and performance:**\n- **Transactions** (2 tools) - Monitor API usage and costs\n- **Utilities** (3 tools) - Health checks and diagnostics\n\n${focus_area ? `\\n**You indicated interest in \"${focus_area}\"** - I'll emphasize those tools as we continue!\\n` : ''}\n\n**Most users start with Articles** - they're versatile, SEO-optimized, and perfect for blogs, guides, and tutorials.\n\nWant to see how to create your first article?`\n }\n },\n {\n role: 'user',\n content: {\n type: 'text',\n text: `Show me how to create my first article`\n }\n },\n {\n role: 'assistant',\n content: {\n type: 'text',\n text: `## 2. Create Your First Article - Complete Walkthrough\n\nLet me walk you through creating a professional blog post step-by-step.\n\n### Step 1: Optional - Create a Project\n\nProjects help you organize content by website/brand. Skip this if you're just testing:\n\n\\`\\`\\`json\ncreate_project({\n \"name\": \"My Tech Blog\",\n \"description\": \"Articles about web development and AI\"\n})\n\\`\\`\\`\n\n### Step 2: Create the Article\n\nUse \\`create_article\\` - this is where the magic happens. Here's a complete example:\n\n\\`\\`\\`json\ncreate_article({\n \"subject\": \"10 Beginner Tips for Content Marketing Success\",\n \"type\": \"blog\",\n \"lang\": \"en\",\n \"length\": 1500,\n \"target_keyword\": \"content marketing tips\",\n \"keywords_secondary\": \"digital marketing, content strategy, SEO basics\",\n \"use_faq\": true,\n \"use_toc\": true,\n \"use_boldkeywords\": true,\n \"use_image\": true,\n \"image_ratio\": \"16:9\"\n})\n\\`\\`\\`\n\n**What these parameters do:**\n- \\`subject\\`: Your article title/topic\n- \\`type\\`: \"blog\", \"tutorial\", \"guide\", \"listicle\", etc.\n- \\`length\\`: Target word count (500-5000)\n- \\`target_keyword\\`: Primary SEO keyword\n- \\`keywords_secondary\\`: Related keywords for semantic SEO\n- \\`use_faq\\`: Add FAQ section (great for voice search!)\n- \\`use_toc\\`: Table of contents for long articles\n- \\`use_boldkeywords\\`: Bold important keywords naturally\n- \\`use_image\\`: Generate AI featured image\n- \\`image_ratio\\`: \"16:9\", \"1:1\", \"4:3\", \"9:16\"\n\n### Step 3: Understanding the Response\n\nYou'll receive:\n\\`\\`\\`json\n{\n \"id\": \"art_abc123\",\n \"status\": \"processing\",\n \"estimated_time\": 45\n}\n\\`\\`\\`\n\nThe article is being generated in the background (takes 30-60 seconds).\n\n### Step 4: Generate the Article Content\n\nCall \\`generate_article\\` with the article ID:\n\n\\`\\`\\`json\ngenerate_article({\n \"article_id\": \"art_abc123\"\n})\n\\`\\`\\`\n\nThis triggers the AI writing process. The content will be SEO-optimized, well-structured, and ready to publish.\n\n### Step 5: Retrieve Your Content\n\nAfter ~45 seconds, get the final content:\n\n\\`\\`\\`json\nget_article_output({\n \"article_id\": \"art_abc123\",\n \"format\": \"html\"\n})\n\\`\\`\\`\n\nYou'll receive:\n- Full HTML article with proper formatting\n- Meta description optimized for search\n- FAQ schema markup (if enabled)\n- Featured image URL\n- SEO analysis and suggestions\n\n### Step 6: Optional - Publish to WordPress\n\nIf you have WordPress connected:\n\n\\`\\`\\`json\npublish_article({\n \"article_id\": \"art_abc123\",\n \"connection_id\": \"conn_xyz789\",\n \"status\": \"draft\",\n \"add_internal_links\": true\n})\n\\`\\`\\`\n\n**That's it!** You've created a professional, SEO-optimized article.\n\n**Pro Tip:** Use \\`wisewand://schemas/article\\` resource to see all available parameters and options.\n\nReady to explore common workflows?`\n }\n },\n {\n role: 'user',\n content: {\n type: 'text',\n text: `What are some common workflows I should know?`\n }\n },\n {\n role: 'assistant',\n content: {\n type: 'text',\n text: `## 3. Common Workflows - Real-World Scenarios\n\nHere are 5 powerful workflows that Wisewand users love:\n\n### 🎯 Workflow 1: SEO Blog Series\n\n**Goal:** Create a 10-article series targeting related keywords\n\n\\`\\`\\`\n1. create_project → \"SEO Fundamentals Series\"\n2. create_article x10 with related keywords:\n - \"seo basics for beginners\"\n - \"keyword research tutorial\"\n - \"on-page seo checklist\"\n - etc.\n3. generate_article for each (can run in parallel!)\n4. Use add_internal_links to cross-link the series\n5. publish_article as drafts for review\n6. Schedule WordPress posts weekly\n\\`\\`\\`\n\n**Why it works:** Topical authority + internal linking = SEO gold\n\n---\n\n### 🛍️ Workflow 2: Product Review Site\n\n**Goal:** Build affiliate content with product comparisons\n\n\\`\\`\\`\n1. create_product_page with affiliate product details\n2. Set comparison_mode: true for \"X vs Y\" articles\n3. Use include_pros_cons: true\n4. Enable use_affiliate_disclaimer: true\n5. generate_product_page\n6. Publish with affiliate links intact\n\\`\\`\\`\n\n**Pro tip:** Use \\`create_bulk_articles\\` to generate 20+ product reviews simultaneously!\n\n---\n\n### 🌍 Workflow 3: Multi-Language Content\n\n**Goal:** Same article in 5 languages for global reach\n\n\\`\\`\\`\n1. create_article with lang: \"en\"\n2. generate_article → get English version\n3. create_article with same subject, lang: \"es\"\n4. create_article with lang: \"fr\", \"de\", \"ja\"\n5. Wisewand optimizes for each language's SEO norms\n6. Publish to different WordPress sites or multilingual setup\n\\`\\`\\`\n\n**Why it works:** Native-quality content in each language, not machine translation\n\n---\n\n### 📡 Workflow 4: RSS-Powered Auto-Publishing\n\n**Goal:** Curate industry content automatically\n\n\\`\\`\\`\n1. create_rss_connection with industry feeds\n2. create_rss_article_from_feed:\n - Monitors RSS feeds\n - Generates original commentary/analysis\n - Adds your expert perspective\n3. Set up recurring jobs (via Jobs tools)\n4. Auto-publish blog posts to WordPress\n\\`\\`\\`\n\n**Perfect for:** Content curation, industry newsletters, trend analysis blogs\n\n---\n\n### 🔄 Workflow 5: Update Old Content\n\n**Goal:** Refresh 50 old articles with new info\n\n\\`\\`\\`\n1. List existing WordPress posts via get_posts\n2. Use update_post to refresh content:\n - Add new statistics/data\n - Update outdated sections\n - Improve SEO based on current trends\n3. Batch process with create_bulk_update\n4. Monitor via get_job_status\n5. Re-publish updated articles\n\\`\\`\\`\n\n**Impact:** Revive organic traffic from existing content\n\n---\n\n**Which workflow matches your use case?** Each can be customized further with personas, custom images, and advanced SEO settings.\n\nWant to learn best practices next?`\n }\n },\n {\n role: 'user',\n content: {\n type: 'text',\n text: `What are the best practices and tips?`\n }\n },\n {\n role: 'assistant',\n content: {\n type: 'text',\n text: `## 4. Best Practices & Tips - Maximize Your Results\n\n### ✍️ Content Quality Tips\n\n**1. Write Better Prompts (Subjects)**\n- ❌ \"SEO article\"\n- ✅ \"Complete Guide to Technical SEO for E-commerce Sites in 2024\"\n- **Why:** Specific subjects = focused, higher-quality content\n\n**2. Use Secondary Keywords Strategically**\n- Don't stuff: \"seo, seo tips, seo guide, seo tutorial\"\n- Do diversify: \"search rankings, organic traffic, SERP visibility, keyword research\"\n- **Impact:** Better semantic SEO and topic coverage\n\n**3. Leverage Content Types**\n- \\`type: \"listicle\"\\` → Scannable, share-worthy\n- \\`type: \"tutorial\"\\` → Step-by-step, actionable\n- \\`type: \"guide\"\\` → Comprehensive, authoritative\n- \\`type: \"comparison\"\\` → Decision-focused, high-intent\n\n**4. Always Enable These:**\n- \\`use_toc: true\\` - Improves UX and may earn rich snippets\n- \\`use_faq: true\\` - Targets voice search and featured snippets\n- \\`use_boldkeywords: true\\` - Helps readability and SEO\n\n---\n\n### 🎯 SEO Optimization Techniques\n\n**5. Keyword Strategy**\n- Primary keyword: Search volume 500-5000 (sweet spot)\n- Include 5-7 secondary keywords for context\n- Use long-tail variations in FAQs\n\n**6. Content Length Guidelines**\n- Blog posts: 1200-1800 words\n- Guides: 2500-4000 words\n- Product reviews: 1500-2500 words\n- Category pages: 1000-1500 words\n\n**7. Internal Linking Power**\n- Use \\`add_internal_links: true\\` when publishing\n- Wisewand auto-identifies relevant existing content\n- Builds topic clusters automatically\n\n**8. Meta Description Magic**\n- Wisewand auto-generates optimized meta descriptions\n- Always includes target keyword\n- Compelling CTAs for higher click-through rates\n\n---\n\n### 💰 Cost Management\n\n**9. Monitor Transactions**\nUse \\`get_transactions\\` to track:\n- API usage per article\n- Monthly spending trends\n- Cost per content type\n\n**10. Batch Processing Saves Money**\n- \\`create_bulk_articles\\` is more efficient than individual calls\n- Process 10-50 articles at once\n- Use Jobs tools to monitor progress\n\n**11. Smart Image Usage**\n- AI images cost credits\n- Skip images for quick updates: \\`use_image: false\\`\n- Use images for evergreen content: \\`use_image: true\\`\n- Best ratios: 16:9 (blog), 1:1 (social), 9:16 (mobile)\n\n---\n\n### 🚀 Publishing Workflows\n\n**12. Draft → Review → Publish**\n\\`\\`\\`json\npublish_article({\n \"status\": \"draft\", // Review before going live\n \"add_internal_links\": true,\n \"set_featured_image\": true\n})\n\\`\\`\\`\n\n**13. WordPress Connection Best Practices**\n- Use \\`list_connections\\` to verify active connections\n- Test with \\`test_connection\\` before bulk publishing\n- Store connection IDs for reuse\n\n**14. Scheduling Strategy**\n- Publish drafts immediately\n- Use WordPress native scheduling for timed releases\n- Spread publications across the week for consistent traffic\n\n---\n\n### 🎨 Image Generation Tips\n\n**15. Choose the Right Ratio**\n- **16:9** - Blog featured images, hero sections\n- **1:1** - Social media, thumbnails\n- **4:3** - Traditional blog layouts\n- **9:16** - Mobile-first, stories\n\n**16. Image Prompts**\nWisewand auto-generates images from your article subject, but you can customize:\n- More specific subjects = better images\n- Mention visual elements: \"infographic about...\", \"diagram showing...\"\n\n---\n\n### 📚 Resources to Bookmark\n\n**17. Essential Resources**\n- \\`wisewand://schemas/article\\` - Complete article parameters\n- \\`wisewand://schemas/product\\` - Product page options\n- \\`wisewand://docs/quickstart\\` - Quick reference guide\n- \\`wisewand://docs/wordpress\\` - WordPress integration guide\n\n**18. Advanced Features to Explore**\n- **Personas** - Brand voice consistency across content\n- **RSS Integration** - Automated content curation\n- **Bulk Operations** - Scale to 100+ articles/month\n- **Update Posts** - Keep content fresh with minimal effort\n\n---\n\n### 🎓 Quick Wins for Beginners\n\nStart with these 3 high-impact actions:\n\n1. **Create Your First Article**\n - Simple subject, 1500 words, enable FAQ + TOC\n - See what Wisewand can do\n\n2. **Set Up WordPress Connection**\n - Use \\`create_connection\\` with your site\n - Publish one test article\n - Experience the full workflow\n\n3. **Try a Bulk Operation**\n - Create 5 related articles with \\`create_bulk_articles\\`\n - Watch them process in parallel\n - Feel the power of scale\n\n---\n\n**You're now equipped to create professional content with Wisewand!**\n\nRemember: Start simple, experiment with features, and scale as you learn. The 74 tools are there when you need them, but you can accomplish most tasks with just 5-10 core tools.\n\nQuestions? Use the resources above or explore tool documentation directly.`\n }\n },\n {\n role: 'assistant',\n content: {\n type: 'text',\n text: `## 🎉 Onboarding Complete!\n\nYou now know:\n- ✅ What Wisewand's 74 tools can do\n- ✅ How to create your first article step-by-step\n- ✅ 5 powerful real-world workflows\n- ✅ Best practices for quality, SEO, and cost efficiency\n\n---\n\n### 📖 Quick Reference\n\n**Most-Used Tools:**\n1. \\`create_article\\` - Start any content project\n2. \\`generate_article\\` - Trigger AI writing\n3. \\`get_article_output\\` - Retrieve finished content\n4. \\`publish_article\\` - Push to WordPress\n5. \\`create_bulk_articles\\` - Scale your content\n\n**Essential Resources:**\n- \\`wisewand://schemas/article\\` - All article parameters\n- \\`wisewand://docs/quickstart\\` - Quick start guide\n- \\`wisewand://docs/wordpress\\` - WordPress setup\n\n---\n\n### 🚀 Try This Now\n\nCreate your first article with this simple command:\n\n\\`\\`\\`json\ncreate_article({\n \"subject\": \"Getting Started with [Your Topic]\",\n \"type\": \"guide\",\n \"lang\": \"en\",\n \"length\": 1500,\n \"target_keyword\": \"[your keyword]\",\n \"use_faq\": true,\n \"use_toc\": true,\n \"use_image\": true\n})\n\\`\\`\\`\n\nThen call \\`generate_article\\` with the returned ID, wait 45 seconds, and use \\`get_article_output\\` to see your content!\n\n---\n\n**Welcome to the Wisewand community!** 🎊\n\n${skip_to ? `\\n*(You used skip_to=\"${skip_to}\" - hope this section was helpful!)*\\n` : ''}\n${focus_area ? `\\n*(Focus area \"${focus_area}\" noted - explore those tools next!)*\\n` : ''}`\n }\n }\n ];\n\n return {\n description: 'Interactive onboarding for Wisewand MCP Server',\n messages\n };\n }\n}","/**\n * Graceful Shutdown Handler\n */\n\nimport { logger } from './logger';\nimport { WisewandMCPServer } from '../server/WisewandMCPServer';\n\nexport function gracefulShutdown(server: WisewandMCPServer): void {\n let isShuttingDown = false;\n \n const shutdown = async (signal: string) => {\n if (isShuttingDown) {\n logger.info('Shutdown already in progress');\n return;\n }\n \n isShuttingDown = true;\n logger.info(`Received ${signal}, starting graceful shutdown...`);\n \n // Give ongoing requests 30 seconds to complete\n const shutdownTimeout = setTimeout(() => {\n logger.error('Forced shutdown due to timeout');\n process.exit(1);\n }, 30000);\n \n try {\n // Shutdown server\n await server.shutdown();\n \n clearTimeout(shutdownTimeout);\n logger.info('Graceful shutdown completed');\n process.exit(0);\n \n } catch (error) {\n logger.error('Error during shutdown', error);\n clearTimeout(shutdownTimeout);\n process.exit(1);\n }\n };\n \n // Handle different termination signals\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n process.on('SIGHUP', () => shutdown('SIGHUP'));\n \n // Handle Windows\n if (process.platform === 'win32') {\n const readline = require('readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n \n rl.on('SIGINT', () => {\n process.emit('SIGINT' as any);\n });\n }\n}"],"mappings":"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","names":["config","config","config","config","z","z","result","z","z","result","result","z","z","result","result","z","z","result","result","z","boolField","z","numField","LANG_ENUM","COUNTRY_ENUM","result","z","boolField","z","numField","LANG_ENUM","COUNTRY_ENUM","result","z","boolField","z","result","z","z","result","result","result","config","result"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config/index.ts","../src/utils/logger.ts","../src/server/WisewandMCPServer.ts","../src/clients/WisewandAPIClient.ts","../src/services/CacheManager.ts","../src/services/RateLimiter.ts","../src/monitoring/MetricsCollector.ts","../src/monitoring/HealthChecker.ts","../src/handlers/tools/ArticleToolHandler.ts","../src/handlers/tools/ProjectToolHandler.ts","../src/handlers/tools/PublishingToolHandler.ts","../src/handlers/tools/PersonaToolHandler.ts","../src/handlers/tools/BulkOperationsToolHandler.ts","../src/handlers/tools/ConnectionsToolHandler.ts","../src/handlers/tools/UtilityToolHandler.ts","../src/handlers/tools/CategoryPagesToolHandler.ts","../src/handlers/tools/ProductPagesToolHandler.ts","../src/handlers/tools/DiscoverToolHandler.ts","../src/handlers/tools/RSSToolHandler.ts","../src/handlers/tools/TransactionsToolHandler.ts","../src/handlers/tools/JobsToolHandler.ts","../src/handlers/resources/ResourceHandler.ts","../src/handlers/prompts/PromptHandler.ts","../src/utils/shutdown.ts"],"sourcesContent":["/**\n * Wisewand MCP Server\n * Production-ready Model Context Protocol server for Wisewand API\n */\n\n// import { Server } from '@modelcontextprotocol/sdk/server/index';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { config } from './config/index';\nimport { logger, logCriticalError } from './utils/logger';\nimport { WisewandMCPServer } from './server/WisewandMCPServer';\nimport { gracefulShutdown } from './utils/shutdown';\n\nasync function main() {\n try {\n logger.info('Starting Wisewand MCP Server', {\n version: process.env.npm_package_version,\n environment: config.environment,\n nodeVersion: process.version\n });\n\n // Create and initialize server\n const server = new WisewandMCPServer(config);\n\n // Validate API connectivity before starting\n logger.info('Testing API connectivity...');\n try {\n const apiHealth = await server.testAPIConnection();\n if (!apiHealth.ok) {\n console.error('❌ FATAL: Cannot connect to Wisewand API');\n console.error(` Reason: ${apiHealth.error}`);\n console.error(' Check your WISEWAND_API_KEY and network connection');\n console.error(' Get your API key from: https://app.wisewand.ai/api');\n process.exit(1);\n }\n logger.info('✓ API connectivity verified');\n } catch (error: any) {\n console.error('❌ FATAL: Failed to validate API connection');\n console.error(` Error: ${error.message}`);\n console.error(' Check your WISEWAND_API_KEY and network connection');\n process.exit(1);\n }\n\n // Set up transport based on environment\n const transport = new StdioServerTransport();\n\n // Connect and start\n await server.connect(transport);\n \n logger.info('Wisewand MCP Server started successfully', {\n tools: server.getToolCount(),\n resources: server.getResourceCount(),\n prompts: server.getPromptCount()\n });\n\n // Set up graceful shutdown\n gracefulShutdown(server);\n \n } catch (error: any) {\n logCriticalError('Failed to start Wisewand MCP Server', error);\n process.exit(1);\n }\n}\n\n// Handle uncaught errors\nprocess.on('uncaughtException', (error) => {\n logCriticalError('Uncaught Exception', error);\n process.exit(1);\n});\n\nprocess.on('unhandledRejection', (reason: any) => {\n logCriticalError('Unhandled Rejection', reason);\n process.exit(1);\n});\n\n// Start the server\nmain();\n\nexport { WisewandMCPServer };","/**\n * Configuration management with validation\n */\n\nimport { z } from 'zod';\nimport dotenv from 'dotenv';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\n\n// Load environment variables\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Load .env file if it exists (optional for npx installations)\nconst envPath = join(__dirname, '../../.env');\nconst result = dotenv.config({ path: envPath });\nif (result.error && (result.error as any).code !== 'ENOENT') {\n // Only warn if error is NOT \"file not found\"\n console.warn('Warning: .env file could not be loaded:', result.error.message);\n}\n\n// Configuration schema\nconst ConfigSchema = z.object({\n // Environment\n environment: z.enum(['development', 'staging', 'production']).default('production'),\n \n // Wisewand API\n wisewand: z.object({\n apiKey: z.string().min(1, 'WISEWAND_API_KEY is required'),\n apiUrl: z.string().url().default('https://api.wisewand.ai'),\n timeout: z.number().default(30000),\n retryAttempts: z.number().default(3),\n retryDelay: z.number().default(1000)\n }),\n \n // Server\n server: z.object({\n port: z.number().default(3000),\n host: z.string().default('0.0.0.0'),\n logLevel: z.enum(['error', 'warn', 'info', 'debug']).default('info')\n }),\n \n // Redis (optional)\n redis: z.object({\n enabled: z.boolean().default(false),\n host: z.string().default('localhost'),\n port: z.number().default(6379),\n password: z.string().optional(),\n tls: z.boolean().default(false),\n db: z.number().default(0),\n keyPrefix: z.string().default('wisewand:mcp:')\n }).optional(),\n \n // Security\n security: z.object({\n enableRateLimiting: z.boolean().default(true),\n maxRequestsPerMinute: z.number().default(60),\n enableRequestValidation: z.boolean().default(true),\n trustedOrigins: z.array(z.string()).default([]),\n enableApiKeyRotation: z.boolean().default(false),\n apiKeyRotationInterval: z.number().default(86400000) // 24 hours\n }),\n \n // Cache\n cache: z.object({\n enabled: z.boolean().default(true),\n ttlSeconds: z.number().default(300),\n maxSizeMB: z.number().default(100),\n strategy: z.enum(['memory', 'redis', 'hybrid']).default('memory')\n }),\n \n // Monitoring\n monitoring: z.object({\n enableMetrics: z.boolean().default(true),\n metricsPort: z.number().default(9090),\n enableTracing: z.boolean().default(false),\n tracingEndpoint: z.string().optional(),\n enableHealthCheck: z.boolean().default(true),\n healthCheckInterval: z.number().default(30000)\n }),\n \n // Features\n features: z.object({\n enableBulkOperations: z.boolean().default(true),\n enableWebhooks: z.boolean().default(true),\n enableWordPress: z.boolean().default(true),\n enableRSSAutomation: z.boolean().default(true),\n enableContentDiscovery: z.boolean().default(true),\n maxBulkSize: z.number().default(100),\n maxConcurrentGenerations: z.number().default(5)\n })\n});\n\n// Parse and validate configuration\nconst parseConfig = () => {\n // Validate API key format before parsing full config\n const apiKey = process.env.WISEWAND_API_KEY;\n if (!apiKey) {\n console.error('❌ FATAL: WISEWAND_API_KEY environment variable not set');\n console.error(' Get your API key from: https://app.wisewand.ai/api');\n process.exit(1);\n }\n if (!apiKey.startsWith('sk_live_') && !apiKey.startsWith('sk_test_')) {\n console.error('❌ FATAL: WISEWAND_API_KEY has invalid format');\n console.error(' Expected: sk_live_... or sk_test_...');\n console.error(` Got: ${apiKey.substring(0, 10)}...`);\n console.error(' Get your API key from: https://app.wisewand.ai/api');\n process.exit(1);\n }\n\n try {\n const config = ConfigSchema.parse({\n environment: process.env.NODE_ENV,\n \n wisewand: {\n apiKey: process.env.WISEWAND_API_KEY,\n apiUrl: process.env.WISEWAND_API_URL,\n timeout: process.env.WISEWAND_TIMEOUT ? parseInt(process.env.WISEWAND_TIMEOUT) : undefined,\n retryAttempts: process.env.WISEWAND_RETRY_ATTEMPTS ? parseInt(process.env.WISEWAND_RETRY_ATTEMPTS) : undefined,\n retryDelay: process.env.WISEWAND_RETRY_DELAY ? parseInt(process.env.WISEWAND_RETRY_DELAY) : undefined\n },\n \n server: {\n port: process.env.PORT ? parseInt(process.env.PORT) : undefined,\n host: process.env.HOST,\n logLevel: process.env.LOG_LEVEL as any\n },\n \n redis: process.env.REDIS_HOST ? {\n enabled: true,\n host: process.env.REDIS_HOST,\n port: process.env.REDIS_PORT ? parseInt(process.env.REDIS_PORT) : undefined,\n password: process.env.REDIS_PASSWORD,\n tls: process.env.REDIS_TLS === 'true',\n db: process.env.REDIS_DB ? parseInt(process.env.REDIS_DB) : undefined,\n keyPrefix: process.env.REDIS_KEY_PREFIX\n } : undefined,\n \n security: {\n enableRateLimiting: process.env.ENABLE_RATE_LIMITING !== 'false',\n maxRequestsPerMinute: process.env.MAX_REQUESTS_PER_MINUTE ? \n parseInt(process.env.MAX_REQUESTS_PER_MINUTE) : undefined,\n enableRequestValidation: process.env.ENABLE_REQUEST_VALIDATION !== 'false',\n trustedOrigins: process.env.TRUSTED_ORIGINS?.split(',') || [],\n enableApiKeyRotation: process.env.ENABLE_API_KEY_ROTATION === 'true',\n apiKeyRotationInterval: process.env.API_KEY_ROTATION_INTERVAL ? \n parseInt(process.env.API_KEY_ROTATION_INTERVAL) : undefined\n },\n \n cache: {\n enabled: process.env.ENABLE_CACHE !== 'false',\n ttlSeconds: process.env.CACHE_TTL_SECONDS ? \n parseInt(process.env.CACHE_TTL_SECONDS) : undefined,\n maxSizeMB: process.env.MAX_CACHE_SIZE_MB ? \n parseInt(process.env.MAX_CACHE_SIZE_MB) : undefined,\n strategy: process.env.CACHE_STRATEGY as any\n },\n \n monitoring: {\n enableMetrics: process.env.ENABLE_METRICS !== 'false',\n metricsPort: process.env.METRICS_PORT ? \n parseInt(process.env.METRICS_PORT) : undefined,\n enableTracing: process.env.ENABLE_TRACING === 'true',\n tracingEndpoint: process.env.TRACING_ENDPOINT,\n enableHealthCheck: process.env.ENABLE_HEALTH_CHECK !== 'false',\n healthCheckInterval: process.env.HEALTH_CHECK_INTERVAL ? \n parseInt(process.env.HEALTH_CHECK_INTERVAL) : undefined\n },\n \n features: {\n enableBulkOperations: process.env.ENABLE_BULK_OPERATIONS !== 'false',\n enableWebhooks: process.env.ENABLE_WEBHOOKS !== 'false',\n enableWordPress: process.env.ENABLE_WORDPRESS !== 'false',\n enableRSSAutomation: process.env.ENABLE_RSS_AUTOMATION !== 'false',\n enableContentDiscovery: process.env.ENABLE_CONTENT_DISCOVERY !== 'false',\n maxBulkSize: process.env.MAX_BULK_SIZE ? \n parseInt(process.env.MAX_BULK_SIZE) : undefined,\n maxConcurrentGenerations: process.env.MAX_CONCURRENT_GENERATIONS ? \n parseInt(process.env.MAX_CONCURRENT_GENERATIONS) : undefined\n }\n });\n \n return config;\n } catch (error) {\n if (error instanceof z.ZodError) {\n console.error('Configuration validation failed:');\n error.errors.forEach(err => {\n console.error(` - ${err.path.join('.')}: ${err.message}`);\n });\n process.exit(1);\n }\n throw error;\n }\n};\n\nexport const config = parseConfig();\nexport type Config = z.infer<typeof ConfigSchema>;","/**\n * Logger configuration\n */\n\nimport winston from 'winston';\nimport { config } from '../config/index';\n\n// Detect if running as MCP server (stdio transport)\nconst isMCPServer = !process.stdout.isTTY || process.env.MCP_MODE === 'stdio';\n\nconst logFormat = winston.format.combine(\n winston.format.timestamp({\n format: 'YYYY-MM-DD HH:mm:ss'\n }),\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n winston.format.json()\n);\n\nconst consoleFormat = winston.format.combine(\n winston.format.colorize(),\n winston.format.timestamp({\n format: 'HH:mm:ss'\n }),\n winston.format.printf(({ timestamp, level, message, ...meta }) => {\n const metaStr = Object.keys(meta).length ? JSON.stringify(meta, null, 2) : '';\n return `${timestamp} ${level}: ${message} ${metaStr}`;\n })\n);\n\n// Configure transports based on environment\nconst transports: winston.transport[] = [];\n\n// Only add console transport if NOT running as MCP server\nif (!isMCPServer) {\n transports.push(\n new winston.transports.Console({\n format: config.environment === 'development' ? consoleFormat : logFormat,\n silent: process.env.NODE_ENV === 'test'\n })\n );\n}\n\n// Always log to stderr when in MCP mode (for debugging)\nif (isMCPServer && config.environment === 'development') {\n transports.push(\n new winston.transports.Stream({\n stream: process.stderr,\n format: winston.format.simple()\n })\n );\n}\n\nexport const logger = winston.createLogger({\n level: config.server.logLevel,\n format: logFormat,\n defaultMeta: { \n service: 'wisewand-mcp',\n environment: config.environment \n },\n transports,\n silent: isMCPServer && config.environment === 'production'\n});\n\n// Production file logging\nif (config.environment === 'production' && !isMCPServer) {\n logger.add(new winston.transports.File({\n filename: 'logs/error.log',\n level: 'error',\n maxsize: 5242880, // 5MB\n maxFiles: 5\n }));\n \n logger.add(new winston.transports.File({\n filename: 'logs/combined.log',\n maxsize: 5242880, // 5MB\n maxFiles: 5\n }));\n}\n\n// Error handling\nlogger.on('error', (error) => {\n if (!isMCPServer) {\n console.error('Logger error:', error);\n }\n});\n\n/**\n * Log critical errors that must always be visible to the user\n * This bypasses Winston's silent mode and writes directly to stderr\n * Use this for startup failures, configuration errors, and fatal issues\n */\nexport function logCriticalError(message: string, error?: any): void {\n // Always write to stderr, even when logger is silent\n console.error(`[CRITICAL] ${message}`);\n if (error) {\n if (error.message) console.error(` Error: ${error.message}`);\n if (error.stack) console.error(error.stack);\n }\n}","/**\n * Main MCP Server implementation\n */\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport {\n CallToolRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n ListPromptsRequestSchema,\n GetPromptRequestSchema,\n ListToolsRequestSchema,\n ServerCapabilities\n} from '@modelcontextprotocol/sdk/types.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\nimport { Config } from '../config/index';\nimport { logger } from '../utils/logger';\nimport { WisewandAPIClient } from '../clients/WisewandAPIClient';\nimport { CacheManager } from '../services/CacheManager';\nimport { RateLimiter } from '../services/RateLimiter';\nimport { MetricsCollector } from '../monitoring/MetricsCollector';\nimport { HealthChecker } from '../monitoring/HealthChecker';\n\n// Tool Handlers\nimport { ArticleToolHandler } from '../handlers/tools/ArticleToolHandler';\nimport { ProjectToolHandler } from '../handlers/tools/ProjectToolHandler';\nimport { PublishingToolHandler } from '../handlers/tools/PublishingToolHandler';\nimport { PersonaToolHandler } from '../handlers/tools/PersonaToolHandler';\nimport { BulkOperationsToolHandler } from '../handlers/tools/BulkOperationsToolHandler';\nimport { ConnectionsToolHandler } from '../handlers/tools/ConnectionsToolHandler';\nimport { UtilityToolHandler } from '../handlers/tools/UtilityToolHandler';\nimport { CategoryPagesToolHandler } from '../handlers/tools/CategoryPagesToolHandler';\nimport { ProductPagesToolHandler } from '../handlers/tools/ProductPagesToolHandler';\nimport { DiscoverToolHandler } from '../handlers/tools/DiscoverToolHandler';\nimport { RSSToolHandler } from '../handlers/tools/RSSToolHandler';\nimport { TransactionsToolHandler } from '../handlers/tools/TransactionsToolHandler';\nimport { JobsToolHandler } from '../handlers/tools/JobsToolHandler';\n\n// Resource Handlers\nimport { ResourceHandler } from '../handlers/resources/ResourceHandler';\n\n// Prompt Handlers\nimport { PromptHandler } from '../handlers/prompts/PromptHandler';\n\nexport class WisewandMCPServer {\n private server: Server;\n private apiClient: WisewandAPIClient;\n private cacheManager: CacheManager;\n private rateLimiter: RateLimiter;\n private metrics: MetricsCollector;\n private healthChecker: HealthChecker;\n\n // Handlers\n private articleHandler: ArticleToolHandler;\n private projectHandler: ProjectToolHandler;\n private publishingHandler: PublishingToolHandler;\n private personaHandler: PersonaToolHandler;\n private bulkHandler: BulkOperationsToolHandler;\n private connectionsHandler: ConnectionsToolHandler;\n private utilityHandler: UtilityToolHandler;\n private categoryPagesHandler: CategoryPagesToolHandler;\n private productPagesHandler: ProductPagesToolHandler;\n private discoverHandler: DiscoverToolHandler;\n private rssHandler: RSSToolHandler;\n private transactionsHandler: TransactionsToolHandler;\n private jobsHandler: JobsToolHandler;\n private resourceHandler: ResourceHandler;\n private promptHandler: PromptHandler;\n\n constructor(private config: Config) {\n // Initialize server with capabilities\n const capabilities: ServerCapabilities = {\n tools: {},\n resources: {},\n prompts: {}\n };\n\n this.server = new Server(\n {\n name: 'wisewand-mcp',\n version: '1.0.0'\n },\n {\n capabilities\n }\n );\n\n // Initialize services\n this.apiClient = new WisewandAPIClient(config.wisewand);\n this.cacheManager = new CacheManager(config.cache);\n this.rateLimiter = new RateLimiter(config.security);\n this.metrics = new MetricsCollector();\n this.healthChecker = new HealthChecker(this.apiClient, this.cacheManager);\n\n // Initialize handlers\n this.articleHandler = new ArticleToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.projectHandler = new ProjectToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.publishingHandler = new PublishingToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.personaHandler = new PersonaToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.bulkHandler = new BulkOperationsToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.connectionsHandler = new ConnectionsToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.utilityHandler = new UtilityToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.categoryPagesHandler = new CategoryPagesToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.productPagesHandler = new ProductPagesToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.discoverHandler = new DiscoverToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.rssHandler = new RSSToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.transactionsHandler = new TransactionsToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.jobsHandler = new JobsToolHandler(this.apiClient, this.cacheManager, this.metrics);\n this.resourceHandler = new ResourceHandler(this.apiClient, this.cacheManager);\n this.promptHandler = new PromptHandler();\n\n // Register all handlers\n this.registerHandlers();\n\n logger.info('WisewandMCPServer initialized', {\n toolsRegistered: this.getToolCount(),\n resourcesRegistered: this.getResourceCount(),\n promptsRegistered: this.getPromptCount()\n });\n }\n\n private getAllTools() {\n return [\n ...this.articleHandler.getTools(),\n ...this.projectHandler.getTools(),\n ...this.publishingHandler.getTools(),\n ...this.personaHandler.getTools(),\n ...this.bulkHandler.getTools(),\n ...this.connectionsHandler.getTools(),\n ...this.utilityHandler.getTools(),\n ...this.categoryPagesHandler.getTools(),\n ...this.productPagesHandler.getTools(),\n ...this.discoverHandler.getTools(),\n ...this.rssHandler.getTools(),\n ...this.transactionsHandler.getTools(),\n ...this.jobsHandler.getTools()\n ];\n }\n\n private registerHandlers() {\n // Register tool list handler\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n const tools = this.getAllTools();\n\n return {\n tools: tools.map(tool => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema\n }))\n };\n });\n\n // Register tool call handler\n this.server.setRequestHandler(CallToolRequestSchema, async (request: any) => {\n const startTime = Date.now();\n const { name, arguments: args } = request.params;\n\n try {\n // Rate limiting\n if (this.config.security.enableRateLimiting) {\n const allowed = await this.rateLimiter.checkLimit('global');\n if (!allowed) {\n throw new Error('Rate limit exceeded. Please try again later.');\n }\n }\n\n // Find and execute tool\n const tool = this.findTool(name);\n if (!tool) {\n throw new Error(`Tool not found: ${name}`);\n }\n\n logger.info('Executing tool', { tool: name });\n\n const result = await tool.handler(args);\n\n // Record metrics\n this.metrics.recordToolCall(name, 'success', Date.now() - startTime);\n\n return result;\n\n } catch (error: any) {\n logger.error('Tool execution failed', { tool: name, error: error.message });\n this.metrics.recordToolCall(name, 'error', Date.now() - startTime);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'An unexpected error occurred',\n tool: name\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n });\n\n // Register resource handlers\n this.server.setRequestHandler(ListResourcesRequestSchema, async () => {\n const resources = this.resourceHandler.getResources();\n\n return {\n resources: resources.map(r => ({\n uri: r.uri,\n name: r.name,\n description: r.description,\n mimeType: r.mimeType\n }))\n };\n });\n\n this.server.setRequestHandler(ReadResourceRequestSchema, async (request: any) => {\n const { uri } = request.params;\n\n try {\n const resource = await this.resourceHandler.readResource(uri);\n return resource;\n } catch (error: any) {\n logger.error('Resource read failed', { uri, error: error.message });\n throw error;\n }\n });\n\n // Register prompt handlers\n this.server.setRequestHandler(ListPromptsRequestSchema, async () => {\n const prompts = this.promptHandler.getPrompts();\n\n return {\n prompts: prompts.map(p => ({\n name: p.name,\n description: p.description,\n arguments: p.arguments\n }))\n };\n });\n\n this.server.setRequestHandler(GetPromptRequestSchema, async (request: any) => {\n const { name, arguments: args } = request.params;\n\n try {\n const prompt = await this.promptHandler.getPrompt(name, args);\n return prompt;\n } catch (error: any) {\n logger.error('Prompt generation failed', { name, error: error.message });\n throw error;\n }\n });\n }\n\n private findTool(name: string) {\n return this.getAllTools().find(tool => tool.name === name);\n }\n\n async connect(transport: StdioServerTransport) {\n await this.server.connect(transport);\n\n // Start health checker if enabled\n if (this.config.monitoring.enableHealthCheck) {\n this.healthChecker.startMonitoring(this.config.monitoring.healthCheckInterval);\n }\n\n // Start metrics server if enabled\n if (this.config.monitoring.enableMetrics) {\n this.metrics.startServer(this.config.monitoring.metricsPort);\n }\n }\n\n async shutdown() {\n logger.info('Shutting down WisewandMCPServer...');\n\n // Stop health monitoring\n this.healthChecker.stopMonitoring();\n\n // Stop metrics server\n if (this.config.monitoring.enableMetrics) {\n await this.metrics.stopServer();\n }\n\n // Clean up cache\n await this.cacheManager.cleanup();\n\n // Close server\n await this.server.close();\n\n logger.info('WisewandMCPServer shutdown complete');\n }\n\n getToolCount(): number {\n return this.getAllTools().length;\n }\n\n getResourceCount(): number {\n return this.resourceHandler.getResources().length;\n }\n\n getPromptCount(): number {\n return this.promptHandler.getPrompts().length;\n }\n\n getHealth() {\n return this.healthChecker.getStatus();\n }\n\n getMetrics() {\n return this.metrics.getMetrics();\n }\n\n /**\n * Test API connection during startup\n * Returns {ok: boolean, error?: string}\n */\n async testAPIConnection(): Promise<{ok: boolean, error?: string}> {\n try {\n const health = await this.healthChecker.checkHealth();\n if (health.checks.api) {\n return { ok: true };\n } else {\n return {\n ok: false,\n error: 'API health check failed - check API key and network connection'\n };\n }\n } catch (error: any) {\n return {\n ok: false,\n error: error.message || 'Unknown error'\n };\n }\n }\n}\n","/**\n * Wisewand API Client with retry logic and error handling\n */\n\nimport pRetry from 'p-retry';\nimport { logger } from '../utils/logger';\nimport {\n Article,\n Project,\n Persona,\n Connection,\n CategoryPage,\n ProductPage,\n DiscoverArticle,\n DiscoverArticleInput,\n Feed,\n CreateFeedInput,\n Transaction,\n Job,\n CreateArticleInput,\n CreateProjectInput,\n CreatePersonaInput,\n CreateCategoryPageInput,\n CreateProductPageInput,\n PublishOptions,\n BulkArticleInput,\n ListParams,\n ArticleOutput,\n CostEstimate\n} from '../types/api';\n\nexport interface WisewandAPIConfig {\n apiKey: string;\n apiUrl: string;\n timeout: number;\n retryAttempts: number;\n retryDelay: number;\n}\n\nexport class WisewandAPIClient {\n private headers: Record<string, string>;\n private abortController: AbortController;\n\n constructor(private config: WisewandAPIConfig) {\n this.headers = {\n 'Authorization': `Bearer ${config.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': 'Wisewand-MCP/1.0.0',\n 'Accept': 'application/json'\n };\n\n this.abortController = new AbortController();\n }\n\n /**\n * Make HTTP request with retry logic\n */\n private async request<T>(\n method: string,\n endpoint: string,\n body?: any,\n options: RequestInit = {}\n ): Promise<T> {\n const url = `${this.config.apiUrl}${endpoint}`;\n\n return pRetry(\n async () => {\n const timeoutId = setTimeout(() => {\n this.abortController.abort();\n }, this.config.timeout);\n\n try {\n const bodyJSON = body ? JSON.stringify(body) : undefined;\n\n // Production logging\n logger.info('API HTTP REQUEST - EXACT JSON', {\n method,\n endpoint,\n url,\n bodyJSON, // The EXACT string being sent over HTTP\n body_includes_apply_project_brief_config: bodyJSON?.includes('apply_project_brief_config'),\n body_apply_project_brief_config_value: bodyJSON?.match(/\"apply_project_brief_config\":(true|false)/)?.[1]\n });\n\n const response = await fetch(url, {\n method,\n headers: this.headers,\n body: bodyJSON,\n signal: this.abortController.signal,\n ...options\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new APIError(response.status, errorBody, endpoint);\n }\n\n const data = await response.json();\n\n logger.debug('API response', { method, endpoint, status: response.status });\n\n return data as T;\n\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n // Reset abort controller for next request\n this.abortController = new AbortController();\n throw new Error(`Request timeout after ${this.config.timeout}ms`);\n }\n\n throw error;\n }\n },\n {\n retries: this.config.retryAttempts,\n minTimeout: this.config.retryDelay,\n maxTimeout: this.config.retryDelay * 10,\n onFailedAttempt: (error) => {\n logger.warn('API request failed, retrying...', {\n attempt: error.attemptNumber,\n retriesLeft: error.retriesLeft,\n error: error.message\n });\n }\n }\n );\n }\n\n private buildQuery(params: Record<string, any>): string {\n const query = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n query.append(key, String(value));\n }\n });\n return query.toString();\n }\n\n // ============= Article Operations =============\n\n async createArticle(input: CreateArticleInput): Promise<Article> {\n return this.request<Article>('POST', '/v1/articles/', input);\n }\n\n async getArticle(id: string): Promise<Article> {\n return this.request<Article>('GET', `/v1/articles/${id}`);\n }\n\n async updateArticle(id: string, updates: Partial<CreateArticleInput>): Promise<Article> {\n return this.request<Article>('PATCH', `/v1/articles/${id}`, updates);\n }\n\n async listArticles(params: ListParams = {}): Promise<{\n items: Article[];\n total: number;\n skip: number;\n take: number;\n }> {\n const query = this.buildQuery(params);\n return this.request('GET', `/v1/articles/?${query}`);\n }\n\n async runArticleGeneration(id: string): Promise<{ success: boolean; message: string }> {\n return this.request('POST', `/v1/articles/${id}/run`, {});\n }\n\n async getArticleOutput(id: string): Promise<ArticleOutput> {\n return this.request<ArticleOutput>('GET', `/v1/articles/${id}/output`);\n }\n\n async updateArticleOutput(id: string, outputId: string, updates: any): Promise<any> {\n return this.request('PATCH', `/v1/articles/${id}/output/${outputId}`, updates);\n }\n\n async getArticleStatus(id: string): Promise<string> {\n const article = await this.getArticle(id);\n return article.status || 'unknown';\n }\n\n async calculateArticleCost(input: CreateArticleInput): Promise<CostEstimate> {\n return this.request<CostEstimate>('POST', '/v1/articles/cost', input);\n }\n\n async createBulkArticles(articles: BulkArticleInput[]): Promise<{\n items: Article[];\n errors: any[];\n }> {\n return this.request('POST', '/v1/articles/bulk', { articles });\n }\n\n async calculateBulkCost(articles: BulkArticleInput[]): Promise<{\n total: number;\n breakdown: CostEstimate[];\n }> {\n return this.request('POST', '/v1/articles/bulk/cost', { articles });\n }\n\n // ============= Project Operations =============\n\n async createProject(input: CreateProjectInput): Promise<Project> {\n return this.request<Project>('POST', '/v1/projects/', input);\n }\n\n async getProject(id: string): Promise<Project> {\n return this.request<Project>('GET', `/v1/projects/${id}`);\n }\n\n async updateProject(id: string, updates: Partial<CreateProjectInput>): Promise<Project> {\n return this.request<Project>('PATCH', `/v1/projects/${id}`, updates);\n }\n\n async deleteProject(id: string): Promise<{ success: boolean }> {\n return this.request('DELETE', `/v1/projects/${id}`);\n }\n\n async listProjects(params: ListParams = {}): Promise<{\n items: Project[];\n total: number;\n }> {\n const query = this.buildQuery(params);\n return this.request('GET', `/v1/projects/?${query}`);\n }\n\n // ============= Persona Operations =============\n\n async createPersona(input: CreatePersonaInput): Promise<Persona> {\n return this.request<Persona>('POST', '/v1/personas/', input);\n }\n\n async getPersona(id: string): Promise<Persona> {\n return this.request<Persona>('GET', `/v1/personas/${id}`);\n }\n\n async updatePersona(id: string, updates: Partial<CreatePersonaInput>): Promise<Persona> {\n return this.request<Persona>('PATCH', `/v1/personas/${id}`, updates);\n }\n\n async deletePersona(id: string): Promise<{ success: boolean }> {\n return this.request('DELETE', `/v1/personas/${id}`);\n }\n\n async listPersonas(params: ListParams = {}): Promise<{\n items: Persona[];\n total: number;\n }> {\n const query = this.buildQuery(params);\n return this.request('GET', `/v1/personas/?${query}`);\n }\n\n // ============= Connection Operations =============\n\n async createConnection(input: any): Promise<Connection> {\n return this.request<Connection>('POST', '/v1/connections/', input);\n }\n\n async getConnection(id: string): Promise<Connection> {\n return this.request<Connection>('GET', `/v1/connections/${id}`);\n }\n\n async updateConnection(id: string, updates: any): Promise<Connection> {\n return this.request<Connection>('PATCH', `/v1/connections/${id}`, updates);\n }\n\n async deleteConnection(id: string): Promise<{ success: boolean }> {\n return this.request('DELETE', `/v1/connections/${id}`);\n }\n\n async listConnections(params: ListParams = {}): Promise<{\n items: Connection[];\n total: number;\n }> {\n const query = this.buildQuery(params);\n return this.request('GET', `/v1/connections/?${query}`);\n }\n\n // ============= Publishing Operations =============\n\n async publishToWordPress(\n entityId: string,\n options: PublishOptions\n ): Promise<{ success: boolean; url?: string; error?: string }> {\n return this.request('POST', `/v1/publish/wordpress/${entityId}`, options);\n }\n\n async triggerWebhook(\n entityId: string,\n webhookId: string\n ): Promise<{ success: boolean; response?: any; error?: string }> {\n return this.request('POST', `/v1/publish/webhook/${entityId}`, {\n webhook_id: webhookId\n });\n }\n\n async publishToShopify(\n entityId: string,\n options?: any\n ): Promise<{ success: boolean; url?: string; error?: string }> {\n return this.request('POST', `/v1/publish/shopify/${entityId}`, options || {});\n }\n\n async publishToPrestashop(\n entityId: string,\n options?: any\n ): Promise<{ success: boolean; url?: string; error?: string }> {\n return this.request('POST', `/v1/publish/prestashop/${entityId}`, options || {});\n }\n\n async publishToWoocommerce(\n entityId: string,\n options?: any\n ): Promise<{ success: boolean; url?: string; error?: string }> {\n return this.request('POST', `/v1/publish/woocommerce/${entityId}`, options || {});\n }\n\n // ============= Category Pages =============\n\n async createCategoryPage(input: CreateCategoryPageInput): Promise<CategoryPage> {\n return this.request<CategoryPage>('POST', '/v1/categorypages/', input);\n }\n\n async getCategoryPage(id: string): Promise<CategoryPage> {\n return this.request<CategoryPage>('GET', `/v1/categorypages/${id}`);\n }\n\n async listCategoryPages(params: ListParams = {}): Promise<{\n items: CategoryPage[];\n total: number;\n }> {\n const query = this.buildQuery(params);\n return this.request('GET', `/v1/categorypages/?${query}`);\n }\n\n async updateCategoryPage(id: string, updates: any): Promise<CategoryPage> {\n return this.request<CategoryPage>('PATCH', `/v1/categorypages/${id}`, updates);\n }\n\n async runCategoryPageGeneration(id: string): Promise<{ success: boolean }> {\n return this.request('POST', `/v1/categorypages/${id}/run`, {});\n }\n\n async getCategoryPageOutput(id: string): Promise<any> {\n return this.request('GET', `/v1/categorypages/${id}/output`);\n }\n\n async calculateCategoryPageCost(input: any): Promise<CostEstimate> {\n return this.request<CostEstimate>('POST', '/v1/categorypages/cost', input);\n }\n\n async createBulkCategoryPages(items: any[]): Promise<any> {\n return this.request('POST', '/v1/categorypages/bulk', { items });\n }\n\n // ============= Product Pages =============\n\n async createProductPage(input: CreateProductPageInput): Promise<ProductPage> {\n return this.request<ProductPage>('POST', '/v1/productpages/', input);\n }\n\n async getProductPage(id: string): Promise<ProductPage> {\n return this.request<ProductPage>('GET', `/v1/productpages/${id}`);\n }\n\n async listProductPages(params: ListParams = {}): Promise<{\n items: ProductPage[];\n total: number;\n }> {\n const query = this.buildQuery(params);\n return this.request('GET', `/v1/productpages/?${query}`);\n }\n\n async updateProductPage(id: string, updates: any): Promise<ProductPage> {\n return this.request<ProductPage>('PATCH', `/v1/productpages/${id}`, updates);\n }\n\n async runProductPageGeneration(id: string): Promise<{ success: boolean }> {\n return this.request('POST', `/v1/productpages/${id}/run`, {});\n }\n\n async getProductPageOutput(id: string): Promise<any> {\n return this.request('GET', `/v1/productpages/${id}/output`);\n }\n\n async calculateProductPageCost(input: any): Promise<CostEstimate> {\n return this.request<CostEstimate>('POST', '/v1/productpages/cost', input);\n }\n\n async createBulkProductPages(items: any[]): Promise<any> {\n return this.request('POST', '/v1/productpages/bulk', { items });\n }\n\n // ============= Content Discovery =============\n\n async discoverArticles(input: DiscoverArticleInput): Promise<DiscoverArticle> {\n return this.request<DiscoverArticle>('POST', '/v1/discoverarticles/', input);\n }\n\n async getDiscoverArticle(id: string): Promise<DiscoverArticle> {\n return this.request<DiscoverArticle>('GET', `/v1/discoverarticles/${id}`);\n }\n\n async listDiscoverArticles(params: ListParams = {}): Promise<{\n items: DiscoverArticle[];\n total: number;\n }> {\n const query = this.buildQuery(params);\n return this.request('GET', `/v1/discoverarticles/?${query}`);\n }\n\n async updateDiscoverArticle(id: string, updates: any): Promise<DiscoverArticle> {\n return this.request<DiscoverArticle>('PATCH', `/v1/discoverarticles/${id}`, updates);\n }\n\n async runDiscovery(id: string): Promise<{ success: boolean }> {\n return this.request('POST', `/v1/discoverarticles/${id}/run`, {});\n }\n\n async getDiscoverArticleOutput(id: string): Promise<any> {\n return this.request('GET', `/v1/discoverarticles/${id}/output`);\n }\n\n async calculateDiscoverCost(input: any): Promise<CostEstimate> {\n return this.request<CostEstimate>('POST', '/v1/discoverarticles/cost', input);\n }\n\n async createBulkDiscoverArticles(items: any[]): Promise<any> {\n return this.request('POST', '/v1/discoverarticles/bulk', { items });\n }\n\n // ============= Feeds (was RSS Feed Triggers) =============\n\n async createFeed(input: CreateFeedInput): Promise<Feed> {\n return this.request<Feed>('POST', '/v1/feeds/', input);\n }\n\n async getFeed(id: string): Promise<Feed> {\n return this.request<Feed>('GET', `/v1/feeds/${id}`);\n }\n\n async listFeeds(params: ListParams = {}): Promise<{\n items: Feed[];\n total: number;\n }> {\n const query = this.buildQuery(params);\n return this.request('GET', `/v1/feeds/?${query}`);\n }\n\n async updateFeed(id: string, updates: Partial<CreateFeedInput>): Promise<Feed> {\n return this.request<Feed>('PATCH', `/v1/feeds/${id}`, updates);\n }\n\n async deleteFeed(id: string): Promise<{ success: boolean }> {\n return this.request('DELETE', `/v1/feeds/${id}`);\n }\n\n // ============= Transactions =============\n\n async listTransactions(params: ListParams = {}): Promise<{\n items: Transaction[];\n total: number;\n }> {\n const query = this.buildQuery(params);\n return this.request('GET', `/v1/transactions/?${query}`);\n }\n\n async getDailyTransactions(): Promise<any> {\n return this.request('GET', '/v1/transactions/daily');\n }\n\n // ============= Jobs =============\n\n async getJob(id: string): Promise<Job> {\n return this.request<Job>('GET', `/v1/jobs/${id}`);\n }\n\n async triggerJob(name: string): Promise<Job> {\n return this.request<Job>('POST', `/v1/jobs/${name}`, {});\n }\n\n // ============= Utility Operations =============\n\n async getAuthors(): Promise<{ items: any[]; total: number }> {\n return this.request('GET', '/v1/authors/');\n }\n\n async getCategories(): Promise<{ items: any[]; total: number }> {\n return this.request('GET', '/v1/categories/');\n }\n\n async getUsageSummary(): Promise<any> {\n return this.request('GET', '/v1/entities/summary/');\n }\n\n async checkHealth(): Promise<boolean> {\n try {\n // Use /v1/projects/ endpoint as health check since /health doesn't exist\n const response = await fetch(`${this.config.apiUrl}/v1/projects/?take=1`, {\n headers: {\n 'Authorization': `Bearer ${this.config.apiKey}`,\n 'Content-Type': 'application/json'\n },\n signal: AbortSignal.timeout(5000)\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n}\n\n/**\n * Custom API Error class\n */\nexport class APIError extends Error {\n constructor(\n public status: number,\n public body: string,\n public endpoint: string\n ) {\n super(`API Error ${status}: ${body}`);\n this.name = 'APIError';\n }\n\n get isRateLimited(): boolean {\n return this.status === 429;\n }\n\n get isUnauthorized(): boolean {\n return this.status === 401 || this.status === 403;\n }\n\n get isNotFound(): boolean {\n return this.status === 404;\n }\n\n get isServerError(): boolean {\n return this.status >= 500;\n }\n}\n","/**\n * Cache Manager\n * Handles caching with multiple strategies (memory, Redis, hybrid)\n */\n\nimport NodeCache from 'node-cache';\nimport Redis from 'ioredis';\nimport { logger } from '../utils/logger';\n\nexport interface CacheConfig {\n enabled: boolean;\n ttlSeconds: number;\n maxSizeMB: number;\n strategy: 'memory' | 'redis' | 'hybrid';\n}\n\nexport class CacheManager {\n private memoryCache?: NodeCache;\n private redisClient?: Redis;\n private enabled: boolean;\n private strategy: string;\n private defaultTTL: number;\n \n constructor(private config: CacheConfig, private redisConfig?: any) {\n this.enabled = config.enabled;\n this.strategy = config.strategy;\n this.defaultTTL = config.ttlSeconds;\n \n if (!this.enabled) {\n logger.info('Cache disabled');\n return;\n }\n \n // Initialize memory cache\n if (this.strategy === 'memory' || this.strategy === 'hybrid') {\n this.memoryCache = new NodeCache({\n stdTTL: this.defaultTTL,\n checkperiod: 120,\n useClones: false,\n deleteOnExpire: true,\n maxKeys: Math.floor(this.config.maxSizeMB * 1000) // Rough estimate\n });\n \n logger.info('Memory cache initialized', {\n ttl: this.defaultTTL,\n maxSizeMB: this.config.maxSizeMB\n });\n }\n \n // Initialize Redis cache\n if ((this.strategy === 'redis' || this.strategy === 'hybrid') && this.redisConfig) {\n this.redisClient = new Redis({\n host: this.redisConfig.host,\n port: this.redisConfig.port,\n password: this.redisConfig.password,\n db: this.redisConfig.db,\n keyPrefix: this.redisConfig.keyPrefix,\n retryStrategy: (times: number) => {\n if (times > 3) {\n logger.error('Redis connection failed after 3 retries');\n return null;\n }\n return Math.min(times * 100, 3000);\n }\n });\n \n this.redisClient.on('connect', () => {\n logger.info('Redis cache connected');\n });\n \n this.redisClient.on('error', (error) => {\n logger.error('Redis cache error', error);\n });\n }\n }\n \n async get<T>(key: string): Promise<T | null> {\n if (!this.enabled) return null;\n \n try {\n // Try memory cache first\n if (this.memoryCache) {\n const memoryResult = this.memoryCache.get<T>(key);\n if (memoryResult !== undefined) {\n logger.debug('Cache hit (memory)', { key });\n return memoryResult;\n }\n }\n \n // Try Redis cache\n if (this.redisClient) {\n const redisResult = await this.redisClient.get(key);\n if (redisResult) {\n logger.debug('Cache hit (redis)', { key });\n const parsed = JSON.parse(redisResult) as T;\n \n // Store in memory cache for hybrid strategy\n if (this.strategy === 'hybrid' && this.memoryCache) {\n this.memoryCache.set(key, parsed, 60); // Short TTL for memory\n }\n \n return parsed;\n }\n }\n \n logger.debug('Cache miss', { key });\n return null;\n \n } catch (error) {\n logger.error('Cache get error', { key, error });\n return null;\n }\n }\n \n async set<T>(key: string, value: T, ttl?: number): Promise<void> {\n if (!this.enabled) return;\n \n const ttlSeconds = ttl || this.defaultTTL;\n \n try {\n // Set in memory cache\n if (this.memoryCache) {\n this.memoryCache.set(key, value, ttlSeconds);\n logger.debug('Cache set (memory)', { key, ttl: ttlSeconds });\n }\n \n // Set in Redis cache\n if (this.redisClient) {\n await this.redisClient.setex(\n key,\n ttlSeconds,\n JSON.stringify(value)\n );\n logger.debug('Cache set (redis)', { key, ttl: ttlSeconds });\n }\n \n } catch (error) {\n logger.error('Cache set error', { key, error });\n }\n }\n \n async delete(key: string): Promise<void> {\n if (!this.enabled) return;\n \n try {\n // Delete from memory cache\n if (this.memoryCache) {\n this.memoryCache.del(key);\n }\n \n // Delete from Redis cache\n if (this.redisClient) {\n await this.redisClient.del(key);\n }\n \n logger.debug('Cache delete', { key });\n \n } catch (error) {\n logger.error('Cache delete error', { key, error });\n }\n }\n \n async flush(): Promise<void> {\n if (!this.enabled) return;\n \n try {\n // Flush memory cache\n if (this.memoryCache) {\n this.memoryCache.flushAll();\n }\n \n // Flush Redis cache (only keys with our prefix)\n if (this.redisClient) {\n const keys = await this.redisClient.keys('*');\n if (keys.length > 0) {\n await this.redisClient.del(...keys);\n }\n }\n \n logger.info('Cache flushed');\n \n } catch (error) {\n logger.error('Cache flush error', error);\n }\n }\n \n async cleanup(): Promise<void> {\n try {\n // Close memory cache\n if (this.memoryCache) {\n this.memoryCache.flushAll();\n this.memoryCache.close();\n }\n \n // Close Redis connection\n if (this.redisClient) {\n await this.redisClient.quit();\n }\n \n logger.info('Cache cleanup completed');\n \n } catch (error) {\n logger.error('Cache cleanup error', error);\n }\n }\n \n getStats(): any {\n const stats: any = {\n enabled: this.enabled,\n strategy: this.strategy\n };\n \n if (this.memoryCache) {\n stats.memory = {\n keys: this.memoryCache.keys().length,\n hits: this.memoryCache.getStats().hits,\n misses: this.memoryCache.getStats().misses\n };\n }\n \n if (this.redisClient) {\n stats.redis = {\n status: this.redisClient.status\n };\n }\n \n return stats;\n }\n}","/**\n * Rate Limiter Service\n * Implements token bucket algorithm for rate limiting\n */\n\nimport { logger } from '../utils/logger';\n\ninterface RateLimitConfig {\n enableRateLimiting: boolean;\n maxRequestsPerMinute: number;\n}\n\ninterface TokenBucket {\n tokens: number;\n lastRefill: number;\n maxTokens: number;\n refillRate: number;\n}\n\nexport class RateLimiter {\n private buckets: Map<string, TokenBucket> = new Map();\n private cleanupInterval: NodeJS.Timeout | null = null;\n \n constructor(private config: RateLimitConfig) {\n if (this.config.enableRateLimiting) {\n // Clean up old buckets every 5 minutes\n this.cleanupInterval = setInterval(() => {\n this.cleanup();\n }, 5 * 60 * 1000);\n \n logger.info('Rate limiter initialized', {\n maxRequestsPerMinute: config.maxRequestsPerMinute\n });\n }\n }\n \n async checkLimit(identifier: string = 'global'): Promise<boolean> {\n if (!this.config.enableRateLimiting) {\n return true;\n }\n \n const now = Date.now();\n let bucket = this.buckets.get(identifier);\n \n if (!bucket) {\n // Create new bucket\n bucket = {\n tokens: this.config.maxRequestsPerMinute,\n lastRefill: now,\n maxTokens: this.config.maxRequestsPerMinute,\n refillRate: this.config.maxRequestsPerMinute / 60000 // tokens per ms\n };\n this.buckets.set(identifier, bucket);\n }\n \n // Refill tokens based on time passed\n const timePassed = now - bucket.lastRefill;\n const tokensToAdd = timePassed * bucket.refillRate;\n bucket.tokens = Math.min(bucket.maxTokens, bucket.tokens + tokensToAdd);\n bucket.lastRefill = now;\n \n // Check if request can be made\n if (bucket.tokens >= 1) {\n bucket.tokens -= 1;\n return true;\n }\n \n logger.warn('Rate limit exceeded', {\n identifier,\n tokensRemaining: bucket.tokens\n });\n \n return false;\n }\n \n getRemainingLimit(identifier: string = 'global'): number {\n const bucket = this.buckets.get(identifier);\n if (!bucket) {\n return this.config.maxRequestsPerMinute;\n }\n \n // Calculate current tokens\n const now = Date.now();\n const timePassed = now - bucket.lastRefill;\n const tokensToAdd = timePassed * bucket.refillRate;\n const currentTokens = Math.min(bucket.maxTokens, bucket.tokens + tokensToAdd);\n \n return Math.floor(currentTokens);\n }\n \n resetLimit(identifier: string = 'global'): void {\n this.buckets.delete(identifier);\n }\n \n private cleanup(): void {\n const now = Date.now();\n const maxAge = 10 * 60 * 1000; // 10 minutes\n \n for (const [identifier, bucket] of this.buckets.entries()) {\n if (now - bucket.lastRefill > maxAge) {\n this.buckets.delete(identifier);\n logger.debug('Cleaned up rate limit bucket', { identifier });\n }\n }\n }\n \n stop(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = null;\n }\n }\n}","/**\n * Metrics Collector\n * Collects and exposes metrics for monitoring\n */\n\nimport { Counter, Histogram, Gauge, Registry, collectDefaultMetrics } from 'prom-client';\nimport express from 'express';\nimport { logger } from '../utils/logger';\n\nexport class MetricsCollector {\n private registry: Registry;\n private app?: express.Application;\n private server?: any;\n \n // Metrics\n private toolCallCounter: Counter;\n private toolCallDuration: Histogram;\n private apiCallCounter: Counter;\n private apiCallDuration: Histogram;\n private cacheHitCounter: Counter;\n private cacheMissCounter: Counter;\n private activeConnections: Gauge;\n private errorCounter: Counter;\n \n constructor() {\n this.registry = new Registry();\n \n // Collect default metrics (CPU, memory, etc.)\n collectDefaultMetrics({ register: this.registry });\n \n // Tool metrics\n this.toolCallCounter = new Counter({\n name: 'mcp_tool_calls_total',\n help: 'Total number of tool calls',\n labelNames: ['tool', 'status'],\n registers: [this.registry]\n });\n \n this.toolCallDuration = new Histogram({\n name: 'mcp_tool_call_duration_ms',\n help: 'Tool call duration in milliseconds',\n labelNames: ['tool'],\n buckets: [10, 50, 100, 500, 1000, 5000, 10000],\n registers: [this.registry]\n });\n \n // API metrics\n this.apiCallCounter = new Counter({\n name: 'wisewand_api_calls_total',\n help: 'Total number of Wisewand API calls',\n labelNames: ['endpoint', 'status'],\n registers: [this.registry]\n });\n \n this.apiCallDuration = new Histogram({\n name: 'wisewand_api_call_duration_ms',\n help: 'Wisewand API call duration in milliseconds',\n labelNames: ['endpoint'],\n buckets: [100, 500, 1000, 2000, 5000, 10000, 30000],\n registers: [this.registry]\n });\n \n // Cache metrics\n this.cacheHitCounter = new Counter({\n name: 'cache_hits_total',\n help: 'Total number of cache hits',\n labelNames: ['cache_type'],\n registers: [this.registry]\n });\n \n this.cacheMissCounter = new Counter({\n name: 'cache_misses_total',\n help: 'Total number of cache misses',\n labelNames: ['cache_type'],\n registers: [this.registry]\n });\n \n // Connection metrics\n this.activeConnections = new Gauge({\n name: 'mcp_active_connections',\n help: 'Number of active MCP connections',\n registers: [this.registry]\n });\n \n // Error metrics\n this.errorCounter = new Counter({\n name: 'mcp_errors_total',\n help: 'Total number of errors',\n labelNames: ['type', 'source'],\n registers: [this.registry]\n });\n \n logger.info('Metrics collector initialized');\n }\n \n recordToolCall(tool: string, status: 'success' | 'error', durationMs: number): void {\n this.toolCallCounter.inc({ tool, status });\n this.toolCallDuration.observe({ tool }, durationMs);\n }\n \n recordAPICall(endpoint: string, status: 'success' | 'error', durationMs?: number): void {\n this.apiCallCounter.inc({ endpoint, status });\n if (durationMs) {\n this.apiCallDuration.observe({ endpoint }, durationMs);\n }\n }\n \n recordCacheHit(cacheType: 'memory' | 'redis' = 'memory'): void {\n this.cacheHitCounter.inc({ cache_type: cacheType });\n }\n \n recordCacheMiss(cacheType: 'memory' | 'redis' = 'memory'): void {\n this.cacheMissCounter.inc({ cache_type: cacheType });\n }\n \n setActiveConnections(count: number): void {\n this.activeConnections.set(count);\n }\n \n incrementActiveConnections(): void {\n this.activeConnections.inc();\n }\n \n decrementActiveConnections(): void {\n this.activeConnections.dec();\n }\n \n recordError(type: string, source: string): void {\n this.errorCounter.inc({ type, source });\n }\n \n async getMetrics(): Promise<string> {\n return await this.registry.metrics();\n }\n \n getMetricsContentType(): string {\n return this.registry.contentType;\n }\n \n startServer(port: number): void {\n if (this.server) {\n logger.warn('Metrics server already running');\n return;\n }\n \n this.app = express();\n \n // Health check endpoint\n this.app.get('/health', (_req, res) => {\n res.status(200).json({ status: 'healthy' });\n });\n \n // Metrics endpoint\n this.app.get('/metrics', async (_req, res) => {\n try {\n res.set('Content-Type', this.getMetricsContentType());\n const metrics = await this.getMetrics();\n res.end(metrics);\n } catch (error) {\n logger.error('Error collecting metrics', error);\n res.status(500).end();\n }\n });\n \n this.server = this.app.listen(port, () => {\n logger.info(`Metrics server started on port ${port}`);\n });\n }\n \n async stopServer(): Promise<void> {\n if (this.server) {\n return new Promise((resolve) => {\n this.server.close(() => {\n logger.info('Metrics server stopped');\n resolve();\n });\n });\n }\n }\n \n reset(): void {\n this.registry.clear();\n }\n}","/**\n * Health Checker\n * Monitors system health and dependencies\n */\n\nimport { WisewandAPIClient } from '../clients/WisewandAPIClient';\nimport { CacheManager } from '../services/CacheManager';\nimport { logger } from '../utils/logger';\n\nexport interface HealthStatus {\n status: 'healthy' | 'degraded' | 'unhealthy';\n timestamp: string;\n checks: {\n api: boolean;\n cache: boolean;\n memory: boolean;\n uptime: number;\n };\n details?: any;\n}\n\nexport class HealthChecker {\n private interval: NodeJS.Timeout | null = null;\n private lastStatus: HealthStatus | null = null;\n private startTime: number = Date.now();\n \n constructor(\n private apiClient: WisewandAPIClient,\n private cacheManager: CacheManager\n ) {}\n \n async checkHealth(): Promise<HealthStatus> {\n const checks = {\n api: false,\n cache: false,\n memory: false,\n uptime: Math.floor((Date.now() - this.startTime) / 1000)\n };\n \n // Check API health\n try {\n checks.api = await this.apiClient.checkHealth();\n } catch (error) {\n logger.error('API health check failed', error);\n }\n \n // Check cache health\n try {\n await this.cacheManager.set('health:check', { timestamp: Date.now() }, 10);\n const cached = await this.cacheManager.get('health:check');\n checks.cache = cached !== null;\n } catch (error) {\n logger.error('Cache health check failed', error);\n }\n \n // Check memory usage\n const memUsage = process.memoryUsage();\n const maxHeap = 4 * 1024 * 1024 * 1024; // 4GB\n checks.memory = memUsage.heapUsed < maxHeap * 0.9; // Alert at 90%\n \n // Determine overall status\n let status: 'healthy' | 'degraded' | 'unhealthy';\n if (checks.api && checks.cache && checks.memory) {\n status = 'healthy';\n } else if (checks.api || checks.cache) {\n status = 'degraded';\n } else {\n status = 'unhealthy';\n }\n \n const healthStatus: HealthStatus = {\n status,\n timestamp: new Date().toISOString(),\n checks,\n details: {\n memory: {\n heapUsed: Math.round(memUsage.heapUsed / 1024 / 1024),\n heapTotal: Math.round(memUsage.heapTotal / 1024 / 1024),\n external: Math.round(memUsage.external / 1024 / 1024),\n rss: Math.round(memUsage.rss / 1024 / 1024)\n },\n cache: this.cacheManager.getStats(),\n process: {\n pid: process.pid,\n version: process.version,\n platform: process.platform,\n uptime: checks.uptime\n }\n }\n };\n \n this.lastStatus = healthStatus;\n \n if (status !== 'healthy') {\n logger.warn('Health check detected issues', healthStatus);\n }\n \n return healthStatus;\n }\n \n startMonitoring(intervalMs: number = 30000): void {\n if (this.interval) {\n logger.warn('Health monitoring already started');\n return;\n }\n \n // Initial check\n this.checkHealth().catch(error => {\n logger.error('Initial health check failed', error);\n });\n \n // Periodic checks\n this.interval = setInterval(async () => {\n try {\n await this.checkHealth();\n } catch (error) {\n logger.error('Health check failed', error);\n }\n }, intervalMs);\n \n logger.info('Health monitoring started', { interval: intervalMs });\n }\n \n stopMonitoring(): void {\n if (this.interval) {\n clearInterval(this.interval);\n this.interval = null;\n logger.info('Health monitoring stopped');\n }\n }\n \n getStatus(): HealthStatus | null {\n return this.lastStatus;\n }\n \n isHealthy(): boolean {\n return this.lastStatus?.status === 'healthy';\n }\n \n isDegraded(): boolean {\n return this.lastStatus?.status === 'degraded';\n }\n \n isUnhealthy(): boolean {\n return this.lastStatus?.status === 'unhealthy';\n }\n}","/**\n * Article Tool Handler\n * Handles all article-related operations\n */\n\nimport { z } from 'zod';\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nconst boolField = z.union([z.boolean(), z.string()]).transform(val =>\n typeof val === 'string' ? val === 'true' : val\n).optional().default(false);\n\nconst numField = z.union([z.number(), z.string()]).transform(val =>\n typeof val === 'string' ? parseInt(val, 10) : val\n).optional();\n\nconst LANG_ENUM = ['de', 'en', 'es', 'fr', 'it', 'nl', 'pl', 'pt', 'ro'] as const;\nconst COUNTRY_ENUM = ['ad', 'ae', 'ar', 'at', 'au', 'be', 'br', 'ca', 'ch', 'cl', 'co', 'de', 'eg', 'es', 'fr', 'gb', 'in', 'it', 'lu', 'ma', 'mx', 'nl', 'pe', 'pl', 'pt', 'ro', 'us', 'za'] as const;\n\nconst AffiliationLinkSchema = z.object({\n url: z.string(),\n anchor: z.string()\n});\n\nconst AffiliationTopProductSchema = z.object({\n name: z.string(),\n urls: z.array(z.string()).optional(),\n affiliation_links: z.array(AffiliationLinkSchema).optional(),\n promo_code: z.string().optional(),\n promo_percentage: z.string().optional()\n});\n\nconst CTASchema = z.object({\n anchor: z.string(),\n url: z.string()\n});\n\nconst CreateArticleSchema = z.object({\n // Basic article fields\n subject: z.string().min(1, 'Subject is required'),\n title: z.string().optional(),\n keep_title: boolField,\n type: z.enum(['blog', 'affiliation-product-review', 'affiliation-compare-products', 'affiliation-top-product']).optional().default('blog'),\n lang: z.enum(LANG_ENUM).optional().default('en'),\n country: z.enum(COUNTRY_ENUM).optional(),\n length: z.union([z.number().max(5000), z.literal('auto')]).optional().default('auto'),\n target_keyword: z.string().optional(),\n keywords_secondary: z.string().optional(),\n search_intention_answer: z.string().optional(),\n additional_information: z.string().optional(),\n avoid_information: z.string().optional(),\n project_id: z.string().uuid().optional(),\n writing_style_mode: z.enum(['auto', 'persona']).optional().default('auto'),\n persona_id: z.string().uuid().optional(),\n apply_project_brief_config: boolField,\n\n // CTA\n use_cta: boolField,\n ctas: z.array(CTASchema).optional(),\n\n // SEO Features\n use_faq: boolField,\n faq_questions: z.string().optional(),\n use_toc: boolField,\n use_boldkeywords: boolField,\n use_internallinks: boolField,\n\n // Internal Links\n use_indexed_pages_internal_links: boolField,\n use_wp_internal_links: boolField,\n use_app_internal_links: boolField,\n use_list_internal_links: boolField,\n internal_links_wp_connection: z.string().optional(),\n internal_links_wp_status: z.array(z.string()).optional(),\n internal_links_list: z.string().optional(),\n\n // Image Features\n use_image: boolField,\n image_ratio: z.enum(['landscape', 'portrait', '16:9', '4:3', '1:1']).optional(),\n image_prompt: z.string().optional(),\n image_use_palette: boolField,\n image_primary_color: z.string().regex(/^#[0-9A-Fa-f]{6}$/).optional(),\n image_secondary_color: z.string().regex(/^#[0-9A-Fa-f]{6}$/).optional(),\n\n // Inline images (API uses \"inlineimages\")\n use_inlineimages: boolField,\n inlineimages_count: z.number().min(1).max(10).optional(),\n inline_images_ratio: z.enum(['landscape', 'portrait', '16:9', '4:3', '1:1']).optional(),\n inline_images_use_palette: boolField,\n inline_images_primary_color: z.string().regex(/^#[0-9A-Fa-f]{6}$/).optional(),\n inline_images_secondary_color: z.string().regex(/^#[0-9A-Fa-f]{6}$/).optional(),\n\n // Enhanced formatting & widgets\n use_enhancedformatting: boolField,\n use_widget: boolField,\n\n // Webhook\n use_webhook: boolField,\n webhook_connection_id: z.string().optional(),\n\n // WordPress Publishing\n use_publishwordpress: boolField,\n publishwordpress_date: z.string().optional(),\n publishwordpress_status: z.enum(['draft', 'publish', 'future']).optional(),\n publishwordpress_category: numField,\n publishwordpress_author: numField,\n publishwordpress_connection: z.string().uuid().optional(),\n\n // Shopify Publishing\n use_publishshopify: boolField,\n publishshopify_connection_id: z.string().optional(),\n\n // PrestaShop Publishing\n use_publishprestashop: boolField,\n publishprestashop_connection_id: z.string().optional(),\n\n // WooCommerce Publishing\n use_publishwoocommerce: boolField,\n publishwoocommerce_connection_id: z.string().optional(),\n\n // Content Features\n use_infotable: boolField,\n use_bulletlist: boolField,\n use_externalsources: boolField,\n use_blockquotes: boolField,\n use_summary: boolField,\n\n // Audio Features\n use_audio: boolField,\n audio_voice_id: z.string().optional(),\n\n // Social Media Generation\n use_social: boolField,\n social_networks: z.union([z.array(z.string()), z.string()]).optional(),\n\n // Information Search Control\n information_search_only_from_subject_sources: boolField,\n\n // Affiliation Product Review params\n affiliation_product_name: z.string().optional(),\n affiliation_product_review_urls: z.array(z.string()).optional(),\n affiliation_links: z.array(AffiliationLinkSchema).optional(),\n affiliation_promo_code: z.string().optional(),\n affiliation_promo_percentage: z.string().optional(),\n\n // Affiliation Compare Products params\n affiliation_product_1_name: z.string().optional(),\n affiliation_product_1_review_urls: z.array(z.string()).optional(),\n affiliation_links_product_1: z.array(AffiliationLinkSchema).optional(),\n affiliation_promo_code_1: z.string().optional(),\n affiliation_promo_percentage_1: z.string().optional(),\n affiliation_product_2_name: z.string().optional(),\n affiliation_product_2_review_urls: z.array(z.string()).optional(),\n affiliation_links_product_2: z.array(AffiliationLinkSchema).optional(),\n affiliation_promo_code_2: z.string().optional(),\n affiliation_promo_percentage_2: z.string().optional(),\n\n // Affiliation Top Products params\n affiliation_top_products: z.array(AffiliationTopProductSchema).optional()\n});\n\n// All article param keys for building inputSchema and addParam calls\nconst ARTICLE_PARAM_KEYS = [\n 'subject', 'title', 'keep_title', 'type', 'lang', 'country', 'length',\n 'target_keyword', 'keywords_secondary', 'search_intention_answer',\n 'additional_information', 'avoid_information', 'project_id',\n 'writing_style_mode', 'persona_id', 'apply_project_brief_config',\n 'use_cta', 'ctas',\n 'use_faq', 'faq_questions', 'use_toc', 'use_boldkeywords', 'use_internallinks',\n 'use_indexed_pages_internal_links', 'use_wp_internal_links', 'use_app_internal_links',\n 'use_list_internal_links', 'internal_links_wp_connection', 'internal_links_wp_status',\n 'internal_links_list',\n 'use_image', 'image_ratio', 'image_prompt', 'image_use_palette',\n 'image_primary_color', 'image_secondary_color',\n 'use_inlineimages', 'inlineimages_count', 'inline_images_ratio',\n 'inline_images_use_palette', 'inline_images_primary_color', 'inline_images_secondary_color',\n 'use_enhancedformatting', 'use_widget',\n 'use_webhook', 'webhook_connection_id',\n 'use_publishwordpress', 'publishwordpress_date', 'publishwordpress_status',\n 'publishwordpress_category', 'publishwordpress_author', 'publishwordpress_connection',\n 'use_publishshopify', 'publishshopify_connection_id',\n 'use_publishprestashop', 'publishprestashop_connection_id',\n 'use_publishwoocommerce', 'publishwoocommerce_connection_id',\n 'use_infotable', 'use_bulletlist', 'use_externalsources',\n 'use_blockquotes', 'use_summary',\n 'use_audio', 'audio_voice_id',\n 'use_social', 'social_networks',\n 'information_search_only_from_subject_sources',\n 'affiliation_product_name', 'affiliation_product_review_urls',\n 'affiliation_links', 'affiliation_promo_code', 'affiliation_promo_percentage',\n 'affiliation_product_1_name', 'affiliation_product_1_review_urls',\n 'affiliation_links_product_1', 'affiliation_promo_code_1', 'affiliation_promo_percentage_1',\n 'affiliation_product_2_name', 'affiliation_product_2_review_urls',\n 'affiliation_links_product_2', 'affiliation_promo_code_2', 'affiliation_promo_percentage_2',\n 'affiliation_top_products'\n] as const;\n\nexport class ArticleToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n private cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n\n getTools(): Tool[] {\n return [\n this.createArticleTool(),\n this.generateArticleTool(),\n this.getArticleTool(),\n this.listArticlesTool(),\n this.updateArticleTool(),\n this.getArticleOutputTool(),\n this.updateArticleOutputTool(),\n this.estimateCostTool()\n ];\n }\n\n private buildArticleInputSchema(): Record<string, any> {\n return {\n // Basic Article Fields\n subject: { type: 'string', description: 'The main subject or topic of the article', minLength: 1 },\n title: { type: 'string', description: 'Optional custom title (auto-generated if not provided)' },\n keep_title: { type: 'boolean', description: 'Whether to keep the provided title or allow AI to modify it' },\n type: { type: 'string', enum: ['blog', 'affiliation-product-review', 'affiliation-compare-products', 'affiliation-top-product'], description: 'Type of article to generate', default: 'blog' },\n lang: { type: 'string', enum: [...LANG_ENUM], description: 'Language for the article', default: 'en' },\n country: { type: 'string', enum: [...COUNTRY_ENUM], description: 'Target country for localization' },\n length: { oneOf: [{ type: 'number', maximum: 5000 }, { type: 'string', const: 'auto' }], description: 'Article length in words or \"auto\"', default: 'auto' },\n target_keyword: { type: 'string', description: 'Primary SEO keyword to target' },\n keywords_secondary: { type: 'string', description: 'Secondary keywords (comma-separated)' },\n search_intention_answer: { type: 'string', description: 'Expected search intention answer' },\n additional_information: { type: 'string', description: 'Additional context or requirements for the article' },\n avoid_information: { type: 'string', description: 'Information to avoid in the article' },\n project_id: { type: 'string', format: 'uuid', description: 'Project ID to associate with the article' },\n writing_style_mode: { type: 'string', enum: ['auto', 'persona'], description: 'Writing style mode', default: 'auto' },\n persona_id: { type: 'string', format: 'uuid', description: 'Persona ID for writing style (required if writing_style_mode is \"persona\")' },\n apply_project_brief_config: { type: 'boolean', description: 'Apply the project brief configuration', default: false },\n\n // CTA\n use_cta: { type: 'boolean', description: 'Include call-to-action buttons' },\n ctas: { type: 'array', items: { type: 'object', properties: { anchor: { type: 'string' }, url: { type: 'string' } }, required: ['anchor', 'url'] }, description: 'Call-to-action items with anchor text and URL' },\n\n // SEO Features\n use_faq: { type: 'boolean', description: 'Generate FAQ section' },\n faq_questions: { type: 'string', description: 'Custom FAQ questions (one per line)' },\n use_toc: { type: 'boolean', description: 'Generate table of contents' },\n use_boldkeywords: { type: 'boolean', description: 'Bold important keywords in content' },\n use_internallinks: { type: 'boolean', description: 'Add internal links automatically' },\n\n // Internal Links\n use_indexed_pages_internal_links: { type: 'boolean', description: 'Use indexed pages for internal linking' },\n use_wp_internal_links: { type: 'boolean', description: 'Use WordPress pages for internal linking' },\n use_app_internal_links: { type: 'boolean', description: 'Use app-managed internal links' },\n use_list_internal_links: { type: 'boolean', description: 'Use custom internal links from provided list' },\n internal_links_wp_connection: { type: 'string', description: 'WordPress connection ID for internal links' },\n internal_links_wp_status: { type: 'array', items: { type: 'string' }, description: 'WordPress post statuses to consider for internal links (default: [\"publish\"])' },\n internal_links_list: { type: 'string', description: 'Custom internal links list (comma-separated URLs or keywords)' },\n\n // Image Features\n use_image: { type: 'boolean', description: 'Generate featured image' },\n image_ratio: { type: 'string', enum: ['landscape', 'portrait', '16:9', '4:3', '1:1'], description: 'Image aspect ratio' },\n image_prompt: { type: 'string', description: 'Custom prompt for image generation' },\n image_use_palette: { type: 'boolean', description: 'Use color palette for featured image' },\n image_primary_color: { type: 'string', pattern: '^#[0-9A-Fa-f]{6}$', description: 'Primary color for featured image palette (hex code like #FF9F67)' },\n image_secondary_color: { type: 'string', pattern: '^#[0-9A-Fa-f]{6}$', description: 'Secondary color for featured image palette (hex code like #FFB584)' },\n\n // Inline Images\n use_inlineimages: { type: 'boolean', description: 'Generate inline images within content' },\n inlineimages_count: { type: 'number', minimum: 1, maximum: 10, description: 'Number of inline images to generate (1-10)' },\n inline_images_ratio: { type: 'string', enum: ['landscape', 'portrait', '16:9', '4:3', '1:1'], description: 'Aspect ratio for inline images' },\n inline_images_use_palette: { type: 'boolean', description: 'Use color palette for inline images' },\n inline_images_primary_color: { type: 'string', pattern: '^#[0-9A-Fa-f]{6}$', description: 'Primary color for inline images palette (hex code)' },\n inline_images_secondary_color: { type: 'string', pattern: '^#[0-9A-Fa-f]{6}$', description: 'Secondary color for inline images palette (hex code)' },\n\n // Enhanced formatting & widgets\n use_enhancedformatting: { type: 'boolean', description: 'Enable enhanced formatting (styled elements, callouts, etc.)' },\n use_widget: { type: 'boolean', description: 'Generate interactive widget' },\n\n // Webhook\n use_webhook: { type: 'boolean', description: 'Trigger webhook after generation' },\n webhook_connection_id: { type: 'string', description: 'Webhook connection ID' },\n\n // WordPress Publishing\n use_publishwordpress: { type: 'boolean', description: 'Automatically publish to WordPress' },\n publishwordpress_date: { type: 'string', description: 'WordPress publish date (ISO 8601)' },\n publishwordpress_status: { type: 'string', enum: ['draft', 'publish', 'future'], description: 'WordPress post status', default: 'draft' },\n publishwordpress_category: { type: 'number', description: 'WordPress category ID' },\n publishwordpress_author: { type: 'number', description: 'WordPress author ID' },\n publishwordpress_connection: { type: 'string', format: 'uuid', description: 'WordPress connection ID' },\n\n // Shopify Publishing\n use_publishshopify: { type: 'boolean', description: 'Automatically publish to Shopify' },\n publishshopify_connection_id: { type: 'string', description: 'Shopify connection ID' },\n\n // PrestaShop Publishing\n use_publishprestashop: { type: 'boolean', description: 'Automatically publish to PrestaShop' },\n publishprestashop_connection_id: { type: 'string', description: 'PrestaShop connection ID' },\n\n // WooCommerce Publishing\n use_publishwoocommerce: { type: 'boolean', description: 'Automatically publish to WooCommerce' },\n publishwoocommerce_connection_id: { type: 'string', description: 'WooCommerce connection ID' },\n\n // Content Enhancement Features\n use_infotable: { type: 'boolean', description: 'Include information tables' },\n use_bulletlist: { type: 'boolean', description: 'Use bullet point lists' },\n use_externalsources: { type: 'boolean', description: 'Include external source references' },\n use_blockquotes: { type: 'boolean', description: 'Add blockquotes for emphasis' },\n use_summary: { type: 'boolean', description: 'Include article summary' },\n\n // Audio Features\n use_audio: { type: 'boolean', description: 'Generate audio version of the article' },\n audio_voice_id: { type: 'string', description: 'Voice ID for audio generation' },\n\n // Social Media Generation\n use_social: { type: 'boolean', description: 'Generate social media posts for the article' },\n social_networks: { oneOf: [{ type: 'array', items: { type: 'string' } }, { type: 'string' }], description: 'Social networks to generate posts for (instagram, facebook, x, linkedin)' },\n\n // Information Search Control\n information_search_only_from_subject_sources: { type: 'boolean', description: 'Only use sources/links from the subject field for information search' },\n\n // Affiliation Product Review\n affiliation_product_name: { type: 'string', description: 'Product name for affiliation review' },\n affiliation_product_review_urls: { type: 'array', items: { type: 'string' }, description: 'Review URLs for affiliation product' },\n affiliation_links: { type: 'array', items: { type: 'object', properties: { url: { type: 'string' }, anchor: { type: 'string' } }, required: ['url', 'anchor'] }, description: 'Affiliation links with URL and anchor text' },\n affiliation_promo_code: { type: 'string', description: 'Promo code for affiliation product' },\n affiliation_promo_percentage: { type: 'string', description: 'Promo percentage for affiliation product' },\n\n // Affiliation Compare Products\n affiliation_product_1_name: { type: 'string', description: 'First product name for comparison' },\n affiliation_product_1_review_urls: { type: 'array', items: { type: 'string' }, description: 'Review URLs for first comparison product' },\n affiliation_links_product_1: { type: 'array', items: { type: 'object', properties: { url: { type: 'string' }, anchor: { type: 'string' } }, required: ['url', 'anchor'] }, description: 'Affiliation links for first comparison product' },\n affiliation_promo_code_1: { type: 'string', description: 'Promo code for first comparison product' },\n affiliation_promo_percentage_1: { type: 'string', description: 'Promo percentage for first comparison product' },\n affiliation_product_2_name: { type: 'string', description: 'Second product name for comparison' },\n affiliation_product_2_review_urls: { type: 'array', items: { type: 'string' }, description: 'Review URLs for second comparison product' },\n affiliation_links_product_2: { type: 'array', items: { type: 'object', properties: { url: { type: 'string' }, anchor: { type: 'string' } }, required: ['url', 'anchor'] }, description: 'Affiliation links for second comparison product' },\n affiliation_promo_code_2: { type: 'string', description: 'Promo code for second comparison product' },\n affiliation_promo_percentage_2: { type: 'string', description: 'Promo percentage for second comparison product' },\n\n // Affiliation Top Products\n affiliation_top_products: { type: 'array', items: { type: 'object', properties: { name: { type: 'string' }, urls: { type: 'array', items: { type: 'string' } }, affiliation_links: { type: 'array', items: { type: 'object', properties: { url: { type: 'string' }, anchor: { type: 'string' } } } }, promo_code: { type: 'string' }, promo_percentage: { type: 'string' } }, required: ['name'] }, description: 'Top products for affiliation article' }\n };\n }\n\n private buildApiInput(validated: any): any {\n const apiInput: any = {};\n const addParam = (key: string, value: any) => {\n if (value !== undefined && value !== null) {\n apiInput[key] = value;\n }\n };\n\n for (const key of ARTICLE_PARAM_KEYS) {\n addParam(key, validated[key]);\n }\n\n return apiInput;\n }\n\n private createArticleTool(): Tool {\n return {\n name: 'create_article',\n description: 'Create a new SEO-optimized article with Wisewand',\n inputSchema: {\n type: 'object',\n properties: this.buildArticleInputSchema(),\n required: ['subject', 'apply_project_brief_config']\n },\n handler: async (args) => {\n try {\n const validated = CreateArticleSchema.parse(args);\n const apiInput = this.buildApiInput(validated);\n\n const article = await this.apiClient.createArticle(apiInput);\n await this.cache.set(`article:${article.id}`, article, 300);\n this.metrics.recordAPICall('create_article', 'success');\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n success: true,\n article_id: article.id,\n title: article.title || 'Article created',\n message: `Article \"${article.title || validated.subject}\" created successfully.`,\n next_steps: [\n `Use 'generate_article' with article_id: ${article.id} to start content generation`,\n `Use 'get_article' with article_id: ${article.id} to check status`\n ]\n }, null, 2)\n }]\n };\n } catch (error: any) {\n logger.error('Failed to create article', { error: error.message });\n this.metrics.recordAPICall('create_article', 'error');\n return {\n content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to create article', details: error.issues || undefined }, null, 2) }],\n isError: true\n };\n }\n }\n };\n }\n\n private generateArticleTool(): Tool {\n return {\n name: 'generate_article',\n description: 'Generate content for an existing article',\n inputSchema: {\n type: 'object',\n properties: {\n article_id: { type: 'string', format: 'uuid', description: 'ID of the article to generate' },\n wait_for_completion: { type: 'boolean', description: 'Wait for generation to complete (may take several minutes)', default: true },\n max_wait_time: { type: 'number', description: 'Maximum time to wait in seconds', default: 300, maximum: 600 }\n },\n required: ['article_id']\n },\n handler: async (args) => {\n try {\n const { article_id, wait_for_completion = true, max_wait_time = 300 } = args;\n await this.apiClient.runArticleGeneration(article_id);\n\n if (!wait_for_completion) {\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Article generation started', article_id, next_step: `Use 'get_article' or 'get_article_output' to check status` }, null, 2) }] };\n }\n\n const startTime = Date.now();\n const pollInterval = 5000;\n const maxAttempts = Math.floor((max_wait_time * 1000) / pollInterval);\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n const status = await this.apiClient.getArticleStatus(article_id);\n\n if (status === 'completed' || status === 'success') {\n const output = await this.apiClient.getArticleOutput(article_id);\n await this.cache.set(`article:output:${article_id}`, output, 600);\n this.metrics.recordAPICall('generate_article', 'success');\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n success: true, status: 'completed', article_id,\n generation_time: Math.round((Date.now() - startTime) / 1000),\n output: { title: output.title, word_count: output.word_count, seo_score: output.seo_score, excerpt: output.excerpt?.substring(0, 200) + '...', has_faq: !!output.faq?.length, has_image: !!output.featured_image },\n message: 'Article generated successfully',\n next_steps: [`Use 'get_article_output' to get full content`, `Use 'publish_to_wordpress' to publish the article`]\n }, null, 2)\n }]\n };\n } else if (status === 'failed' || status === 'error') {\n throw new Error('Article generation failed');\n }\n\n if (attempt % 6 === 0) {\n logger.info('Article generation in progress', { article_id, elapsed: Math.round((Date.now() - startTime) / 1000), status });\n }\n }\n throw new Error(`Generation timeout after ${max_wait_time} seconds`);\n } catch (error: any) {\n logger.error('Failed to generate article', { error: error.message });\n this.metrics.recordAPICall('generate_article', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to generate article' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private getArticleTool(): Tool {\n return {\n name: 'get_article',\n description: 'Get article details and status',\n inputSchema: {\n type: 'object',\n properties: { article_id: { type: 'string', format: 'uuid', description: 'ID of the article to retrieve' } },\n required: ['article_id']\n },\n handler: async (args) => {\n try {\n const { article_id } = args;\n const cached = await this.cache.get(`article:${article_id}`);\n if (cached) {\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, article: cached, from_cache: true }, null, 2) }] };\n }\n const article = await this.apiClient.getArticle(article_id);\n await this.cache.set(`article:${article_id}`, article, 300);\n this.metrics.recordAPICall('get_article', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, article }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get article', { error: error.message });\n this.metrics.recordAPICall('get_article', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to retrieve article' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private listArticlesTool(): Tool {\n return {\n name: 'list_articles',\n description: 'List and search articles',\n inputSchema: {\n type: 'object',\n properties: {\n search: { type: 'string', description: 'Search term to filter articles' },\n status: { type: 'string', description: 'Filter by status' },\n projectId: { type: 'string', format: 'uuid', description: 'Filter by project (camelCase as per API)' },\n project_id: { type: 'string', format: 'uuid', description: 'Filter by project (alias)' },\n maker: { type: 'string', description: 'Filter by maker' },\n persona: { type: 'string', description: 'Filter by persona' },\n author: { type: 'string', description: 'Filter by author' },\n category: { type: 'string', description: 'Filter by category' },\n published: { type: 'string', description: 'Filter by published status' },\n skip: { type: 'number', description: 'Number of items to skip', default: 0, minimum: 0 },\n take: { type: 'number', description: 'Number of items to retrieve', default: 10, minimum: 1, maximum: 50 },\n sort: { type: 'string', description: 'Sort field' },\n order: { type: 'string', enum: ['asc', 'desc'], description: 'Sort order' }\n }\n },\n handler: async (args) => {\n try {\n const result = await this.apiClient.listArticles(args);\n this.metrics.recordAPICall('list_articles', 'success');\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n success: true, total: result.total, count: result.items.length,\n articles: result.items.map(a => ({ id: a.id, title: a.title, status: a.status, created_at: a.created_at, type: a.data?.input?.type })),\n pagination: { skip: result.skip, take: result.take, has_more: result.skip + result.take < result.total }\n }, null, 2)\n }]\n };\n } catch (error: any) {\n logger.error('Failed to list articles', { error: error.message });\n this.metrics.recordAPICall('list_articles', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to list articles' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private updateArticleTool(): Tool {\n return {\n name: 'update_article',\n description: 'Update an existing article. Supports ALL article parameters (same as create_article).',\n inputSchema: {\n type: 'object',\n properties: {\n article_id: { type: 'string', format: 'uuid', description: 'ID of the article to update' },\n updates: {\n type: 'object',\n description: 'Fields to update (supports all create_article parameters)',\n properties: this.buildArticleInputSchema()\n }\n },\n required: ['article_id', 'updates']\n },\n handler: async (args) => {\n try {\n const { article_id, updates } = args;\n await this.apiClient.updateArticle(article_id, updates);\n await this.cache.delete(`article:${article_id}`);\n this.metrics.recordAPICall('update_article', 'success');\n return {\n content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Article updated successfully', article_id, updated_fields: Object.keys(updates) }, null, 2) }]\n };\n } catch (error: any) {\n logger.error('Failed to update article', { error: error.message });\n this.metrics.recordAPICall('update_article', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to update article' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private getArticleOutputTool(): Tool {\n return {\n name: 'get_article_output',\n description: 'Get the generated content of an article',\n inputSchema: {\n type: 'object',\n properties: {\n article_id: { type: 'string', format: 'uuid', description: 'ID of the article' },\n format: { type: 'string', enum: ['full', 'html', 'markdown', 'summary'], description: 'Output format', default: 'full' }\n },\n required: ['article_id']\n },\n handler: async (args) => {\n try {\n const { article_id, format = 'full' } = args;\n const cacheKey = `article:output:${article_id}`;\n const cached = await this.cache.get(cacheKey);\n const output = (cached || await this.apiClient.getArticleOutput(article_id)) as any;\n if (!cached && output) { await this.cache.set(cacheKey, output, 600); }\n this.metrics.recordAPICall('get_article_output', 'success');\n\n let formattedOutput;\n switch (format) {\n case 'html': formattedOutput = { html: output.html_content, title: output.title }; break;\n case 'markdown': formattedOutput = { content: output.content, title: output.title }; break;\n case 'summary': formattedOutput = { title: output.title, excerpt: output.excerpt, word_count: output.word_count, seo_score: output.seo_score }; break;\n default: formattedOutput = output;\n }\n\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, article_id, format, output: formattedOutput, from_cache: !!cached }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get article output', { error: error.message });\n this.metrics.recordAPICall('get_article_output', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to get article output' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private updateArticleOutputTool(): Tool {\n return {\n name: 'update_article_output',\n description: 'Update the generated output of an article',\n inputSchema: {\n type: 'object',\n properties: {\n article_id: { type: 'string', format: 'uuid', description: 'ID of the article' },\n output_id: { type: 'string', format: 'uuid', description: 'ID of the output to update' },\n updates: { type: 'object', description: 'Fields to update in the output' }\n },\n required: ['article_id', 'output_id', 'updates']\n },\n handler: async (args) => {\n try {\n const { article_id, output_id, updates } = args;\n const result = await this.apiClient.updateArticleOutput(article_id, output_id, updates);\n await this.cache.delete(`article:output:${article_id}`);\n this.metrics.recordAPICall('update_article_output', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Article output updated successfully', article_id, output_id, result }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to update article output', { error: error.message });\n this.metrics.recordAPICall('update_article_output', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to update article output' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private estimateCostTool(): Tool {\n return {\n name: 'estimate_article_cost',\n description: 'Estimate the cost of generating an article',\n inputSchema: {\n type: 'object',\n properties: {\n subject: { type: 'string', description: 'Article subject', minLength: 1 },\n length: { oneOf: [{ type: 'number', maximum: 5000 }, { type: 'string', const: 'auto' }], default: 'auto' },\n use_image: { type: 'boolean', default: false },\n use_seo_features: { type: 'boolean', default: false }\n },\n required: ['subject']\n },\n handler: async (args) => {\n try {\n const cost = await this.apiClient.calculateArticleCost(args as any);\n this.metrics.recordAPICall('estimate_cost', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, cost_estimate: cost, message: `Estimated cost: ${cost.credits} credits ($${cost.cost_usd})` }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to estimate cost', { error: error.message });\n this.metrics.recordAPICall('estimate_cost', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to estimate cost' }, null, 2) }], isError: true };\n }\n }\n };\n }\n}\n","/**\n * Project Tool Handler\n */\n\nimport { z } from 'zod';\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nconst CreateProjectSchema = z.object({\n name: z.string().min(1, 'Project name is required'),\n website_url: z.string().url().optional(),\n description: z.string().optional(),\n default_lang: z.enum(['fr', 'en']).optional(),\n default_country: z.enum(['fr', 'be', 'ch', 'ca', 'us', 'gb']).optional(),\n default_persona_id: z.string().uuid().optional(),\n default_settings: z.record(z.any()).optional()\n});\n\nexport class ProjectToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n private cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n \n getTools(): Tool[] {\n return [\n this.createProjectTool(),\n this.getProjectTool(),\n this.listProjectsTool(),\n this.updateProjectTool(),\n this.deleteProjectTool()\n ];\n }\n \n private createProjectTool(): Tool {\n return {\n name: 'create_project',\n description: 'Create a new project for organizing content',\n inputSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Project name',\n minLength: 1\n },\n website_url: {\n type: 'string',\n format: 'uri',\n description: 'Associated website URL'\n },\n description: {\n type: 'string',\n description: 'Project description'\n },\n default_lang: {\n type: 'string',\n enum: ['fr', 'en'],\n description: 'Default language for content'\n },\n default_country: {\n type: 'string',\n enum: ['fr', 'be', 'ch', 'ca', 'us', 'gb'],\n description: 'Default target country'\n },\n default_persona_id: {\n type: 'string',\n format: 'uuid',\n description: 'Default writing persona'\n }\n },\n required: ['name']\n },\n handler: async (args) => {\n try {\n const validated = CreateProjectSchema.parse(args);\n const project = await this.apiClient.createProject(validated);\n \n await this.cache.set(`project:${project.id}`, project, 600);\n this.metrics.recordAPICall('create_project', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n project_id: project.id,\n name: project.name,\n message: `Project \"${project.name}\" created successfully`\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to create project', { error: error.message });\n this.metrics.recordAPICall('create_project', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to create project'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n \n private getProjectTool(): Tool {\n return {\n name: 'get_project',\n description: 'Get project details',\n inputSchema: {\n type: 'object',\n properties: {\n project_id: {\n type: 'string',\n format: 'uuid',\n description: 'Project ID'\n }\n },\n required: ['project_id']\n },\n handler: async (args) => {\n try {\n const { project_id } = args;\n \n const cached = await this.cache.get(`project:${project_id}`);\n if (cached) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n project: cached,\n from_cache: true\n }, null, 2)\n }\n ]\n };\n }\n \n const project = await this.apiClient.getProject(project_id);\n await this.cache.set(`project:${project_id}`, project, 600);\n this.metrics.recordAPICall('get_project', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n project\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to get project', { error: error.message });\n this.metrics.recordAPICall('get_project', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to get project'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n \n private listProjectsTool(): Tool {\n return {\n name: 'list_projects',\n description: 'List all projects',\n inputSchema: {\n type: 'object',\n properties: {\n search: {\n type: 'string',\n description: 'Search term'\n },\n skip: {\n type: 'number',\n default: 0,\n minimum: 0\n },\n take: {\n type: 'number',\n default: 10,\n minimum: 1,\n maximum: 50\n }\n }\n },\n handler: async (args) => {\n try {\n const result = await this.apiClient.listProjects(args);\n this.metrics.recordAPICall('list_projects', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n total: result.total,\n count: result.items.length,\n projects: result.items.map(p => ({\n id: p.id,\n name: p.name,\n website_url: p.website_url,\n created_at: p.created_at\n }))\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to list projects', { error: error.message });\n this.metrics.recordAPICall('list_projects', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to list projects'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n \n private updateProjectTool(): Tool {\n return {\n name: 'update_project',\n description: 'Update project settings',\n inputSchema: {\n type: 'object',\n properties: {\n project_id: {\n type: 'string',\n format: 'uuid',\n description: 'Project ID'\n },\n updates: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n website_url: { type: 'string', format: 'uri' },\n description: { type: 'string' },\n default_lang: { type: 'string', enum: ['fr', 'en'] },\n default_country: { type: 'string', enum: ['fr', 'be', 'ch', 'ca', 'us', 'gb'] },\n default_persona_id: { type: 'string', format: 'uuid' }\n }\n }\n },\n required: ['project_id', 'updates']\n },\n handler: async (args) => {\n try {\n const { project_id, updates } = args;\n await this.apiClient.updateProject(project_id, updates);\n \n await this.cache.delete(`project:${project_id}`);\n this.metrics.recordAPICall('update_project', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n message: 'Project updated successfully',\n project_id,\n updated_fields: Object.keys(updates)\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to update project', { error: error.message });\n this.metrics.recordAPICall('update_project', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to update project'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n \n private deleteProjectTool(): Tool {\n return {\n name: 'delete_project',\n description: 'Delete a project',\n inputSchema: {\n type: 'object',\n properties: {\n project_id: {\n type: 'string',\n format: 'uuid',\n description: 'Project ID to delete'\n },\n confirm: {\n type: 'boolean',\n description: 'Confirm deletion',\n const: true\n }\n },\n required: ['project_id', 'confirm']\n },\n handler: async (args) => {\n try {\n const { project_id, confirm } = args;\n \n if (!confirm) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: 'Deletion not confirmed. Set confirm: true to proceed.'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n \n await this.apiClient.deleteProject(project_id);\n await this.cache.delete(`project:${project_id}`);\n this.metrics.recordAPICall('delete_project', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n message: 'Project deleted successfully',\n project_id\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to delete project', { error: error.message });\n this.metrics.recordAPICall('delete_project', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to delete project'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n}","/**\n * Publishing Tool Handler\n */\n\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nexport class PublishingToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n _cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n\n getTools(): Tool[] {\n return [\n this.publishToWordPressTool(),\n this.triggerWebhookTool(),\n this.publishToShopifyTool(),\n this.publishToPrestashopTool(),\n this.publishToWoocommerceTool()\n ];\n }\n\n private publishToWordPressTool(): Tool {\n return {\n name: 'publish_to_wordpress',\n description: 'Publish content to WordPress',\n inputSchema: {\n type: 'object',\n properties: {\n entity_id: { type: 'string', format: 'uuid', description: 'ID of the article/content to publish' },\n status: { type: 'string', enum: ['draft', 'publish', 'future'], description: 'Publishing status', default: 'draft' },\n schedule_date: { type: 'string', format: 'date-time', description: 'Schedule date for future publishing (ISO 8601)' },\n category_id: { type: 'number', description: 'WordPress category ID' },\n author_id: { type: 'number', description: 'WordPress author ID' },\n connection_id: { type: 'string', format: 'uuid', description: 'WordPress connection ID' }\n },\n required: ['entity_id']\n },\n handler: async (args) => {\n try {\n const { entity_id, ...options } = args;\n const result = await this.apiClient.publishToWordPress(entity_id, options);\n this.metrics.recordAPICall('publish_wordpress', result.success ? 'success' : 'error');\n if (result.success) {\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Content published to WordPress successfully', entity_id, wordpress_url: result.url, status: options.status || 'draft' }, null, 2) }] };\n } else {\n throw new Error(result.error || 'Publishing failed');\n }\n } catch (error: any) {\n logger.error('Failed to publish to WordPress', { error: error.message });\n this.metrics.recordAPICall('publish_wordpress', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to publish to WordPress' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private triggerWebhookTool(): Tool {\n return {\n name: 'trigger_webhook',\n description: 'Send content via webhook',\n inputSchema: {\n type: 'object',\n properties: {\n entity_id: { type: 'string', format: 'uuid', description: 'ID of the content to send' },\n webhook_id: { type: 'string', format: 'uuid', description: 'ID of the webhook configuration' }\n },\n required: ['entity_id', 'webhook_id']\n },\n handler: async (args) => {\n try {\n const { entity_id, webhook_id } = args;\n const result = await this.apiClient.triggerWebhook(entity_id, webhook_id);\n this.metrics.recordAPICall('trigger_webhook', result.success ? 'success' : 'error');\n if (result.success) {\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Webhook triggered successfully', entity_id, webhook_id, response: result.response }, null, 2) }] };\n } else {\n throw new Error(result.error || 'Webhook trigger failed');\n }\n } catch (error: any) {\n logger.error('Failed to trigger webhook', { error: error.message });\n this.metrics.recordAPICall('trigger_webhook', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to trigger webhook' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private publishToShopifyTool(): Tool {\n return {\n name: 'publish_to_shopify',\n description: 'Publish content to Shopify',\n inputSchema: {\n type: 'object',\n properties: {\n entity_id: { type: 'string', format: 'uuid', description: 'ID of the content to publish' },\n connection_id: { type: 'string', format: 'uuid', description: 'Shopify connection ID' }\n },\n required: ['entity_id']\n },\n handler: async (args) => {\n try {\n const { entity_id, ...options } = args;\n const result = await this.apiClient.publishToShopify(entity_id, options);\n this.metrics.recordAPICall('publish_shopify', result.success ? 'success' : 'error');\n if (result.success) {\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Content published to Shopify successfully', entity_id, url: result.url }, null, 2) }] };\n } else {\n throw new Error(result.error || 'Shopify publishing failed');\n }\n } catch (error: any) {\n logger.error('Failed to publish to Shopify', { error: error.message });\n this.metrics.recordAPICall('publish_shopify', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to publish to Shopify' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private publishToPrestashopTool(): Tool {\n return {\n name: 'publish_to_prestashop',\n description: 'Publish content to PrestaShop',\n inputSchema: {\n type: 'object',\n properties: {\n entity_id: { type: 'string', format: 'uuid', description: 'ID of the content to publish' },\n connection_id: { type: 'string', format: 'uuid', description: 'PrestaShop connection ID' }\n },\n required: ['entity_id']\n },\n handler: async (args) => {\n try {\n const { entity_id, ...options } = args;\n const result = await this.apiClient.publishToPrestashop(entity_id, options);\n this.metrics.recordAPICall('publish_prestashop', result.success ? 'success' : 'error');\n if (result.success) {\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Content published to PrestaShop successfully', entity_id, url: result.url }, null, 2) }] };\n } else {\n throw new Error(result.error || 'PrestaShop publishing failed');\n }\n } catch (error: any) {\n logger.error('Failed to publish to PrestaShop', { error: error.message });\n this.metrics.recordAPICall('publish_prestashop', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to publish to PrestaShop' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private publishToWoocommerceTool(): Tool {\n return {\n name: 'publish_to_woocommerce',\n description: 'Publish content to WooCommerce',\n inputSchema: {\n type: 'object',\n properties: {\n entity_id: { type: 'string', format: 'uuid', description: 'ID of the content to publish' },\n connection_id: { type: 'string', format: 'uuid', description: 'WooCommerce connection ID' }\n },\n required: ['entity_id']\n },\n handler: async (args) => {\n try {\n const { entity_id, ...options } = args;\n const result = await this.apiClient.publishToWoocommerce(entity_id, options);\n this.metrics.recordAPICall('publish_woocommerce', result.success ? 'success' : 'error');\n if (result.success) {\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Content published to WooCommerce successfully', entity_id, url: result.url }, null, 2) }] };\n } else {\n throw new Error(result.error || 'WooCommerce publishing failed');\n }\n } catch (error: any) {\n logger.error('Failed to publish to WooCommerce', { error: error.message });\n this.metrics.recordAPICall('publish_woocommerce', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to publish to WooCommerce' }, null, 2) }], isError: true };\n }\n }\n };\n }\n}\n","/**\n * Persona Tool Handler\n */\n\nimport { z } from 'zod';\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nconst CreatePersonaSchema = z.object({\n name: z.string().min(1, 'Persona name is required'),\n description: z.string().optional(),\n tone: z.string().optional(),\n style: z.string().optional(),\n voice: z.string().optional(),\n examples: z.array(z.string()).optional(),\n guidelines: z.string().optional()\n});\n\nexport class PersonaToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n private cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n \n getTools(): Tool[] {\n return [\n this.createPersonaTool(),\n this.getPersonaTool(),\n this.listPersonasTool(),\n this.updatePersonaTool(),\n this.deletePersonaTool()\n ];\n }\n \n private createPersonaTool(): Tool {\n return {\n name: 'create_persona',\n description: 'Create a writing persona for content style',\n inputSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Persona name',\n minLength: 1\n },\n description: {\n type: 'string',\n description: 'Description of the persona'\n },\n tone: {\n type: 'string',\n description: 'Writing tone (e.g., professional, casual, friendly)'\n },\n style: {\n type: 'string',\n description: 'Writing style (e.g., informative, persuasive, narrative)'\n },\n voice: {\n type: 'string',\n description: 'Writing voice (e.g., first person, third person)'\n },\n examples: {\n type: 'array',\n items: { type: 'string' },\n description: 'Example sentences in this persona\\'s style'\n },\n guidelines: {\n type: 'string',\n description: 'Additional guidelines for this persona'\n }\n },\n required: ['name']\n },\n handler: async (args) => {\n try {\n const validated = CreatePersonaSchema.parse(args);\n const persona = await this.apiClient.createPersona(validated);\n \n await this.cache.set(`persona:${persona.id}`, persona, 600);\n this.metrics.recordAPICall('create_persona', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n persona_id: persona.id,\n name: persona.name,\n message: `Persona \"${persona.name}\" created successfully`\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to create persona', { error: error.message });\n this.metrics.recordAPICall('create_persona', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to create persona'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n \n private getPersonaTool(): Tool {\n return {\n name: 'get_persona',\n description: 'Get persona details',\n inputSchema: {\n type: 'object',\n properties: {\n persona_id: {\n type: 'string',\n format: 'uuid',\n description: 'Persona ID'\n }\n },\n required: ['persona_id']\n },\n handler: async (args) => {\n try {\n const { persona_id } = args;\n \n const cached = await this.cache.get(`persona:${persona_id}`);\n if (cached) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n persona: cached,\n from_cache: true\n }, null, 2)\n }\n ]\n };\n }\n \n const persona = await this.apiClient.getPersona(persona_id);\n await this.cache.set(`persona:${persona_id}`, persona, 600);\n this.metrics.recordAPICall('get_persona', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n persona\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to get persona', { error: error.message });\n this.metrics.recordAPICall('get_persona', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to get persona'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n \n private listPersonasTool(): Tool {\n return {\n name: 'list_personas',\n description: 'List all personas',\n inputSchema: {\n type: 'object',\n properties: {\n search: {\n type: 'string',\n description: 'Search term'\n },\n skip: {\n type: 'number',\n default: 0,\n minimum: 0\n },\n take: {\n type: 'number',\n default: 10,\n minimum: 1,\n maximum: 50\n }\n }\n },\n handler: async (args) => {\n try {\n const result = await this.apiClient.listPersonas(args);\n this.metrics.recordAPICall('list_personas', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n total: result.total,\n count: result.items.length,\n personas: result.items.map(p => ({\n id: p.id,\n name: p.name,\n tone: p.tone,\n style: p.style,\n created_at: p.created_at\n }))\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to list personas', { error: error.message });\n this.metrics.recordAPICall('list_personas', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to list personas'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n \n private updatePersonaTool(): Tool {\n return {\n name: 'update_persona',\n description: 'Update persona settings',\n inputSchema: {\n type: 'object',\n properties: {\n persona_id: {\n type: 'string',\n format: 'uuid',\n description: 'Persona ID'\n },\n updates: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n description: { type: 'string' },\n tone: { type: 'string' },\n style: { type: 'string' },\n voice: { type: 'string' },\n examples: {\n type: 'array',\n items: { type: 'string' }\n },\n guidelines: { type: 'string' }\n }\n }\n },\n required: ['persona_id', 'updates']\n },\n handler: async (args) => {\n try {\n const { persona_id, updates } = args;\n await this.apiClient.updatePersona(persona_id, updates);\n \n await this.cache.delete(`persona:${persona_id}`);\n this.metrics.recordAPICall('update_persona', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n message: 'Persona updated successfully',\n persona_id,\n updated_fields: Object.keys(updates)\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to update persona', { error: error.message });\n this.metrics.recordAPICall('update_persona', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to update persona'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n \n private deletePersonaTool(): Tool {\n return {\n name: 'delete_persona',\n description: 'Delete a persona',\n inputSchema: {\n type: 'object',\n properties: {\n persona_id: {\n type: 'string',\n format: 'uuid',\n description: 'Persona ID to delete'\n },\n confirm: {\n type: 'boolean',\n description: 'Confirm deletion',\n const: true\n }\n },\n required: ['persona_id', 'confirm']\n },\n handler: async (args) => {\n try {\n const { persona_id, confirm } = args;\n \n if (!confirm) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: 'Deletion not confirmed. Set confirm: true to proceed.'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n \n await this.apiClient.deletePersona(persona_id);\n await this.cache.delete(`persona:${persona_id}`);\n this.metrics.recordAPICall('delete_persona', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n message: 'Persona deleted successfully',\n persona_id\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to delete persona', { error: error.message });\n this.metrics.recordAPICall('delete_persona', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to delete persona'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n}","/**\n * Bulk Operations Tool Handler\n */\n\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\nimport PQueue from 'p-queue';\n\nexport class BulkOperationsToolHandler implements ToolHandler {\n private queue: PQueue;\n \n constructor(\n private apiClient: WisewandAPIClient,\n _cache: CacheManager,\n private metrics: MetricsCollector\n ) {\n this.queue = new PQueue({ concurrency: 5 });\n }\n \n getTools(): Tool[] {\n return [\n this.bulkCreateArticlesTool(),\n this.bulkEstimateCostTool()\n ];\n }\n \n private bulkCreateArticlesTool(): Tool {\n return {\n name: 'bulk_create_articles',\n description: 'Create multiple articles in batch',\n inputSchema: {\n type: 'object',\n properties: {\n articles: {\n type: 'array',\n description: 'Array of article configurations',\n items: {\n type: 'object',\n properties: {\n subject: { type: 'string', minLength: 1 },\n title: { type: 'string' },\n type: {\n type: 'string',\n enum: ['blog', 'affiliation-product-review', 'affiliation-compare-products', 'affiliation-top-product']\n },\n lang: { type: 'string', enum: ['fr', 'en'] },\n target_keyword: { type: 'string' },\n project_id: { type: 'string', format: 'uuid' }\n },\n required: ['subject']\n },\n minItems: 1,\n maxItems: 100\n },\n auto_generate: {\n type: 'boolean',\n description: 'Automatically generate content after creation',\n default: false\n }\n },\n required: ['articles']\n },\n handler: async (args) => {\n try {\n const { articles, auto_generate = false } = args;\n \n logger.info('Starting bulk article creation', { count: articles.length });\n \n // Create articles\n const createResult = await this.apiClient.createBulkArticles(articles);\n \n const results = {\n total: articles.length,\n created: createResult.items.length,\n failed: createResult.errors?.length || 0,\n articles: createResult.items.map(a => ({\n id: a.id,\n title: a.title,\n status: a.status\n })),\n errors: createResult.errors\n };\n \n // Auto-generate if requested\n if (auto_generate && createResult.items.length > 0) {\n logger.info('Starting auto-generation for bulk articles');\n \n const generationPromises = createResult.items.map(article =>\n this.queue.add(async () => {\n try {\n await this.apiClient.runArticleGeneration(article.id);\n return { id: article.id, status: 'generation_started' };\n } catch (error) {\n return { id: article.id, status: 'generation_failed', error };\n }\n })\n );\n \n const generationResults = await Promise.all(generationPromises);\n (results as any)['generation'] = generationResults;\n }\n \n this.metrics.recordAPICall('bulk_create_articles', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n message: `Created ${results.created} articles successfully`,\n results,\n auto_generate\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed bulk article creation', { error: error.message });\n this.metrics.recordAPICall('bulk_create_articles', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to create articles in bulk'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n \n private bulkEstimateCostTool(): Tool {\n return {\n name: 'bulk_estimate_cost',\n description: 'Estimate cost for bulk article generation',\n inputSchema: {\n type: 'object',\n properties: {\n articles: {\n type: 'array',\n description: 'Array of article configurations',\n items: {\n type: 'object',\n properties: {\n subject: { type: 'string', minLength: 1 },\n length: {\n oneOf: [\n { type: 'number', maximum: 5000 },\n { type: 'string', const: 'auto' }\n ]\n },\n use_image: { type: 'boolean' },\n use_seo_features: { type: 'boolean' }\n },\n required: ['subject']\n },\n minItems: 1,\n maxItems: 100\n }\n },\n required: ['articles']\n },\n handler: async (args) => {\n try {\n const { articles } = args;\n \n const result = await this.apiClient.calculateBulkCost(articles);\n \n this.metrics.recordAPICall('bulk_estimate_cost', 'success');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n total_cost: {\n credits: result.total,\n usd: (result.total * 0.01).toFixed(2) // Assuming 1 credit = $0.01\n },\n article_count: articles.length,\n average_cost_per_article: {\n credits: Math.round(result.total / articles.length),\n usd: ((result.total / articles.length) * 0.01).toFixed(2)\n },\n breakdown: result.breakdown\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to estimate bulk cost', { error: error.message });\n this.metrics.recordAPICall('bulk_estimate_cost', 'error');\n \n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to estimate bulk cost'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n}","/**\n * Connections Tool Handler\n * Manages WordPress and Webhook connections\n */\n\nimport { z } from 'zod';\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nconst CreateConnectionSchema = z.object({\n name: z.string().min(1, 'Connection name is required'),\n type: z.enum(['wordpress', 'webhook', 'other']),\n configuration: z.record(z.any())\n});\n\nexport class ConnectionsToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n private cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n\n getTools(): Tool[] {\n return [\n this.listConnectionsTool(),\n this.getConnectionTool(),\n this.createConnectionTool(),\n this.updateConnectionTool(),\n this.deleteConnectionTool()\n ];\n }\n\n private listConnectionsTool(): Tool {\n return {\n name: 'list_connections',\n description: 'List all WordPress and webhook connections',\n inputSchema: {\n type: 'object',\n properties: {\n search: {\n type: 'string',\n description: 'Search term'\n },\n skip: {\n type: 'number',\n default: 0,\n minimum: 0\n },\n take: {\n type: 'number',\n default: 10,\n minimum: 1,\n maximum: 50\n }\n }\n },\n handler: async (args) => {\n try {\n const result = await this.apiClient.listConnections(args);\n this.metrics.recordAPICall('list_connections', 'success');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n total: result.total,\n count: result.items.length,\n connections: result.items.map(c => ({\n id: c.id,\n name: c.name,\n type: c.type,\n status: c.status,\n created_at: c.created_at\n }))\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to list connections', { error: error.message });\n this.metrics.recordAPICall('list_connections', 'error');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to list connections'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n\n private getConnectionTool(): Tool {\n return {\n name: 'get_connection',\n description: 'Get connection details by ID',\n inputSchema: {\n type: 'object',\n properties: {\n connection_id: {\n type: 'string',\n format: 'uuid',\n description: 'Connection ID'\n }\n },\n required: ['connection_id']\n },\n handler: async (args) => {\n try {\n const { connection_id } = args;\n\n const cached = await this.cache.get(`connection:${connection_id}`);\n if (cached) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n connection: cached,\n from_cache: true\n }, null, 2)\n }\n ]\n };\n }\n\n const connection = await this.apiClient.getConnection(connection_id);\n await this.cache.set(`connection:${connection_id}`, connection, 600);\n this.metrics.recordAPICall('get_connection', 'success');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n connection\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to get connection', { error: error.message });\n this.metrics.recordAPICall('get_connection', 'error');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to get connection'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n\n private createConnectionTool(): Tool {\n return {\n name: 'create_connection',\n description: 'Create a new WordPress or webhook connection',\n inputSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Connection name',\n minLength: 1\n },\n type: {\n type: 'string',\n enum: ['wordpress', 'webhook', 'other'],\n description: 'Connection type'\n },\n configuration: {\n type: 'object',\n description: 'Connection configuration (WordPress credentials, webhook URL, etc.)',\n additionalProperties: true\n }\n },\n required: ['name', 'type', 'configuration']\n },\n handler: async (args) => {\n try {\n const validated = CreateConnectionSchema.parse(args);\n const connection = await this.apiClient.createConnection(validated);\n\n await this.cache.set(`connection:${connection.id}`, connection, 600);\n this.metrics.recordAPICall('create_connection', 'success');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n connection_id: connection.id,\n name: connection.name,\n type: connection.type,\n message: `Connection \"${connection.name}\" created successfully`\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to create connection', { error: error.message });\n this.metrics.recordAPICall('create_connection', 'error');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to create connection'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n\n private updateConnectionTool(): Tool {\n return {\n name: 'update_connection',\n description: 'Update an existing connection',\n inputSchema: {\n type: 'object',\n properties: {\n connection_id: {\n type: 'string',\n format: 'uuid',\n description: 'Connection ID'\n },\n updates: {\n type: 'object',\n properties: {\n name: { type: 'string' },\n configuration: { type: 'object', additionalProperties: true }\n }\n }\n },\n required: ['connection_id', 'updates']\n },\n handler: async (args) => {\n try {\n const { connection_id, updates } = args;\n await this.apiClient.updateConnection(connection_id, updates);\n\n await this.cache.delete(`connection:${connection_id}`);\n this.metrics.recordAPICall('update_connection', 'success');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n message: 'Connection updated successfully',\n connection_id\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to update connection', { error: error.message });\n this.metrics.recordAPICall('update_connection', 'error');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to update connection'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n\n private deleteConnectionTool(): Tool {\n return {\n name: 'delete_connection',\n description: 'Delete a connection',\n inputSchema: {\n type: 'object',\n properties: {\n connection_id: {\n type: 'string',\n format: 'uuid',\n description: 'Connection ID to delete'\n },\n confirm: {\n type: 'boolean',\n description: 'Confirm deletion',\n const: true\n }\n },\n required: ['connection_id', 'confirm']\n },\n handler: async (args) => {\n try {\n const { connection_id, confirm } = args;\n\n if (!confirm) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: 'Deletion not confirmed. Set confirm: true to proceed.'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n\n await this.apiClient.deleteConnection(connection_id);\n await this.cache.delete(`connection:${connection_id}`);\n this.metrics.recordAPICall('delete_connection', 'success');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n message: 'Connection deleted successfully',\n connection_id\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to delete connection', { error: error.message });\n this.metrics.recordAPICall('delete_connection', 'error');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to delete connection'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n}","/**\n * Utility Tool Handler\n * Provides access to authors, categories, and usage statistics\n */\n\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nexport class UtilityToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n private cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n\n getTools(): Tool[] {\n return [\n this.getAuthorsTool(),\n this.getCategoriesTool(),\n this.getUsageSummaryTool()\n ];\n }\n\n private getAuthorsTool(): Tool {\n return {\n name: 'get_authors',\n description: 'Get list of available authors for WordPress publishing',\n inputSchema: {\n type: 'object',\n properties: {}\n },\n handler: async (_args) => {\n try {\n const cacheKey = 'utility:authors';\n const cached = await this.cache.get(cacheKey);\n\n const result = (cached || await this.apiClient.getAuthors()) as any;\n\n if (!cached && result) {\n await this.cache.set(cacheKey, result, 300); // 5 min cache\n }\n\n this.metrics.recordAPICall('get_authors', 'success');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n total: result.total || result.items?.length || 0,\n authors: result.items || result,\n from_cache: !!cached\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to get authors', { error: error.message });\n this.metrics.recordAPICall('get_authors', 'error');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to get authors'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n\n private getCategoriesTool(): Tool {\n return {\n name: 'get_categories',\n description: 'Get list of available categories for WordPress publishing',\n inputSchema: {\n type: 'object',\n properties: {}\n },\n handler: async (_args) => {\n try {\n const cacheKey = 'utility:categories';\n const cached = await this.cache.get(cacheKey);\n\n const result = (cached || await this.apiClient.getCategories()) as any;\n\n if (!cached && result) {\n await this.cache.set(cacheKey, result, 300); // 5 min cache\n }\n\n this.metrics.recordAPICall('get_categories', 'success');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n total: result.total || result.items?.length || 0,\n categories: result.items || result,\n from_cache: !!cached\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to get categories', { error: error.message });\n this.metrics.recordAPICall('get_categories', 'error');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to get categories'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n\n private getUsageSummaryTool(): Tool {\n return {\n name: 'get_usage_summary',\n description: 'Get account usage statistics and limits',\n inputSchema: {\n type: 'object',\n properties: {}\n },\n handler: async (_args) => {\n try {\n const usage = await this.apiClient.getUsageSummary();\n this.metrics.recordAPICall('get_usage_summary', 'success');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n usage\n }, null, 2)\n }\n ]\n };\n } catch (error: any) {\n logger.error('Failed to get usage summary', { error: error.message });\n this.metrics.recordAPICall('get_usage_summary', 'error');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: true,\n message: error.message || 'Failed to get usage summary'\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n };\n }\n}","/**\n * Category Pages Tool Handler\n * Handles category page CRUD and generation operations\n */\n\nimport { z } from 'zod';\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nconst boolField = z.union([z.boolean(), z.string()]).transform(val =>\n typeof val === 'string' ? val === 'true' : val\n).optional().default(false);\n\nconst numField = z.union([z.number(), z.string()]).transform(val =>\n typeof val === 'string' ? parseInt(val, 10) : val\n).optional();\n\nconst LANG_ENUM = ['de', 'en', 'es', 'fr', 'it', 'nl', 'pl', 'pt', 'ro'] as const;\nconst COUNTRY_ENUM = ['ad', 'ae', 'ar', 'at', 'au', 'be', 'br', 'ca', 'ch', 'cl', 'co', 'de', 'eg', 'es', 'fr', 'gb', 'in', 'it', 'lu', 'ma', 'mx', 'nl', 'pe', 'pl', 'pt', 'ro', 'us', 'za'] as const;\n\nconst CreateCategoryPageSchema = z.object({\n // Basic fields\n name: z.string().min(1, 'Name is required'),\n subject: z.string().min(1, 'Subject is required'),\n title: z.string().optional(),\n category: z.string().optional(),\n\n // Standard fields\n lang: z.enum(LANG_ENUM).optional().default('en'),\n country: z.enum(COUNTRY_ENUM).optional(),\n project_id: z.string().uuid().optional(),\n persona_id: z.string().uuid().optional(),\n apply_project_brief_config: boolField,\n\n // SEO features\n use_faq: boolField,\n use_toc: boolField,\n use_image: boolField,\n use_inlineimages: boolField,\n\n // Additional fields that might be relevant\n target_keyword: z.string().optional(),\n keywords_secondary: z.string().optional(),\n additional_information: z.string().optional(),\n length: z.union([z.number().max(5000), z.literal('auto')]).optional().default('auto'),\n\n // Publishing options\n use_publishwordpress: boolField,\n publishwordpress_date: z.string().optional(),\n publishwordpress_status: z.enum(['draft', 'publish', 'future']).optional(),\n publishwordpress_category: numField,\n publishwordpress_author: numField,\n publishwordpress_connection: z.string().uuid().optional()\n});\n\nexport class CategoryPagesToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n private cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n\n getTools(): Tool[] {\n return [\n this.createCategoryPageTool(),\n this.getCategoryPageTool(),\n this.listCategoryPagesTool(),\n this.updateCategoryPageTool(),\n this.generateCategoryPageTool(),\n this.getCategoryPageOutputTool(),\n this.estimateCategoryPageCostTool(),\n this.bulkCreateCategoryPagesTool()\n ];\n }\n\n private createCategoryPageTool(): Tool {\n return {\n name: 'create_category_page',\n description: 'Create a new category page',\n inputSchema: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Name/identifier of the category page', minLength: 1 },\n subject: { type: 'string', description: 'Category subject/topic', minLength: 1 },\n title: { type: 'string', description: 'Category page title' },\n category: { type: 'string', description: 'Category name/slug' },\n lang: { type: 'string', enum: [...LANG_ENUM], description: 'Language for the category page', default: 'en' },\n country: { type: 'string', enum: [...COUNTRY_ENUM], description: 'Target country for localization' },\n project_id: { type: 'string', format: 'uuid', description: 'Project UUID' },\n persona_id: { type: 'string', format: 'uuid', description: 'Persona UUID' },\n apply_project_brief_config: { type: 'boolean', description: 'Apply project configuration', default: false },\n use_faq: { type: 'boolean', description: 'Generate FAQ section', default: false },\n use_toc: { type: 'boolean', description: 'Generate table of contents', default: false },\n use_image: { type: 'boolean', description: 'Generate featured image', default: false },\n use_inlineimages: { type: 'boolean', description: 'Generate inline images', default: false },\n target_keyword: { type: 'string', description: 'Target SEO keyword' },\n keywords_secondary: { type: 'string', description: 'Secondary keywords (comma-separated)' },\n additional_information: { type: 'string', description: 'Additional context or instructions' },\n length: { description: 'Content length in words or \"auto\"', oneOf: [{ type: 'number', maximum: 5000 }, { type: 'string', enum: ['auto'] }], default: 'auto' },\n use_publishwordpress: { type: 'boolean', description: 'Publish to WordPress', default: false },\n publishwordpress_date: { type: 'string', description: 'Publication date (ISO 8601 or WordPress format)' },\n publishwordpress_status: { type: 'string', enum: ['draft', 'publish', 'future'], description: 'WordPress post status' },\n publishwordpress_category: { type: 'number', description: 'WordPress category ID' },\n publishwordpress_author: { type: 'number', description: 'WordPress author ID' },\n publishwordpress_connection: { type: 'string', format: 'uuid', description: 'WordPress connection UUID' }\n },\n required: ['name', 'subject']\n },\n handler: async (args) => {\n try {\n const validated = CreateCategoryPageSchema.parse(args);\n const categoryPage = await this.apiClient.createCategoryPage(validated);\n await this.cache.set(`category_page:${categoryPage.id}`, categoryPage, 300);\n this.metrics.recordAPICall('create_category_page', 'success');\n return {\n content: [{ type: 'text', text: JSON.stringify({ success: true, category_page_id: categoryPage.id, name: categoryPage.name, message: `Category page \"${categoryPage.name}\" created successfully`, next_steps: [`Use 'generate_category_page' with id: ${categoryPage.id}`, `Use 'get_category_page' with id: ${categoryPage.id}`] }, null, 2) }]\n };\n } catch (error: any) {\n logger.error('Failed to create category page', { error: error.message });\n this.metrics.recordAPICall('create_category_page', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to create category page', details: error.issues || undefined }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private getCategoryPageTool(): Tool {\n return {\n name: 'get_category_page',\n description: 'Get category page details and status',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid', description: 'ID of the category page' } }, required: ['id'] },\n handler: async (args) => {\n try {\n const { id } = args;\n const cached = await this.cache.get(`category_page:${id}`);\n if (cached) { return { content: [{ type: 'text', text: JSON.stringify({ success: true, category_page: cached, from_cache: true }, null, 2) }] }; }\n const categoryPage = await this.apiClient.getCategoryPage(id);\n await this.cache.set(`category_page:${id}`, categoryPage, 300);\n this.metrics.recordAPICall('get_category_page', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, category_page: categoryPage }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get category page', { error: error.message });\n this.metrics.recordAPICall('get_category_page', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to retrieve category page' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private listCategoryPagesTool(): Tool {\n return {\n name: 'list_category_pages',\n description: 'List all category pages',\n inputSchema: {\n type: 'object',\n properties: {\n skip: { type: 'number', default: 0 },\n take: { type: 'number', default: 10 },\n search: { type: 'string', description: 'Search term' },\n status: { type: 'string', description: 'Filter by status' },\n project_id: { type: 'string', format: 'uuid', description: 'Filter by project' }\n }\n },\n handler: async (args) => {\n try {\n const result = await this.apiClient.listCategoryPages(args);\n this.metrics.recordAPICall('list_category_pages', 'success');\n return {\n content: [{ type: 'text', text: JSON.stringify({ success: true, total: result.total, count: result.items.length, category_pages: result.items.map(c => ({ id: c.id, name: c.name, status: c.status, created_at: c.created_at })) }, null, 2) }]\n };\n } catch (error: any) {\n logger.error('Failed to list category pages', { error: error.message });\n this.metrics.recordAPICall('list_category_pages', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to list category pages' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private updateCategoryPageTool(): Tool {\n return {\n name: 'update_category_page',\n description: 'Update an existing category page',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid', description: 'ID of the category page to update' },\n updates: { type: 'object', description: 'Fields to update' }\n },\n required: ['id', 'updates']\n },\n handler: async (args) => {\n try {\n const { id, updates } = args;\n await this.apiClient.updateCategoryPage(id, updates);\n await this.cache.delete(`category_page:${id}`);\n this.metrics.recordAPICall('update_category_page', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Category page updated successfully', id, updated_fields: Object.keys(updates) }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to update category page', { error: error.message });\n this.metrics.recordAPICall('update_category_page', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to update category page' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private generateCategoryPageTool(): Tool {\n return {\n name: 'generate_category_page',\n description: 'Generate content for an existing category page',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid', description: 'ID of the category page to generate' },\n wait_for_completion: { type: 'boolean', default: true },\n max_wait_time: { type: 'number', default: 300, maximum: 600 }\n },\n required: ['id']\n },\n handler: async (args) => {\n try {\n const { id, wait_for_completion = true, max_wait_time = 300 } = args;\n await this.apiClient.runCategoryPageGeneration(id);\n if (!wait_for_completion) {\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Category page generation started', category_page_id: id }, null, 2) }] };\n }\n const startTime = Date.now();\n const pollInterval = 5000;\n const maxAttempts = Math.floor((max_wait_time * 1000) / pollInterval);\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n const categoryPage = await this.apiClient.getCategoryPage(id);\n if (categoryPage.status === 'completed' || categoryPage.status === 'success') {\n const output = await this.apiClient.getCategoryPageOutput(id);\n await this.cache.set(`category_page:output:${id}`, output, 600);\n this.metrics.recordAPICall('generate_category_page', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, status: 'completed', category_page_id: id, generation_time: Math.round((Date.now() - startTime) / 1000), message: 'Category page generated successfully' }, null, 2) }] };\n } else if (categoryPage.status === 'failed' || categoryPage.status === 'error') {\n throw new Error('Category page generation failed');\n }\n }\n throw new Error(`Generation timeout after ${max_wait_time} seconds`);\n } catch (error: any) {\n logger.error('Failed to generate category page', { error: error.message });\n this.metrics.recordAPICall('generate_category_page', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to generate category page' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private getCategoryPageOutputTool(): Tool {\n return {\n name: 'get_category_page_output',\n description: 'Get the generated content of a category page',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid', description: 'ID of the category page' } }, required: ['id'] },\n handler: async (args) => {\n try {\n const { id } = args;\n const cacheKey = `category_page:output:${id}`;\n const cached = await this.cache.get(cacheKey);\n const output = (cached || await this.apiClient.getCategoryPageOutput(id)) as any;\n if (!cached && output) { await this.cache.set(cacheKey, output, 600); }\n this.metrics.recordAPICall('get_category_page_output', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, category_page_id: id, output, from_cache: !!cached }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get category page output', { error: error.message });\n this.metrics.recordAPICall('get_category_page_output', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to get category page output' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private estimateCategoryPageCostTool(): Tool {\n return {\n name: 'estimate_category_page_cost',\n description: 'Estimate the cost of generating a category page',\n inputSchema: { type: 'object', properties: { data: { type: 'object', description: 'Category page configuration for cost estimation' } }, required: ['data'] },\n handler: async (args) => {\n try {\n const cost = await this.apiClient.calculateCategoryPageCost(args);\n this.metrics.recordAPICall('estimate_category_page_cost', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, cost_estimate: cost }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to estimate category page cost', { error: error.message });\n this.metrics.recordAPICall('estimate_category_page_cost', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to estimate cost' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private bulkCreateCategoryPagesTool(): Tool {\n return {\n name: 'bulk_create_category_pages',\n description: 'Create multiple category pages at once',\n inputSchema: { type: 'object', properties: { items: { type: 'array', items: { type: 'object' }, description: 'Array of category page configurations' } }, required: ['items'] },\n handler: async (args) => {\n try {\n const { items } = args;\n const result = await this.apiClient.createBulkCategoryPages(items);\n this.metrics.recordAPICall('bulk_create_category_pages', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: `Bulk created ${items.length} category pages`, result }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to bulk create category pages', { error: error.message });\n this.metrics.recordAPICall('bulk_create_category_pages', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to bulk create category pages' }, null, 2) }], isError: true };\n }\n }\n };\n }\n}\n","/**\n * Product Pages Tool Handler\n * Handles product page CRUD and generation operations\n */\n\nimport { z } from 'zod';\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nconst boolField = z.union([z.boolean(), z.string()]).transform(val =>\n typeof val === 'string' ? val === 'true' : val\n).optional().default(false);\n\nconst numField = z.union([z.number(), z.string()]).transform(val =>\n typeof val === 'string' ? parseInt(val, 10) : val\n).optional();\n\nconst LANG_ENUM = ['de', 'en', 'es', 'fr', 'it', 'nl', 'pl', 'pt', 'ro'] as const;\nconst COUNTRY_ENUM = ['ad', 'ae', 'ar', 'at', 'au', 'be', 'br', 'ca', 'ch', 'cl', 'co', 'de', 'eg', 'es', 'fr', 'gb', 'in', 'it', 'lu', 'ma', 'mx', 'nl', 'pe', 'pl', 'pt', 'ro', 'us', 'za'] as const;\n\nconst CreateProductPageSchema = z.object({\n // Basic fields\n name: z.string().min(1, 'Name is required'),\n subject: z.string().min(1, 'Subject is required'),\n title: z.string().optional(),\n product_name: z.string().optional(),\n\n // Product-specific fields\n product_url: z.string().url().optional(),\n product_description: z.string().optional(),\n\n // Standard fields\n lang: z.enum(LANG_ENUM).optional().default('en'),\n country: z.enum(COUNTRY_ENUM).optional(),\n project_id: z.string().uuid().optional(),\n persona_id: z.string().uuid().optional(),\n apply_project_brief_config: boolField,\n\n // SEO features\n use_faq: boolField,\n use_toc: boolField,\n use_image: boolField,\n use_inlineimages: boolField,\n\n // Additional fields that might be relevant\n target_keyword: z.string().optional(),\n keywords_secondary: z.string().optional(),\n additional_information: z.string().optional(),\n length: z.union([z.number().max(5000), z.literal('auto')]).optional().default('auto'),\n\n // Publishing options\n use_publishwordpress: boolField,\n publishwordpress_date: z.string().optional(),\n publishwordpress_status: z.enum(['draft', 'publish', 'future']).optional(),\n publishwordpress_category: numField,\n publishwordpress_author: numField,\n publishwordpress_connection: z.string().uuid().optional()\n});\n\nexport class ProductPagesToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n private cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n\n getTools(): Tool[] {\n return [\n this.createProductPageTool(),\n this.getProductPageTool(),\n this.listProductPagesTool(),\n this.updateProductPageTool(),\n this.generateProductPageTool(),\n this.getProductPageOutputTool(),\n this.estimateProductPageCostTool(),\n this.bulkCreateProductPagesTool()\n ];\n }\n\n private createProductPageTool(): Tool {\n return {\n name: 'create_product_page',\n description: 'Create a new product page',\n inputSchema: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Name/identifier of the product page', minLength: 1 },\n subject: { type: 'string', description: 'Product subject/topic', minLength: 1 },\n title: { type: 'string', description: 'Product page title' },\n product_name: { type: 'string', description: 'Name of the product' },\n product_url: { type: 'string', format: 'uri', description: 'URL of the product' },\n product_description: { type: 'string', description: 'Product description' },\n lang: { type: 'string', enum: [...LANG_ENUM], description: 'Language for the product page', default: 'en' },\n country: { type: 'string', enum: [...COUNTRY_ENUM], description: 'Target country for localization' },\n project_id: { type: 'string', format: 'uuid', description: 'Project UUID' },\n persona_id: { type: 'string', format: 'uuid', description: 'Persona UUID' },\n apply_project_brief_config: { type: 'boolean', description: 'Apply project configuration', default: false },\n use_faq: { type: 'boolean', description: 'Generate FAQ section', default: false },\n use_toc: { type: 'boolean', description: 'Generate table of contents', default: false },\n use_image: { type: 'boolean', description: 'Generate featured image', default: false },\n use_inlineimages: { type: 'boolean', description: 'Generate inline images', default: false },\n target_keyword: { type: 'string', description: 'Target SEO keyword' },\n keywords_secondary: { type: 'string', description: 'Secondary keywords (comma-separated)' },\n additional_information: { type: 'string', description: 'Additional context or instructions' },\n length: { description: 'Content length in words or \"auto\"', oneOf: [{ type: 'number', maximum: 5000 }, { type: 'string', enum: ['auto'] }], default: 'auto' },\n use_publishwordpress: { type: 'boolean', description: 'Publish to WordPress', default: false },\n publishwordpress_date: { type: 'string', description: 'Publication date (ISO 8601 or WordPress format)' },\n publishwordpress_status: { type: 'string', enum: ['draft', 'publish', 'future'], description: 'WordPress post status' },\n publishwordpress_category: { type: 'number', description: 'WordPress category ID' },\n publishwordpress_author: { type: 'number', description: 'WordPress author ID' },\n publishwordpress_connection: { type: 'string', format: 'uuid', description: 'WordPress connection UUID' }\n },\n required: ['name', 'subject']\n },\n handler: async (args) => {\n try {\n const validated = CreateProductPageSchema.parse(args);\n const productPage = await this.apiClient.createProductPage(validated);\n await this.cache.set(`product_page:${productPage.id}`, productPage, 300);\n this.metrics.recordAPICall('create_product_page', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, product_page_id: productPage.id, name: productPage.name, message: `Product page \"${productPage.name}\" created successfully`, next_steps: [`Use 'generate_product_page' with id: ${productPage.id}`, `Use 'get_product_page' with id: ${productPage.id}`] }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to create product page', { error: error.message });\n this.metrics.recordAPICall('create_product_page', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to create product page', details: error.issues || undefined }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private getProductPageTool(): Tool {\n return {\n name: 'get_product_page',\n description: 'Get product page details and status',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid', description: 'ID of the product page' } }, required: ['id'] },\n handler: async (args) => {\n try {\n const { id } = args;\n const cached = await this.cache.get(`product_page:${id}`);\n if (cached) { return { content: [{ type: 'text', text: JSON.stringify({ success: true, product_page: cached, from_cache: true }, null, 2) }] }; }\n const productPage = await this.apiClient.getProductPage(id);\n await this.cache.set(`product_page:${id}`, productPage, 300);\n this.metrics.recordAPICall('get_product_page', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, product_page: productPage }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get product page', { error: error.message });\n this.metrics.recordAPICall('get_product_page', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to retrieve product page' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private listProductPagesTool(): Tool {\n return {\n name: 'list_product_pages',\n description: 'List all product pages',\n inputSchema: {\n type: 'object',\n properties: {\n skip: { type: 'number', default: 0 },\n take: { type: 'number', default: 10 },\n search: { type: 'string', description: 'Search term' },\n status: { type: 'string', description: 'Filter by status' },\n project_id: { type: 'string', format: 'uuid', description: 'Filter by project' }\n }\n },\n handler: async (args) => {\n try {\n const result = await this.apiClient.listProductPages(args);\n this.metrics.recordAPICall('list_product_pages', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, total: result.total, count: result.items.length, product_pages: result.items.map(p => ({ id: p.id, name: p.name, status: p.status, created_at: p.created_at })) }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to list product pages', { error: error.message });\n this.metrics.recordAPICall('list_product_pages', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to list product pages' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private updateProductPageTool(): Tool {\n return {\n name: 'update_product_page',\n description: 'Update an existing product page',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid', description: 'ID of the product page to update' }, updates: { type: 'object', description: 'Fields to update' } }, required: ['id', 'updates'] },\n handler: async (args) => {\n try {\n const { id, updates } = args;\n await this.apiClient.updateProductPage(id, updates);\n await this.cache.delete(`product_page:${id}`);\n this.metrics.recordAPICall('update_product_page', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Product page updated successfully', id, updated_fields: Object.keys(updates) }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to update product page', { error: error.message });\n this.metrics.recordAPICall('update_product_page', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to update product page' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private generateProductPageTool(): Tool {\n return {\n name: 'generate_product_page',\n description: 'Generate content for an existing product page',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid' }, wait_for_completion: { type: 'boolean', default: true }, max_wait_time: { type: 'number', default: 300, maximum: 600 } }, required: ['id'] },\n handler: async (args) => {\n try {\n const { id, wait_for_completion = true, max_wait_time = 300 } = args;\n await this.apiClient.runProductPageGeneration(id);\n if (!wait_for_completion) { return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Product page generation started', product_page_id: id }, null, 2) }] }; }\n const startTime = Date.now();\n const pollInterval = 5000;\n const maxAttempts = Math.floor((max_wait_time * 1000) / pollInterval);\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n const productPage = await this.apiClient.getProductPage(id);\n if (productPage.status === 'completed' || productPage.status === 'success') {\n const output = await this.apiClient.getProductPageOutput(id);\n await this.cache.set(`product_page:output:${id}`, output, 600);\n this.metrics.recordAPICall('generate_product_page', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, status: 'completed', product_page_id: id, generation_time: Math.round((Date.now() - startTime) / 1000), message: 'Product page generated successfully' }, null, 2) }] };\n } else if (productPage.status === 'failed' || productPage.status === 'error') { throw new Error('Product page generation failed'); }\n }\n throw new Error(`Generation timeout after ${max_wait_time} seconds`);\n } catch (error: any) {\n logger.error('Failed to generate product page', { error: error.message });\n this.metrics.recordAPICall('generate_product_page', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to generate product page' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private getProductPageOutputTool(): Tool {\n return {\n name: 'get_product_page_output',\n description: 'Get the generated content of a product page',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid' } }, required: ['id'] },\n handler: async (args) => {\n try {\n const { id } = args;\n const cacheKey = `product_page:output:${id}`;\n const cached = await this.cache.get(cacheKey);\n const output = (cached || await this.apiClient.getProductPageOutput(id)) as any;\n if (!cached && output) { await this.cache.set(cacheKey, output, 600); }\n this.metrics.recordAPICall('get_product_page_output', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, product_page_id: id, output, from_cache: !!cached }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get product page output', { error: error.message });\n this.metrics.recordAPICall('get_product_page_output', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to get product page output' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private estimateProductPageCostTool(): Tool {\n return {\n name: 'estimate_product_page_cost',\n description: 'Estimate the cost of generating a product page',\n inputSchema: { type: 'object', properties: { data: { type: 'object', description: 'Product page configuration for cost estimation' } }, required: ['data'] },\n handler: async (args) => {\n try {\n const cost = await this.apiClient.calculateProductPageCost(args);\n this.metrics.recordAPICall('estimate_product_page_cost', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, cost_estimate: cost }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to estimate product page cost', { error: error.message });\n this.metrics.recordAPICall('estimate_product_page_cost', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to estimate cost' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private bulkCreateProductPagesTool(): Tool {\n return {\n name: 'bulk_create_product_pages',\n description: 'Create multiple product pages at once',\n inputSchema: { type: 'object', properties: { items: { type: 'array', items: { type: 'object' }, description: 'Array of product page configurations' } }, required: ['items'] },\n handler: async (args) => {\n try {\n const { items } = args;\n const result = await this.apiClient.createBulkProductPages(items);\n this.metrics.recordAPICall('bulk_create_product_pages', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: `Bulk created ${items.length} product pages`, result }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to bulk create product pages', { error: error.message });\n this.metrics.recordAPICall('bulk_create_product_pages', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to bulk create product pages' }, null, 2) }], isError: true };\n }\n }\n };\n }\n}\n","/**\n * Discover Tool Handler\n * Handles content discovery CRUD and generation operations\n */\n\nimport { z } from 'zod';\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\n// Boolean field transformer - accepts both boolean and string values\nconst boolField = z.union([z.boolean(), z.string()]).transform(val =>\n typeof val === 'string' ? val === 'true' : val\n).optional().default(false);\n\nconst DiscoverContentSchema = z.object({\n subject: z.string().min(1),\n target_keyword: z.string().optional(),\n keywords_secondary: z.string().optional(),\n project_id: z.string().uuid().optional(),\n persona_id: z.string().uuid().optional(),\n apply_project_brief_config: boolField,\n lang: z.enum(['fr', 'en']).optional(),\n country: z.enum(['fr', 'be', 'ch', 'ca', 'us', 'gb']).optional(),\n length: z.union([z.number().max(2000), z.literal('auto')]).optional(),\n title: z.string().optional(),\n additional_information: z.string().optional(),\n writing_style: z.string().optional(),\n website: z.string().optional(),\n writing_style_mode: z.enum(['auto', 'persona']).optional(),\n // SEO Features\n use_cta: z.boolean().optional(),\n ctas: z.array(z.object({\n anchor: z.string(),\n url: z.string()\n })).optional(),\n use_boldkeywords: z.boolean().optional(),\n use_faq: z.boolean().optional(),\n faq_questions: z.string().optional(),\n use_toc: z.boolean().optional(),\n // Image options\n use_image: z.boolean().optional(),\n image_ratio: z.enum(['landscape', 'portrait', '16:9', '4:3', '1:1']).optional(),\n image_prompt: z.string().optional(),\n image_use_palette: z.boolean().optional(),\n image_primary_color: z.string().optional(),\n image_secondary_color: z.string().optional(),\n use_inline_images: z.boolean().optional(),\n inline_images_ratio: z.enum(['landscape', 'portrait', '16:9', '4:3', '1:1']).optional(),\n inline_images_use_palette: z.boolean().optional(),\n inline_images_primary_color: z.string().optional(),\n inline_images_secondary_color: z.string().optional(),\n // Internal links\n use_internallinks: z.boolean().optional(),\n use_indexed_pages_internal_links: z.boolean().optional(),\n use_wp_internal_links: z.boolean().optional(),\n use_app_internal_links: z.boolean().optional(),\n use_list_internal_links: z.boolean().optional(),\n internal_links_wp_status: z.array(z.string()).optional(),\n internal_links_list: z.string().optional(),\n internal_links_wp_connection: z.string().optional(),\n // WordPress publishing\n use_publishwordpress: z.boolean().optional(),\n publishwordpress_date: z.string().optional(),\n publishwordpress_status: z.enum(['draft', 'publish', 'future']).optional(),\n publishwordpress_category: z.number().optional(),\n publishwordpress_author: z.number().optional(),\n publishwordpress_connection: z.string().optional(),\n // Additional features\n use_infotable: z.boolean().optional(),\n use_bulletlist: z.boolean().optional(),\n use_externalsources: z.boolean().optional(),\n use_audio: z.boolean().optional(),\n audio_voice_id: z.string().optional(),\n use_social: z.boolean().optional(),\n social_networks: z.union([\n z.array(z.string()),\n z.string()\n ]).optional(),\n use_blockquotes: z.boolean().optional(),\n use_summary: z.boolean().optional(),\n use_webhook: z.boolean().optional(),\n webhook_connection_id: z.string().optional()\n});\n\nexport class DiscoverToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n private cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n\n getTools(): Tool[] {\n return [\n this.discoverContentTool(),\n this.getDiscoverResultTool(),\n this.listDiscoverArticlesTool(),\n this.updateDiscoverArticleTool(),\n this.runDiscoveryTool(),\n this.getDiscoverOutputTool(),\n this.estimateDiscoverCostTool(),\n this.bulkCreateDiscoverArticlesTool()\n ];\n }\n\n private discoverContentTool(): Tool {\n return {\n name: 'discover_content',\n description: 'Create a Google Discover article optimized for ranking in Google Discover feed. Requires subject field. Supports all standard article features like FAQ, TOC, images, and WordPress publishing.',\n inputSchema: {\n type: 'object',\n properties: {\n subject: { type: 'string', description: 'The subject of the discover article (required)' },\n target_keyword: { type: 'string', description: 'SERP target keyword' },\n keywords_secondary: { type: 'string', description: 'Secondary keywords' },\n project_id: { type: 'string', format: 'uuid', description: 'Project UUID' },\n persona_id: { type: 'string', format: 'uuid', description: 'Persona UUID' },\n apply_project_brief_config: { type: 'boolean', description: 'Apply project brief configuration settings. When true, inherits all feature flags and settings from the project brief (use_faq, use_toc, use_inline_images, internal links, etc.). Recommended for consistency.', default: false },\n lang: { type: 'string', enum: ['fr', 'en'], description: 'Language code' },\n country: { type: 'string', enum: ['fr', 'be', 'ch', 'ca', 'us', 'gb'], description: 'Country code' },\n length: { description: 'Number (max 2000) or \"auto\"' },\n title: { type: 'string', description: 'Article title' },\n additional_information: { type: 'string', description: 'Additional context' },\n writing_style: { type: 'string', description: 'Writing style' },\n website: { type: 'string', description: 'Website URL' },\n writing_style_mode: { type: 'string', enum: ['auto', 'persona'], description: 'Writing style mode' },\n // SEO Features\n use_cta: { type: 'boolean', description: 'Add CTA' },\n ctas: { type: 'array', items: { type: 'object', properties: { anchor: { type: 'string' }, url: { type: 'string' } } }, description: 'Call-to-action links' },\n use_boldkeywords: { type: 'boolean', description: 'Bold keywords' },\n use_faq: { type: 'boolean', description: 'Add FAQ section' },\n faq_questions: { type: 'string', description: 'FAQ questions' },\n use_toc: { type: 'boolean', description: 'Add table of contents' },\n // Image options\n use_image: { type: 'boolean', description: 'Generate cover image' },\n image_ratio: { type: 'string', enum: ['landscape', 'portrait', '16:9', '4:3', '1:1'], description: 'Image aspect ratio' },\n image_prompt: { type: 'string', description: 'Image generation prompt' },\n image_use_palette: { type: 'boolean', description: 'Use color palette for image' },\n image_primary_color: { type: 'string', description: 'Primary color for image' },\n image_secondary_color: { type: 'string', description: 'Secondary color for image' },\n use_inline_images: { type: 'boolean', description: 'Generate inline images' },\n inline_images_ratio: { type: 'string', enum: ['landscape', 'portrait', '16:9', '4:3', '1:1'], description: 'Inline images aspect ratio' },\n inline_images_use_palette: { type: 'boolean', description: 'Use color palette for inline images' },\n inline_images_primary_color: { type: 'string', description: 'Primary color for inline images' },\n inline_images_secondary_color: { type: 'string', description: 'Secondary color for inline images' },\n // Internal links\n use_internallinks: { type: 'boolean', description: 'Add internal links' },\n use_indexed_pages_internal_links: { type: 'boolean', description: 'Use indexed pages for internal links' },\n use_wp_internal_links: { type: 'boolean', description: 'Use WordPress internal links' },\n use_app_internal_links: { type: 'boolean', description: 'Use app internal links' },\n use_list_internal_links: { type: 'boolean', description: 'Use list internal links' },\n internal_links_wp_status: { type: 'array', items: { type: 'string' }, description: 'WordPress post status for internal links' },\n internal_links_list: { type: 'string', description: 'Internal links list' },\n internal_links_wp_connection: { type: 'string', description: 'WordPress connection ID for internal links' },\n // WordPress publishing\n use_publishwordpress: { type: 'boolean', description: 'Auto-publish to WordPress' },\n publishwordpress_date: { type: 'string', description: 'WordPress publish date' },\n publishwordpress_status: { type: 'string', enum: ['draft', 'publish', 'future'], description: 'WordPress post status' },\n publishwordpress_category: { type: 'number', description: 'WordPress category ID' },\n publishwordpress_author: { type: 'number', description: 'WordPress author ID' },\n publishwordpress_connection: { type: 'string', description: 'WordPress connection ID' },\n // Additional features\n use_infotable: { type: 'boolean', description: 'Add info table' },\n use_bulletlist: { type: 'boolean', description: 'Add bullet list' },\n use_externalsources: { type: 'boolean', description: 'Use external sources' },\n use_audio: { type: 'boolean', description: 'Generate audio' },\n audio_voice_id: { type: 'string', description: 'Audio voice ID' },\n use_social: { type: 'boolean', description: 'Generate social media posts' },\n social_networks: { description: 'Social networks (array or comma-separated string)' },\n use_blockquotes: { type: 'boolean', description: 'Add blockquotes' },\n use_summary: { type: 'boolean', description: 'Add summary' },\n use_webhook: { type: 'boolean', description: 'Trigger webhook' },\n webhook_connection_id: { type: 'string', description: 'Webhook connection ID' }\n },\n required: ['subject', 'apply_project_brief_config']\n },\n handler: async (args) => {\n try {\n // Log raw input BEFORE validation\n logger.info('discover_content RAW INPUT', {\n raw_args: args,\n apply_project_brief_config_raw: args.apply_project_brief_config,\n apply_project_brief_config_raw_type: typeof args.apply_project_brief_config\n });\n\n const validated = DiscoverContentSchema.parse(args);\n\n // Log AFTER validation/transformation\n logger.info('discover_content VALIDATED (after boolField transform)', {\n apply_project_brief_config: validated.apply_project_brief_config,\n apply_project_brief_config_type: typeof validated.apply_project_brief_config,\n has_project_id: !!validated.project_id,\n full_validated: validated\n });\n\n // Clean undefined/null values before sending to API\n const cleanedInput: Record<string, any> = {};\n for (const [key, value] of Object.entries(validated)) {\n if (value !== undefined && value !== null) {\n cleanedInput[key] = value;\n }\n }\n\n logger.info('discover_content CLEANED INPUT (undefined removed)', {\n before_cleaning_keys: Object.keys(validated).length,\n after_cleaning_keys: Object.keys(cleanedInput).length,\n apply_project_brief_config_included: 'apply_project_brief_config' in cleanedInput,\n apply_project_brief_config_value: cleanedInput.apply_project_brief_config\n });\n\n const discovery = await this.apiClient.discoverArticles(cleanedInput as DiscoverArticleInput);\n\n await this.cache.set(`discover:${discovery.id}`, discovery, 300);\n this.metrics.recordAPICall('discover_content', 'success');\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n success: true,\n discovery_id: discovery.id,\n message: 'Content discovery created successfully',\n next_steps: [\n `Use 'run_discovery' with id: ${discovery.id}`,\n `Use 'get_discover_result' with id: ${discovery.id}`\n ]\n }, null, 2)\n }]\n };\n } catch (error: any) {\n logger.error('Failed to create discovery', { error: error.message });\n this.metrics.recordAPICall('discover_content', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to create discovery', details: error.issues || undefined }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private getDiscoverResultTool(): Tool {\n return {\n name: 'get_discover_result',\n description: 'Get content discovery results and status',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid' } }, required: ['id'] },\n handler: async (args) => {\n try {\n const { id } = args;\n const cached = await this.cache.get(`discover:${id}`);\n if (cached) { return { content: [{ type: 'text', text: JSON.stringify({ success: true, discovery: cached, from_cache: true }, null, 2) }] }; }\n const discovery = await this.apiClient.getDiscoverArticle(id);\n await this.cache.set(`discover:${id}`, discovery, 300);\n this.metrics.recordAPICall('get_discover_result', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, discovery }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get discovery result', { error: error.message });\n this.metrics.recordAPICall('get_discover_result', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to retrieve discovery result' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private listDiscoverArticlesTool(): Tool {\n return {\n name: 'list_discover_articles',\n description: 'List all discover articles',\n inputSchema: {\n type: 'object',\n properties: {\n skip: { type: 'number', default: 0 },\n take: { type: 'number', default: 10 },\n search: { type: 'string', description: 'Search term' },\n status: { type: 'string', description: 'Filter by status' },\n project_id: { type: 'string', format: 'uuid', description: 'Filter by project' }\n }\n },\n handler: async (args) => {\n try {\n const result = await this.apiClient.listDiscoverArticles(args);\n this.metrics.recordAPICall('list_discover_articles', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, total: result.total, count: result.items.length, discover_articles: result.items.map(d => ({ id: d.id, name: d.name, status: d.status, created_at: d.created_at })) }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to list discover articles', { error: error.message });\n this.metrics.recordAPICall('list_discover_articles', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to list discover articles' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private updateDiscoverArticleTool(): Tool {\n return {\n name: 'update_discover_article',\n description: 'Update an existing discover article',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid' }, updates: { type: 'object', description: 'Fields to update' } }, required: ['id', 'updates'] },\n handler: async (args) => {\n try {\n const { id, updates } = args;\n await this.apiClient.updateDiscoverArticle(id, updates);\n await this.cache.delete(`discover:${id}`);\n this.metrics.recordAPICall('update_discover_article', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Discover article updated successfully', id, updated_fields: Object.keys(updates) }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to update discover article', { error: error.message });\n this.metrics.recordAPICall('update_discover_article', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to update discover article' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private runDiscoveryTool(): Tool {\n return {\n name: 'run_discovery',\n description: 'Run content discovery process',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid' } }, required: ['id'] },\n handler: async (args) => {\n try {\n const { id } = args;\n await this.apiClient.runDiscovery(id);\n await this.cache.delete(`discover:${id}`);\n this.metrics.recordAPICall('run_discovery', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Discovery started successfully', discovery_id: id, next_step: `Use 'get_discover_result' to check status and get results` }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to run discovery', { error: error.message });\n this.metrics.recordAPICall('run_discovery', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to run discovery' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private getDiscoverOutputTool(): Tool {\n return {\n name: 'get_discover_output',\n description: 'Get the generated output of a discover article',\n inputSchema: { type: 'object', properties: { id: { type: 'string', format: 'uuid' } }, required: ['id'] },\n handler: async (args) => {\n try {\n const { id } = args;\n const cacheKey = `discover:output:${id}`;\n const cached = await this.cache.get(cacheKey);\n const output = (cached || await this.apiClient.getDiscoverArticleOutput(id)) as any;\n if (!cached && output) { await this.cache.set(cacheKey, output, 600); }\n this.metrics.recordAPICall('get_discover_output', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, discovery_id: id, output, from_cache: !!cached }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get discover output', { error: error.message });\n this.metrics.recordAPICall('get_discover_output', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to get discover output' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private estimateDiscoverCostTool(): Tool {\n return {\n name: 'estimate_discover_cost',\n description: 'Estimate the cost of a discover article',\n inputSchema: { type: 'object', properties: { data: { type: 'object', description: 'Discovery configuration for cost estimation' } }, required: ['data'] },\n handler: async (args) => {\n try {\n const cost = await this.apiClient.calculateDiscoverCost(args);\n this.metrics.recordAPICall('estimate_discover_cost', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, cost_estimate: cost }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to estimate discover cost', { error: error.message });\n this.metrics.recordAPICall('estimate_discover_cost', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to estimate cost' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private bulkCreateDiscoverArticlesTool(): Tool {\n return {\n name: 'bulk_create_discover_articles',\n description: 'Create multiple discover articles at once',\n inputSchema: { type: 'object', properties: { items: { type: 'array', items: { type: 'object' }, description: 'Array of discover article configurations' } }, required: ['items'] },\n handler: async (args) => {\n try {\n const { items } = args;\n const result = await this.apiClient.createBulkDiscoverArticles(items);\n this.metrics.recordAPICall('bulk_create_discover_articles', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: `Bulk created ${items.length} discover articles`, result }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to bulk create discover articles', { error: error.message });\n this.metrics.recordAPICall('bulk_create_discover_articles', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to bulk create discover articles' }, null, 2) }], isError: true };\n }\n }\n };\n }\n}\n","/**\n * Feeds Tool Handler (was RSS Tool Handler)\n * Handles feed operations via /v1/feeds/ API\n */\n\nimport { z } from 'zod';\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nconst CreateFeedSchema = z.object({\n url: z.string().url('Valid feed URL is required'),\n title: z.string().optional(),\n entity_type: z.enum(['articles', 'discoverarticles']).optional().default('articles'),\n frequency: z.enum(['30min', '1h', '3h', '6h', '12h', '24h', '48h', '72h']).optional().default('24h'),\n limit: z.number().min(1).max(50).optional().default(10),\n sort_by: z.enum(['newest', 'oldest', 'most_relevant']).optional().default('most_relevant'),\n filtering_brief: z.string().optional(),\n is_active: z.boolean().optional().default(true),\n enable_generation: z.boolean().optional().default(false),\n project_id: z.string().uuid().optional(),\n config: z.record(z.any()).optional()\n});\n\n// Keep the class name for backwards compatibility with server registration\nexport class RSSToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n private cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n\n getTools(): Tool[] {\n return [\n this.createFeedTool(),\n this.getFeedTool(),\n this.listFeedsTool(),\n this.updateFeedTool(),\n this.deleteFeedTool()\n ];\n }\n\n private createFeedTool(): Tool {\n return {\n name: 'create_feed',\n description: 'Create a new RSS/Atom feed for automated content monitoring and generation',\n inputSchema: {\n type: 'object',\n properties: {\n url: { type: 'string', format: 'uri', description: 'URL of the RSS/Atom feed to monitor' },\n title: { type: 'string', description: 'Title for this feed configuration' },\n entity_type: { type: 'string', enum: ['articles', 'discoverarticles'], description: 'Type of entity to create from feed items', default: 'articles' },\n frequency: { type: 'string', enum: ['30min', '1h', '3h', '6h', '12h', '24h', '48h', '72h'], description: 'How often to check for new feed items', default: '24h' },\n limit: { type: 'number', minimum: 1, maximum: 50, description: 'Maximum number of feed items to process per check', default: 10 },\n sort_by: { type: 'string', enum: ['newest', 'oldest', 'most_relevant'], description: 'How to sort feed items', default: 'most_relevant' },\n filtering_brief: { type: 'string', description: 'Description of how to filter RSS items (e.g., \"only tech-related articles\")' },\n is_active: { type: 'boolean', description: 'Whether the feed is active', default: true },\n enable_generation: { type: 'boolean', description: 'Auto-generate content from feed items', default: false },\n project_id: { type: 'string', format: 'uuid', description: 'Project ID to associate feed items with' },\n config: { type: 'object', description: 'Additional feed configuration' }\n },\n required: ['url']\n },\n handler: async (args) => {\n try {\n const validated = CreateFeedSchema.parse(args);\n const feed = await this.apiClient.createFeed(validated);\n await this.cache.set(`feed:${feed.id}`, feed, 300);\n this.metrics.recordAPICall('create_feed', 'success');\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n success: true,\n feed_id: feed.id,\n title: feed.title || feed.url,\n message: `Feed \"${feed.title || feed.url}\" created successfully`,\n next_steps: [\n `Use 'get_feed' with id: ${feed.id} to check status`,\n `Use 'update_feed' with id: ${feed.id} to modify settings`,\n `Use 'list_feeds' to see all feeds`\n ]\n }, null, 2)\n }]\n };\n } catch (error: any) {\n logger.error('Failed to create feed', { error: error.message });\n this.metrics.recordAPICall('create_feed', 'error');\n return {\n content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to create feed', details: error.issues || undefined }, null, 2) }],\n isError: true\n };\n }\n }\n };\n }\n\n private getFeedTool(): Tool {\n return {\n name: 'get_feed',\n description: 'Get feed details and status',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid', description: 'ID of the feed to retrieve' }\n },\n required: ['id']\n },\n handler: async (args) => {\n try {\n const { id } = args;\n const cached = await this.cache.get(`feed:${id}`);\n if (cached) {\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, feed: cached, from_cache: true }, null, 2) }] };\n }\n const feed = await this.apiClient.getFeed(id);\n await this.cache.set(`feed:${id}`, feed, 300);\n this.metrics.recordAPICall('get_feed', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, feed }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get feed', { error: error.message });\n this.metrics.recordAPICall('get_feed', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to retrieve feed' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private listFeedsTool(): Tool {\n return {\n name: 'list_feeds',\n description: 'List all configured feeds',\n inputSchema: {\n type: 'object',\n properties: {\n skip: { type: 'number', description: 'Number of items to skip', default: 0 },\n take: { type: 'number', description: 'Number of items to retrieve', default: 10 },\n search: { type: 'string', description: 'Search term to filter feeds' }\n }\n },\n handler: async (args) => {\n try {\n const result = await this.apiClient.listFeeds(args);\n this.metrics.recordAPICall('list_feeds', 'success');\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n success: true,\n total: result.total,\n count: result.items.length,\n feeds: result.items.map(f => ({\n id: f.id, url: f.url, title: f.title,\n entity_type: f.entity_type, frequency: f.frequency,\n is_active: f.is_active, enable_generation: f.enable_generation\n }))\n }, null, 2)\n }]\n };\n } catch (error: any) {\n logger.error('Failed to list feeds', { error: error.message });\n this.metrics.recordAPICall('list_feeds', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to list feeds' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private updateFeedTool(): Tool {\n return {\n name: 'update_feed',\n description: 'Update an existing feed configuration',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid', description: 'ID of the feed to update' },\n updates: {\n type: 'object',\n description: 'Fields to update',\n properties: {\n url: { type: 'string', format: 'uri', description: 'Feed URL' },\n title: { type: 'string', description: 'Feed title' },\n entity_type: { type: 'string', enum: ['articles', 'discoverarticles'] },\n frequency: { type: 'string', enum: ['30min', '1h', '3h', '6h', '12h', '24h', '48h', '72h'] },\n limit: { type: 'number', minimum: 1, maximum: 50 },\n sort_by: { type: 'string', enum: ['newest', 'oldest', 'most_relevant'] },\n filtering_brief: { type: 'string' },\n is_active: { type: 'boolean' },\n enable_generation: { type: 'boolean' },\n project_id: { type: 'string', format: 'uuid' },\n config: { type: 'object' }\n }\n }\n },\n required: ['id', 'updates']\n },\n handler: async (args) => {\n try {\n const { id, updates } = args;\n await this.apiClient.updateFeed(id, updates);\n await this.cache.delete(`feed:${id}`);\n this.metrics.recordAPICall('update_feed', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Feed updated successfully', feed_id: id, updated_fields: Object.keys(updates) }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to update feed', { error: error.message });\n this.metrics.recordAPICall('update_feed', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to update feed' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private deleteFeedTool(): Tool {\n return {\n name: 'delete_feed',\n description: 'Delete a feed configuration',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', format: 'uuid', description: 'ID of the feed to delete' }\n },\n required: ['id']\n },\n handler: async (args) => {\n try {\n const { id } = args;\n await this.apiClient.deleteFeed(id);\n await this.cache.delete(`feed:${id}`);\n this.metrics.recordAPICall('delete_feed', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, message: 'Feed deleted successfully', feed_id: id }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to delete feed', { error: error.message });\n this.metrics.recordAPICall('delete_feed', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to delete feed' }, null, 2) }], isError: true };\n }\n }\n };\n }\n}\n","/**\n * Transactions Tool Handler\n * Handles transaction listing and daily summary\n */\n\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nexport class TransactionsToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n _cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n\n getTools(): Tool[] {\n return [\n this.listTransactionsTool(),\n this.getDailyTransactionsTool()\n ];\n }\n\n private listTransactionsTool(): Tool {\n return {\n name: 'list_transactions',\n description: 'List credit transactions and usage history',\n inputSchema: {\n type: 'object',\n properties: {\n skip: { type: 'number', description: 'Number of items to skip', default: 0 },\n take: { type: 'number', description: 'Number of items to retrieve', default: 10 },\n search: { type: 'string', description: 'Search term' }\n }\n },\n handler: async (args) => {\n try {\n const result = await this.apiClient.listTransactions(args);\n this.metrics.recordAPICall('list_transactions', 'success');\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n success: true,\n total: result.total,\n count: result.items.length,\n transactions: result.items.map(t => ({\n id: t.id, type: t.type, amount: t.amount, credits: t.credits,\n description: t.description, entity_id: t.entity_id,\n entity_type: t.entity_type, created_at: t.created_at\n }))\n }, null, 2)\n }]\n };\n } catch (error: any) {\n logger.error('Failed to list transactions', { error: error.message });\n this.metrics.recordAPICall('list_transactions', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to list transactions' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private getDailyTransactionsTool(): Tool {\n return {\n name: 'get_daily_transactions',\n description: 'Get daily transaction summary',\n inputSchema: { type: 'object', properties: {} },\n handler: async () => {\n try {\n const result = await this.apiClient.getDailyTransactions();\n this.metrics.recordAPICall('get_daily_transactions', 'success');\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, daily_summary: result }, null, 2) }] };\n } catch (error: any) {\n logger.error('Failed to get daily transactions', { error: error.message });\n this.metrics.recordAPICall('get_daily_transactions', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to get daily transactions' }, null, 2) }], isError: true };\n }\n }\n };\n }\n}\n","/**\n * Jobs Tool Handler\n * Handles job status checking and triggering\n */\n\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { MetricsCollector } from '../../monitoring/MetricsCollector';\nimport { logger } from '../../utils/logger';\nimport { Tool, ToolHandler } from '../../types/mcp';\n\nexport class JobsToolHandler implements ToolHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n _cache: CacheManager,\n private metrics: MetricsCollector\n ) {}\n\n getTools(): Tool[] {\n return [\n this.getJobTool(),\n this.triggerJobTool()\n ];\n }\n\n private getJobTool(): Tool {\n return {\n name: 'get_job',\n description: 'Get the status of a background job',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'ID of the job to check' }\n },\n required: ['id']\n },\n handler: async (args) => {\n try {\n const { id } = args;\n const job = await this.apiClient.getJob(id);\n this.metrics.recordAPICall('get_job', 'success');\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n success: true,\n job: {\n id: job.id, name: job.name, status: job.status,\n progress: job.progress, result: job.result, error: job.error,\n created_at: job.created_at, updated_at: job.updated_at\n }\n }, null, 2)\n }]\n };\n } catch (error: any) {\n logger.error('Failed to get job', { error: error.message });\n this.metrics.recordAPICall('get_job', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to get job status' }, null, 2) }], isError: true };\n }\n }\n };\n }\n\n private triggerJobTool(): Tool {\n return {\n name: 'trigger_job',\n description: 'Trigger a named background job',\n inputSchema: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Name of the job to trigger' }\n },\n required: ['name']\n },\n handler: async (args) => {\n try {\n const { name } = args;\n const job = await this.apiClient.triggerJob(name);\n this.metrics.recordAPICall('trigger_job', 'success');\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n success: true,\n message: `Job \"${name}\" triggered successfully`,\n job_id: job.id,\n status: job.status,\n next_step: `Use 'get_job' with id: ${job.id} to check progress`\n }, null, 2)\n }]\n };\n } catch (error: any) {\n logger.error('Failed to trigger job', { error: error.message });\n this.metrics.recordAPICall('trigger_job', 'error');\n return { content: [{ type: 'text', text: JSON.stringify({ error: true, message: error.message || 'Failed to trigger job' }, null, 2) }], isError: true };\n }\n }\n };\n }\n}\n","/**\n * Resource Handler\n * Provides static and dynamic resources\n */\n\nimport { WisewandAPIClient } from '../../clients/WisewandAPIClient';\nimport { CacheManager } from '../../services/CacheManager';\nimport { logger } from '../../utils/logger';\nimport { Resource } from '../../types/mcp';\n\nexport class ResourceHandler {\n constructor(\n private apiClient: WisewandAPIClient,\n _cache: CacheManager\n ) {}\n \n getResources(): Resource[] {\n return [\n {\n uri: 'wisewand://schemas/article',\n name: 'Article Schema',\n description: 'Complete schema for article creation',\n mimeType: 'application/json'\n },\n {\n uri: 'wisewand://schemas/project',\n name: 'Project Schema',\n description: 'Schema for project configuration',\n mimeType: 'application/json'\n },\n {\n uri: 'wisewand://schemas/persona',\n name: 'Persona Schema',\n description: 'Schema for writing personas',\n mimeType: 'application/json'\n },\n {\n uri: 'wisewand://docs/quickstart',\n name: 'Quick Start Guide',\n description: 'Getting started with Wisewand MCP',\n mimeType: 'text/markdown'\n },\n {\n uri: 'wisewand://docs/workflows',\n name: 'Common Workflows',\n description: 'Example workflows for content generation',\n mimeType: 'text/markdown'\n },\n {\n uri: 'wisewand://stats/usage',\n name: 'Usage Statistics',\n description: 'Current API usage and limits',\n mimeType: 'application/json'\n }\n ];\n }\n \n async readResource(uri: string): Promise<any> {\n logger.debug('Reading resource', { uri });\n \n // Parse URI\n const url = new URL(uri);\n const path = url.pathname;\n \n switch (path) {\n case '/schemas/article':\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(this.getArticleSchema(), null, 2)\n }\n ]\n };\n \n case '/schemas/project':\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(this.getProjectSchema(), null, 2)\n }\n ]\n };\n \n case '/schemas/persona':\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(this.getPersonaSchema(), null, 2)\n }\n ]\n };\n \n case '/docs/quickstart':\n return {\n contents: [\n {\n uri,\n mimeType: 'text/markdown',\n text: this.getQuickStartGuide()\n }\n ]\n };\n \n case '/docs/workflows':\n return {\n contents: [\n {\n uri,\n mimeType: 'text/markdown',\n text: this.getWorkflowsGuide()\n }\n ]\n };\n \n case '/stats/usage':\n const usage = await this.apiClient.getUsageSummary();\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(usage, null, 2)\n }\n ]\n };\n \n default:\n throw new Error(`Resource not found: ${uri}`);\n }\n }\n \n private getArticleSchema() {\n return {\n type: 'object',\n properties: {\n subject: {\n type: 'string',\n description: 'Main topic of the article',\n minLength: 1\n },\n title: {\n type: 'string',\n description: 'Custom title (optional)'\n },\n type: {\n type: 'string',\n enum: ['blog', 'affiliation-product-review', 'affiliation-compare-products', 'affiliation-top-product'],\n default: 'blog'\n },\n lang: {\n type: 'string',\n enum: ['fr', 'en'],\n default: 'en'\n },\n country: {\n type: 'string',\n enum: ['fr', 'be', 'ch', 'ca', 'us', 'gb']\n },\n length: {\n oneOf: [\n { type: 'number', maximum: 5000 },\n { type: 'string', const: 'auto' }\n ],\n default: 'auto'\n },\n target_keyword: {\n type: 'string',\n description: 'Primary SEO keyword'\n },\n keywords_secondary: {\n type: 'string',\n description: 'Secondary keywords (comma-separated)'\n },\n seo_features: {\n type: 'object',\n properties: {\n use_faq: { type: 'boolean', default: false },\n use_toc: { type: 'boolean', default: false },\n use_boldkeywords: { type: 'boolean', default: false },\n use_internallinks: { type: 'boolean', default: false }\n }\n },\n image_generation: {\n type: 'object',\n properties: {\n use_image: { type: 'boolean', default: false },\n image_ratio: {\n type: 'string',\n enum: ['landscape', 'portrait', '16:9', '4:3', '1:1'],\n default: 'landscape'\n },\n image_prompt: { type: 'string' }\n }\n }\n },\n required: ['subject']\n };\n }\n \n private getProjectSchema() {\n return {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Project name',\n minLength: 1\n },\n website_url: {\n type: 'string',\n format: 'uri',\n description: 'Associated website'\n },\n description: {\n type: 'string',\n description: 'Project description'\n },\n default_lang: {\n type: 'string',\n enum: ['fr', 'en']\n },\n default_country: {\n type: 'string',\n enum: ['fr', 'be', 'ch', 'ca', 'us', 'gb']\n },\n default_persona_id: {\n type: 'string',\n format: 'uuid'\n }\n },\n required: ['name']\n };\n }\n \n private getPersonaSchema() {\n return {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Persona name',\n minLength: 1\n },\n description: {\n type: 'string'\n },\n tone: {\n type: 'string',\n description: 'Writing tone'\n },\n style: {\n type: 'string',\n description: 'Writing style'\n },\n voice: {\n type: 'string',\n description: 'Writing voice'\n },\n examples: {\n type: 'array',\n items: { type: 'string' }\n },\n guidelines: {\n type: 'string'\n }\n },\n required: ['name']\n };\n }\n \n private getQuickStartGuide(): string {\n return `# Wisewand MCP Quick Start Guide\n\n## 🎉 New to Wisewand? Start Here!\n\n**First time using Wisewand MCP?** Get comprehensive onboarding:\n\n\\`\\`\\`\nUse the onboarding wizard\n\\`\\`\\`\n\nThis interactive guide teaches you:\n- ✅ What all 74 tools can do (organized by category)\n- ✅ How to create your first article (step-by-step with examples)\n- ✅ 5 powerful real-world workflows\n- ✅ Best practices for SEO, cost management, and publishing\n\n**Takes 10-15 minutes and you'll be an expert!**\n\n---\n\n## Quick Reference\n\nFor experienced users, here's a quick workflow:\n\n### Step 1: Create a Project\n\nFirst, create a project to organize your content:\n\n\\`\\`\\`\ncreate_project({\n \"name\": \"My Blog\",\n \"website_url\": \"https://myblog.com\",\n \"default_lang\": \"en\"\n})\n\\`\\`\\`\n\n### Step 2: Create a Persona (Optional)\n\nDefine a writing style for consistent voice:\n\n\\`\\`\\`\ncreate_persona({\n \"name\": \"Professional Writer\",\n \"tone\": \"professional\",\n \"style\": \"informative\"\n})\n\\`\\`\\`\n\n### Step 3: Create an Article\n\nCreate your first article:\n\n\\`\\`\\`\ncreate_article({\n \"subject\": \"10 Tips for Better Content Marketing\",\n \"type\": \"blog\",\n \"target_keyword\": \"content marketing tips\",\n \"project_id\": \"<your-project-id>\",\n \"seo_features\": {\n \"use_faq\": true,\n \"use_toc\": true\n }\n})\n\\`\\`\\`\n\n### Step 4: Generate Content\n\nGenerate the article content:\n\n\\`\\`\\`\ngenerate_article({\n \"article_id\": \"<article-id>\",\n \"wait_for_completion\": true\n})\n\\`\\`\\`\n\n### Step 5: Retrieve Output\n\nGet the generated content:\n\n\\`\\`\\`\nget_article_output({\n \"article_id\": \"<article-id>\",\n \"format\": \"full\"\n})\n\\`\\`\\`\n\n### Step 6: Publish (Optional)\n\nPublish to WordPress:\n\n\\`\\`\\`\npublish_to_wordpress({\n \"entity_id\": \"<article-id>\",\n \"status\": \"publish\"\n})\n\\`\\`\\`\n\n## Common Commands\n\n- \\`list_articles\\` - View all articles\n- \\`list_projects\\` - View all projects\n- \\`estimate_article_cost\\` - Check generation cost\n- \\`bulk_create_articles\\` - Create multiple articles\n\n## Need Help?\n\n- Check the workflows guide: \\`wisewand://docs/workflows\\`\n- View API schemas: \\`wisewand://schemas/article\\`\n- Check usage: \\`wisewand://stats/usage\\`\n`;\n }\n \n private getWorkflowsGuide(): string {\n return `# Wisewand Common Workflows\n\n## 1. SEO-Optimized Blog Post\n\n\\`\\`\\`javascript\n// 1. Research keywords\nconst article = await create_article({\n subject: \"Ultimate Guide to SEO in 2024\",\n target_keyword: \"SEO guide 2024\",\n keywords_secondary: \"search engine optimization, SEO tips, Google ranking\",\n length: 2000,\n seo_features: {\n use_faq: true,\n use_toc: true,\n use_boldkeywords: true,\n use_internallinks: true\n },\n image_generation: {\n use_image: true,\n image_ratio: \"16:9\"\n }\n});\n\n// 2. Generate content\nawait generate_article({\n article_id: article.article_id,\n wait_for_completion: true\n});\n\n// 3. Publish\nawait publish_to_wordpress({\n entity_id: article.article_id,\n status: \"publish\"\n});\n\\`\\`\\`\n\n## 2. Bulk Content Campaign\n\n\\`\\`\\`javascript\n// 1. Prepare articles\nconst articles = [\n { subject: \"Topic 1\", target_keyword: \"keyword1\" },\n { subject: \"Topic 2\", target_keyword: \"keyword2\" },\n { subject: \"Topic 3\", target_keyword: \"keyword3\" }\n];\n\n// 2. Estimate cost\nconst cost = await bulk_estimate_cost({ articles });\n\n// 3. Create and generate\nawait bulk_create_articles({\n articles,\n auto_generate: true\n});\n\\`\\`\\`\n\n## 3. Multi-Language Content\n\n\\`\\`\\`javascript\n// Create same article in multiple languages\nconst languages = ['en', 'fr'];\nconst countries = { en: 'us', fr: 'fr' };\n\nfor (const lang of languages) {\n await create_article({\n subject: \"Product Launch Announcement\",\n lang,\n country: countries[lang],\n project_id: project.id\n });\n}\n\\`\\`\\`\n\n## 4. Product Review Article\n\n\\`\\`\\`javascript\nawait create_article({\n subject: \"iPhone 15 Pro Max Review\",\n type: \"affiliation-product-review\",\n target_keyword: \"iPhone 15 Pro Max review\",\n length: 3000,\n use_cta: true,\n ctas: [\n {\n anchor: \"Buy on Amazon\",\n url: \"https://amazon.com/...\"\n }\n ],\n image_generation: {\n use_image: true,\n image_prompt: \"Modern smartphone review setup\"\n }\n});\n\\`\\`\\`\n\n## 5. Content Series with Persona\n\n\\`\\`\\`javascript\n// 1. Create persona\nconst persona = await create_persona({\n name: \"Tech Expert\",\n tone: \"authoritative\",\n style: \"technical\",\n voice: \"first person plural\"\n});\n\n// 2. Create series\nconst topics = [\n \"AI Basics\",\n \"Machine Learning\",\n \"Neural Networks\",\n \"Deep Learning\"\n];\n\nfor (const topic of topics) {\n const article = await create_article({\n subject: \\`Understanding \\${topic}: A Comprehensive Guide\\`,\n persona_id: persona.persona_id,\n project_id: project.id\n });\n \n await generate_article({\n article_id: article.article_id\n });\n}\n\\`\\`\\`\n`;\n }\n}","/**\n * Prompt Handler\n * Provides interactive prompt templates\n */\n\nimport { logger } from '../../utils/logger';\nimport { Prompt } from '../../types/mcp';\n\nexport class PromptHandler {\n getPrompts(): Prompt[] {\n return [\n {\n name: 'blog_post_wizard',\n description: 'Interactive wizard for creating a blog post',\n arguments: [\n { name: 'topic', description: 'Blog post topic' },\n { name: 'keywords', description: 'Target keywords' },\n { name: 'length', description: 'Desired word count' }\n ]\n },\n {\n name: 'seo_optimization',\n description: 'SEO-focused content generation wizard',\n arguments: [\n { name: 'keyword', description: 'Primary keyword' },\n { name: 'competitors', description: 'Competitor URLs' }\n ]\n },\n {\n name: 'content_campaign',\n description: 'Plan and execute a content campaign',\n arguments: [\n { name: 'theme', description: 'Campaign theme' },\n { name: 'num_articles', description: 'Number of articles' },\n { name: 'schedule', description: 'Publishing schedule' }\n ]\n },\n {\n name: 'onboarding_wizard',\n description: 'Interactive guide for first-time users - learn tools, create your first article, discover workflows',\n arguments: [\n { name: 'focus_area', description: 'Optional: Focus on specific area (articles, publishing, discovery, bulk)' },\n { name: 'skip_to', description: 'Optional: Jump to section (tools, first-article, workflows, tips)' }\n ]\n }\n ];\n }\n \n async getPrompt(name: string, args: any): Promise<any> {\n logger.debug('Getting prompt', { name, args });\n \n switch (name) {\n case 'blog_post_wizard':\n return this.getBlogPostWizardPrompt(args);\n \n case 'seo_optimization':\n return this.getSEOOptimizationPrompt(args);\n \n case 'content_campaign':\n return this.getContentCampaignPrompt(args);\n\n case 'onboarding_wizard':\n return this.getOnboardingWizardPrompt(args);\n\n default:\n throw new Error(`Prompt not found: ${name}`);\n }\n }\n \n private getBlogPostWizardPrompt(args: any): any {\n const { topic, keywords, length } = args || {};\n \n const messages = [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `I want to create a blog post about: ${topic || '[topic]'}`\n }\n },\n {\n role: 'assistant',\n content: {\n type: 'text',\n text: `I'll help you create an optimized blog post about \"${topic || '[topic]'}\". Let me set this up for you.\n\nFirst, I'll create the article with these specifications:\n- Topic: ${topic || '[topic]'}\n- Target Keywords: ${keywords || '[keywords]'}\n- Length: ${length || 'auto'} words\n- Type: Blog post\n- SEO Features: FAQ, Table of Contents, Bold Keywords\n\nHere's what I'll do:\n1. Create the article with optimal SEO settings\n2. Generate high-quality content\n3. Include relevant internal links\n4. Add a featured image\n5. Optimize meta description\n\nLet me start by creating the article...`\n }\n }\n ];\n \n return {\n description: `Create a blog post about \"${topic || '[topic]'}\"`,\n messages\n };\n }\n \n private getSEOOptimizationPrompt(args: any): any {\n const { keyword, competitors } = args || {};\n \n const messages = [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `I want to rank for: ${keyword || '[keyword]'}`\n }\n },\n {\n role: 'assistant',\n content: {\n type: 'text',\n text: `I'll help you create content optimized to rank for \"${keyword || '[keyword]'}\".\n\nSEO Strategy:\n1. **Keyword Research**\n - Primary: ${keyword || '[keyword]'}\n - LSI keywords will be automatically identified\n - Search intent analysis\n\n2. **Content Structure**\n - Comprehensive guide format\n - FAQ section for voice search\n - Table of contents for easy navigation\n - Strategic keyword placement\n\n3. **Competitive Analysis**\n ${competitors ? `- Analyzing: ${competitors}` : '- Identifying top-ranking content'}\n - Finding content gaps\n - Improving on existing content\n\n4. **Technical SEO**\n - Optimized meta description\n - Proper heading structure\n - Internal linking strategy\n - Schema markup ready\n\nLet me create this SEO-optimized content for you...`\n }\n }\n ];\n \n return {\n description: `SEO-optimized content for \"${keyword || '[keyword]'}\"`,\n messages\n };\n }\n \n private getContentCampaignPrompt(args: any): any {\n const { theme, num_articles, schedule } = args || {};\n \n const messages = [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `I want to create a content campaign: ${theme || '[theme]'}`\n }\n },\n {\n role: 'assistant',\n content: {\n type: 'text',\n text: `I'll help you plan and execute a content campaign for \"${theme || '[theme]'}\".\n\nCampaign Overview:\n- Theme: ${theme || '[theme]'}\n- Articles: ${num_articles || '10'} pieces\n- Schedule: ${schedule || 'Weekly releases'}\n\nContent Strategy:\n\n1. **Pillar Content** (2 articles)\n - Comprehensive guides (3000+ words)\n - Main topic coverage\n - High-value, evergreen content\n\n2. **Supporting Content** (${(num_articles || 10) - 2} articles)\n - Related subtopics (1500-2000 words)\n - Linking to pillar content\n - Targeting long-tail keywords\n\n3. **Content Types**\n - How-to guides\n - Listicles\n - Case studies\n - Comparison articles\n - FAQ compilations\n\n4. **Publishing Schedule**\n ${schedule === 'daily' ? '- Daily releases for maximum impact' : ''}\n ${schedule === 'weekly' ? '- Weekly releases for consistent engagement' : ''}\n ${!schedule ? '- Optimized schedule based on your audience' : ''}\n\n5. **Cross-Promotion**\n - Internal linking strategy\n - Social media snippets\n - Email newsletter content\n\nLet me start creating this campaign for you...`\n }\n }\n ];\n \n return {\n description: `Content campaign: \"${theme || '[theme]'}\"`,\n messages\n };\n }\n\n private getOnboardingWizardPrompt(args: any): any {\n const { focus_area, skip_to } = args || {};\n\n const messages = [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `I want to learn how to use Wisewand MCP`\n }\n },\n {\n role: 'assistant',\n content: {\n type: 'text',\n text: `Welcome to Wisewand MCP! 🎉\n\nI'm excited to guide you through this powerful AI-powered content generation platform. With 74 tools across 14 categories, Wisewand helps you create high-quality SEO-optimized content at scale.\n\n**What we'll cover:**\n\n1. **Tool Categories Overview** - Understand what Wisewand can do\n2. **Create Your First Article** - Step-by-step walkthrough with examples\n3. **Common Workflows** - Real-world scenarios and complete flows\n4. **Best Practices & Tips** - Maximize quality and efficiency\n\nThis guide will take about 10-15 minutes. You'll leave knowing how to create professional content, publish to WordPress, and leverage powerful automation workflows.\n\nReady to get started?`\n }\n },\n {\n role: 'user',\n content: {\n type: 'text',\n text: `Yes, let's go through the full onboarding`\n }\n },\n {\n role: 'assistant',\n content: {\n type: 'text',\n text: `## 1. Tool Categories Overview\n\nWisewand's 74 tools are organized into **7 logical categories** by use case:\n\n### 🎨 Content Creation Powerhouse\n**Core tools for generating different content types:**\n- **Articles** (16 tools) - Blog posts, guides, tutorials with advanced SEO\n- **Category Pages** (9 tools) - Category and pillar content\n- **Product Pages** (9 tools) - Product reviews and comparisons\n- **Discover** (6 tools) - Content ideas and topic research\n\n### 📁 Organization & Branding\n**Structure your content library:**\n- **Projects** (7 tools) - Organize content by project/website\n- **Personas** (6 tools) - Create branded writing voices\n\n### 🚀 Publishing & Distribution\n**Get content live:**\n- **Publishing** (9 tools) - WordPress integration, direct publishing\n- **RSS/Feeds** (5 tools) - Auto-generate content from RSS feeds\n\n### ⚡ Scale & Efficiency\n**Bulk operations for serious content creators:**\n- **Bulk Operations** (3 tools) - Create multiple articles simultaneously\n- **Jobs** (3 tools) - Monitor background processing\n- **Update Posts** (3 tools) - Refresh existing content\n\n### 🔗 WordPress Power Features\n**Advanced WordPress capabilities:**\n- **Connections** (4 tools) - Manage WordPress sites\n- **Internal Links** (2 tools) - Auto-link content intelligently\n\n### 📊 Monitoring & Cost Control\n**Track usage and performance:**\n- **Transactions** (2 tools) - Monitor API usage and costs\n- **Utilities** (3 tools) - Health checks and diagnostics\n\n${focus_area ? `\\n**You indicated interest in \"${focus_area}\"** - I'll emphasize those tools as we continue!\\n` : ''}\n\n**Most users start with Articles** - they're versatile, SEO-optimized, and perfect for blogs, guides, and tutorials.\n\nWant to see how to create your first article?`\n }\n },\n {\n role: 'user',\n content: {\n type: 'text',\n text: `Show me how to create my first article`\n }\n },\n {\n role: 'assistant',\n content: {\n type: 'text',\n text: `## 2. Create Your First Article - Complete Walkthrough\n\nLet me walk you through creating a professional blog post step-by-step.\n\n### Step 1: Optional - Create a Project\n\nProjects help you organize content by website/brand. Skip this if you're just testing:\n\n\\`\\`\\`json\ncreate_project({\n \"name\": \"My Tech Blog\",\n \"description\": \"Articles about web development and AI\"\n})\n\\`\\`\\`\n\n### Step 2: Create the Article\n\nUse \\`create_article\\` - this is where the magic happens. Here's a complete example:\n\n\\`\\`\\`json\ncreate_article({\n \"subject\": \"10 Beginner Tips for Content Marketing Success\",\n \"type\": \"blog\",\n \"lang\": \"en\",\n \"length\": 1500,\n \"target_keyword\": \"content marketing tips\",\n \"keywords_secondary\": \"digital marketing, content strategy, SEO basics\",\n \"use_faq\": true,\n \"use_toc\": true,\n \"use_boldkeywords\": true,\n \"use_image\": true,\n \"image_ratio\": \"16:9\"\n})\n\\`\\`\\`\n\n**What these parameters do:**\n- \\`subject\\`: Your article title/topic\n- \\`type\\`: \"blog\", \"tutorial\", \"guide\", \"listicle\", etc.\n- \\`length\\`: Target word count (500-5000)\n- \\`target_keyword\\`: Primary SEO keyword\n- \\`keywords_secondary\\`: Related keywords for semantic SEO\n- \\`use_faq\\`: Add FAQ section (great for voice search!)\n- \\`use_toc\\`: Table of contents for long articles\n- \\`use_boldkeywords\\`: Bold important keywords naturally\n- \\`use_image\\`: Generate AI featured image\n- \\`image_ratio\\`: \"16:9\", \"1:1\", \"4:3\", \"9:16\"\n\n### Step 3: Understanding the Response\n\nYou'll receive:\n\\`\\`\\`json\n{\n \"id\": \"art_abc123\",\n \"status\": \"processing\",\n \"estimated_time\": 45\n}\n\\`\\`\\`\n\nThe article is being generated in the background (takes 30-60 seconds).\n\n### Step 4: Generate the Article Content\n\nCall \\`generate_article\\` with the article ID:\n\n\\`\\`\\`json\ngenerate_article({\n \"article_id\": \"art_abc123\"\n})\n\\`\\`\\`\n\nThis triggers the AI writing process. The content will be SEO-optimized, well-structured, and ready to publish.\n\n### Step 5: Retrieve Your Content\n\nAfter ~45 seconds, get the final content:\n\n\\`\\`\\`json\nget_article_output({\n \"article_id\": \"art_abc123\",\n \"format\": \"html\"\n})\n\\`\\`\\`\n\nYou'll receive:\n- Full HTML article with proper formatting\n- Meta description optimized for search\n- FAQ schema markup (if enabled)\n- Featured image URL\n- SEO analysis and suggestions\n\n### Step 6: Optional - Publish to WordPress\n\nIf you have WordPress connected:\n\n\\`\\`\\`json\npublish_article({\n \"article_id\": \"art_abc123\",\n \"connection_id\": \"conn_xyz789\",\n \"status\": \"draft\",\n \"add_internal_links\": true\n})\n\\`\\`\\`\n\n**That's it!** You've created a professional, SEO-optimized article.\n\n**Pro Tip:** Use \\`wisewand://schemas/article\\` resource to see all available parameters and options.\n\nReady to explore common workflows?`\n }\n },\n {\n role: 'user',\n content: {\n type: 'text',\n text: `What are some common workflows I should know?`\n }\n },\n {\n role: 'assistant',\n content: {\n type: 'text',\n text: `## 3. Common Workflows - Real-World Scenarios\n\nHere are 5 powerful workflows that Wisewand users love:\n\n### 🎯 Workflow 1: SEO Blog Series\n\n**Goal:** Create a 10-article series targeting related keywords\n\n\\`\\`\\`\n1. create_project → \"SEO Fundamentals Series\"\n2. create_article x10 with related keywords:\n - \"seo basics for beginners\"\n - \"keyword research tutorial\"\n - \"on-page seo checklist\"\n - etc.\n3. generate_article for each (can run in parallel!)\n4. Use add_internal_links to cross-link the series\n5. publish_article as drafts for review\n6. Schedule WordPress posts weekly\n\\`\\`\\`\n\n**Why it works:** Topical authority + internal linking = SEO gold\n\n---\n\n### 🛍️ Workflow 2: Product Review Site\n\n**Goal:** Build affiliate content with product comparisons\n\n\\`\\`\\`\n1. create_product_page with affiliate product details\n2. Set comparison_mode: true for \"X vs Y\" articles\n3. Use include_pros_cons: true\n4. Enable use_affiliate_disclaimer: true\n5. generate_product_page\n6. Publish with affiliate links intact\n\\`\\`\\`\n\n**Pro tip:** Use \\`create_bulk_articles\\` to generate 20+ product reviews simultaneously!\n\n---\n\n### 🌍 Workflow 3: Multi-Language Content\n\n**Goal:** Same article in 5 languages for global reach\n\n\\`\\`\\`\n1. create_article with lang: \"en\"\n2. generate_article → get English version\n3. create_article with same subject, lang: \"es\"\n4. create_article with lang: \"fr\", \"de\", \"ja\"\n5. Wisewand optimizes for each language's SEO norms\n6. Publish to different WordPress sites or multilingual setup\n\\`\\`\\`\n\n**Why it works:** Native-quality content in each language, not machine translation\n\n---\n\n### 📡 Workflow 4: RSS-Powered Auto-Publishing\n\n**Goal:** Curate industry content automatically\n\n\\`\\`\\`\n1. create_rss_connection with industry feeds\n2. create_rss_article_from_feed:\n - Monitors RSS feeds\n - Generates original commentary/analysis\n - Adds your expert perspective\n3. Set up recurring jobs (via Jobs tools)\n4. Auto-publish blog posts to WordPress\n\\`\\`\\`\n\n**Perfect for:** Content curation, industry newsletters, trend analysis blogs\n\n---\n\n### 🔄 Workflow 5: Update Old Content\n\n**Goal:** Refresh 50 old articles with new info\n\n\\`\\`\\`\n1. List existing WordPress posts via get_posts\n2. Use update_post to refresh content:\n - Add new statistics/data\n - Update outdated sections\n - Improve SEO based on current trends\n3. Batch process with create_bulk_update\n4. Monitor via get_job_status\n5. Re-publish updated articles\n\\`\\`\\`\n\n**Impact:** Revive organic traffic from existing content\n\n---\n\n**Which workflow matches your use case?** Each can be customized further with personas, custom images, and advanced SEO settings.\n\nWant to learn best practices next?`\n }\n },\n {\n role: 'user',\n content: {\n type: 'text',\n text: `What are the best practices and tips?`\n }\n },\n {\n role: 'assistant',\n content: {\n type: 'text',\n text: `## 4. Best Practices & Tips - Maximize Your Results\n\n### ✍️ Content Quality Tips\n\n**1. Write Better Prompts (Subjects)**\n- ❌ \"SEO article\"\n- ✅ \"Complete Guide to Technical SEO for E-commerce Sites in 2024\"\n- **Why:** Specific subjects = focused, higher-quality content\n\n**2. Use Secondary Keywords Strategically**\n- Don't stuff: \"seo, seo tips, seo guide, seo tutorial\"\n- Do diversify: \"search rankings, organic traffic, SERP visibility, keyword research\"\n- **Impact:** Better semantic SEO and topic coverage\n\n**3. Leverage Content Types**\n- \\`type: \"listicle\"\\` → Scannable, share-worthy\n- \\`type: \"tutorial\"\\` → Step-by-step, actionable\n- \\`type: \"guide\"\\` → Comprehensive, authoritative\n- \\`type: \"comparison\"\\` → Decision-focused, high-intent\n\n**4. Always Enable These:**\n- \\`use_toc: true\\` - Improves UX and may earn rich snippets\n- \\`use_faq: true\\` - Targets voice search and featured snippets\n- \\`use_boldkeywords: true\\` - Helps readability and SEO\n\n---\n\n### 🎯 SEO Optimization Techniques\n\n**5. Keyword Strategy**\n- Primary keyword: Search volume 500-5000 (sweet spot)\n- Include 5-7 secondary keywords for context\n- Use long-tail variations in FAQs\n\n**6. Content Length Guidelines**\n- Blog posts: 1200-1800 words\n- Guides: 2500-4000 words\n- Product reviews: 1500-2500 words\n- Category pages: 1000-1500 words\n\n**7. Internal Linking Power**\n- Use \\`add_internal_links: true\\` when publishing\n- Wisewand auto-identifies relevant existing content\n- Builds topic clusters automatically\n\n**8. Meta Description Magic**\n- Wisewand auto-generates optimized meta descriptions\n- Always includes target keyword\n- Compelling CTAs for higher click-through rates\n\n---\n\n### 💰 Cost Management\n\n**9. Monitor Transactions**\nUse \\`get_transactions\\` to track:\n- API usage per article\n- Monthly spending trends\n- Cost per content type\n\n**10. Batch Processing Saves Money**\n- \\`create_bulk_articles\\` is more efficient than individual calls\n- Process 10-50 articles at once\n- Use Jobs tools to monitor progress\n\n**11. Smart Image Usage**\n- AI images cost credits\n- Skip images for quick updates: \\`use_image: false\\`\n- Use images for evergreen content: \\`use_image: true\\`\n- Best ratios: 16:9 (blog), 1:1 (social), 9:16 (mobile)\n\n---\n\n### 🚀 Publishing Workflows\n\n**12. Draft → Review → Publish**\n\\`\\`\\`json\npublish_article({\n \"status\": \"draft\", // Review before going live\n \"add_internal_links\": true,\n \"set_featured_image\": true\n})\n\\`\\`\\`\n\n**13. WordPress Connection Best Practices**\n- Use \\`list_connections\\` to verify active connections\n- Test with \\`test_connection\\` before bulk publishing\n- Store connection IDs for reuse\n\n**14. Scheduling Strategy**\n- Publish drafts immediately\n- Use WordPress native scheduling for timed releases\n- Spread publications across the week for consistent traffic\n\n---\n\n### 🎨 Image Generation Tips\n\n**15. Choose the Right Ratio**\n- **16:9** - Blog featured images, hero sections\n- **1:1** - Social media, thumbnails\n- **4:3** - Traditional blog layouts\n- **9:16** - Mobile-first, stories\n\n**16. Image Prompts**\nWisewand auto-generates images from your article subject, but you can customize:\n- More specific subjects = better images\n- Mention visual elements: \"infographic about...\", \"diagram showing...\"\n\n---\n\n### 📚 Resources to Bookmark\n\n**17. Essential Resources**\n- \\`wisewand://schemas/article\\` - Complete article parameters\n- \\`wisewand://schemas/product\\` - Product page options\n- \\`wisewand://docs/quickstart\\` - Quick reference guide\n- \\`wisewand://docs/wordpress\\` - WordPress integration guide\n\n**18. Advanced Features to Explore**\n- **Personas** - Brand voice consistency across content\n- **RSS Integration** - Automated content curation\n- **Bulk Operations** - Scale to 100+ articles/month\n- **Update Posts** - Keep content fresh with minimal effort\n\n---\n\n### 🎓 Quick Wins for Beginners\n\nStart with these 3 high-impact actions:\n\n1. **Create Your First Article**\n - Simple subject, 1500 words, enable FAQ + TOC\n - See what Wisewand can do\n\n2. **Set Up WordPress Connection**\n - Use \\`create_connection\\` with your site\n - Publish one test article\n - Experience the full workflow\n\n3. **Try a Bulk Operation**\n - Create 5 related articles with \\`create_bulk_articles\\`\n - Watch them process in parallel\n - Feel the power of scale\n\n---\n\n**You're now equipped to create professional content with Wisewand!**\n\nRemember: Start simple, experiment with features, and scale as you learn. The 74 tools are there when you need them, but you can accomplish most tasks with just 5-10 core tools.\n\nQuestions? Use the resources above or explore tool documentation directly.`\n }\n },\n {\n role: 'assistant',\n content: {\n type: 'text',\n text: `## 🎉 Onboarding Complete!\n\nYou now know:\n- ✅ What Wisewand's 74 tools can do\n- ✅ How to create your first article step-by-step\n- ✅ 5 powerful real-world workflows\n- ✅ Best practices for quality, SEO, and cost efficiency\n\n---\n\n### 📖 Quick Reference\n\n**Most-Used Tools:**\n1. \\`create_article\\` - Start any content project\n2. \\`generate_article\\` - Trigger AI writing\n3. \\`get_article_output\\` - Retrieve finished content\n4. \\`publish_article\\` - Push to WordPress\n5. \\`create_bulk_articles\\` - Scale your content\n\n**Essential Resources:**\n- \\`wisewand://schemas/article\\` - All article parameters\n- \\`wisewand://docs/quickstart\\` - Quick start guide\n- \\`wisewand://docs/wordpress\\` - WordPress setup\n\n---\n\n### 🚀 Try This Now\n\nCreate your first article with this simple command:\n\n\\`\\`\\`json\ncreate_article({\n \"subject\": \"Getting Started with [Your Topic]\",\n \"type\": \"guide\",\n \"lang\": \"en\",\n \"length\": 1500,\n \"target_keyword\": \"[your keyword]\",\n \"use_faq\": true,\n \"use_toc\": true,\n \"use_image\": true\n})\n\\`\\`\\`\n\nThen call \\`generate_article\\` with the returned ID, wait 45 seconds, and use \\`get_article_output\\` to see your content!\n\n---\n\n**Welcome to the Wisewand community!** 🎊\n\n${skip_to ? `\\n*(You used skip_to=\"${skip_to}\" - hope this section was helpful!)*\\n` : ''}\n${focus_area ? `\\n*(Focus area \"${focus_area}\" noted - explore those tools next!)*\\n` : ''}`\n }\n }\n ];\n\n return {\n description: 'Interactive onboarding for Wisewand MCP Server',\n messages\n };\n }\n}","/**\n * Graceful Shutdown Handler\n */\n\nimport { logger } from './logger';\nimport { WisewandMCPServer } from '../server/WisewandMCPServer';\nimport * as readline from 'readline';\n\nexport function gracefulShutdown(server: WisewandMCPServer): void {\n let isShuttingDown = false;\n \n const shutdown = async (signal: string) => {\n if (isShuttingDown) {\n logger.info('Shutdown already in progress');\n return;\n }\n \n isShuttingDown = true;\n logger.info(`Received ${signal}, starting graceful shutdown...`);\n \n // Give ongoing requests 30 seconds to complete\n const shutdownTimeout = setTimeout(() => {\n logger.error('Forced shutdown due to timeout');\n process.exit(1);\n }, 30000);\n \n try {\n // Shutdown server\n await server.shutdown();\n \n clearTimeout(shutdownTimeout);\n logger.info('Graceful shutdown completed');\n process.exit(0);\n \n } catch (error) {\n logger.error('Error during shutdown', error);\n clearTimeout(shutdownTimeout);\n process.exit(1);\n }\n };\n \n // Handle different termination signals\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n process.on('SIGHUP', () => shutdown('SIGHUP'));\n \n // Handle Windows - readline is imported at the top\n if (process.platform === 'win32') {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n rl.on('SIGINT', () => {\n process.emit('SIGINT' as any);\n });\n }\n}"],"mappings":"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","names":["config","config","config","config","z","z","result","z","z","result","result","z","z","result","result","z","z","result","result","z","boolField","z","numField","LANG_ENUM","COUNTRY_ENUM","result","z","boolField","z","numField","LANG_ENUM","COUNTRY_ENUM","result","z","boolField","z","result","z","z","result","result","config","result"]}
|