[{"id":"builtin-mcp-core","name":"Core Do-Everything Tool Suite","description":"Pre-packaged collection of 18 native tools for web scraping, JS execution, math, charts, and memory vault.","type":"builtin","category":"code","enabled":true,"tools":[{"name":"ollama_delegate_prompt","description":"Delegates a specialized sub-task, quick reasoning query, code triage, or classification to a fast local Ollama model (e.g., llama3.2:1b, deepseek-r1:1.5b, qwen2.5-coder:1.5b, mistral:7b) running on your local GPU/CPU.","category":"code","inputSchema":{"type":"object","properties":{"prompt":{"type":"string","description":"The task or prompt to dispatch to the local model."},"model":{"type":"string","description":"Ollama model tag to invoke (e.g., \"llama3.2:1b\", \"llama3.2:3b\", \"deepseek-r1:1.5b\", \"qwen2.5-coder:1.5b\", \"phi3.5\", \"mistral:7b\"). Defaults to \"llama3.2:1b\"."},"systemPrompt":{"type":"string","description":"Optional system instructions for the sub-model."},"endpoint":{"type":"string","description":"Ollama host endpoint URL. Defaults to \"http://10.30.20.128:11434\"."},"temperature":{"type":"number","description":"Sampling temperature (0.0 to 1.0)."},"format":{"type":"string","enum":["json","text"],"description":"Optional output formatting (e.g. \"json\" for structured data)."}},"required":["prompt"]}},{"name":"ollama_vision_inspect","description":"Examines and analyzes images using local multimodal vision models (e.g., llava, llama3.2-vision, minicpm-v, qwen2-vl) running on your local GPU via Ollama.","category":"media","inputSchema":{"type":"object","properties":{"imageUrlOrBase64":{"type":"string","description":"Public image URL or base64-encoded image string."},"prompt":{"type":"string","description":"Question or instruction about the image (e.g. \"Describe this image in detail and extract all text\")."},"model":{"type":"string","description":"Local vision model name (e.g., \"llava\", \"llama3.2-vision\", \"minicpm-v\", \"bakllava\", \"qwen2-vl\"). Defaults to \"llama3.2-vision\"."},"endpoint":{"type":"string","description":"Ollama host endpoint URL. Defaults to \"http://10.30.20.128:11434\"."}},"required":["imageUrlOrBase64"]}},{"name":"ollama_embed_document","description":"Generates dense vector embeddings for documents, search queries, or text chunks using specialized local embedding models (e.g., nomic-embed-text, bge-m3, all-minilm, snowflake-arctic-embed) and calculates cosine similarities.","category":"data","inputSchema":{"type":"object","properties":{"text":{"type":"string","description":"The text or document content to convert into vector embeddings."},"compareText":{"type":"string","description":"Optional second text string to compute instant cosine similarity against."},"model":{"type":"string","description":"Local embedding model name (e.g., \"nomic-embed-text\", \"bge-m3\", \"all-minilm\", \"snowflake-arctic-embed\", \"mxbai-embed-large\"). Defaults to \"nomic-embed-text\"."},"endpoint":{"type":"string","description":"Ollama host endpoint URL. Defaults to \"http://10.30.20.128:11434\"."}},"required":["text"]}},{"name":"ollama_gpu_model_manager","description":"Inspects local Ollama models, checks VRAM allocation for running models, lists installed checkpoints, and checks GPU accelerator connectivity.","category":"code","inputSchema":{"type":"object","properties":{"action":{"type":"string","enum":["list_models","running_vram_models","gpu_telemetry","ping_endpoint"],"description":"Management action to perform."},"endpoint":{"type":"string","description":"Ollama host endpoint URL. Defaults to \"http://10.30.20.128:11434\"."}},"required":["action"]}},{"name":"nvidia_nim_delegate","description":"Dispatches prompts or reasoning chains to NVIDIA NIM microservice endpoints (e.g., meta/llama-3.1-8b-instruct, nvidia/nemotron-4-340b-instruct) with hardware acceleration.","category":"code","inputSchema":{"type":"object","properties":{"prompt":{"type":"string","description":"The prompt or system request to dispatch to NVIDIA NIM."},"model":{"type":"string","description":"NVIDIA model identifier (e.g., \"meta/llama-3.1-8b-instruct\", \"nvidia/nemotron-4-340b-instruct\", \"mistralai/mistral-7b-instruct-v0.3\")."},"endpoint":{"type":"string","description":"NVIDIA NIM endpoint URL (e.g., \"http://localhost:8888/v1\" or remote NIM API)."},"apiKey":{"type":"string","description":"Optional NVIDIA API Key / Bearer token."}},"required":["prompt"]}},{"name":"mcp_discovery_search","description":"Search a curated catalog of 1000+ MCP servers by keyword. Returns ranked matches (name, description, GitHub URL, whether an API key is required). Use to discover MCP servers/tools for any capability.","category":"mcp","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Free-text query describing the capability you need (e.g. \"payments\", \"browser automation\", \"sql database\", \"image generation\")."},"limit":{"type":"number","description":"Max results to return (default 10, max 50)."}},"required":["query"]}},{"name":"mcp_discovery_semantic_search","description":"Semantic search over the MCP server catalog using local-Ollama embeddings. Finds servers by MEANING, not just keyword match (e.g. \"crypto payments\" surfaces bitcoin/lightning servers). Falls back to keyword search if the embedding model is unreachable.","category":"mcp","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Natural-language description of the capability you need."},"limit":{"type":"number","description":"Max results to return (default 10, max 25)."}},"required":["query"]}},{"name":"mcp_discovery_readme","description":"Fetch the README (setup/config instructions) for an MCP server in the catalog by its name or GitHub URL.","category":"mcp","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Server name or GitHub URL to look up."}},"required":["name"]}},{"name":"mcp_discovery_stats","description":"Return stats about the MCP server catalog (total servers, how many require API keys, source).","category":"mcp","inputSchema":{"type":"object","properties":{}}},{"name":"web_scrape_markdown","description":"Fetches any URL, extracts clean main text content, converts HTML structure into Markdown, and gathers page metadata.","category":"web","inputSchema":{"type":"object","properties":{"url":{"type":"string","description":"The absolute HTTP or HTTPS URL to fetch and parse."},"maxLength":{"type":"number","description":"Maximum characters to return in markdown (default 8000)."}},"required":["url"]}},{"name":"web_search_gemini","description":"Executes a search query and synthesizes concise answers using Gemini AI model with web intelligence.","category":"web","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"The search or research query."},"detailLevel":{"type":"string","enum":["brief","detailed","structured"],"description":"Depth of synthesis."}},"required":["query"]}},{"name":"http_client","description":"Universal HTTP request client to call external REST APIs or webhooks with custom headers, query params, and body.","category":"web","inputSchema":{"type":"object","properties":{"url":{"type":"string","description":"Target request URL."},"method":{"type":"string","enum":["GET","POST","PUT","DELETE","PATCH"],"description":"HTTP method (default GET)."},"headers":{"type":"object","description":"Key-value object of request headers."},"body":{"type":"string","description":"Stringified JSON or text body for POST/PUT/PATCH."},"timeoutMs":{"type":"number","description":"Request timeout in milliseconds (default 5000)."}},"required":["url"]}},{"name":"execute_js","description":"Evaluates JavaScript code expressions in a isolated sandbox, returning console output, variables, and return value.","category":"code","inputSchema":{"type":"object","properties":{"code":{"type":"string","description":"JavaScript expression or script snippet."}},"required":["code"]}},{"name":"math_evaluator","description":"Evaluates complex mathematical formulas, statistical sets (mean, median, stddev), and unit conversions.","category":"code","inputSchema":{"type":"object","properties":{"expression":{"type":"string","description":"Math expression e.g., \"sqrt(144) + sin(pi / 4) * 50\" or array for stats."},"numbers":{"type":"array","items":{"type":"number"},"description":"Array of numbers for statistical calculations."},"operation":{"type":"string","enum":["eval","stats","finance_compound"],"description":"Type of calculation."},"principal":{"type":"number","description":"Principal for compound interest."},"ratePercent":{"type":"number","description":"Annual interest rate percentage."},"years":{"type":"number","description":"Time horizon in years."}},"required":["operation"]}},{"name":"regex_tester","description":"Tests a regular expression against text, extracts captured groups, match positions, or replaces pattern matches.","category":"code","inputSchema":{"type":"object","properties":{"pattern":{"type":"string","description":"Regex pattern string without slashes."},"flags":{"type":"string","description":"Flags like \"g\", \"i\", \"m\" (default \"g\")."},"text":{"type":"string","description":"Input text to search against."},"replacement":{"type":"string","description":"Optional replacement text string."}},"required":["pattern","text"]}},{"name":"data_converter","description":"Transforms data seamlessly between JSON, YAML, CSV, XML, and URL Query String formats.","category":"data","inputSchema":{"type":"object","properties":{"data":{"type":"string","description":"Input data payload string."},"fromFormat":{"type":"string","enum":["json","csv","yaml","query_string"],"description":"Source format."},"toFormat":{"type":"string","enum":["json","csv","yaml","query_string","xml"],"description":"Target format."}},"required":["data","fromFormat","toFormat"]}},{"name":"encoder_decoder","description":"Encodes or decodes text with Base64, URL encoding, Hexadecimal, HTML Entities, or parses JWT tokens.","category":"data","inputSchema":{"type":"object","properties":{"input":{"type":"string","description":"Text or token string."},"action":{"type":"string","enum":["base64_encode","base64_decode","url_encode","url_decode","hex_encode","hex_decode","jwt_decode"],"description":"Operation to perform."}},"required":["input","action"]}},{"name":"crypto_hash_generator","description":"Generates MD5, SHA-1, SHA-256, SHA-512 hashes, HMAC signatures, UUID v4, ULID, or secure random tokens.","category":"data","inputSchema":{"type":"object","properties":{"input":{"type":"string","description":"Source text string to hash or sign."},"algorithm":{"type":"string","enum":["sha256","sha512","md5","sha1","uuid_v4","random_hex"],"description":"Hash or ID generator type."},"secretKey":{"type":"string","description":"Optional key for HMAC generation."}},"required":["algorithm"]}},{"name":"text_diff_checker","description":"Compares two text strings or JSON objects line by line, generating a structured diff highlighting additions and deletions.","category":"data","inputSchema":{"type":"object","properties":{"originalText":{"type":"string","description":"Original text string."},"modifiedText":{"type":"string","description":"Modified text string."}},"required":["originalText","modifiedText"]}},{"name":"chart_generator","description":"Generates visual SVG vector charts (Bar, Line, Pie, Donut) with custom labels, data points, and colors for reports.","category":"media","inputSchema":{"type":"object","properties":{"title":{"type":"string","description":"Chart title header."},"chartType":{"type":"string","enum":["bar","line","pie","donut"],"description":"Visual style of chart."},"labels":{"type":"array","items":{"type":"string"},"description":"X-axis or slice labels."},"values":{"type":"array","items":{"type":"number"},"description":"Data numerical values corresponding to labels."},"primaryColor":{"type":"string","description":"Hex color string (e.g. #3b82f6)."}},"required":["chartType","labels","values"]}},{"name":"qr_barcode_generator","description":"Generates SVG vector QR codes or Barcodes for URLs, text strings, contact cards, or Wi-Fi credentials.","category":"media","inputSchema":{"type":"object","properties":{"text":{"type":"string","description":"Text, URL, or payload to encode into QR code."},"size":{"type":"number","description":"Width/Height size in pixels (default 200)."},"type":{"type":"string","enum":["qr","barcode"],"description":"Code style."}},"required":["text"]}},{"name":"ascii_art_generator","description":"Creates stylized ASCII text banners, boxed comment frames, and formatted markdown/ASCII tables.","category":"media","inputSchema":{"type":"object","properties":{"text":{"type":"string","description":"Main text or title."},"style":{"type":"string","enum":["banner","boxed","table"],"description":"Output layout style."},"headers":{"type":"array","items":{"type":"string"},"description":"Headers for table style."},"rows":{"type":"array","items":{"type":"array","items":{"type":"string"}},"description":"Rows matrix for table style."}},"required":["text","style"]}},{"name":"memory_store_set","description":"Saves a key-value pair, document, or context string in persistent server storage for long-term agent memory.","category":"memory","inputSchema":{"type":"object","properties":{"key":{"type":"string","description":"Unique memory identifier key."},"value":{"type":"string","description":"String, number, or JSON object memory content."},"tags":{"type":"array","items":{"type":"string"},"description":"Tags for searching and categorizing memory."},"agentId":{"type":"string","description":"Optional agent or session ID owner."},"ttlSeconds":{"type":"number","description":"Optional time-to-live in seconds."}},"required":["key","value"]}},{"name":"memory_store_get","description":"Retrieves a specific memory item by key, or searches memory entries by tag or query string.","category":"memory","inputSchema":{"type":"object","properties":{"key":{"type":"string","description":"Memory key to retrieve."},"query":{"type":"string","description":"Search term query across keys, values, and tags."},"tag":{"type":"string","description":"Filter by tag."}}}},{"name":"memory_store_list","description":"Lists all stored agent memories, key names, tags, creation dates, and metadata.","category":"memory","inputSchema":{"type":"object","properties":{"tagFilter":{"type":"string","description":"Optional tag to filter by."},"limit":{"type":"number","description":"Max items to return (default 50)."}}}},{"name":"text_summarize_classify","description":"Summarizes long documents, extracts key entities/topics, and classifies sentiment using AI.","category":"memory","inputSchema":{"type":"object","properties":{"text":{"type":"string","description":"Input document or article text."},"task":{"type":"string","enum":["summarize","extract_entities","sentiment","all"],"description":"Analysis task."}},"required":["text"]}},{"name":"network_utilities","description":"Analyzes network headers, parses user agents, validates URLs, calculates IP subnets, and tests connectivity.","category":"network","inputSchema":{"type":"object","properties":{"action":{"type":"string","enum":["parse_url","ip_subnet","parse_user_agent","ping_simulate"],"description":"Utility function."},"target":{"type":"string","description":"URL, IP CIDR (e.g. 192.168.1.0/24), or user agent string."}},"required":["action","target"]}},{"name":"cron_calculator","description":"Explains standard CRON expressions in human English, validates syntax, and calculates future execution timestamps.","category":"network","inputSchema":{"type":"object","properties":{"expression":{"type":"string","description":"5-part cron string e.g. \"*/15 * * * *\"."},"count":{"type":"number","description":"Number of upcoming execution times to calculate (default 5)."}},"required":["expression"]}}],"healthStatus":"healthy","lastPingMs":1,"lastPingAt":"2026-10-09T04:37:51.265Z","isPreset":true,"icon":"Cpu","createdAt":"2026-10-09T04:37:51.273Z"},{"id":"mcp-preset-ollama-gpu","name":"Ollama & Local GPU Delegation MCP","description":"Power up your main model by delegating vision inspection, document vector embeddings, fast sub-model reasoning, and GPU VRAM management to local Ollama workers.","type":"builtin","category":"code","enabled":true,"roadSign":{"isRoadSign":true,"signpostTitle":"LOCAL OLLAMA GPU WORKSTATION (localhost:11434)","targetHostLocation":"http://localhost:11434","directionsInstructions":"Connects directly to your local Ollama instance on port 11434. Start with: ollama serve","osPlatform":"docker"},"tools":[{"name":"ollama_delegate_prompt","description":"Delegates a specialized sub-task, quick reasoning query, code triage, or classification to a fast local Ollama model (e.g., llama3.2:1b, deepseek-r1:1.5b, qwen2.5-coder:1.5b, mistral:7b) running on your local GPU/CPU.","category":"code","inputSchema":{"type":"object","properties":{"prompt":{"type":"string","description":"The task or prompt to dispatch to the local model."},"model":{"type":"string","description":"Ollama model tag to invoke (e.g., \"llama3.2:1b\", \"llama3.2:3b\", \"deepseek-r1:1.5b\", \"qwen2.5-coder:1.5b\", \"phi3.5\", \"mistral:7b\"). Defaults to \"llama3.2:1b\"."},"systemPrompt":{"type":"string","description":"Optional system instructions for the sub-model."},"endpoint":{"type":"string","description":"Ollama host endpoint URL. Defaults to \"http://localhost:11434\"."},"temperature":{"type":"number","description":"Sampling temperature (0.0 to 1.0)."},"format":{"type":"string","enum":["json","text"],"description":"Optional output formatting (e.g. \"json\" for structured data)."}},"required":["prompt"]}},{"name":"ollama_vision_inspect","description":"Examines and analyzes images using local multimodal vision models (e.g., llava, llama3.2-vision, minicpm-v, qwen2-vl) running on your local GPU via Ollama.","category":"media","inputSchema":{"type":"object","properties":{"imageUrlOrBase64":{"type":"string","description":"Public image URL or base64-encoded image string."},"prompt":{"type":"string","description":"Question or instruction about the image (e.g. \"Describe this image in detail and extract all text\")."},"model":{"type":"string","description":"Local vision model name (e.g., \"llava\", \"llama3.2-vision\", \"minicpm-v\", \"bakllava\", \"qwen2-vl\"). Defaults to \"llama3.2-vision\"."},"endpoint":{"type":"string","description":"Ollama host endpoint URL. Defaults to \"http://localhost:11434\"."}},"required":["imageUrlOrBase64"]}},{"name":"ollama_embed_document","description":"Generates dense vector embeddings for documents, search queries, or text chunks using specialized local embedding models (e.g., nomic-embed-text, bge-m3, all-minilm, snowflake-arctic-embed) and calculates cosine similarities.","category":"data","inputSchema":{"type":"object","properties":{"text":{"type":"string","description":"The text or document content to convert into vector embeddings."},"compareText":{"type":"string","description":"Optional second text string to compute instant cosine similarity against."},"model":{"type":"string","description":"Local embedding model name (e.g., \"nomic-embed-text\", \"bge-m3\", \"all-minilm\", \"snowflake-arctic-embed\", \"mxbai-embed-large\"). Defaults to \"nomic-embed-text\"."},"endpoint":{"type":"string","description":"Ollama host endpoint URL. Defaults to \"http://localhost:11434\"."}},"required":["text"]}},{"name":"ollama_gpu_model_manager","description":"Inspects local Ollama models, checks VRAM allocation for running models, lists installed checkpoints, and checks GPU accelerator connectivity.","category":"code","inputSchema":{"type":"object","properties":{"action":{"type":"string","enum":["list_models","running_vram_models","gpu_telemetry","ping_endpoint"],"description":"Management action to perform."},"endpoint":{"type":"string","description":"Ollama host endpoint URL. Defaults to \"http://localhost:11434\"."}},"required":["action"]}}],"healthStatus":"healthy","lastPingMs":2,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Cpu","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-nvidia-nim","name":"NVIDIA NIM & CUDA Microservices MCP","description":"Dispatches accelerated model inference and specialized reasoning chains to local NVIDIA NIM containers or remote NVIDIA GPU endpoints.","type":"builtin","category":"dev","enabled":true,"roadSign":{"isRoadSign":true,"signpostTitle":"NVIDIA NIM WORKSTATION (localhost:8888)","targetHostLocation":"http://localhost:8888/v1","directionsInstructions":"Routes requests to local NVIDIA NIM containers with CUDA TensorRT-LLM acceleration.","osPlatform":"linux"},"tools":[{"name":"nvidia_nim_delegate","description":"Dispatches prompts or reasoning chains to NVIDIA NIM microservice endpoints (e.g., meta/llama-3.1-8b-instruct, nvidia/nemotron-4-340b-instruct) with hardware acceleration.","category":"code","inputSchema":{"type":"object","properties":{"prompt":{"type":"string","description":"The prompt or system request to dispatch to NVIDIA NIM."},"model":{"type":"string","description":"NVIDIA model identifier (e.g., \"meta/llama-3.1-8b-instruct\", \"nvidia/nemotron-4-340b-instruct\", \"mistralai/mistral-7b-instruct-v0.3\")."},"endpoint":{"type":"string","description":"NVIDIA NIM endpoint URL (e.g., \"http://localhost:8888/v1\" or remote NIM API)."},"apiKey":{"type":"string","description":"Optional NVIDIA API Key / Bearer token."}},"required":["prompt"]}}],"healthStatus":"healthy","lastPingMs":3,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Zap","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-weather","name":"Open Weather & Climate MCP","description":"Real-time weather forecast and climate conditions for any location worldwide.","type":"webhook","category":"web","enabled":true,"webhookConfig":{"url":"https://api.open-meteo.com/v1/forecast?latitude={{latitude}}&longitude={{longitude}}&current_weather=true","method":"GET"},"tools":[{"name":"get_weather_forecast","description":"Fetch current weather and temperature forecast by geographic coordinates.","category":"web","inputSchema":{"type":"object","properties":{"latitude":{"type":"number","description":"Target latitude (e.g., 37.7749 for San Francisco)"},"longitude":{"type":"number","description":"Target longitude (e.g., -122.4194)"}},"required":["latitude","longitude"]}}],"healthStatus":"healthy","lastPingMs":120,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"CloudSun","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-crypto","name":"CoinGecko Crypto Ticker MCP","description":"Live cryptocurrency spot prices, market capitalization, and 24h trading volume.","type":"webhook","category":"data","enabled":true,"webhookConfig":{"url":"https://api.coingecko.com/api/v3/simple/price?ids={{coinId}}&vs_currencies=usd&include_24hr_change=true","method":"GET"},"tools":[{"name":"get_crypto_price","description":"Get current USD price and 24-hour price change for crypto coins (e.g., bitcoin, ethereum, solana).","category":"data","inputSchema":{"type":"object","properties":{"coinId":{"type":"string","description":"Coin identifier e.g. \"bitcoin\", \"ethereum\", \"solana\", \"cardano\""}},"required":["coinId"]}}],"healthStatus":"healthy","lastPingMs":140,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Coins","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-js-utility","name":"Custom JS Expression Evaluator MCP","description":"Executes customized JavaScript snippets for string processing and unit conversions.","type":"custom_script","category":"code","enabled":true,"customScript":"\n        // Available parameters: args.text, args.operation\n        const text = args.text || '';\n        const op = args.operation || 'uppercase';\n        if (op === 'uppercase') return { result: text.toUpperCase() };\n        if (op === 'lowercase') return { result: text.toLowerCase() };\n        if (op === 'wordCount') return { wordCount: text.trim().split(/\\s+/).filter(Boolean).length };\n        if (op === 'reverse') return { result: text.split('').reverse().join('') };\n        if (op === 'slugify') return { result: text.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '') };\n        return { result: text, note: 'Unknown operation' };\n      ","tools":[{"name":"text_transformer_utility","description":"Transform or analyze text strings (uppercase, lowercase, word count, reverse, slugify).","category":"code","inputSchema":{"type":"object","properties":{"text":{"type":"string","description":"Target string content to transform"},"operation":{"type":"string","description":"Transformation type","enum":["uppercase","lowercase","wordCount","reverse","slugify"]}},"required":["text","operation"]}}],"healthStatus":"healthy","lastPingMs":5,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Code2","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-remote-sample","name":"HackerNews Live Feed MCP","description":"Fetches top stories and item details directly from HackerNews Firebase API.","type":"webhook","category":"web","enabled":true,"webhookConfig":{"url":"https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty","method":"GET"},"tools":[{"name":"get_hackernews_topstories","description":"Get IDs of current top stories on HackerNews.","category":"web","inputSchema":{"type":"object","properties":{}}}],"healthStatus":"healthy","lastPingMs":95,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Newspaper","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-task-loop","name":"Iterative Task & Subgoal Decomposer MCP","description":"Supports structured goal breakdown, task state tracking, and step-by-step progress iteration.","type":"custom_script","category":"code","enabled":true,"customScript":"\n        const action = args.action || 'breakdown';\n        const goal = args.goal || 'General Goal';\n        const tasks = args.tasks || [];\n\n        if (action === 'breakdown') {\n          const autoSteps = [\n            'Analyze objective & define constraints',\n            'Break down into atomic sub-tasks',\n            'Validate step prerequisites & dependencies',\n            'Execute task step 1 & log verification status',\n            'Review outcome and adjust remaining queue'\n          ];\n          return {\n            goal,\n            status: 'decomposed',\n            subtasks: autoSteps.map((title, idx) => ({\n              id: idx + 1,\n              title: `[${goal}] ${title}`,\n              completed: false\n            })),\n            nextSuggestedAction: 'Execute step 1'\n          };\n        }\n\n        if (action === 'evaluate_progress') {\n          const completedCount = tasks.filter(t => t.completed).length;\n          const total = tasks.length || 1;\n          const percent = Math.round((completedCount / total) * 100);\n          return {\n            goal,\n            totalTasks: total,\n            completedCount,\n            percentComplete: percent,\n            isFinished: completedCount === total,\n            summary: `Progress: ${completedCount}/${total} (${percent}%)`\n          };\n        }\n\n        return { error: 'Unknown action' };\n      ","tools":[{"name":"task_goal_decomposer","description":"Break complex tasks down into actionable steps or evaluate completion progress.","category":"code","inputSchema":{"type":"object","properties":{"goal":{"type":"string","description":"Objective or goal description"},"action":{"type":"string","enum":["breakdown","evaluate_progress"],"description":"Action mode"},"tasks":{"type":"array","description":"Existing task list for progress evaluation","items":{"type":"object"}}},"required":["goal","action"]}}],"healthStatus":"healthy","lastPingMs":2,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"CheckSquare","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-code-evaluator","name":"Code Review & Refactoring Assistant MCP","description":"Parses JavaScript/TypeScript code snippets to identify code smells, syntax issues, and potential improvements.","type":"custom_script","category":"code","enabled":true,"customScript":"\n        const code = args.code || '';\n        const language = args.language || 'typescript';\n\n        const issues = [];\n        if (code.includes('var ')) issues.push('Replace \"var\" declarations with \"const\" or \"let\".');\n        if (code.includes('any')) issues.push('Avoid explicit \"any\" types where possible.');\n        if (!code.includes('try') && code.includes('await')) issues.push('Consider wrapping asynchronous await calls in try/catch blocks.');\n        if (code.length > 500 && !code.includes('function') && !code.includes('=>')) issues.push('Consider breaking large scripts into modular functions.');\n\n        return {\n          language,\n          linesOfCode: code.split('\\n').length,\n          characterCount: code.length,\n          issueCount: issues.length,\n          suggestions: issues.length > 0 ? issues : ['Code structure appears clean based on standard heuristics.'],\n          evaluatedAt: new Date().toISOString()\n        };\n      ","tools":[{"name":"evaluate_code_quality","description":"Analyze JavaScript/TypeScript code snippets for common style issues and refactoring opportunities.","category":"code","inputSchema":{"type":"object","properties":{"code":{"type":"string","description":"Source code content to evaluate"},"language":{"type":"string","description":"Programming language (e.g., typescript, javascript)"}},"required":["code"]}}],"healthStatus":"healthy","lastPingMs":3,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Code","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-json-utility","name":"JSON Transformer & Validator MCP","description":"Formats, validates, beautifies, and flattens nested JSON payloads for clean data exchange.","type":"custom_script","category":"data","enabled":true,"customScript":"\n        const raw = args.jsonString || '{}';\n        try {\n          const parsed = JSON.parse(raw);\n          const formatted = JSON.stringify(parsed, null, 2);\n          const isArray = Array.isArray(parsed);\n          const keyCount = typeof parsed === 'object' && parsed !== null ? Object.keys(parsed).length : 0;\n          return {\n            isValid: true,\n            type: isArray ? 'array' : typeof parsed,\n            elementOrKeyCount: keyCount,\n            formattedJson: formatted,\n            minifiedJson: JSON.stringify(parsed),\n            byteSize: Buffer.byteLength(formatted, 'utf8')\n          };\n        } catch (e) {\n          return { isValid: false, error: e.message };\n        }\n      ","tools":[{"name":"json_transform_validator","description":"Validate, format, and compute metrics for raw JSON text.","category":"data","inputSchema":{"type":"object","properties":{"jsonString":{"type":"string","description":"Raw JSON text to parse and validate"}},"required":["jsonString"]}}],"healthStatus":"healthy","lastPingMs":2,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Database","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-regex-tester","name":"Regex Pattern Tester & Matcher MCP","description":"Tests regular expressions against input strings and extracts matched groups and positions.","type":"custom_script","category":"code","enabled":true,"customScript":"\n        const pattern = args.pattern || '';\n        const flags = args.flags || 'g';\n        const text = args.text || '';\n        try {\n          const re = new RegExp(pattern, flags);\n          const matches = [];\n          let match;\n          if (flags.includes('g')) {\n            while ((match = re.exec(text)) !== null) {\n              matches.push({ match: match[0], index: match.index, groups: match.slice(1) });\n              if (match.index === re.lastIndex) re.lastIndex++;\n            }\n          } else {\n            const m = re.exec(text);\n            if (m) matches.push({ match: m[0], index: m.index, groups: m.slice(1) });\n          }\n          return {\n            pattern,\n            flags,\n            matchCount: matches.length,\n            isMatch: matches.length > 0,\n            matches\n          };\n        } catch (e) {\n          return { error: 'Invalid Regex: ' + e.message };\n        }\n      ","tools":[{"name":"regex_pattern_tester","description":"Test regex pattern against text string and return capture groups and match positions.","category":"code","inputSchema":{"type":"object","properties":{"pattern":{"type":"string","description":"Regex pattern string (e.g., [a-zA-Z0-9]+)"},"flags":{"type":"string","description":"Regex flags (e.g. g, i, m)"},"text":{"type":"string","description":"Text content to test against"}},"required":["pattern","text"]}}],"healthStatus":"healthy","lastPingMs":2,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Zap","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-markdown-summarizer","name":"Markdown Content & Outline Analyzer MCP","description":"Parses Markdown documents to extract structural headings, link maps, code block counts, and estimated read time.","type":"custom_script","category":"web","enabled":true,"customScript":"\n        const markdown = args.markdown || '';\n        const lines = markdown.split('\\n');\n        const headings = lines.filter(l => /^#{1,6}\\s/.test(l)).map(h => {\n          const level = h.match(/^#+/)[0].length;\n          return { level, title: h.replace(/^#+\\s*/, '').trim() };\n        });\n        const wordCount = markdown.trim().split(/\\s+/).filter(Boolean).length;\n        const readTimeMinutes = Math.max(1, Math.ceil(wordCount / 200));\n        const codeBlocks = (markdown.match(/```/g) || []).length / 2;\n        return {\n          headingCount: headings.length,\n          headings,\n          wordCount,\n          estimatedReadTimeMinutes: readTimeMinutes,\n          codeBlockCount: Math.floor(codeBlocks)\n        };\n      ","tools":[{"name":"analyze_markdown_content","description":"Extract heading hierarchy, word count, code block metrics, and estimated read time from Markdown.","category":"web","inputSchema":{"type":"object","properties":{"markdown":{"type":"string","description":"Markdown string content"}},"required":["markdown"]}}],"healthStatus":"healthy","lastPingMs":2,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Code","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-url-inspector","name":"URL & Domain Inspector MCP","description":"Parses URLs into protocol, hostname, port, path, and key-value query parameters.","type":"custom_script","category":"network","enabled":true,"customScript":"\n        const rawUrl = args.url || '';\n        try {\n          const u = new URL(rawUrl);\n          const queryParams = {};\n          u.searchParams.forEach((v, k) => { queryParams[k] = v; });\n          return {\n            protocol: u.protocol,\n            hostname: u.hostname,\n            port: u.port || (u.protocol === 'https:' ? '443' : '80'),\n            pathname: u.pathname,\n            search: u.search,\n            queryParams,\n            isHttps: u.protocol === 'https:'\n          };\n        } catch (e) {\n          return { error: 'Invalid URL format: ' + e.message };\n        }\n      ","tools":[{"name":"inspect_url_structure","description":"Parse URL structure and extract query parameters, hostname, and path.","category":"network","inputSchema":{"type":"object","properties":{"url":{"type":"string","description":"URL string to inspect"}},"required":["url"]}}],"healthStatus":"healthy","lastPingMs":2,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Globe","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-csv-parser","name":"CSV Data Converter & Analyzer MCP","description":"Converts CSV text into structured JSON row objects and calculates basic column statistics.","type":"custom_script","category":"data","enabled":true,"customScript":"\n        const csv = args.csv || '';\n        const lines = csv.trim().split('\\n').filter(Boolean);\n        if (lines.length === 0) return { rowCount: 0, rows: [] };\n        const headers = lines[0].split(',').map(h => h.trim().replace(/^\"|\"$/g, ''));\n        const rows = lines.slice(1).map(line => {\n          const values = line.split(',').map(v => v.trim().replace(/^\"|\"$/g, ''));\n          const rowObj = {};\n          headers.forEach((h, idx) => {\n            rowObj[h] = values[idx] !== undefined ? values[idx] : '';\n          });\n          return rowObj;\n        });\n        return {\n          headers,\n          rowCount: rows.length,\n          rows\n        };\n      ","tools":[{"name":"convert_csv_to_json","description":"Parse raw CSV text string into clean JSON record objects.","category":"data","inputSchema":{"type":"object","properties":{"csv":{"type":"string","description":"Raw CSV text"}},"required":["csv"]}}],"healthStatus":"healthy","lastPingMs":2,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Database","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-jwt-inspector","name":"JWT Token Decoder & Inspector MCP","description":"Decodes Base64-encoded JWT headers and payload claims without verifying signature.","type":"custom_script","category":"dev","enabled":true,"customScript":"\n        const token = (args.token || '').trim();\n        const parts = token.split('.');\n        if (parts.length !== 3) {\n          return { error: 'Invalid JWT format. Expected 3 dot-separated parts.' };\n        }\n        try {\n          const decodeBase64 = (str) => {\n            let base64 = str.replace(/-/g, '+').replace(/_/g, '/');\n            while (base64.length % 4) base64 += '=';\n            return Buffer.from(base64, 'base64').toString('utf8');\n          };\n          const header = JSON.parse(decodeBase64(parts[0]));\n          const payload = JSON.parse(decodeBase64(parts[1]));\n          const isExpired = payload.exp ? (Date.now() / 1000) > payload.exp : false;\n          return {\n            header,\n            payload,\n            isExpired,\n            expiresAt: payload.exp ? new Date(payload.exp * 1000).toISOString() : 'N/A'\n          };\n        } catch (e) {\n          return { error: 'Failed to decode JWT claims: ' + e.message };\n        }\n      ","tools":[{"name":"decode_jwt_token","description":"Decode Base64 JSON Web Token (JWT) header and payload claims.","category":"dev","inputSchema":{"type":"object","properties":{"token":{"type":"string","description":"Raw JWT token string"}},"required":["token"]}}],"healthStatus":"healthy","lastPingMs":2,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Shield","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-changelog-builder","name":"Git Commit & Changelog Formatter MCP","description":"Parses git commit messages into structured Conventional Commit categories (feat, fix, docs, refactor).","type":"custom_script","category":"code","enabled":true,"customScript":"\n        const commits = args.commits || [];\n        const categorized = { feat: [], fix: [], docs: [], refactor: [], chore: [], other: [] };\n        commits.forEach(msg => {\n          if (/^feat/i.test(msg)) categorized.feat.push(msg);\n          else if (/^fix/i.test(msg)) categorized.fix.push(msg);\n          else if (/^docs/i.test(msg)) categorized.docs.push(msg);\n          else if (/^refactor/i.test(msg)) categorized.refactor.push(msg);\n          else if (/^chore/i.test(msg)) categorized.chore.push(msg);\n          else categorized.other.push(msg);\n        });\n        return {\n          totalCommits: commits.length,\n          categorized,\n          formattedMarkdown: `\n### 🚀 Features\n${categorized.feat.map(c => '- ' + c).join('\\n') || 'None'}\n\n### 🐛 Bug Fixes\n${categorized.fix.map(c => '- ' + c).join('\\n') || 'None'}\n\n### 🛠️ Maintenance & Other\n${[...categorized.refactor, ...categorized.chore, ...categorized.other].map(c => '- ' + c).join('\\n') || 'None'}\n          `\n        };\n      ","tools":[{"name":"format_git_changelog","description":"Categorize commit messages into structured Conventional Commit markdown sections.","category":"code","inputSchema":{"type":"object","properties":{"commits":{"type":"array","items":{"type":"string"},"description":"Array of git commit message strings"}},"required":["commits"]}}],"healthStatus":"healthy","lastPingMs":2,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"GitBranch","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-color-palette","name":"Color Contrast & Palette Evaluator MCP","description":"Calculates WCAG 2.1 relative luminance and contrast ratio between foreground and background colors.","type":"custom_script","category":"media","enabled":true,"customScript":"\n        const fg = args.fgHex || '#000000';\n        const bg = args.bgHex || '#ffffff';\n        const hexToRgb = (hex) => {\n          const clean = hex.replace('#', '');\n          const num = parseInt(clean.length === 3 ? clean.split('').map(c=>c+c).join('') : clean, 16);\n          return [(num >> 16) & 255, (num >> 8) & 255, num & 255];\n        };\n        const getLuminance = (rgb) => {\n          const a = rgb.map(v => {\n            v /= 255;\n            return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n          });\n          return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722;\n        };\n        try {\n          const lum1 = getLuminance(hexToRgb(fg));\n          const lum2 = getLuminance(hexToRgb(bg));\n          const ratio = (Math.max(lum1, lum2) + 0.05) / (Math.min(lum1, lum2) + 0.05);\n          const ratioRounded = Math.round(ratio * 100) / 100;\n          return {\n            fgHex: fg,\n            bgHex: bg,\n            contrastRatio: ratioRounded,\n            passWCAG_AA: ratioRounded >= 4.5,\n            passWCAG_AAA: ratioRounded >= 7.0,\n            rating: ratioRounded >= 7 ? 'AAA' : ratioRounded >= 4.5 ? 'AA' : 'Fail'\n          };\n        } catch (e) {\n          return { error: 'Invalid hex color code: ' + e.message };\n        }\n      ","tools":[{"name":"evaluate_color_contrast","description":"Calculate WCAG contrast ratio between two hex color codes.","category":"media","inputSchema":{"type":"object","properties":{"fgHex":{"type":"string","description":"Foreground hex color code (e.g. #333333)"},"bgHex":{"type":"string","description":"Background hex color code (e.g. #ffffff)"}},"required":["fgHex","bgHex"]}}],"healthStatus":"healthy","lastPingMs":2,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Eye","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-http-status","name":"HTTP Status & API Error Helper MCP","description":"Provides standardized RFC definitions, error classifications, and remediation steps for HTTP status codes.","type":"custom_script","category":"network","enabled":true,"customScript":"\n        const code = Number(args.code) || 200;\n        const statusMap = {\n          200: { name: 'OK', type: 'Success', desc: 'Standard successful HTTP response.' },\n          201: { name: 'Created', type: 'Success', desc: 'Resource created successfully.' },\n          400: { name: 'Bad Request', type: 'Client Error', desc: 'The server cannot process the request due to malformed syntax.' },\n          401: { name: 'Unauthorized', type: 'Client Error', desc: 'Authentication token is missing or invalid.' },\n          403: { name: 'Forbidden', type: 'Client Error', desc: 'Client authenticated but lacks permissions.' },\n          404: { name: 'Not Found', type: 'Client Error', desc: 'Requested resource could not be found.' },\n          429: { name: 'Too Many Requests', type: 'Client Error', desc: 'Rate limit exceeded.' },\n          500: { name: 'Internal Server Error', type: 'Server Error', desc: 'Generic unexpected server failure.' },\n          502: { name: 'Bad Gateway', type: 'Server Error', desc: 'Upstream server sent invalid response.' },\n          503: { name: 'Service Unavailable', type: 'Server Error', desc: 'Server is temporarily overloaded or undergoing maintenance.' }\n        };\n        const info = statusMap[code] || { name: 'Custom Code', type: code >= 500 ? 'Server Error' : 'Client Error', desc: 'Custom HTTP status code.' };\n        return { code, ...info };\n      ","tools":[{"name":"lookup_http_status_code","description":"Look up standard description, category, and remediation details for an HTTP status code.","category":"network","inputSchema":{"type":"object","properties":{"code":{"type":"number","description":"HTTP status code (e.g., 401, 404, 500)"}},"required":["code"]}}],"healthStatus":"healthy","lastPingMs":1,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"HelpCircle","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-prompt-optimizer","name":"Prompt Token & Template Helper MCP","description":"Estimates token count, cleans trailing spaces, and substitutes template placeholders in prompt strings.","type":"custom_script","category":"code","enabled":true,"customScript":"\n        const prompt = args.prompt || '';\n        const vars = args.variables || {};\n        let resolved = prompt;\n        for (const [k, v] of Object.entries(vars)) {\n          resolved = resolved.replace(new RegExp(`\\\\{\\\\{\\\\s*${k}\\\\s*\\\\}\\\\}`, 'g'), String(v));\n        }\n        const cleaned = resolved.replace(/\\r\\n/g, '\\n').replace(/\\n{3,}/g, '\\n\\n').trim();\n        const estTokens = Math.ceil(cleaned.length / 4);\n        return {\n          originalLength: prompt.length,\n          optimizedLength: cleaned.length,\n          estimatedTokenCount: estTokens,\n          optimizedPrompt: cleaned\n        };\n      ","tools":[{"name":"optimize_prompt_template","description":"Clean whitespace, substitute template variables, and estimate token count for prompt text.","category":"code","inputSchema":{"type":"object","properties":{"prompt":{"type":"string","description":"Prompt text string with optional {{var}} placeholders"},"variables":{"type":"object","description":"Key-value map of template variables"}},"required":["prompt"]}}],"healthStatus":"healthy","lastPingMs":2,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Sparkles","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-ast-inspector","name":"AST & Syntax Structure Inspector MCP","description":"Parses JavaScript/TypeScript syntax structures, imports, exported symbols, cyclomatic complexity, and bracket nesting depth.","type":"custom_script","category":"code","enabled":true,"customScript":"\n        const code = args.code || '';\n        const lines = code.split('\\n');\n        const imports = (code.match(/^import\\s+.*?from\\s+['\"][^'\"]+['\"]/gm) || []);\n        const exports = (code.match(/^export\\s+(default\\s+)?(function|const|class|type|interface|let|var)\\s+([a-zA-Z0-9_$]+)/gm) || []);\n        const functions = (code.match(/(function\\s+[a-zA-Z0-9_$]+|[a-zA-Z0-9_$]+\\s*=\\s*\\([^)]*\\)\\s*=>)/g) || []);\n        \n        // Estimate cyclomatic complexity (branches: if, while, for, case, catch, &&, ||, ?)\n        const branchMatches = (code.match(/\\b(if|while|for|case|catch)\\b|\\?\\s*.*?:|&&|\\|\\|/g) || []);\n        const complexity = 1 + branchMatches.length;\n\n        return {\n          totalLines: lines.length,\n          characterCount: code.length,\n          estimatedCyclomaticComplexity: complexity,\n          complexityRating: complexity > 15 ? 'High (Refactor recommended)' : complexity > 8 ? 'Moderate' : 'Low (Clean)',\n          importStatements: imports,\n          exportCount: exports.length,\n          exportedDeclarations: exports,\n          detectedFunctions: functions.map(f => f.trim()),\n          hasAsyncOperations: /\\basync\\b|\\bawait\\b|Promise\\./.test(code),\n        };\n      ","tools":[{"name":"inspect_syntax_ast_metrics","description":"Analyze code syntax structure, cyclomatic complexity, imports, exports, and function signatures.","category":"code","inputSchema":{"type":"object","properties":{"code":{"type":"string","description":"JavaScript or TypeScript source code string"}},"required":["code"]}}],"healthStatus":"healthy","lastPingMs":2,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Code","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-cron-planner","name":"Cron Expression & Schedule Planner MCP","description":"Parses standard 5/6-part cron expressions into plain English descriptions and calculates upcoming execution run times.","type":"custom_script","category":"dev","enabled":true,"customScript":"\n        const expr = (args.cronExpression || '* * * * *').trim();\n        const parts = expr.split(/\\s+/);\n        if (parts.length < 5) {\n          return { error: 'Invalid cron format. Expected at least 5 parts: [min] [hour] [day-of-month] [month] [day-of-week]' };\n        }\n        const [min, hour, dom, mon, dow] = parts;\n        \n        let humanDesc = 'Runs ';\n        if (min === '*' && hour === '*') humanDesc += 'every minute';\n        else if (min.startsWith('*/')) humanDesc += `every ${min.slice(2)} minutes`;\n        else if (min === '0' && hour === '*') humanDesc += 'at minute 0 of every hour';\n        else if (min === '0' && hour === '0') humanDesc += 'every day at midnight UTC';\n        else humanDesc += `at minute ${min}, hour ${hour}`;\n\n        if (dow !== '*') humanDesc += `, on day-of-week ${dow}`;\n        if (dom !== '*') humanDesc += `, on day-of-month ${dom}`;\n        if (mon !== '*') humanDesc += `, in month ${mon}`;\n\n        // Calculate next 5 approximate schedule ticks (simulated forward timestamps)\n        const nextRuns = [];\n        const base = new Date();\n        for (let i = 1; i <= 5; i++) {\n          const tick = new Date(base.getTime() + i * 3600000);\n          nextRuns.push(tick.toISOString());\n        }\n\n        return {\n          cronExpression: expr,\n          isValid: true,\n          humanReadableSchedule: humanDesc,\n          fields: { minute: min, hour, dayOfMonth: dom, month: mon, dayOfWeek: dow },\n          nextUpcomingRuns: nextRuns\n        };\n      ","tools":[{"name":"evaluate_cron_schedule","description":"Decode cron expression, generate human description, and calculate upcoming execution intervals.","category":"dev","inputSchema":{"type":"object","properties":{"cronExpression":{"type":"string","description":"Standard cron string e.g. \"*/15 * * * *\", \"0 0 * * 0\""}},"required":["cronExpression"]}}],"healthStatus":"healthy","lastPingMs":1,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Clock","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-semantic-diff","name":"Semantic Diff & Patch Generator MCP","description":"Generates line-by-line unified diffs, calculates added/removed lines, and creates universal patch files.","type":"custom_script","category":"code","enabled":true,"customScript":"\n        const orig = (args.originalText || '').split('\\n');\n        const mod = (args.modifiedText || '').split('\\n');\n        const diffLines = [];\n        let added = 0;\n        let removed = 0;\n        let unchanged = 0;\n\n        const max = Math.max(orig.length, mod.length);\n        for (let i = 0; i < max; i++) {\n          const o = orig[i];\n          const m = mod[i];\n          if (o === m) {\n            diffLines.push(' ' + (o || ''));\n            unchanged++;\n          } else {\n            if (o !== undefined) {\n              diffLines.push('-' + o);\n              removed++;\n            }\n            if (m !== undefined) {\n              diffLines.push('+' + m);\n              added++;\n            }\n          }\n        }\n\n        const unifiedPatch = [\n          '--- original',\n          '+++ modified',\n          `@@ -1,${orig.length} +1,${mod.length} @@`,\n          ...diffLines\n        ].join('\\n');\n\n        return {\n          totalOriginalLines: orig.length,\n          totalModifiedLines: mod.length,\n          addedLinesCount: added,\n          removedLinesCount: removed,\n          unchangedLinesCount: unchanged,\n          hasChanges: added > 0 || removed > 0,\n          unifiedPatch\n        };\n      ","tools":[{"name":"generate_semantic_diff","description":"Compare two text strings and produce standard unified diff format with change metrics.","category":"code","inputSchema":{"type":"object","properties":{"originalText":{"type":"string","description":"Original source text content"},"modifiedText":{"type":"string","description":"Modified source text content"}},"required":["originalText","modifiedText"]}}],"healthStatus":"healthy","lastPingMs":2,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"GitBranch","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-sql-schema-gen","name":"SQL Schema to TypeScript & Zod Generator MCP","description":"Converts SQL CREATE TABLE statements into strongly-typed TypeScript interfaces and runtime Zod validation schemas.","type":"custom_script","category":"data","enabled":true,"customScript":"\n        const sql = args.sql || '';\n        const tableMatch = sql.match(/CREATE\\s+TABLE\\s+(?:IF\\s+NOT\\s+EXISTS\\s+)?([a-zA-Z0-9_]+)/i);\n        const tableName = tableMatch ? tableMatch[1] : 'Entity';\n        const pascalName = tableName.split('_').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join('');\n\n        // Extract column definitions\n        const bodyMatch = sql.match(/\\((.*)\\)/s);\n        const cols = [];\n        if (bodyMatch) {\n          const rawCols = bodyMatch[1].split(',').map(c => c.trim()).filter(Boolean);\n          for (const line of rawCols) {\n            if (/^(PRIMARY\\s+KEY|FOREIGN\\s+KEY|CONSTRAINT|UNIQUE|INDEX)/i.test(line)) continue;\n            const parts = line.split(/\\s+/);\n            if (parts.length >= 2) {\n              const colName = parts[0].replace(/[`\"]/g, '');\n              const colType = parts[1].toUpperCase();\n              const isNullable = !/NOT\\s+NULL/i.test(line);\n\n              let tsType = 'string';\n              let zodType = 'z.string()';\n\n              if (/INT|SERIAL|DECIMAL|NUMERIC|FLOAT|REAL/i.test(colType)) {\n                tsType = 'number';\n                zodType = 'z.number()';\n              } else if (/BOOL/i.test(colType)) {\n                tsType = 'boolean';\n                zodType = 'z.boolean()';\n              } else if (/JSON/i.test(colType)) {\n                tsType = 'Record<string, any>';\n                zodType = 'z.record(z.any())';\n              } else if (/TIMESTAMP|DATE|TIME/i.test(colType)) {\n                tsType = 'string';\n                zodType = 'z.string().datetime()';\n              }\n\n              if (isNullable) {\n                tsType += ' | null';\n                zodType += '.nullable().optional()';\n              }\n              cols.push({ colName, tsType, zodType });\n            }\n          }\n        }\n\n        const tsCode = `export interface ${pascalName} {\\n${cols.map(c => `  ${c.colName}: ${c.tsType};`).join('\\n')}\\n}`;\n        const zodCode = `import { z } from 'zod';\\n\\nexport const ${tableName}Schema = z.object({\\n${cols.map(c => `  ${c.colName}: ${c.zodType},`).join('\\n')}\\n});\\n\\nexport type ${pascalName}Type = z.infer<typeof ${tableName}Schema>;`;\n\n        return {\n          tableName,\n          pascalName,\n          columnsDetected: cols.length,\n          typescriptInterface: tsCode,\n          zodSchema: zodCode\n        };\n      ","tools":[{"name":"sql_to_ts_zod_schema","description":"Convert SQL CREATE TABLE statement into TypeScript interface and Zod schema code.","category":"data","inputSchema":{"type":"object","properties":{"sql":{"type":"string","description":"SQL CREATE TABLE definition string"}},"required":["sql"]}}],"healthStatus":"healthy","lastPingMs":2,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Database","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-cidr-calculator","name":"Network CIDR & Subnet Calculator MCP","description":"Calculates network IP ranges, subnet masks, wildcard masks, usable host count, and broadcast addresses.","type":"custom_script","category":"network","enabled":true,"customScript":"\n        const cidr = (args.cidr || '192.168.1.0/24').trim();\n        const [ip, maskStr] = cidr.split('/');\n        const prefix = parseInt(maskStr, 10) || 24;\n        \n        const ipToLong = (ipStr) => ipStr.split('.').reduce((acc, oct) => (acc << 8) + parseInt(oct, 10), 0) >>> 0;\n        const longToIp = (longVal) => [\n          (longVal >>> 24) & 255,\n          (longVal >>> 16) & 255,\n          (longVal >>> 8) & 255,\n          longVal & 255\n        ].join('.');\n\n        const netmaskLong = prefix === 0 ? 0 : (~0 << (32 - prefix)) >>> 0;\n        const wildcardLong = ~netmaskLong >>> 0;\n        const ipLong = ipToLong(ip);\n        const networkLong = (ipLong & netmaskLong) >>> 0;\n        const broadcastLong = (networkLong | wildcardLong) >>> 0;\n\n        const totalHosts = Math.pow(2, 32 - prefix);\n        const usableHosts = prefix >= 31 ? (prefix === 31 ? 2 : 1) : Math.max(0, totalHosts - 2);\n        const firstUsable = prefix >= 31 ? networkLong : networkLong + 1;\n        const lastUsable = prefix >= 31 ? broadcastLong : broadcastLong - 1;\n\n        return {\n          cidrNotation: `${longToIp(networkLong)}/${prefix}`,\n          ipAddress: ip,\n          subnetMask: longToIp(netmaskLong),\n          wildcardMask: longToIp(wildcardLong),\n          networkAddress: longToIp(networkLong),\n          broadcastAddress: longToIp(broadcastLong),\n          firstUsableIp: longToIp(firstUsable),\n          lastUsableIp: longToIp(lastUsable),\n          totalHosts,\n          usableHosts,\n          isPrivateRange: /^(10\\.|172\\.(1[6-9]|2[0-9]|3[01])\\.|192\\.168\\.)/.test(ip)\n        };\n      ","tools":[{"name":"calculate_cidr_subnet","description":"Calculate subnet masks, broadcast address, IP range, and host capacities from CIDR notation.","category":"network","inputSchema":{"type":"object","properties":{"cidr":{"type":"string","description":"CIDR block string e.g. \"192.168.1.0/24\" or \"10.0.0.0/16\""}},"required":["cidr"]}}],"healthStatus":"healthy","lastPingMs":1,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Globe","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-pii-anonymizer","name":"Data Masker & PII Anonymizer MCP","description":"Detects and redacts sensitive information such as Credit Cards, SSNs, Emails, Phone Numbers, and API Keys.","type":"custom_script","category":"dev","enabled":true,"customScript":"\n        let text = args.text || '';\n        const mode = args.redactionMode || 'REPLACE_TAGS'; // 'REPLACE_TAGS' or 'PARTIAL_MASK'\n        const detected = [];\n\n        // Credit Card detection (13-19 digits with spaces/dashes)\n        text = text.replace(/\\b(?:\\d[ -]*?){13,16}\\b/g, (match) => {\n          if (match.replace(/\\D/g, '').length >= 13) {\n            detected.push({ type: 'CREDIT_CARD', original: match });\n            return mode === 'PARTIAL_MASK' ? '****-****-****-' + match.slice(-4) : '[REDACTED_CC]';\n          }\n          return match;\n        });\n\n        // SSN detection (XXX-XX-XXXX)\n        text = text.replace(/\\b\\d{3}-\\d{2}-\\d{4}\\b/g, (match) => {\n          detected.push({ type: 'SSN', original: match });\n          return mode === 'PARTIAL_MASK' ? '***-**-' + match.slice(-4) : '[REDACTED_SSN]';\n        });\n\n        // Email address\n        text = text.replace(/\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b/g, (match) => {\n          detected.push({ type: 'EMAIL', original: match });\n          return mode === 'PARTIAL_MASK' ? match.charAt(0) + '***@' + match.split('@')[1] : '[REDACTED_EMAIL]';\n        });\n\n        // API Keys (e.g. sk-..., bearer tokens)\n        text = text.replace(/\\b(sk-[a-zA-Z0-9]{20,}|mcp_live_[a-zA-Z0-9_-]{20,}|ghp_[a-zA-Z0-9]{20,})\\b/g, (match) => {\n          detected.push({ type: 'API_KEY', original: match });\n          return '[REDACTED_SECRET_KEY]';\n        });\n\n        // US Phone Numbers\n        text = text.replace(/\\b(?:\\+?1[-. ]?)?\\(?([0-9]{3})\\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})\\b/g, (match) => {\n          detected.push({ type: 'PHONE', original: match });\n          return mode === 'PARTIAL_MASK' ? '***-***-' + match.slice(-4) : '[REDACTED_PHONE]';\n        });\n\n        return {\n          totalRedactions: detected.length,\n          detectedPIITypes: Array.from(new Set(detected.map(d => d.type))),\n          anonymizedText: text,\n          detectedCountByType: detected.reduce((acc, cur) => {\n            acc[cur.type] = (acc[cur.type] || 0) + 1;\n            return acc;\n          }, {})\n        };\n      ","tools":[{"name":"anonymize_sensitive_pii","description":"Detect and redact sensitive PII (credit cards, emails, SSNs, phone numbers, API keys) from text.","category":"dev","inputSchema":{"type":"object","properties":{"text":{"type":"string","description":"Raw text containing potentially sensitive information"},"redactionMode":{"type":"string","enum":["REPLACE_TAGS","PARTIAL_MASK"],"description":"Redaction style ([REDACTED_TAG] vs ****-1234)"}},"required":["text"]}}],"healthStatus":"healthy","lastPingMs":2,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Shield","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-svg-chart-builder","name":"SVG Vector Shape & Chart Generator MCP","description":"Generates clean, scalable vector SVG markup for sparkline charts, progress dials, status badges, and flow diagrams.","type":"custom_script","category":"media","enabled":true,"customScript":"\n        const chartType = args.chartType || 'sparkline';\n        const values = args.values || [10, 25, 18, 45, 30, 60, 55, 80];\n        const width = Number(args.width) || 300;\n        const height = Number(args.height) || 100;\n        const color = args.color || '#4f46e5';\n\n        let svgMarkup = '';\n\n        if (chartType === 'sparkline') {\n          const max = Math.max(...values, 1);\n          const min = Math.min(...values, 0);\n          const range = max - min || 1;\n          const points = values.map((val, idx) => {\n            const x = (idx / (values.length - 1)) * (width - 20) + 10;\n            const y = height - 10 - ((val - min) / range) * (height - 20);\n            return `${x.toFixed(1)},${y.toFixed(1)}`;\n          }).join(' ');\n\n          svgMarkup = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${width} ${height}\" width=\"${width}\" height=\"${height}\">\n  <polyline fill=\"none\" stroke=\"${color}\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" points=\"${points}\" />\n</svg>`;\n        } else if (chartType === 'status_badge') {\n          const label = args.label || 'STATUS';\n          const status = args.status || 'ACTIVE';\n          svgMarkup = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"160\" height=\"28\" viewBox=\"0 0 160 28\">\n  <rect rx=\"6\" width=\"160\" height=\"28\" fill=\"#1e293b\"/>\n  <rect rx=\"6\" width=\"70\" height=\"28\" fill=\"#334155\"/>\n  <text x=\"35\" y=\"18\" fill=\"#fff\" font-family=\"sans-serif\" font-size=\"11\" font-weight=\"bold\" text-anchor=\"middle\">${label}</text>\n  <text x=\"115\" y=\"18\" fill=\"#10b981\" font-family=\"sans-serif\" font-size=\"11\" font-weight=\"bold\" text-anchor=\"middle\">${status}</text>\n</svg>`;\n        } else {\n          svgMarkup = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\">\n  <rect width=\"${width}\" height=\"${height}\" rx=\"8\" fill=\"${color}\" opacity=\"0.1\"/>\n  <text x=\"${width/2}\" y=\"${height/2 + 5}\" fill=\"${color}\" font-family=\"sans-serif\" font-size=\"14\" text-anchor=\"middle\" font-weight=\"bold\">${chartType.toUpperCase()}</text>\n</svg>`;\n        }\n\n        return {\n          chartType,\n          width,\n          height,\n          svgCode: svgMarkup,\n          dataUri: 'data:image/svg+xml;utf8,' + encodeURIComponent(svgMarkup)\n        };\n      ","tools":[{"name":"generate_vector_svg","description":"Generate production-ready vector SVG markup for sparkline charts, progress rings, and status badges.","category":"media","inputSchema":{"type":"object","properties":{"chartType":{"type":"string","enum":["sparkline","status_badge","card"],"description":"Chart or shape type"},"values":{"type":"array","items":{"type":"number"},"description":"Array of numbers for sparkline data points"},"color":{"type":"string","description":"Hex or CSS color string (e.g., #4f46e5)"},"width":{"type":"number","description":"SVG canvas width in px"},"height":{"type":"number","description":"SVG canvas height in px"}},"required":["chartType"]}}],"healthStatus":"healthy","lastPingMs":1,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Layers","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-curl-converter","name":"cURL Command & Multi-Language HTTP Converter MCP","description":"Parses cURL commands and outputs equivalent executable code for Node.js fetch, Python requests, and Axios.","type":"custom_script","category":"dev","enabled":true,"customScript":"\n        const curl = (args.curlString || 'curl https://api.example.com/v1').trim();\n        const methodMatch = curl.match(/-X\\s+([A-Z]+)/i);\n        const method = methodMatch ? methodMatch[1].toUpperCase() : (curl.includes('-d ') || curl.includes('--data') ? 'POST' : 'GET');\n        \n        const urlMatch = curl.match(/(https?:\\/\\/[^\\s'\"]+)/);\n        const url = urlMatch ? urlMatch[1] : 'https://api.example.com';\n\n        const headers = {};\n        const headerMatches = curl.matchAll(/-H\\s+['\"]([^'\"]+)['\"]/g);\n        for (const hm of headerMatches) {\n          const [k, ...rest] = hm[1].split(':');\n          if (k && rest.length) headers[k.trim()] = rest.join(':').trim();\n        }\n\n        const dataMatch = curl.match(/(?:-d|--data(?:-raw)?)\\s+['\"](.*?)['\"]/s);\n        const rawBody = dataMatch ? dataMatch[1] : null;\n\n        // Generate Node.js Fetch\n        const nodeFetch = `const res = await fetch('${url}', {\\n  method: '${method}',\\n  headers: ${JSON.stringify(headers, null, 4)},\\n  ${rawBody ? `body: ${JSON.stringify(rawBody)}\\n` : ''}});\\nconst data = await res.json();`;\n\n        // Generate Python requests\n        const pythonReq = `import requests\\n\\nurl = '${url}'\\nheaders = ${JSON.stringify(headers, null, 4)}\\n${rawBody ? `data = ${rawBody}\\nres = requests.${method.toLowerCase()}(url, headers=headers, json=data)\\n` : `res = requests.${method.toLowerCase()}(url, headers=headers)\\n`}print(res.json())`;\n\n        return {\n          parsedMethod: method,\n          targetUrl: url,\n          parsedHeaders: headers,\n          hasBody: Boolean(rawBody),\n          nodeFetchCode: nodeFetch,\n          pythonRequestsCode: pythonReq\n        };\n      ","tools":[{"name":"convert_curl_request","description":"Parse cURL command string and convert into Node.js fetch and Python requests code snippets.","category":"dev","inputSchema":{"type":"object","properties":{"curlString":{"type":"string","description":"Raw cURL command line string"}},"required":["curlString"]}}],"healthStatus":"healthy","lastPingMs":1,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Zap","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-timezone-engine","name":"Timezone & Epoch Precision Engine MCP","description":"Converts timestamps between ISO 8601, RFC 3339, Unix epoch seconds/ms, and major international timezones.","type":"custom_script","category":"dev","enabled":true,"customScript":"\n        const input = args.timestamp || new Date().toISOString();\n        let d = new Date(input);\n        if (isNaN(d.getTime())) {\n          // Try numeric epoch\n          const num = Number(input);\n          if (!isNaN(num)) {\n            d = new Date(num > 1e11 ? num : num * 1000);\n          } else {\n            return { error: 'Invalid timestamp string or epoch number' };\n          }\n        }\n\n        const epochMs = d.getTime();\n        const epochSec = Math.floor(epochMs / 1000);\n        const now = Date.now();\n        const diffMs = epochMs - now;\n        const diffSec = Math.round(diffMs / 1000);\n        const diffHours = (diffSec / 3600).toFixed(1);\n\n        const formatTZ = (timeZone) => {\n          return new Intl.DateTimeFormat('en-US', {\n            timeZone,\n            dateStyle: 'full',\n            timeStyle: 'long',\n          }).format(d);\n        };\n\n        return {\n          inputReceived: input,\n          iso8601UTC: d.toISOString(),\n          epochSeconds: epochSec,\n          epochMilliseconds: epochMs,\n          relativeDescription: diffSec === 0 ? 'Now' : diffSec > 0 ? `in ${diffHours} hours` : `${Math.abs(diffHours)} hours ago`,\n          timezones: {\n            UTC: formatTZ('UTC'),\n            'America/New_York (EST/EDT)': formatTZ('America/New_York'),\n            'America/Los_Angeles (PST/PDT)': formatTZ('America/Los_Angeles'),\n            'Europe/London (GMT/BST)': formatTZ('Europe/London'),\n            'Asia/Tokyo (JST)': formatTZ('Asia/Tokyo'),\n            'Asia/Dubai (GST)': formatTZ('Asia/Dubai'),\n            'Australia/Sydney (AEST)': formatTZ('Australia/Sydney')\n          }\n        };\n      ","tools":[{"name":"convert_timestamp_timezone","description":"Convert timestamp to Unix epoch, UTC ISO, and international timezone formats with relative diff.","category":"dev","inputSchema":{"type":"object","properties":{"timestamp":{"type":"string","description":"ISO string, date string, or Unix epoch number (e.g. 1718000000)"}},"required":["timestamp"]}}],"healthStatus":"healthy","lastPingMs":1,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Clock","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-state-machine","name":"State Machine & Flowchart Verifier MCP","description":"Validates state machine transitions, detects orphan states and deadlocks, and generates Mermaid diagram code.","type":"custom_script","category":"code","enabled":true,"customScript":"\n        const states = args.states || ['idle', 'running', 'completed', 'failed'];\n        const initialState = args.initialState || states[0];\n        const transitions = args.transitions || [\n          { from: 'idle', event: 'START', to: 'running' },\n          { from: 'running', event: 'SUCCESS', to: 'completed' },\n          { from: 'running', event: 'FAIL', to: 'failed' },\n          { from: 'failed', event: 'RETRY', to: 'running' }\n        ];\n\n        // Reachability analysis from initialState\n        const reachable = new Set([initialState]);\n        let changed = true;\n        while (changed) {\n          changed = false;\n          for (const t of transitions) {\n            if (reachable.has(t.from) && !reachable.has(t.to)) {\n              reachable.add(t.to);\n              changed = true;\n            }\n          }\n        }\n\n        const unreachableStates = states.filter(s => !reachable.has(s));\n        \n        // Find terminal dead-end states (no outgoing transitions)\n        const sources = new Set(transitions.map(t => t.from));\n        const deadEndStates = states.filter(s => !sources.has(s));\n\n        // Generate Mermaid diagram\n        const mermaidLines = ['stateDiagram-v2', `  [*] --> ${initialState}`];\n        transitions.forEach(t => {\n          mermaidLines.push(`  ${t.from} --> ${t.to} : ${t.event}`);\n        });\n\n        return {\n          totalStates: states.length,\n          totalTransitions: transitions.length,\n          initialState,\n          allStatesReachable: unreachableStates.length === 0,\n          unreachableStates,\n          terminalDeadEndStates: deadEndStates,\n          mermaidDiagramCode: mermaidLines.join('\\n')\n        };\n      ","tools":[{"name":"verify_state_machine","description":"Validate finite state machine transitions, check reachability, and generate Mermaid state diagram.","category":"code","inputSchema":{"type":"object","properties":{"states":{"type":"array","items":{"type":"string"},"description":"Array of state names"},"initialState":{"type":"string","description":"Starting state"},"transitions":{"type":"array","items":{"type":"object"},"description":"Array of transition objects { from, event, to }"}},"required":["states","initialState","transitions"]}}],"healthStatus":"healthy","lastPingMs":2,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"GitBranch","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-roadsign-windows-desktop","name":"Windows Desktop Automation MCP (Road Sign)","description":"Road Sign signpost for external Windows host with injected Bearer authentication.","type":"remote_http","category":"dev","enabled":true,"endpointUrl":"http://192.168.1.150:8000/mcp","headers":{"Authorization":"Bearer win_mcp_sec_9941a8","X-Client-Origin":"DoEverythingMCP-Nexus"},"roadSign":{"isRoadSign":true,"signpostTitle":"LOOK HERE: Windows Workstation Desktop MCP","targetHostLocation":"http://192.168.1.150:8000/mcp","directionsInstructions":"Directs agents to access local Windows workstation tools (PowerShell CLI, registry access, Windows UI automation) with auto-injected Bearer token credentials.","credentialKeys":{"Authorization":"Bearer win_mcp_sec_9941a8","X-Windows-Host":"DESKTOP-WIN11-WORKSTATION"},"osPlatform":"windows"},"tools":[{"name":"windows_powershell_exec","description":"Execute PowerShell commands on the connected remote Windows desktop workstation.","category":"dev","inputSchema":{"type":"object","properties":{"command":{"type":"string","description":"PowerShell script or command line to execute"}},"required":["command"]}},{"name":"windows_registry_query","description":"Query Windows system registry keys and values.","category":"dev","inputSchema":{"type":"object","properties":{"keyPath":{"type":"string","description":"Registry hive path (e.g. HKLM\\Software\\...)"}},"required":["keyPath"]}}],"healthStatus":"healthy","lastPingMs":12,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Shield","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-roadsign-linux-cluster","name":"Production Linux & GPU Cluster MCP (Road Sign)","description":"Road Sign signpost for cloud Linux cluster with X-API-Key credentials.","type":"remote_http","category":"dev","enabled":true,"endpointUrl":"https://mcp-node.internal.corp:8443/mcp","headers":{"X-API-Key":"prod_cluster_mcp_key_77812"},"roadSign":{"isRoadSign":true,"signpostTitle":"LOOK HERE: Cloud Linux & GPU Cluster MCP","targetHostLocation":"https://mcp-node.internal.corp:8443/mcp","directionsInstructions":"Directs models and sub-agents to access the remote cluster Docker, CUDA GPU tensors, and bash shell with injected X-API-Key credentials.","credentialKeys":{"X-API-Key":"prod_cluster_mcp_key_77812"},"osPlatform":"linux"},"tools":[{"name":"remote_docker_container_inspect","description":"Inspect running Docker containers on the remote production cluster.","category":"dev","inputSchema":{"type":"object","properties":{"containerName":{"type":"string","description":"Docker container ID or name"}},"required":["containerName"]}}],"healthStatus":"healthy","lastPingMs":25,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Cpu","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"mcp-preset-runner-filesystem","name":"Filesystem Explorer MCP (npx / bunx runner)","description":"Process runner configuration for @modelcontextprotocol/server-filesystem.","type":"custom_script","category":"dev","enabled":true,"runnerConfig":{"packageManager":"npx","packageNameOrCommand":"@modelcontextprotocol/server-filesystem","args":["/workspace"]},"customScript":"\n        const path = args.path || '/workspace';\n        return {\n          status: 'simulated_fs_bridge',\n          packageManager: 'npx',\n          package: '@modelcontextprotocol/server-filesystem',\n          queriedPath: path,\n          entries: [\n            { name: 'src', type: 'directory', size: 4096 },\n            { name: 'package.json', type: 'file', size: 1240 },\n            { name: 'server.ts', type: 'file', size: 14200 },\n            { name: 'README.md', type: 'file', size: 850 }\n          ],\n          totalFiles: 4\n        };\n      ","tools":[{"name":"filesystem_list_directory","description":"List directories and file metadata across the workspace.","category":"dev","inputSchema":{"type":"object","properties":{"path":{"type":"string","description":"Directory path"}},"required":["path"]}}],"healthStatus":"healthy","lastPingMs":2,"lastPingAt":"2026-08-14T00:22:03.304Z","isPreset":true,"icon":"Layers","createdAt":"2026-08-14T00:22:03.304Z"},{"id":"hermes-13ft","name":"13ft","enabled":true,"tools":[{"name":"bypass_paywall","description":"Fetch an article through 13ft paywall bypass. Uses Googlebot UA to get past paywalls. Returns cleaned article text.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"bypass_paywall_text","description":"Fetch an article and extract plain text (no HTML tags). Good for reading/summarizing.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"web","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/13ft-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/13ft-mcp","python","server.py"],"env":{"13FT_URL":"http://10.30.20.204:5000"}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.202Z","updatedAt":"2026-08-14T01:10:57.734Z"},{"id":"hermes-ai-research-engine","name":"ai-research-engine","enabled":true,"tools":[{"name":"search_web","description":"Full-text search across indexed documents.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"semantic_search","description":"Search by meaning using vector embeddings.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"crawl_url","description":"Crawl a URL and index it.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"crawl_topic","description":"Discover and crawl sources for a topic.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_crawl","description":"Crawl JS-heavy sites using headless Chromium (Playwright). For pages that need JavaScript rendering.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"research_topic","description":"Full pipeline: search → crawl → AI summary.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"retrieve_document","description":"Get full indexed content of a document.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"summarize_sources","description":"AI summary of multiple URLs. urls: comma-separated.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"extract_information","description":"Extract structured data from a document using LLM.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_report","description":"Generate comprehensive research report.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"index_status","description":"System health + business stats.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"web","type":"runner_process","description":"/Users/drjones/ai-research-engine/.venv/bin/python /Users/drjones/ai-research-engine/server.py","runnerConfig":{"packageManager":"python","packageNameOrCommand":"/Users/drjones/ai-research-engine/.venv/bin/python","args":["/Users/drjones/ai-research-engine/server.py"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.206Z","updatedAt":"2026-08-14T01:08:23.517Z"},{"id":"hermes-alby-hub","name":"alby-hub","enabled":true,"tools":[{"name":"get_info","description":"Get Alby Hub node info (alias, pubkey, network, version).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_balances","description":"Get Alby Hub wallet balances (onchain + lightning channels).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_channels","description":"List lightning channels and their states.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"open_channel","description":"Open a new lightning channel to a peer.","category":"dev","inputSchema":{"type":"object","properties":{"node_uri":{"type":"string","description":"Peer node URI (pubkey@host:port)"},"amount_sats":{"type":"number","description":"Channel funding amount in sats"}},"required":["node_uri","amount_sats"]}},{"name":"create_invoice","description":"Create a lightning invoice.","category":"dev","inputSchema":{"type":"object","properties":{"amount_sats":{"type":"number","description":"Invoice amount in sats"},"description":{"type":"string","description":"Invoice memo/description"}},"required":["amount_sats"]}},{"name":"pay_invoice","description":"Pay a lightning invoice.","category":"dev","inputSchema":{"type":"object","properties":{"invoice":{"type":"string","description":"BOLT11 invoice string"}},"required":["invoice"]}},{"name":"list_transactions","description":"List Alby Hub transaction history.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_node_status","description":"Get lightning node status (synced, peers, etc.).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"dev","type":"runner_process","description":"python3 /Users/drjones/.hermes/mcp-servers/alby-hub/server.py","runnerConfig":{"packageManager":"python","packageNameOrCommand":"python3","args":["/Users/drjones/.hermes/mcp-servers/alby-hub/server.py"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.209Z","updatedAt":"2026-08-14T02:22:07.161Z"},{"id":"hermes-amp","name":"amp","enabled":true,"tools":[{"name":"list_instances","description":"List all AMP instances with status, ports, and module info","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"start_instance","description":"Start an AMP instance by its internal name (e.g., 'older01')","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"stop_instance","description":"Stop an AMP instance by its internal name","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"restart_instance","description":"Restart an AMP instance by its internal name","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_minecraft_server","description":"Create a new Minecraft Java server instance. Name is internal, friendly_name is display name.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"send_console_command","description":"Send a console command to a Minecraft server (e.g., 'list', 'say hello')","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_instance_log","description":"Get recent console log from an instance","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"dev","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/amp-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/amp-mcp","python","server.py"],"env":{"AMP_PASSWORD":"czapiewski","AMP_URL":"http://10.30.20.216:8080","AMP_USER":"drjones"}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.211Z","updatedAt":"2026-08-14T01:08:23.533Z"},{"id":"hermes-android-adb","name":"android-adb","enabled":true,"tools":[{"name":"device_info","description":"Get detailed device information: model, manufacturer, Android version,\n    CPU, memory, storage, network, and current foreground app.","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"battery_status","description":"Get battery level, temperature, and charging status.","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"cpu_status","description":"Get CPU frequency, governor, and temperature.","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_packages","description":"List installed packages. Optional filter string (e.g. 'youtube', 'netflix').","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"install_app","description":"Install an APK from a local path on the Mac. \n    The APK is pushed to the device and installed silently.","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"uninstall_app","description":"Uninstall an app by package name (e.g. 'com.example.app').","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"start_app","description":"Launch an app by package name. Optionally specify the activity.\n    Common examples: 'com.google.android.youtube', 'org.jellyfin.mobile'","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"stop_app","description":"Force-stop an app by package name. \n    Use this to kill misbehaving apps or free resources.","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"current_app","description":"Get the currently focused/foreground app.","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"send_keyevent","description":"Send an Android key event. Common keycodes:\n    KEYCODE_VOLUME_UP=24, KEYCODE_VOLUME_DOWN=25, KEYCODE_VOLUME_MUTE=164,\n    KEYCODE_HOME=3, KEYCODE_BACK=4, KEYCODE_DPAD_UP=19, KEYCODE_DPAD_DOWN=20,\n    KEYCODE_DPAD_LEFT=21, KEYCODE_DPAD_RIGHT=22, KEYCODE_ENTER=66,\n    KEYCODE_POWER=26, KEYCODE_MENU=82","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"volume_set","description":"Set volume. level: '0'-'25' (0=silent, 25=max), 'up', 'down', or 'mute'.","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"type_text","description":"Type text on the device. Use for search fields, URLs, etc.","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"screencap","description":"Capture a screenshot from the device and save to output_path.\n    Default: /tmp/android-screenshot.png","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"shell","description":"Run an arbitrary shell command on the Android device.\n    Use for advanced operations not covered by other tools.\n    WARNING: Be careful — 'rm -rf', 'reboot', etc. are destructive.","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"ping_host","description":"Ping a host from the Android device. Useful for network diagnostics.","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"push_file","description":"Push a file from Mac to the Android device.","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"pull_file","description":"Pull a file from the Android device to Mac.","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_files","description":"List files in a directory on the Android device.","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"reboot_device","description":"Reboot the Android device. mode: 'normal', 'recovery', 'bootloader'.\n    WARNING: This will disconnect any active streaming sessions.","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"system_monitor","description":"One-shot system health: CPU load, memory usage, top processes, uptime.","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"data","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/android-adb-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/android-adb-mcp","python","server.py"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.214Z","updatedAt":"2026-08-14T01:08:23.548Z"},{"id":"hermes-apple-calendar","name":"apple-calendar","enabled":true,"tools":[{"name":"list_calendars","description":"List all calendars in Apple Calendar","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_all_events","description":"List events across ALL calendars within a date range. Use this instead of list_events when you need events from all calendars.","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_events","description":"List events in a calendar within a date range","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_event","description":"Get full details of an event by its summary/title","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_event","description":"Create a new event in a calendar","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"update_event","description":"Update an existing calendar event's details","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"delete_event","description":"Delete an event by its summary/title","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"search_events","description":"Search events by summary/title across calendars","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"memory","type":"runner_process","description":"node /Users/drjones/.hermes/apple-mcp/calendar/build/index.js","runnerConfig":{"packageManager":"npx","packageNameOrCommand":"node","args":["/Users/drjones/.hermes/apple-mcp/calendar/build/index.js"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.216Z","updatedAt":"2026-08-14T01:08:23.562Z"},{"id":"hermes-apple-contacts","name":"apple-contacts","enabled":true,"tools":[{"name":"list_groups","description":"List all groups in Apple Contacts","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_contacts","description":"List all contacts, optionally filtered by group","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_contact","description":"Get full details of a contact by name including emails, phones, organization, and addresses","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"search_contacts","description":"Search contacts by name","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"update_contact","description":"Update an existing contact's details. For email and phone, new entries are added (existing ones are not removed).","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_contact","description":"Create a new contact in Apple Contacts","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"delete_contact","description":"Delete a contact by name","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_group","description":"Create a new group in Apple Contacts","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"add_contact_to_group","description":"Add an existing contact to a group","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"remove_contact_from_group","description":"Remove a contact from a group","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"delete_group","description":"Delete a contact group","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"memory","type":"runner_process","description":"node /Users/drjones/.hermes/apple-mcp/contacts/build/index.js","runnerConfig":{"packageManager":"npx","packageNameOrCommand":"node","args":["/Users/drjones/.hermes/apple-mcp/contacts/build/index.js"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.220Z","updatedAt":"2026-08-14T01:08:23.575Z"},{"id":"hermes-apple-mail","name":"apple-mail","enabled":true,"tools":[{"name":"list_mailboxes","description":"List all mailboxes across all accounts with unread counts","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_messages","description":"List recent messages in a mailbox, optionally filtered to unread only","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_message","description":"Get the full content of an email message by ID","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"search_messages","description":"Search emails by subject or sender across mailboxes","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"send_email","description":"Send an email via Apple Mail","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_unread_count","description":"Get the unread email count for a mailbox or across all mailboxes","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"move_message","description":"Move an email message to a different mailbox","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"mark_read","description":"Mark an email message as read or unread","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"delete_message","description":"Delete an email message (moves to trash)","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"flag_message","description":"Flag or unflag an email message","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"memory","type":"runner_process","description":"node /Users/drjones/.hermes/apple-mcp/mail/build/index.js","runnerConfig":{"packageManager":"npx","packageNameOrCommand":"node","args":["/Users/drjones/.hermes/apple-mcp/mail/build/index.js"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.223Z","updatedAt":"2026-08-14T01:08:23.587Z"},{"id":"hermes-apple-maps","name":"apple-maps","enabled":true,"tools":[{"name":"search_location","description":"Search for a location in Apple Maps","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_directions","description":"Get directions between two locations in Apple Maps","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"drop_pin","description":"Drop a pin at specific coordinates in Apple Maps","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"open_address","description":"Open a specific address in Apple Maps","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"save_to_favorites","description":"Open a location in Apple Maps so you can save it as a favorite. (Maps opens the location — save it manually from the Maps interface.)","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"custom","type":"runner_process","description":"node /Users/drjones/.hermes/apple-mcp/maps/build/index.js","runnerConfig":{"packageManager":"npx","packageNameOrCommand":"node","args":["/Users/drjones/.hermes/apple-mcp/maps/build/index.js"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.225Z","updatedAt":"2026-08-14T01:08:23.602Z"},{"id":"hermes-apple-messages","name":"apple-messages","enabled":true,"tools":[{"name":"list_chats","description":"List recent chats with last message preview and participant info","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_chat_messages","description":"Get message history for a specific chat","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"search_messages","description":"Search messages by text content","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"send_message","description":"Send an iMessage or SMS to a phone number or email address","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_chat_participants","description":"Get participants of a chat","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"custom","type":"runner_process","description":"node /Users/drjones/.hermes/apple-mcp/messages/build/index.js","runnerConfig":{"packageManager":"npx","packageNameOrCommand":"node","args":["/Users/drjones/.hermes/apple-mcp/messages/build/index.js"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.228Z","updatedAt":"2026-08-14T01:08:23.615Z"},{"id":"hermes-apple-notes","name":"apple-notes","enabled":true,"tools":[{"name":"list_folders","description":"List all folders in Apple Notes","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_folder","description":"Create a new folder in Apple Notes","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_notes","description":"List all notes in a specified Apple Notes folder","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_note","description":"Get the full content of a specific note by title","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_note","description":"Create a new note in a specified Apple Notes folder","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"update_note","description":"Update the body of an existing note","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"delete_note","description":"Delete a note from Apple Notes","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"delete_folder","description":"Delete a folder and all its notes from Apple Notes","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"move_note","description":"Move a note from one folder to another","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"append_to_note","description":"Append HTML content to an existing note without replacing its body","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"search_notes","description":"Search notes by keyword across all folders or within a specific folder. Searches both titles and body content.","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"memory","type":"runner_process","description":"node /Users/drjones/.hermes/apple-mcp/notes/build/index.js","runnerConfig":{"packageManager":"npx","packageNameOrCommand":"node","args":["/Users/drjones/.hermes/apple-mcp/notes/build/index.js"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.230Z","updatedAt":"2026-08-14T01:08:23.630Z"},{"id":"hermes-apple-reminders","name":"apple-reminders","enabled":true,"tools":[{"name":"list_lists","description":"List all reminder lists in Apple Reminders","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_list","description":"Create a new reminder list","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_reminders","description":"List reminders in a specific list","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_reminder","description":"Get full details of a reminder by name","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_reminder","description":"Create a new reminder in a list","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"update_reminder","description":"Update an existing reminder's details","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"complete_reminder","description":"Mark a reminder as completed","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"uncomplete_reminder","description":"Mark a completed reminder as incomplete","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"delete_reminder","description":"Delete a reminder","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"delete_list","description":"Delete a reminder list and all its reminders","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"search_reminders","description":"Search reminders by name across all lists or within a specific list","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"custom","type":"runner_process","description":"node /Users/drjones/.hermes/apple-mcp/reminders/build/index.js","runnerConfig":{"packageManager":"npx","packageNameOrCommand":"node","args":["/Users/drjones/.hermes/apple-mcp/reminders/build/index.js"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.234Z","updatedAt":"2026-08-14T01:08:23.647Z"},{"id":"hermes-applescript-mcp","name":"applescript-mcp","enabled":true,"tools":[{"name":"system_volume","description":"[System control and information] Set system volume","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"system_get_frontmost_app","description":"[System control and information] Get the name of the frontmost application","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"system_launch_app","description":"[System control and information] Launch an application","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"system_quit_app","description":"[System control and information] Quit an application","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"system_toggle_dark_mode","description":"[System control and information] Toggle system dark mode","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"system_get_battery_status","description":"[System control and information] Get battery level and charging status","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"calendar_add","description":"[Calendar operations] Add a new event to Calendar","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"calendar_list","description":"[Calendar operations] List all events for today","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"finder_get_selected_files","description":"[Finder and file operations] Get currently selected files in Finder","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"finder_search_files","description":"[Finder and file operations] Search for files by name","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"finder_quick_look_file","description":"[Finder and file operations] Preview a file using Quick Look","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"clipboard_get_clipboard","description":"[Clipboard management operations] Get current clipboard content","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"clipboard_set_clipboard","description":"[Clipboard management operations] Set clipboard content","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"clipboard_clear_clipboard","description":"[Clipboard management operations] Clear clipboard content","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"notifications_toggle_do_not_disturb","description":"[Notification management] Toggle Do Not Disturb mode using keyboard shortcut","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"notifications_send_notification","description":"[Notification management] Send a system notification","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"iterm_paste_clipboard","description":"[iTerm terminal operations] Paste clipboard content into iTerm","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"iterm_run","description":"[iTerm terminal operations] Run a command in iTerm","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"mail_create_email","description":"[Mail operations] Create a new email in Mail.app","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"mail_list_emails","description":"[Mail operations] List emails from a specified mailbox in Mail.app","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"mail_get_email","description":"[Mail operations] Get a specific email by search criteria from Mail.app","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"pages_create_document","description":"[Pages document operations] Create a new Pages document with plain text content (no formatting)","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"shortcuts_run_shortcut","description":"[Shortcuts operations] Run a shortcut with optional input. Uses Shortcuts Events to run in background without opening the app.","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"shortcuts_list_shortcuts","description":"[Shortcuts operations] List all available shortcuts with optional limit","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"messages_list_chats","description":"[iMessage operations] List available iMessage and SMS chats","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"messages_get_messages","description":"[iMessage operations] Get messages from the Messages app","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"messages_search_messages","description":"[iMessage operations] Search for messages containing specific text or from a specific sender","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"messages_compose_message","description":"[iMessage operations] Open Messages app with a pre-filled message to a recipient or automatically send a message","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"notes_create","description":"[Apple Notes operations] Create a new note with optional formatting","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"notes_createRawHtml","description":"[Apple Notes operations] Create a new note with direct HTML content","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"notes_list","description":"[Apple Notes operations] List all notes or notes in a specific folder","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"notes_get","description":"[Apple Notes operations] Get a specific note by title","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"notes_search","description":"[Apple Notes operations] Search for notes containing specific text","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"dev","type":"runner_process","description":"node /Users/drjones/.hermes/applescript-mcp/dist/index.js","runnerConfig":{"packageManager":"npx","packageNameOrCommand":"node","args":["/Users/drjones/.hermes/applescript-mcp/dist/index.js"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.237Z","updatedAt":"2026-08-14T01:08:23.663Z"},{"id":"hermes-archivebox","name":"archivebox","enabled":true,"tools":[{"name":"health","description":"Check ArchiveBox health","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_snapshots","description":"List archived snapshots","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"search_snapshots","description":"Search archived snapshots by keyword","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_snapshot","description":"Get a specific snapshot's details","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"archive_url","description":"Submit a URL to be archived","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_archived_sources","description":"List all archived URLs/sources","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"stats","description":"Get archive statistics","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"web","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/archivebox-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/archivebox-mcp","python","server.py"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.240Z","updatedAt":"2026-08-14T01:08:23.679Z"},{"id":"hermes-browserless","name":"browserless","enabled":true,"tools":[{"name":"health","description":"Check browserless health/version","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"screenshot","description":"Take a screenshot of a URL. Returns base64 PNG data","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"pdf","description":"Generate a PDF from a URL. Returns base64 PDF data","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"scrape_html","description":"Scrape the HTML content of a URL. Optionally extract specific elements by CSS selector.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"function_execute","description":"Execute custom JavaScript in headless browser context. code is JS function body. context is optional variables.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"scrape_url_content","description":"Scrape a URL and extract clean readable content using the content endpoint","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"web","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/browserless-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/browserless-mcp","python","server.py"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.243Z","updatedAt":"2026-08-14T01:08:23.693Z"},{"id":"hermes-changedetection","name":"changedetection","enabled":true,"tools":[{"name":"list_watches","description":"List all monitored watches in Change Detection.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"add_watch","description":"Add a new URL to monitor for changes.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_watch","description":"Get details about a specific watch by its UUID.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"delete_watch","description":"Delete a watch by its UUID. Use list_watches to find UUIDs.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"watch_history","description":"Get change history for a watch. Shows timestamps of detected changes.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_tags","description":"List all tags used to organize watches.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"web","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/changedetection-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/changedetection-mcp","python","server.py"],"env":{"CHANGEDETECTION_API_KEY":"bdff888cbf98f452987905269a7edb50","CHANGEDETECTION_URL":"https://10.30.20.204"}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.246Z","updatedAt":"2026-08-14T01:10:58.038Z"},{"id":"hermes-chroma","name":"chroma","enabled":true,"tools":[{"name":"health","description":"Check Chroma DB health","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_collections","description":"List all collections in Chroma (v2 API)","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_collection","description":"Get collection details by name","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"count_collection","description":"Count items in a collection","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"query_collection","description":"Query a collection by text embeddings (semantic search). Returns matching documents.","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"peek_collection","description":"Peek at first N items in a collection","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"delete_collection","description":"Delete a collection","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"data","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/chroma-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/chroma-mcp","python","server.py"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.250Z","updatedAt":"2026-08-14T01:08:23.707Z"},{"id":"hermes-chrome-devtools","name":"chrome-devtools","enabled":true,"tools":[{"name":"click","description":"Clicks on the provided element","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"close_page","description":"Closes the page by its index. The last open page cannot be closed.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"drag","description":"Drag an element onto another element","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"emulate","description":"Emulates various features on the selected page.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"evaluate_script","description":"Evaluate a JavaScript function inside the currently selected page. Returns the response as JSON, so returned values have to be JSON-serializable.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"fill","description":"Type text into an input, text area or select an option from a <select> element.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"fill_form","description":"Fill out multiple form elements (inputs, selects, checkboxes, radios) at once. ALWAYS prefer this tool over multiple individual 'fill' or 'click' calls when interacting with forms. It is significantly faster, more reliable, and reduces turn count. Example: Fill username, password, and check \"Remember Me\" in one call.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_console_message","description":"Gets a console message by its ID. You can get all messages by calling list_console_messages.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_network_request","description":"Gets a network request by an optional reqid, if omitted returns the currently selected request in the DevTools Network panel.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"handle_dialog","description":"If a browser dialog was opened, use this command to handle it","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"hover","description":"Hover over the provided element","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"lighthouse_audit","description":"Get Lighthouse score and reports for accessibility, SEO, best practices, and agentic browsing. This excludes performance. For performance audits, run performance_start_trace","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_console_messages","description":"List all console messages for the currently selected page since the last navigation.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_network_requests","description":"List all requests for the currently selected page since the last navigation.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_pages","description":"Get a list of pages open in the browser.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"navigate_page","description":"Go to a URL, or back, forward, or reload. Use project URL if not specified otherwise.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"new_page","description":"Open a new tab and load a URL. Use project URL if not specified otherwise.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"performance_analyze_insight","description":"Provides more detailed information on a specific Performance Insight of an insight set that was highlighted in the results of a trace recording.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"performance_start_trace","description":"Start a performance trace on the selected webpage. Use to find frontend performance issues, Core Web Vitals (LCP, INP, CLS), and improve page load speed.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"performance_stop_trace","description":"Stop the active performance trace recording on the selected webpage.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"press_key","description":"Press a key or key combination. Use this when other input methods like fill() cannot be used (e.g., keyboard shortcuts, navigation keys, or special key combinations).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"resize_page","description":"Resizes the selected page's window so that the page has specified dimension","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"select_page","description":"Select a page as a context for future tool calls.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"take_heapsnapshot","description":"Capture a heap snapshot of the currently selected page. Use to analyze the memory distribution of JavaScript objects and debug memory leaks.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"take_screenshot","description":"Take a screenshot of the page or element.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"take_snapshot","description":"Take a text snapshot of the currently selected page based on the a11y tree. The snapshot lists page elements along with a unique\nidentifier (uid). Always use the latest snapshot. Prefer taking a snapshot over taking a screenshot. The snapshot indicates the element selected\nin the DevTools Elements panel (if any).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"type_text","description":"Type text using keyboard into a previously focused input","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"upload_file","description":"Upload a file through a provided element.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"wait_for","description":"Wait for the specified text to appear on the selected page.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"dev","type":"runner_process","description":"npx chrome-devtools-mcp --headless --isolated","runnerConfig":{"packageManager":"npx","packageNameOrCommand":"npx","args":["chrome-devtools-mcp","--headless","--isolated"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.253Z","updatedAt":"2026-08-14T01:08:23.720Z"},{"id":"hermes-commando","name":"commando","enabled":true,"tools":[{"name":"execute_command","description":"Run an arbitrary command on the Commando VM (Windows red-team box).\n\n    shell: 'cmd' for cmd.exe or 'powershell' for PowerShell. Returns stdout/stderr/exit code.\n    This is the universal entrypoint to the full Commando VM toolkit\n    (mimikatz, BloodHound/SharpHound, CrackMapExec, impacket, hashcat, PowerSploit, etc.).\n    ","category":"dev","inputSchema":{"properties":{"command":{"title":"Command","type":"string"},"shell":{"default":"cmd","title":"Shell","type":"string"}},"required":["command"],"title":"execute_commandArguments","type":"object"}},{"name":"run_powershell","description":"Run a PowerShell script block and return its output.","category":"dev","inputSchema":{"properties":{"script":{"title":"Script","type":"string"}},"required":["script"],"title":"run_powershellArguments","type":"object"}},{"name":"list_tools","description":"List installed red-team tools under C:\\Tools.","category":"dev","inputSchema":{"properties":{},"title":"list_toolsArguments","type":"object"}},{"name":"sysinfo","description":"Host reconnaissance: hostname, current user, OS version, IP config.","category":"dev","inputSchema":{"properties":{},"title":"sysinfoArguments","type":"object"}},{"name":"netstat_connections","description":"List active TCP/UDP connections with owning PIDs (post-exploitation recon).","category":"dev","inputSchema":{"properties":{},"title":"netstat_connectionsArguments","type":"object"}}],"category":"dev","type":"sse","description":"Remote MCP endpoint (http://10.30.20.158:8000)","endpointUrl":"http://10.30.20.47:8000","healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.256Z","updatedAt":"2026-08-14T05:15:51.029Z"},{"id":"hermes-filesystem","name":"filesystem","enabled":true,"tools":[{"name":"read_file","description":"Read the complete contents of a file as text. DEPRECATED: Use read_text_file instead.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"read_text_file","description":"Read the complete contents of a file from the file system as text. Handles various text encodings and provides detailed error messages if the file cannot be read. Use this tool when you need to examine the contents of a single file. Use the 'head' parameter to read only the first N lines of a file, or the 'tail' parameter to read only the last N lines of a file. Operates on the file as text regardless of extension. Only works within allowed directories.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"read_media_file","description":"Read a file and return it as a base64-encoded content block with its MIME type. Image and audio files are returned as image/audio content; any other file type is returned as an embedded resource. Only works within allowed directories.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"read_multiple_files","description":"Read the contents of multiple files simultaneously. This is more efficient than reading files one by one when you need to analyze or compare multiple files. Each file's content is returned with its path as a reference. Failed reads for individual files won't stop the entire operation. Only works within allowed directories.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"write_file","description":"Create a new file or completely overwrite an existing file with new content. Use with caution as it will overwrite existing files without warning. Handles text content with proper encoding. Only works within allowed directories.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"edit_file","description":"Make line-based edits to a text file. Each edit replaces exact line sequences with new content. Returns a git-style diff showing the changes made. Only works within allowed directories.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_directory","description":"Create a new directory or ensure a directory exists. Can create multiple nested directories in one operation. If the directory already exists, this operation will succeed silently. Perfect for setting up directory structures for projects or ensuring required paths exist. Only works within allowed directories.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_directory","description":"Get a detailed listing of all files and directories in a specified path. Results clearly distinguish between files and directories with [FILE] and [DIR] prefixes. This tool is essential for understanding directory structure and finding specific files within a directory. Only works within allowed directories.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_directory_with_sizes","description":"Get a detailed listing of all files and directories in a specified path, including sizes. Results clearly distinguish between files and directories with [FILE] and [DIR] prefixes. This tool is useful for understanding directory structure and finding specific files within a directory. Only works within allowed directories.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"directory_tree","description":"Get a recursive tree view of files and directories as a JSON structure. Each entry includes 'name', 'type' (file/directory), and 'children' for directories. Files have no children array, while directories always have a children array (which may be empty). The output is formatted with 2-space indentation for readability. Only works within allowed directories.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"move_file","description":"Move or rename files and directories. Can move files between directories and rename them in a single operation. If the destination exists, the operation will fail. Works across different directories and can be used for simple renaming within the same directory. Both source and destination must be within allowed directories.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"search_files","description":"Recursively search for files and directories matching a pattern. The patterns should be glob-style patterns that match paths relative to the working directory. Use pattern like '*.ext' to match files in current directory, and '**/*.ext' to match files in all subdirectories. Returns full paths to all matching items. Great for finding files when you don't know their exact location. Only searches within allowed directories.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_file_info","description":"Retrieve detailed metadata about a file or directory. Returns comprehensive information including size, creation time, last modified time, permissions, and type. This tool is perfect for understanding file characteristics without reading the actual content. Only works within allowed directories.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_allowed_directories","description":"Returns the list of directories that this server is allowed to access. Subdirectories within these allowed directories are also accessible. Use this to understand which directories and their nested paths are available before trying to access files.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"dev","type":"runner_process","description":"npx -y @modelcontextprotocol/server-filesystem /Users/drjones","runnerConfig":{"packageManager":"npx","packageNameOrCommand":"npx","args":["-y","@modelcontextprotocol/server-filesystem","/Users/drjones"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.259Z","updatedAt":"2026-08-14T01:08:23.737Z"},{"id":"hermes-gitea","name":"gitea","enabled":true,"tools":[{"name":"list_repos","description":"List Gitea repositories, optionally filtered by user","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_repo","description":"Get details of a specific repository","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_issues","description":"List issues in a repository","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_pull_requests","description":"List pull requests in a repository","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"search_repos","description":"Search repositories by keyword","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"dev","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/gitea-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/gitea-mcp","python","server.py"],"env":{"GITEA_TOKEN":"9480f7a863cca799ddc88494387c65b9ab7a3529","GITEA_URL":"http://10.30.20.149:3000"}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.262Z","updatedAt":"2026-08-14T01:08:23.750Z"},{"id":"hermes-homebrew","name":"homebrew","enabled":true,"tools":[{"name":"install","description":"Installs the given formula or cask.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"uninstall","description":"Uninstalls the given formula or cask.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"untap","description":"Removes the given tap(s).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"upgrade","description":"Upgrades outdated casks and formulae.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list","description":"Lists installed formulae or casks.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"search","description":"Performs a search of formulae and casks.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"info","description":"Displays information about a formula or cask.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"doctor","description":"Checks your system for potential problems.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"update","description":"Fetches the newest version of Homebrew and all formulae.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"outdated","description":"Shows formulae and casks that have an updated version available.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"cleanup","description":"Removes stale lock files and outdated downloads for a specific formula or cask, or for all if none is specified.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"services","description":"Manages Homebrew services.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"tap","description":"Adds the given tap(s).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"pin","description":"Pins the given formula(e), preventing them from being upgraded.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"unpin","description":"Unpins the given formula(e), allowing them to be upgraded.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"deps","description":"Shows the dependencies for the given formula(e).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"dev","type":"runner_process","description":"uv run --directory /Users/drjones/Git/homebrew-mcp python homebrew_mcp.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/Git/homebrew-mcp","python","homebrew_mcp.py"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.266Z","updatedAt":"2026-08-14T01:08:23.768Z"},{"id":"hermes-influxdb","name":"influxdb","enabled":true,"tools":[{"name":"health","description":"Check InfluxDB health","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"query_flux","description":"Run a Flux query against InfluxDB","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_buckets","description":"List all buckets in InfluxDB","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"write_data","description":"Write a data point to InfluxDB","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_orgs","description":"List organizations","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"data","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/influxdb-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/influxdb-mcp","python","server.py"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.267Z","updatedAt":"2026-08-14T01:08:23.783Z"},{"id":"hermes-jellyfin","name":"jellyfin","enabled":true,"tools":[{"name":"search_media","description":"Search Jellyfin media library","category":"media","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_libraries","description":"List all media libraries","category":"media","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_recent","description":"Get recently added media","category":"media","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"health","description":"Check Jellyfin server health","category":"media","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"media","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/jellyfin-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/jellyfin-mcp","python","server.py"],"env":{"JELLYFIN_KEY":"065f171eccdf4cb4bc91e3c88be08851","JELLYFIN_URL":"http://10.30.20.88:8096"}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.269Z","updatedAt":"2026-08-14T01:08:23.799Z"},{"id":"hermes-jones","name":"jones","enabled":true,"tools":[{"name":"jones_status","description":"Health check: STT/TTS/Ollama/Twilio readiness, public URL, active calls.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"jones_call","description":"Place an outbound phone call. JONES (the voice AI) calls `to` (E.164, e.g.\n    +14255550123) and works to accomplish `task` — e.g. 'confirm my Monday shift\n    start time with Vernon, get a name and a time'. Returns call SID or error.\n    Requires the Twilio number to be provisioned.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"jones_send_sms","description":"Send a text message from the JONES number.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"jones_push_otp","description":"Push a verification/OTP code into JONES — it gets read digit-by-digit into\n    any live call. Use when a code arrives on a channel JONES can't see.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"jones_inject","description":"Inject text into a live call's context (system message). If speak=true and\n    the agent is idle, it also says the text aloud on the call.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"jones_conversations","description":"List recent voice conversations (browser + phone calls) with ids.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"jones_transcript","description":"Full transcript (all turns incl. notes) for a conversation id.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"jones_set_model","description":"Hot-swap the Ollama model JONES speaks with (e.g. 'ministral-3:3b',\n    'qwen3.5:4b', 'granite4.1:3b'). Use jones_status to see the active model.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"jones_models","description":"List models available on the Ollama host JONES uses.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"network","type":"runner_process","description":"/Users/drjones/.hermes/mcp-servers/jones/run.sh","runnerConfig":{"packageManager":"binary","packageNameOrCommand":"","args":[],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.271Z","updatedAt":"2026-08-14T01:08:23.813Z"},{"id":"hermes-kali","name":"kali","enabled":true,"tools":[{"name":"nmap","description":"Kali nmap — Network discovery & port scanner.","category":"network","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"masscan","description":"Kali masscan — Ultra-fast port scanner.","category":"network","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"rustscan","description":"Kali rustscan — Fast port scanner.","category":"network","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"naabu","description":"Kali naabu — Fast port scanner (projectdiscovery).","category":"network","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"netcat","description":"Kali netcat — TCP/UDP swiss-army knife.","category":"network","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"ffuf","description":"Kali ffuf — Fast web fuzzer.","category":"web","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"gobuster","description":"Kali gobuster — Directory/DNS/vhost bruteforcer.","category":"web","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"dirb","description":"Kali dirb — Web content scanner.","category":"web","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"dirsearch","description":"Kali dirsearch — Web path brute-forcer.","category":"web","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"feroxbuster","description":"Kali feroxbuster — Recursive content discovery.","category":"web","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"wfuzz","description":"Kali wfuzz — Web application fuzzer.","category":"web","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"nikto","description":"Kali nikto — Web server vulnerability scanner.","category":"web","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"nuclei","description":"Kali nuclei — Template-based vulnerability scanner.","category":"web","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"wpscan","description":"Kali wpscan — WordPress security scanner.","category":"web","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"httpx","description":"Kali httpx — HTTP probe & tech fingerprinting.","category":"web","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"httprobe","description":"Kali httprobe — Probe HTTP/HTTPS servers.","category":"web","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"arjun","description":"Kali arjun — HTTP parameter discovery.","category":"web","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"subjack","description":"Kali subjack — Subdomain takeover checker.","category":"web","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"amass","description":"Kali amass — In-depth DNS/subdomain enumeration.","category":"recon","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"subfinder","description":"Kali subfinder — Subdomain discovery.","category":"recon","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"assetfinder","description":"Kali assetfinder — Subdomain/asset discovery.","category":"recon","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"findomain","description":"Kali findomain — Subdomain enumerator.","category":"recon","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"dnsx","description":"Kali dnsx — DNS toolkit.","category":"recon","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"dnsrecon","description":"Kali dnsrecon — DNS enumeration.","category":"recon","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"theharvester","description":"Kali theharvester — Email/subdomain/OSINT gathering.","category":"recon","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"shodan","description":"Kali shodan — Shodan internet-wide search.","category":"recon","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"recon-ng","description":"Kali recon-ng — Web recon framework.","category":"recon","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"spiderfoot","description":"Kali spiderfoot — Automated OSINT platform.","category":"recon","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"hakrawler","description":"Kali hakrawler — Web crawler for endpoints.","category":"recon","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"hashcat","description":"Kali hashcat — Password hash cracker.","category":"credential","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"john","description":"Kali john — John the Ripper password cracker.","category":"credential","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"hydra","description":"Kali hydra — Login brute-forcer.","category":"credential","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"crackmapexec","description":"Kali crackmapexec — CrackMapExec (SMB/LDAP/WinRM).","category":"credential","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"nxc","description":"Kali nxc — NetExec (crackmapexec successor).","category":"credential","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"evil-winrm","description":"Kali evil-winrm — Windows Remote Management shell.","category":"credential","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"smbclient","description":"Kali smbclient — SMB client.","category":"credential","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"enum4linux","description":"Kali enum4linux — SMB/enum enumeration.","category":"credential","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"sqlmap","description":"Kali sqlmap — SQL injection automation.","category":"exploit","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"sqlmap-advanced","description":"Kali sqlmap-advanced — SQL injection (advanced).","category":"exploit","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"commix","description":"Kali commix — Command injection exploitation.","category":"exploit","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"msfconsole","description":"Kali msfconsole — Metasploit framework.","category":"exploit","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"impacket","description":"Kali impacket — Python network protocol toolkit.","category":"exploit","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"powersploit","description":"Kali powersploit — PowerShell post-exploitation.","category":"exploit","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"pwncat","description":"Kali pwncat — Netcat replacement with automation.","category":"exploit","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"chisel","description":"Kali chisel — TCP/UDP tunneling over HTTP.","category":"tunnel","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"ligolo-ng","description":"Kali ligolo-ng — Reverse tunneling.","category":"tunnel","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"proxychains","description":"Kali proxychains — Proxy chain wrapper.","category":"tunnel","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"socat","description":"Kali socat — Relay/forward sockets.","category":"tunnel","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"mitmproxy","description":"Kali mitmproxy — HTTPS man-in-the-middle proxy.","category":"mitm","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"bettercap","description":"Kali bettercap — Network MITM/recon framework.","category":"mitm","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"ettercap","description":"Kali ettercap — ARP spoofing & MITM.","category":"mitm","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"aircrack","description":"Kali aircrack — WiFi cracking suite.","category":"wireless","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"responder","description":"Kali responder — LLMNR/NBT-NS/mDNS poisoning.","category":"mitm","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"responder-enhanced","description":"Kali responder-enhanced — Responder (enhanced).","category":"mitm","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"eavesarp","description":"Kali eavesarp — ARP MITM toolkit.","category":"mitm","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"scapy","description":"Kali scapy — Packet manipulation.","category":"network","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"linpeas","description":"Kali linpeas — Linux privilege escalation.","category":"privesc","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"winpeas","description":"Kali winpeas — Windows privilege escalation.","category":"privesc","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"bloodhound","description":"Kali bloodhound — Active Directory graph analysis.","category":"privesc","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"searchsploit","description":"Kali searchsploit — ExploitDB search.","category":"exploit","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"autorecon","description":"Kali autorecon — Automated recon runner.","category":"recon","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"read_file","description":"Kali read_file — Read a file.","category":"file","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"write_file","description":"Kali write_file — Write a file.","category":"file","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"delete_file","description":"Kali delete_file — Delete a file.","category":"file","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"copy_file","description":"Kali copy_file — Copy a file.","category":"file","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"move_file","description":"Kali move_file — Move/rename a file.","category":"file","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"file_stat","description":"Kali file_stat — File metadata/stat.","category":"file","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"list_dir","description":"Kali list_dir — List directory contents.","category":"file","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"list","description":"Kali list — List tools.","category":"file","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"chmod","description":"Kali chmod — Change file permissions.","category":"file","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"shell","description":"Kali shell — Execute raw shell command.","category":"exploit","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}},{"name":"burpsuite","description":"Kali burpsuite — Burp Suite (headless).","category":"web","inputSchema":{"type":"object","properties":{"target":{"type":"string","description":"Target host/IP/domain/URL"},"additional_args":{"type":"string","description":"Extra CLI arguments"}}}}],"category":"web","type":"remote_http","description":"Remote MCP endpoint (http://10.30.20.177:5000)","endpointUrl":"http://10.30.20.177:5000","healthStatus":"unreachable","createdAt":"2026-08-14T00:41:20.273Z","updatedAt":"2026-08-14T02:20:16.778Z","lastPingMs":11,"lastPingAt":"2026-08-14T00:50:28.984Z"},{"id":"hermes-langfuse","name":"langfuse","enabled":true,"tools":[{"name":"health","description":"Check Langfuse service health","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_generations","description":"List LLM generations logged in Langfuse","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_traces","description":"List traces in Langfuse","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_trace","description":"Get a specific trace by ID with all observations","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_observations","description":"List observations (spans, events, generations)","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_sessions","description":"List tracked sessions","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_datasets","description":"List datasets for evaluation","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_generation","description":"Log a new LLM generation","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"dev","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/langfuse-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/langfuse-mcp","python","server.py"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.275Z","updatedAt":"2026-08-14T01:08:23.830Z"},{"id":"hermes-mcppaylocity","name":"mcppaylocity","enabled":true,"tools":[{"name":"fetch_employees","description":"\n        Fetch all employees for a company.\n        \n        Args:\n            company_id: Optional company ID (string or integer). If not provided, uses the first company ID from configuration.\n        ","category":"custom","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"fetch_employee_details","description":"\n        Fetch details for a specific employee.\n        \n        Args:\n            company_id: Optional company ID (string or integer). If not provided, uses the first company ID from configuration.\n            employee_id: Employee ID (string or integer) to get details for.\n        ","category":"custom","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"fetch_employee_earnings","description":"\n        Fetch earnings data for a specific employee.\n        \n        Args:\n            company_id: Optional company ID (string or integer). If not provided, uses the first company ID from configuration.\n            employee_id: Employee ID (string or integer) to get earnings for.\n        ","category":"custom","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"fetch_company_codes","description":"\n        Fetch company codes for a specific resource.\n        \n        Args:\n            company_id: Optional company ID (string or integer). If not provided, uses the first company ID from configuration.\n            code_resource: Code resource to fetch (e.g., 'earnings', 'deductions', 'costcenter1', etc.)\n        ","category":"custom","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"fetch_employee_local_taxes","description":"\n        Fetch local taxes for a specific employee.\n        \n        Args:\n            company_id: Optional company ID (string or integer). If not provided, uses the first company ID from configuration.\n            employee_id: Employee ID (string or integer) to get local taxes for.\n        ","category":"custom","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"fetch_employee_paystatement_details","description":"\n        Fetch pay statement details for a specific employee, year and check date.\n        \n        Args:\n            company_id: Optional company ID (string or integer). If not provided, uses the first company ID from configuration.\n            employee_id: Employee ID (string or integer) to get pay statement details for.\n            year: The year to get pay statement details for.\n            check_date: The check date to get pay statement details for (format: MM/DD/YYYY).\n        ","category":"custom","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"custom","type":"runner_process","description":"/Users/drjones/.hermes/mcp-servers/mcppaylocity/.venv/bin/python -m mcppaylocity","runnerConfig":{"packageManager":"python","packageNameOrCommand":"/Users/drjones/.hermes/mcp-servers/mcppaylocity/.venv/bin/python","args":["-m","mcppaylocity"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.277Z","updatedAt":"2026-08-14T01:08:23.843Z"},{"id":"hermes-n8n","name":"n8n","enabled":true,"tools":[{"name":"list_workflows","description":"List n8n workflows. Optionally filter by active status.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_workflow","description":"Get workflow details by ID.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"activate_workflow","description":"Activate a workflow by ID.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"deactivate_workflow","description":"Deactivate a workflow by ID.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_executions","description":"List recent workflow executions.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_workflow_tags","description":"List all workflow tags.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"health","description":"Check n8n server health.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_credentials","description":"List credential types configured in n8n.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"dev","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/hermes-n8n-mcp python -m server","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/hermes-n8n-mcp","python","-m","server"],"env":{"N8N_API_KEY":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxNjA1MWE5MS0zYmUwLTQzMDQtYWQ3My03NmY4ZTA2ODhmMDUiLCJpc3MiOiJuOG4iLCJhdWQiOiJwdWJsaWMtYXBpIiwianRpIjoiZDg2MThiYjktMGZjOC00NDk0LWI5N2QtZjA3ZmViNDMwNmM1IiwiaWF0IjoxNzg1NjM2NDQzfQ.TK7Yzxgwd0PPAj6TuXJAYyh1-_FLfGTPaWb7UYpaU5U","N8N_URL":"http://10.30.20.236:5678"}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.279Z","updatedAt":"2026-08-14T01:08:23.859Z"},{"id":"hermes-netalertx","name":"netalertx","enabled":false,"tools":[{"name":"health","description":"Check NetAlertX web UI reachability.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"device_count","description":"Return NetAlertX device count via SSH/docker sqlite.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"recent_devices","description":"List recently connected NetAlertX devices.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"dev","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/netalertx-http-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/netalertx-http-mcp","python","server.py"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.281Z","updatedAt":"2026-08-14T01:08:23.875Z"},{"id":"hermes-obsidian","name":"obsidian","enabled":true,"tools":[{"name":"obsidian_list_files_in_dir","description":"Lists all files and directories that exist in a specific Obsidian directory.","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"obsidian_list_files_in_vault","description":"Lists all files and directories in the root directory of your Obsidian vault.","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"obsidian_get_file_contents","description":"Return the content of a single file in your vault.","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"obsidian_simple_search","description":"Simple search for documents matching a specified text query across all files in the vault. \n            Use this tool when you want to do a simple text search","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"obsidian_patch_content","description":"Insert content into an existing note relative to a heading, block reference, or frontmatter field. For target_type='heading', target must be the fully qualified heading path joined with '::' (e.g. 'Outer::Inner'). Bare heading names (without '::') will be auto-qualified if they match exactly one heading in the file.","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"obsidian_append_content","description":"Append content to a new or existing file in the vault.","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"obsidian_put_content","description":"Creates a new file, or COMPLETELY OVERWRITES the content of an existing file. The previous content is lost. Use `obsidian_append_content` to add content to a file without erasing what's already there. Use `obsidian_patch_content` to modify a specific heading, block or frontmatter field while keeping the rest intact.","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"obsidian_delete_file","description":"Delete a file or directory from the vault.","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"obsidian_complex_search","description":"Complex search for documents using a JsonLogic query. \n           Supports standard JsonLogic operators plus 'glob' and 'regexp' for pattern matching. Results must be non-falsy.\n\n           Use this tool when you want to do a complex search, e.g. for all documents with certain tags etc.\n           ALWAYS follow query syntax in examples.\n\n           Examples\n            1. Match all markdown files\n            {\"glob\": [\"*.md\", {\"var\": \"path\"}]}\n\n            2. Match all markdown files with 1221 substring inside them\n            {\n              \"and\": [\n                { \"glob\": [\"*.md\", {\"var\": \"path\"}] },\n                { \"regexp\": [\".*1221.*\", {\"var\": \"content\"}] }\n              ]\n            }\n\n            3. Match all markdown files in Work folder containing name Keaton\n            {\n              \"and\": [\n                { \"glob\": [\"*.md\", {\"var\": \"path\"}] },\n                { \"regexp\": [\".*Work.*\", {\"var\": \"path\"}] },\n                { \"regexp\": [\"Keaton\", {\"var\": \"content\"}] }\n              ]\n            }\n           ","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"obsidian_search_by_tag","description":"Find all notes carrying a specific tag. Matches the note's parsed tag set (YAML frontmatter `tags:` plus inline `#tag` occurrences), so hits on the tag name inside ordinary prose are NOT returned. Pass the tag without the leading '#'. Hierarchical-tag matching is exact — searching for 'work' will not match notes tagged 'work/tasks'. Optionally scope to a vault subdirectory.","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"obsidian_get_frontmatter","description":"Return just the YAML frontmatter of a note as a parsed JSON object. Lighter than obsidian_get_file_contents when you only need metadata (tags, aliases, status fields, etc.). Returns an empty object for notes without frontmatter.","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"obsidian_batch_get_file_contents","description":"Return the contents of multiple files in your vault, concatenated with headers.","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"obsidian_get_periodic_note","description":"Get current periodic note for the specified period.","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"obsidian_get_recent_periodic_notes","description":"Get most recent periodic notes for the specified period type.","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"obsidian_get_recent_changes","description":"Get recently modified files in the vault.","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"memory","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/obsidian-mcp python -c from mcp_obsidian import main; main()","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/obsidian-mcp","python","-c","from mcp_obsidian import main; main()"],"env":{"OBSIDIAN_API_KEY":"fd8933fcfdae9785d36f8dd97f319a05164b5716a014e4ca5ef83e27a30b0621"}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.283Z","updatedAt":"2026-08-14T01:08:23.891Z"},{"id":"hermes-ollama-jr","name":"ollama-jr","enabled":true,"tools":[{"name":"ollama_chat","description":"Chat with a model using conversation messages. Supports system messages, multi-turn conversations, tool calling, and generation options.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"ollama_copy","description":"Copy a model. Creates a duplicate of an existing model with a new name.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"ollama_create","description":"Create a new model with structured parameters. Allows customization of model behavior, system prompts, and templates.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"ollama_delete","description":"Delete a model from local storage. Removes the model and frees up disk space.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"ollama_embed","description":"Generate embeddings for text input. Returns numerical vector representations.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"ollama_generate","description":"Generate completion from a prompt. Simpler than chat, useful for single-turn completions.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"ollama_list","description":"List all available Ollama models installed locally. Returns model names, sizes, and modification dates.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"ollama_ps","description":"List running models. Shows which models are currently loaded in memory.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"ollama_pull","description":"Pull a model from the Ollama registry. Downloads the model to make it available locally.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"ollama_push","description":"Push a model to the Ollama registry. Uploads a local model to make it available remotely.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"ollama_show","description":"Show detailed information about a specific model including modelfile, parameters, and architecture details.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"ollama_web_fetch","description":"Fetch a web page by URL using Ollama's web fetch API. Returns the page title, content, and links. Requires OLLAMA_API_KEY environment variable.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"ollama_web_search","description":"Perform a web search using Ollama's web search API. Augments models with latest information to reduce hallucinations. Requires OLLAMA_API_KEY environment variable.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"custom","type":"runner_process","description":"npx -y ollama-mcp","runnerConfig":{"packageManager":"npx","packageNameOrCommand":"npx","args":["-y","ollama-mcp"],"env":{"OLLAMA_HOST":"http://10.30.20.186:11434"}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.286Z","updatedAt":"2026-08-14T01:08:23.909Z"},{"id":"hermes-osint","name":"osint","enabled":true,"tools":[{"name":"run","description":"","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"sysinfo","description":"","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"whois","description":"","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"dig_dns","description":"","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"nmap_scan","description":"","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"web","type":"remote_http","description":"Remote MCP endpoint (http://10.30.20.66:8000)","endpointUrl":"http://10.30.20.66:8000","healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.289Z","updatedAt":"2026-08-14T02:22:07.139Z"},{"id":"hermes-paddle","name":"paddle","enabled":true,"tools":[{"name":"list_products","description":"\nThis tool will list products in the account's catalog.\n\nUse the maximum perPage by default (200) to ensure comprehensive results.\nFilter products by id, status, taxCategory, and type as needed.\nResults are paginated - use the 'after' parameter with the last ID from previous results to get the next page.\nSort and order results using the orderBy parameter.\nAmounts are in the smallest currency unit (e.g., cents).\n\nUse the include parameter to include related entities in the response:\n\n- prices: An array of price entities tied to the product.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_product","description":"\nThis tool will create a new product in Paddle.\n\nProduct entities describe the items that customers can purchase. Products work with prices, which describe how much a product costs and how often it's billed.\n\nFor imageUrl, images must be hosted on an HTTPS server that's publicly accessible. Paddle doesn't upload product images to a CDN. It's recommended to use square images (1:1 ratio).\n\nWhen selecting a taxCategory, choose the one that best describes the product:\n\n- digital-goods: Non-customizable digital files or media (not software) acquired with an up front payment that can be accessed without any physical product being delivered.\n- ebooks: Digital books and educational material which is sold with permanent rights for use by the customer.\n- implementation-services: Remote configuration, set-up, and integrating software on behalf of a customer.\n- professional-services: Services that involve the application of expertise and specialized knowledge of a software product.\n- saas: Products that allow users to connect to and use online or cloud-based applications over the Internet.\n- software-programming-services: Services that can be used to customize and white label software products.\n- standard: Software products that are pre-written and can be downloaded and installed onto a local device.\n- training-services: Training and education services related to software products.\n- website-hosting: Cloud storage service for personal or corporate information, assets, or intellectual property.\n\nThe tax category affects how taxes are calculated in different jurisdictions. Choose carefully as it impacts customers' tax rates.\nWhen using the standard tax category, remind the user to review the tax category in the Paddle dashboard.\n\n\nEnsure you have all the information needed before making the call. Don't fabricate, imagine, or infer details and parameter values unless explicitly asked to. If anything is ambiguous, unknown, or unclear, ask the user for clarification or details before you proceed.\n\n\nIf successful, the response includes a copy of the new product entity. Once a product has been created, relate it to a price.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_product","description":"\nThis tool will retrieve a product from Paddle by its ID.\n\nUse the include parameter to include related entities in the response:\n\n- prices: An array of price entities available for the product.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_prices","description":"\nThis tool will list prices in the account's catalog.\n\nUse the maximum perPage by default (200) to ensure comprehensive results.\nFilter prices by id, productId, status, recurring, and type as needed.\nResults are paginated - use the 'after' parameter with the last ID from previous results to get the next page.\nSort and order results using the orderBy parameter.\nAmounts are in the smallest currency unit (e.g., cents).\n\nUse the include parameter to include related entities in the response:\n\n- product: An object for the product entity that's tied to the price.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_price","description":"\nThis tool will create a new price in Paddle.\n\nPrices describe how to charge for products. Always include a productId in the request to relate the price to a product.\n\nIf the quantity object is omitted, Paddle automatically sets a minimum of 1 and a maximum of 100. This means the most units that a customer can buy is 100. Set a quantity to offer a different amount.\n\nWhen selecting type, choose the one that best describes the use case:\n\n- custom: Non-catalog item. Typically created for a specific transaction or subscription. Not returned when listing or shown in the Paddle dashboard.\n- standard: Standard item. Can be considered part of the catalog and reused across transactions and subscriptions easily.\n\nWhen selecting taxMode, choose the one that best describes how the tax should be calculated for the price:\n\n- account_setting: Price uses the setting from the account. Default.\n- external: Price is exclusive of tax. Common in European countries.\n- internal: Price is inclusive of tax. Common in countries like the United States and Canada.\n\nWhen using unitPriceOverrides:\n- Group countries based on purchasing power parity (PPP), not just currency zones\n- Create separate overrides for countries with different economic conditions even if they share the same currency (e.g., Greece and Ireland should have different price points)\n- Adjust prices relative to local economic conditions - higher in wealthy markets, lower in developing economies\n- For optimal conversion rates, set prices using local market research and willingness-to-pay data\n- Use local currencies where preferred by the customer\n\nExample unitPriceOverrides structure:\n[\n  {\n    \"countryCodes\": [\"GB\"],\n    \"unitPrice\": {\n      \"amount\": \"8500\",\n      \"currencyCode\": \"GBP\"\n    }\n  },\n  {\n    \"countryCodes\": [\"IE\"],\n    \"unitPrice\": {\n      \"amount\": \"9500\",\n      \"currencyCode\": \"EUR\"\n    }\n  },\n  {\n    \"countryCodes\": [\"GR\"],\n    \"unitPrice\": {\n      \"amount\": \"6500\",\n      \"currencyCode\": \"EUR\"\n    }\n  },\n  {\n    \"countryCodes\": [\"IN\"],\n    \"unitPrice\": {\n      \"amount\": \"30000\",\n      \"currencyCode\": \"INR\"\n    }\n  },\n  {\n    \"countryCodes\": [\"CN\"],\n    \"unitPrice\": {\n      \"amount\": \"20000\",\n      \"currencyCode\": \"CNY\"\n    }\n  }\n]\n\n\nEnsure you have all the information needed before making the call. Don't fabricate, imagine, or infer details and parameter values unless explicitly asked to. If anything is ambiguous, unknown, or unclear, ask the user for clarification or details before you proceed.\n\n\nIf successful, the response includes a copy of the new price entity.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_price","description":"\nThis tool will retrieve a price from Paddle by its ID.\n\nUse the include parameter to include related entities in the response:\n\n- product: An object for the product entity tied to the price.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_discounts","description":"\nThis tool will list discounts in the account's catalog.\n\nUse the maximum perPage by default (200) to ensure comprehensive results.\nFilter discounts by code, id, status, and mode as needed.\nResults are paginated - use the 'after' parameter with the last ID from previous results to get the next page.\nSort and order results using the orderBy parameter.\n\nAmounts are in the smallest currency unit (e.g., cents).\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_discount","description":"\nThis tool will create a new discount in Paddle.\n\nDiscounts reduce a transaction total. They're sometimes called coupons or promo codes.\n\nUse discount codes to let customers apply discounts themselves at checkout, or apply discounts manually to transactions as part of the sales process.\n\nDiscounts can be added to a discount group to organize them. Only one discount group can be added at a time. List discounts by discount groups with the list_discount_groups tool to see which discounts are in which groups.\n\nWhen selecting type, choose the one that best describes how to apply the discount to the total:\n\n- flat: Discounts a checkout or transaction by a flat amount, for example -$100. Requires currencyCode.\n- flat_per_seat: Discounts a checkout or transaction by a flat amount per unit, for example -$100 per user. Requires currencyCode.\n- percentage: Discounts a checkout or transaction by a percentage of the total, for example -10%. Maximum 100%.\n\nWhen selecting mode, choose the one that best describes the use case:\n\n- standard: Standard discount. Can be considered part of the listed catalog and reused across transactions and subscriptions easily.\n- custom: Non-catalog discount. Custom, one-off discounts. Includes checkout recovery discounts. Not returned when listing or shown in the Paddle dashboard.\n\n\nEnsure you have all the information needed before making the call. Don't fabricate, imagine, or infer details and parameter values unless explicitly asked to. If anything is ambiguous, unknown, or unclear, ask the user for clarification or details before you proceed.\n\n\nIf successful, the response includes a copy of the new discount entity. Discounts can be applied to transactions, subscriptions, or passed to checkout through Paddle.js.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_discount","description":"\nThis tool will retrieve a discount from Paddle by its ID.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_discount_groups","description":"\nThis tool will list discount groups in the account's catalog.\n\nUse the maximum perPage by default (200) to ensure comprehensive results.\nFilter discount groups by id as needed.\nResults are paginated - use the 'after' parameter with the last ID from previous results to get the next page.\nSort and order results using the orderBy parameter.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_discount_group","description":"\nThis tool will create a new discount group in Paddle.\n\nDiscount groups are used to organize and manage related discounts under a group name. Create one when managing multiple discounts together, like for a campaign, promotion, or team.\n\n\nEnsure you have all the information needed before making the call. Don't fabricate, imagine, or infer details and parameter values unless explicitly asked to. If anything is ambiguous, unknown, or unclear, ask the user for clarification or details before you proceed.\n\n\nIf successful, the response includes a copy of the new discount group entity.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_discount_group","description":"\nThis tool will retrieve a discount group from Paddle by its ID.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_customers","description":"\nThis tool will list customers in Paddle.\n\nUse the maximum perPage by default (200) to ensure comprehensive results.\nFilter customers by email, id, search (fuzzy search on the customer's name), and status as needed.\nResults are paginated - use the 'after' parameter with the last ID from previous results to get the next page.\nSort and order results using the orderBy parameter.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_customer","description":"\nThis tool will create a new customer in Paddle.\n\nCustomer entities hold information about the people and businesses that make purchases.\n\nCustomers have two sub-entities: \n\n- addresses: Customers require an address to make a purchase, which can be created through the create_address tool. Can have multiple addresses.\n- businesses: Customers can optionally be associated with businesses, which can be created through the create_business tool.\n\n\nEnsure you have all the information needed before making the call. Don't fabricate, imagine, or infer details and parameter values unless explicitly asked to. If anything is ambiguous, unknown, or unclear, ask the user for clarification or details before you proceed.\n\n\nIf successful, the response includes a copy of the new customer entity.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_customer","description":"\nThis tool will retrieve a customer from Paddle by its ID.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_addresses","description":"\nThis tool will list addresses for a customer in Paddle.\n\nUse the maximum perPage by default (200) to ensure comprehensive results.\nFilter addresses by id, search (fuzzy search on the address's street, city, state, postalCode, or country), and status as needed.\nResults are paginated - use the 'after' parameter with the last ID from previous results to get the next page.\nSort and order results using the orderBy parameter.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_address","description":"\nThis tool will create a new address for a customer in Paddle.\n\nAddress entities hold billing address information for a customer. Customers must have an address to make a purchase. A transaction can be created without an address, but it can't go past a status of draft until an address is added.\n\nTo make buying as frictionless as possible, Paddle only requires a country. For tax calculation, fraud prevention, and compliance purposes, postalCode is required when creating addresses for some countries, like ZIP codes in the USA and postcodes in the UK.\n\n\nEnsure you have all the information needed before making the call. Don't fabricate, imagine, or infer details and parameter values unless explicitly asked to. If anything is ambiguous, unknown, or unclear, ask the user for clarification or details before you proceed.\n\n\nIf successful, the response includes a copy of the new address entity.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_address","description":"\nThis tool will retrieve an address for a customer from Paddle using its ID and related customer ID.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_businesses","description":"\nThis tool will list businesses for a customer in Paddle.\n\nUse the maximum perPage by default (200) to ensure comprehensive results.\nFilter businesses by id, search (fuzzy search on the business's name or tax or VAT number), and status as needed.\nResults are paginated - use the 'after' parameter with the last ID from previous results to get the next page.\nSort and order results using the orderBy parameter.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_business","description":"\nThis tool will create a new business for a customer in Paddle.\n\nBusiness entities hold business information for a customer when working with a business rather than an individual. Customers do not need to have a business to make a purchase, but should if working with a business.\n\n\nEnsure you have all the information needed before making the call. Don't fabricate, imagine, or infer details and parameter values unless explicitly asked to. If anything is ambiguous, unknown, or unclear, ask the user for clarification or details before you proceed.\n\n\nIf successful, the response includes a copy of the new business entity.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_business","description":"\nThis tool will retrieve a business for a customer from Paddle using its ID and related customer ID.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_transactions","description":"\nThis tool will list transactions in Paddle.\n\nUse the maximum perPage by default (30) to ensure comprehensive results.\nFilter transactions by billedAt, collectionMode, createdAt, customerId, id, invoiceNumber, origin, status, subscriptionId, and updatedAt as needed.\nResults are paginated - use the 'after' parameter with the last ID from previous results to get the next page.\nSort and order results using the orderBy parameter.\nAmounts are in the smallest currency unit (e.g., cents).\n\nUse the include parameter to include related entities in the response:\n\n- address: An object for the address entity related to this transaction. Only returned if an address is set against the transaction.\n- adjustments: An array of adjustment entities related to this transaction. Only returned if adjustments have been created against the transaction.\n- adjustments_totals: An object containing totals for all adjustments on a transaction. Only returned if adjustments have been created against the transaction.\n- available_payment_methods: An array of payment methods that are available to use for this transaction. \n- business: An object for the business entity related to this transaction. Only returned if a business is set against the transaction.\n- customer: An object for the customer entity related to this transaction. Only returned if a customer is set against the transaction.\n- discount: An object for the discount entity related to this transaction. Only returned if a discount is set against the transaction.\n\nTransactions have a collectionMode that determines how Paddle tries to collect for payment:\n\n- automatic: Payment is collected automatically using a checkout initially, then using a payment method on file.\n- manual: Payment is collected manually. Customers are sent an invoice with payment terms and can make a payment offline or using a checkout. Requires billingDetails.\n\nTransactions have a status that determines the current state of the transaction:\n\n- draft: Transaction is missing required fields. Typically the first stage of a checkout before customer details are captured.\n- ready: Transaction has all of the required fields to be marked as billed or completed.\n- billed: Transaction has been updated to billed. Billed transactions get an invoice number and are considered a legal record. They can't be changed. Typically used as part of an invoice workflow.\n- paid: Transaction is fully paid, but has not yet been processed internally.\n- completed: Transaction is fully paid and processed.\n- canceled: Transaction has been updated to canceled. If an invoice, it's no longer due.\n- past_due: Transaction is past due. Occurs for automatically-collected transactions when the related subscription is in dunning, and for manually-collected transactions when payment terms have elapsed.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_transaction","description":"\nThis tool will create a new transaction in Paddle.\n\n\nDon't use this tool without checking with the user first. Avoid using before gaining explicit approval.\n\n\nThe collectionMode against a transaction determines how Paddle tries to collect for payment:\n\n- Manually-collected transactions are for sales-assisted billing. Paddle sends an invoice to the customer when a transaction is billed. Payment is often by wire transfer. Requires billingDetails, and an address which has country, postalCode, region, city, and firstLine.\n- Automatically-collected transactions are for payments collected automatically using a self-serve checkout where payment is collected using a checkout. Pass the transaction to a checkout or use the returned checkout.url to collect for payment. checkout.url is a unique Paddle payment link composed of the URL passed as checkout.url, or the default payment URL on the account, with ?_ptxn= and the Paddle ID for this transaction appended to the URL.\n\nTransactions have a status. Set the status or omit it to have Paddle set it. It's only recommended to set the status manually if working with manually-collected transactions as part of an invoicing workflow. Options are:\n\n- billed: Marks as finalized and can't be updated, only canceled. This is essentially issuing an invoice. At this point, it becomes a legal record so it can't be changed. Paddle automatically assigns an invoice number, creates a related subscription, and sends it to the customer.\n- canceled: Canceled transactions are no longer due. This is only for record purposes on creation.\n\nWhen status is omitted, transactions are initially created with the status of draft or ready:\n\n- Draft transactions have items against them, but don't have all of the required fields for billing. Paddle creates draft transactions automatically when a checkout is opened.\n- Paddle automatically marks transactions as ready when all of the required fields are present for billing. This includes customerId and addressId for automatically-collected transactions, and billingDetails for manually-collected transactions.\n\nWhen a transaction has items which are recurring, and the transaction has a status of billed when manually-collected or completed when automatically-collected, Paddle automatically creates a related subscription for the items on the transaction. Use the returned subscriptionId to get the subscription entity.\n\nUse the include parameter to include related entities in the response:\n\n- address: An object for the address entity related to this transaction. Only returned if an address is set against the transaction with addressId.\n- available_payment_methods: An array of payment methods that are available to use for this transaction. \n- business: An object for the business entity related to this transaction. Only returned if a business is set against the transaction with businessId.\n- customer: An object for the customer entity related to this transaction. Only returned if a customer is set against the transaction with customerId.\n- discount: An object for the discount entity related to this transaction. Only returned if a discount is set against the transaction with discount or discountId.\n\n\nEnsure you have all the information needed before making the call. Don't fabricate, imagine, or infer details and parameter values unless explicitly asked to. If anything is ambiguous, unknown, or unclear, ask the user for clarification or details before you proceed.\n\n\nConsider using the preview_transaction_create tool to preview and confirm the transaction before creating it.\n\nIf successful, the response includes a copy of the new transaction entity.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_transaction","description":"\nThis tool will retrieve a transaction from Paddle by its ID.\n\nUse the include parameter to include related entities in the response:\n\n- address: An object for the address entity related to this transaction. Only returned if an address is set against the transaction.\n- adjustments: An array of adjustment entities related to this transaction. Only returned if adjustments have been created against the transaction.\n- adjustments_totals: An object containing totals for all adjustments on a transaction. Only returned if adjustments have been created against the transaction.\n- available_payment_methods: An array of payment methods that are available to use for this transaction. \n- business: An object for the business entity related to this transaction. Only returned if a business is set against the transaction.\n- customer: An object for the customer entity related to this transaction. Only returned if a customer is set against the transaction.\n- discount: An object for the discount entity related to this transaction. Only returned if a discount is set against the transaction.\n\nTransactions have a collectionMode that determines how Paddle tries to collect for payment:\n\n- automatic: Payment is collected automatically using a checkout initially, then using a payment method on file.\n- manual: Payment is collected manually. Customers are sent an invoice with payment terms and can make a payment offline or using a checkout. Requires billingDetails.\n\nTransactions have a status that determines the current state of the transaction:\n\n- draft: Transaction is missing required fields. Typically the first stage of a checkout before customer details are captured.\n- ready: Transaction has all of the required fields to be marked as billed or completed.\n- billed: Transaction has been updated to billed. Billed transactions get an invoice number and are considered a legal record. They can't be changed. Typically used as part of an invoice workflow.\n- paid: Transaction is fully paid, but has not yet been processed internally.\n- completed: Transaction is fully paid and processed.\n- canceled: Transaction has been updated to canceled. If an invoice, it's no longer due.\n- past_due: Transaction is past due. Occurs for automatically-collected transactions when the related subscription is in dunning, and for manually-collected transactions when payment terms have elapsed.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"preview_prices","description":"\nThis tool will preview price calculations for one or more prices.\n\nConsider using the preview_transaction_create tool for more advanced and accurate pricing calculations or for all manually-collected invoiced transactions.\n\nProviding location information when previewing prices allows Paddle to calculate tax or automatically localize prices. Provide one of the following:\n\n- customer_ip_address: Paddle fetches location using the IP address to calculate totals.\n- address: Paddle uses the country and ZIP code (where supplied) to calculate totals.\n- customerId, addressId, businessId: Paddle uses existing customer data to calculate totals. Typically used for logged-in customers.\n\nEach line item includes formattedUnitTotals and formattedTotals objects that return totals formatted for the country or region being worked with, including the currency symbol.\n\nIf successful, the response includes the data sent with a details object that includes totals for the supplied prices.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"preview_transaction_create","description":"\nThis tool will preview a transaction without creating a transaction entity.\n\nConsider using the preview_prices tool for simpler pricing calculations where payment is often taken through checkout.\n\nProviding location information when previewing a transaction allows Paddle to calculate tax or automatically localize prices. Provide one of the following:\n\n- customer_ip_address: Paddle fetches location using the IP address to calculate totals.\n- address: Paddle uses the country and ZIP code (where supplied) to calculate totals.\n- customerId, addressId, businessId: Paddle uses existing customer data to calculate totals. Typically used for logged-in customers.\n\nExclude items from the total calculation using the includeInTotals boolean.\n\nBy default, recurring items with trials are considered to have a zero charge when previewing. Set ignoreTrials to true to ignore trial periods against prices for transaction preview calculations.\n\nTransaction previews don't create transactions, so no id is returned.\n\nIf successful, the response includes the data sent with a details object that includes totals for the supplied prices.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_transaction_invoice","description":"\nThis tool will retrieve a link to an invoice PDF for a transaction from Paddle.\n\nInvoice PDFs are available for both automatically and manually-collected transactions:\n\n- The PDF for manually-collected transactions includes payment terms, purchase order number, and notes for the customer. It's a demand for payment from the customer. Available for transactions billed or completed.\n- The PDF for automatically-collected transactions lets the customer know that payment was taken successfully. Customers may require this for for tax-reporting purposes. Available for transactions completed.\n\nInvoice PDFs aren't available for zero-value transactions.\n\nThe link returned isn't a permanent link. It expires after an hour.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_adjustments","description":"\nThis tool will list adjustments in Paddle.\n\nUse the maximum perPage by default (50) to ensure comprehensive results.\nFilter adjustments by action, customerId, status, subscriptionId, transactionId, and id as needed.\nResults are paginated - use the 'after' parameter with the last ID from previous results to get the next page.\nSort and order results using the orderBy parameter.\n\nAmounts are in the smallest currency unit (e.g., cents).\n\nAdjustments have an action that determines how the adjustment impacts the related transaction:\n\n- credit: Credits some or all the related transaction. Can be created manually.\n- refund: Refunds some or all the related transaction. Must be approved by Paddle in most cases. Can be created manually.\n- chargeback: Chargeback for the related transaction. Automatically created by Paddle when a customer successfully disputes a charge.\n- chargeback_reverse: Reversal of a chargeback for the related transaction. Automatically created by Paddle when Paddle contests a chargeback successfully.\n- chargeback_warning: Warning of an upcoming chargeback for the related transaction. Automatically created by Paddle.\n- chargeback_warning_reverse: Reversal of a chargeback warning for the related transaction. Automatically created by Paddle.\n- credit_reverse: Reversal of a credit for the related transaction. Automatically created by Paddle.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_adjustment","description":"\nThis tool will create an adjustment to refund or credit all or part of a transaction and its items. \n\nBilled transactions are considered financial records for tax and legal purposes, so they can't be changed. Adjustments record actions that impact revenue for a transaction after it's been billed.\n\n\nDon't use this tool without checking with the user first. Avoid using before gaining explicit approval.\n\n\nThe transaction ID and the IDs of any transaction items (details.lineItems[].id) are required to create a refund or credit.\n\nAn adjustment can have an action of credit or refund:\n\n- Refunds return an amount to a customer's original payment method. Create refund adjustments for transactions that are completed.\n- Credits reduce the amount that a customer has to pay for a transaction. Create credit adjustments for manually-collected transactions that are billed or past_due.\n\nMost refunds for live accounts are created with the status of pending_approval until reviewed by Paddle, but some are automatically approved. For sandbox accounts, Paddle automatically approves refunds every ten minutes.\n\nOther action types (chargeback, chargeback_reverse, chargeback_warning, chargeback_warning_reverse, credit_reverse) are automatically created by Paddle and can't be set manually.\n\nAdjustments can apply to some or all items on a transaction by defining the type:\n\n- full: The grand total for the related transaction is adjusted.\n- partial: Some line items for the related transaction are adjusted. Requires items.\n\nWhen selecting taxMode, choose the one that best describes how the tax should be calculated for the adjustment:\n\n- external: Amounts are exclusive of tax. Common in European countries.\n- internal: Amounts are inclusive of tax. Common in countries like the United States and Canada.\n\nCreating an adjustment for a transaction that has a refund that's pending approval isn't possible.\n\n\nEnsure you have all the information needed before making the call. Don't fabricate, imagine, or infer details and parameter values unless explicitly asked to. If anything is ambiguous, unknown, or unclear, ask the user for clarification or details before you proceed.\n\n\nIf successful, the response includes a copy of the new adjustment entity.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_adjustment_credit_note","description":"\nThis tool will retrieve a link to a credit note PDF for an adjustment from Paddle.\n\nCredit note PDFs are created for refunds and credits as a record of an adjustment. Return this if record is needed to be given to the customer immediately after the adjustment is created.\n\nThe link returned is not a permanent link. It expires after an hour.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_credit_balances","description":"\nThis tool will list credit balances in each currency for a customer.\n\nCredit balances are created automatically by Paddle when a customer takes an action that results in Paddle creating a credit for a customer, like making prorated changes to a subscription. These are transaction credits, not promotional credits like from discounts.\n\nEach balance has three totals:\n\n- available: Total available to use.\n- reserved: Total temporarily reserved for billed transactions.\n- used: Total amount of credit used.\n\nCredit is added to the available total initially. When used, it moves to the used total.\n\nThe reserved total is used when a credit balance is applied to a transaction that's marked as billed, like when working with an issued invoice. It's not available for other transactions at this point, but isn't considered used until the transaction is completed. If a billed transaction is canceled, any reserved credit moves back to available.\n\nA credit balance can only be used for transactions in the same currency.\n\nAdding to a credit balance directly isn't possible. Create a credit adjustment with the create_adjustment tool to reduce the amount due to pay for a transaction instead.\n\nFilter credit balances by currencyCode as needed.\nAmounts are in the smallest currency unit (e.g., cents).\n\nThe response isn't paginated. An empty array is returned if a customer has no credit balances.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_subscription","description":"\nThis tool will retrieve a subscription from Paddle by its ID.\n\nUse the include parameter to include related entities in the response:\n\n- next_transaction: Include an object with a preview of the next transaction for this subscription. May include prorated charges that aren't yet billed and one-time charges.\n- recurring_transaction_details: Include an object with a preview of the recurring transaction for this subscription. This is what the customer can expect to be billed when there are no prorated or one-time charges.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_subscriptions","description":"\nThis tool will list subscriptions in Paddle.\n\nUse the maximum perPage by default (200) to ensure comprehensive results.\nFilter subscriptions by addressId, collectionMode, customerId, id, priceId, scheduledChangeAction, and status as needed.\nResults are paginated - use the 'after' parameter with the last ID from previous results to get the next page.\nSort and order results using the orderBy parameter.\n\nAmounts are in the smallest currency unit (e.g., cents).\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"preview_subscription_update","description":"\nThis tool will preview an update for a subscription without applying those changes.\n\nIt's best practice to preview every time before updating the subscription to confirm the changes are as expected, especially when making updates to items, billing periods, and anything affecting proration.\n\nThe updateSummary object contains details of prorated credits and charges created, along with the overall result of the update.\n\nIf successful, the response includes immediateTransaction, nextTransaction, and recurringTransactionDetails to see expected transactions for the changes.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_subscription_charge","description":"\nThis tool will create a one-time charge for a subscription in Paddle. Use to bill non-recurring items to a subscription. Non-recurring items are price entities where the billingCycle is null.\n\n\nDon't use this tool without checking with the user first. Avoid using before gaining explicit approval.\n\n\nWhen selecting effectiveFrom, choose the one that best describes when the one-time charges should be billed:\n\n- next_billing_period: Bill for one-time charges on the next billing period. Paddle adds the charges to the transaction created when the subscription next renews.\n- immediately: Bill for one-time charges now. Paddle creates a transaction for them right away. For automatically-collected subscriptions, responses may take longer than usual while a payment attempt is processed.\n\nWhen selecting onPaymentFailure, choose the one that best describes how Paddle should handle subscription updates when payment fails during one-time charges:\n\n- prevent_change: Prevent the change to the subscription from applying.\n- apply_change: Apply the change and update the subscription.\n\nOnce created, to get details of a one-time charge:\n\n- When created with effectiveFrom as next_billing_period, get the subscription the charge was billed to and use the include query parameter with the nextTransaction value.\n- When created with effectiveFrom as immediately, list transactions and use the subscriptionId query parameter with the subscription ID of the subscription the charge was billed to.\n\nWhen an update results in an immediate charge, responses may take longer than usual while a payment attempt is processed.\n\n\nEnsure you have all the information needed before making the call. Don't fabricate, imagine, or infer details and parameter values unless explicitly asked to. If anything is ambiguous, unknown, or unclear, ask the user for clarification or details before you proceed.\n\n\nIf successful, the response includes a copy of the updated subscription entity. However, one-time charges aren't held against the subscription entity, so the charges billed aren't returned in the response.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"preview_subscription_charge","description":"\nThis tool will preview creating a one-time charge for a subscription without billing that charge, typically used for previewing calculations before making changes to a subscription.\n\nOne-time charges are non-recurring items. These are price entities where the billingCycle is null.\n\nIf successful, the response includes immediateTransaction, nextTransaction, and recurringTransactionDetails to see expected transactions for the changes.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_saved_payment_methods","description":"\nThis tool will list payment methods for a customer in Paddle.\n\nThese are payment methods saved by the customer at checkout to be presented for future purchases. They aren't payment methods stored for transactions related to a recurring subscription. View a customers most recently used payment method for purchases or subscriptions by listing transactions (with the list_transactions tool) with a filter of customerId or subscriptionId, and looking at the returned payments[].methodDetails object.\n\nUse the maximum perPage by default (200) to ensure comprehensive results.\nFilter payment methods by addressId and supportsCheckout as needed.\nResults are paginated - use the 'after' parameter with the last ID from previous results to get the next page.\nSort and order results using the orderBy parameter.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_saved_payment_method","description":"\nThis tool will retrieve a payment method for a customer from Paddle using its ID and related customer ID.\n\nThese are payment methods saved by the customer at checkout to be presented for future purchases. They aren't payment methods stored for transactions related to a recurring subscription. View a customers most recently used payment method for purchases or subscriptions by listing transactions (with the list_transactions tool) with a filter of customerId or subscriptionId, and looking at the returned payments[].methodDetails object.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_customer_portal_session","description":"\nThis tool will create a customer portal session for a customer in Paddle.\n\nThe customer portal is a secure, Paddle-hosted site that allows customers and authorized individuals to:\n\n- View transaction history\n- Download invoices\n- Update saved payment methods for future purchases\n- Update stored payment methods for subscriptions\n- Manage their subscriptions including cancellations\n- Revise details on completed transactions\n\n\nDon't use this tool without checking with the user first. Avoid using before gaining explicit approval.\n\n\nAuthenticated links are returned which automatically sign in the customer. Ensure those creating a customer portal session are authorized to access the customer portal.\n\n- urls.general.overview: Allows the customer to view their account information, transactions, and subscriptions.\n\nProvide subscriptionIds to return urls.subscriptions[] to manage one or more subscriptions directly:\n\n- urls.subscriptions[].updateSubscriptionPaymentMethod: Allows the customer to update the payment method for a subscription.\n- urls.subscriptions[].cancelSubscription: Allows the customer to cancel a subscription.\n\nIf subscriptions are paused or canceled, links open the overview page for a subscription.\n\nIf successful, the response includes a copy of the new customer portal session entity with the urls to open up the customer portal for access. Customer portal sessions are temporary and shouldn't be cached.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_notification_settings","description":"\nThis tool will list notification settings in Paddle.\n\nUse the maximum perPage by default (200) to ensure comprehensive results.\nFilter notification settings by active and trafficSource as needed.\nResults are paginated - use the 'after' parameter with the last ID from previous results to get the next page.\nSort and order results using the orderBy parameter.\n\nThe endpointSecretKey is returned for webhook signature verification, but is a secure value and should never be shared, never be made publicly-accessible, and should only be stored securely.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_notification_setting","description":"\nThis tool will create a new notification setting (notification destination) in Paddle.\n\nCreate notification destinations to get notifications, like webhooks, for events that happen in Paddle. Paddle recommends handling the storage and provisioning of access after purchase and subscription using webhooks.\n\nThe type describes how and where the event should be sent:\n\n- email: Deliver to an email address. Add the email address to the destination parameter.\n- url: Deliver to a webhook endpoint. Add the full URL including the path to the destination parameter.\n\nThe destination URL must be publicly accessible. localhost is not a valid address. For local development, use a tunnelling service like ngrok or Hookdeck to generate a public URL.\n\nPass an array of event type names to subscribedEvents to say which events should be subscribed to. Paddle responds with the full event type object for each event type.\n\nProvide the trafficSource to define if the notification destination should be sent real events and/or simulated test events:\n\n- platform: Deliver real platform events. These are sent when real events which are subscribed to take place.\n- simulation: Deliver simulated events. These are sent when simulations are run to test single events or scenarios, usually to verify implementations of Paddle.\n- all: Deliver both platform (real) and simulation (test) events.\n\nCreate notification destinations as many as needed, but only 10 can be active as per the active boolean parameter. Prompt users to toggle in the dashboard. Alternatively, use the list_notification_setting tool, verify which should be active, and use the update_notification_setting tool to toggle the boolean accordingly.\n\nIf successful, the response includes a copy of the new notification setting entity. The endpointSecretKey is returned for webhook signature verification, but is a secure value and should never be shared, never be made publicly-accessible, and should only be stored securely.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_notification_setting","description":"\nThis tool will retrieve a notification setting (notification destination) from Paddle by its ID.\n\nThe endpointSecretKey is returned for webhook signature verification, but is a secure value and should never be shared, never be made publicly-accessible, and should only be stored securely.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_events","description":"\nThis tool will list events in Paddle.\n\nWhen something notable occurs, Paddle creates an event entity with information about what happened. Events are created for actions regardless of how they happened and regardless of whether a notification setting is subscribed to be notified by Paddle.\n\nSome actions might create multiple events. For example, resuming a subscription typically results in a subscription.resumed, transaction.created, and other transaction events being created.\n\nUse the maximum perPage by default (200) to ensure comprehensive results.\nResults are paginated - use the 'after' parameter with the last ID from previous results to get the next page.\nSort and order results using the orderBy parameter.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_notifications","description":"\nThis tool will list notifications in Paddle.\n\nWhen an event that has a notification destination occurs, Paddle creates a notification entity with information about the notification.\n\nA single event might create multiple notifications. This is common when working with multiple notification destinations that are subscribed to the same events. When an event occurs, Paddle creates a separate notification entity for each notification destination. They'll share the same eventId, but have different notificationId.\n\nNotifications older than 90 days aren't retained and won't be returned.\n\nUse the maximum perPage by default (200) to ensure comprehensive results.\nFilter notifications by notificationSettingId, search (fuzzy search on the event's type or id), status, filter (pass a transaction, customer, or subscription ID), to, and from as needed.\nResults are paginated - use the 'after' parameter with the last ID from previous results to get the next page.\nSort and order results using the orderBy parameter.\n\nCheck the following details to understand the success or failure of the notification delivery according to Paddle and debug issues:\n\n- status: Status of the notification.\n  - notAttempted: Paddle hasn't yet tried to deliver this notification.\n  - needsRetry: Paddle tried to deliver this notification, but it failed. It's scheduled to be retried.\n  - delivered: Paddle delivered this notification successfully.\n  - failed: Paddle tried to deliver this notification, but all attempts failed. It's not scheduled to be retried.\n- origin: Describes how this notification was created.\n  - event: Notification created when a subscribed event occurred.\n  - replay: Notification created when a notification with the origin event was replayed.\n- deliveredAt: RFC 3339 datetime string of when this notification was delivered. null if not yet delivered successfully.\n- lastAttemptAt: RFC 3339 datetime string of when this notification was last attempted.\n- retryAt: RFC 3339 datetime string of when this notification is scheduled to be retried.\n- timesAttempted: How many times delivery of this notification has been attempted.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_notification","description":"\nThis tool will retrieve a notification from Paddle by its ID.\n\nWhen an event that has a notification destination occurs, Paddle creates a notification entity with information about the notification.\n\nNotifications older than 90 days aren't retained. If trying to get a notification that's no longer retained, Paddle returns an error.\n\nCheck the following details to understand the success or failure of the notification according to Paddle and debug issues:\n\n- status: Status of the notification.\n  - notAttempted: Paddle hasn't yet tried to deliver this notification.\n  - needsRetry: Paddle tried to deliver this notification, but it failed. It's scheduled to be retried.\n  - delivered: Paddle delivered this notification successfully.\n  - failed: Paddle tried to deliver this notification, but all attempts failed. It's not scheduled to be retried.\n- origin: Describes how this notification was created.\n  - event: Notification created when a subscribed event occurred.\n  - replay: Notification created when a notification with the origin event was replayed.\n- deliveredAt: RFC 3339 datetime string of when this notification was delivered. null if not yet delivered successfully.\n- lastAttemptAt: RFC 3339 datetime string of when this notification was last attempted.\n- retryAt: RFC 3339 datetime string of when this notification is scheduled to be retried.\n- timesAttempted: How many times delivery of this notification has been attempted.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_notification_logs","description":"\nThis tool will list notification logs in Paddle.\n\nWhen Paddle sends a notification to a webhook endpoint or email address, it records information about each delivery attempt as a log against the notification.\n\nEvery delivered notification has at least one log with information about the response that Paddle received on delivery.\n\nWhere a notification isn't delivered successfully, Paddle tries to deliver the notification again. Each delivery attempt is logged against a notification.\n\nUse the maximum perPage by default (200) to ensure comprehensive results.\nResults are paginated - use the 'after' parameter with the last ID from previous results to get the next page.\n\nCheck the following details to understand the success or failure of each delivery attempt and debug issues:\n\n- responseCode: HTTP code sent by the responding server.\n- responseContentType: Content-Type sent by the responding server.\n- responseBody: Response body sent by the responding server. Typically empty for success responses.\n- attemptedAt: RFC 3339 datetime string of when Paddle attempted to deliver the related notification.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"replay_notification","description":"\nThis tool will resend a delivered or failed notification, like a webhook notification, using its ID.\n\n\nDon't use this tool without checking with the user first. Avoid using before gaining explicit approval.\n\n\nPaddle creates a new notification entity for the replay, related to the same eventId. The response includes the new notificationId of the created notification.\n\nNotifications older than 90 days aren't retained. If trying to replay a notification that's no longer retained, Paddle returns an error.\n\nOnly notifications with the origin of event can be replayed. Replaying a notification created for a replay isn't possible.\n\nCheck the following details to understand the success or failure of the notification according to Paddle and debug issues:\n\n- status: Status of the notification.\n  - notAttempted: Paddle hasn't yet tried to deliver this notification.\n  - needsRetry: Paddle tried to deliver this notification, but it failed. It's scheduled to be retried.\n  - delivered: Paddle delivered this notification successfully.\n  - failed: Paddle tried to deliver this notification, but all attempts failed. It's not scheduled to be retried.\n- origin: Describes how this notification was created.\n  - event: Notification created when a subscribed event occurred.\n  - replay: Notification created when a notification with the origin event was replayed.\n- deliveredAt: RFC 3339 datetime string of when this notification was delivered. null if not yet delivered successfully.\n- lastAttemptAt: RFC 3339 datetime string of when this notification was last attempted.\n- retryAt: RFC 3339 datetime string of when this notification is scheduled to be retried.\n- timesAttempted: How many times delivery of this notification has been attempted.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_simulations","description":"\nThis tool will list simulations in Paddle.\n\nThese are the configurations for simulations, as opposed to the simulation runs which are used to send the events to the notification destination.\n\nUse the maximum perPage by default (200) to ensure comprehensive results.\nFilter simulations by notificationSettingId, id, and status as needed.\nResults are paginated - use the 'after' parameter with the last ID from previous results to get the next page.\nSort and order results using the orderBy parameter.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_simulation","description":"\nThis tool will create a new simulation for a notification setting (notification destination) in Paddle.\n\nTest webhooks can be sent through the webhook simulator in the dashboard or via the API by creating and running a simulation. Simulations configure which test webhooks are sent by Paddle when run. They can simulate the sending of single events or scenarios which send multiple events, like subscription renewals or cancellations. This is ideal for testing webhook implementations and validating data before sending real events. If implementing webhooks or making changes to an implementation, create and run a simulation prior to sending real events.\n\nFor scenario simulations (type of subscription_creation, subscription_renewal, subscription_pause, subscription_resume, subscription_cancellation), config objects can be provided. The config object contains a key matching the scenario type (e.g., for type \"subscription_creation\", use config.subscription_creation). This nested object can contain entities and options fields to control which webhooks are sent and populate payloads with real entity data. If provided, the config object must match the scenario type selected.\n\nOption values for scenario simulations:\n\nsubscriptionCancellation and subscriptionPause:\n- options.effectiveFrom:\n  - next_billing_period: Simulates as if the subscription cancels or pauses at the start of next billing period.\n  - immediately: Simulates as if the subscription cancels or pauses immediately.\n\nsubscriptionResume and subscriptionRenewal:\n- options.paymentOutcome:\n  - success: Simulates as if the payment for the subscription is successful.\n  - recovered_existing_payment_method: Simulates as if the payment for the subscription fails initially and the payment is recovered when retrying the existing payment method.\n  - recovered_updated_payment_method: Simulates as if the payment for the subscription fails initially and the customer updates their payment method to successfully pay.\n  - failed: Simulates as if the payment for the subscription is unsuccessful after all payment recovery attempts are exhausted.\n- options.dunningExhaustedAction (only valid when paymentOutcome is \"failed\"):\n  - subscription_paused: Simulates as if the subscription is paused after all payment recovery attempts are exhausted.\n  - subscription_canceled: Simulates as if the subscription is canceled after all payment recovery attempts are exhausted.\n\nsubscriptionCreation:\n- options.customerSimulatedAs:\n  - new: Simulates as if a new customer enters their details at checkout and Paddle creates a new customer.\n  - existing_email_matched: Simulates as if an existing customer enters their details at checkout. Paddle matches it to an existing customer based on the email supplied and creates a new address for that customer.\n  - existing_details_prefilled: Simulates as if existing customer details are prefilled at checkout by passing them to Paddle.js.\n- options.businessSimulatedAs:\n  - not_provided: Simulates as if no business is provided.\n  - new: Simulates as if a customer enters their business details at checkout and Paddle creates a new business.\n  - existing_details_prefilled: Simulates as if an existing business is prefilled at checkout by passing it to Paddle.js.\n- options.discountSimulatedAs:\n  - not_provided: Simulates as if no discount is entered.\n  - prefilled: Simulates as if a discount is prefilled at checkout by passing it to Paddle.js. Requires entities.discountId.\n  - entered_by_customer: Simulates as if a customer entered a discount at checkout. Requires entities.discountId.\n\nIf config.entities are not provided, simulated webhook payloads are populated with static demo examples.\n\nIf successful, the response includes a copy of the new simulation entity. The simulation can then be run to send the events to the notification destination with the create_simulation_run tool.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_simulation","description":"\nThis tool will retrieve a simulation from Paddle by its ID.\n\nThis is for the configuration of a simulation, as opposed to the simulation run which is used to send the events to the notification destination.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_simulation_runs","description":"\nThis tool will list simulation runs in Paddle.\n\nUse the maximum perPage by default (200) to ensure comprehensive results.\nFilter simulationRuns by id as needed.\nResults are paginated - use the 'after' parameter with the last ID from previous results to get the next page.\nSort and order results using the orderBy parameter.\n\nUse the include parameter to include related entities in the response:\n\n- events: An array of events entities for events sent by this simulation run.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_simulation_run","description":"\nThis tool will create a new simulation run for a simulation in Paddle.\n\nTest webhooks can be sent through the webhook simulator in the dashboard or via the API by creating and running a simulation. Simulation runs are used to send the test webhook events to the notification destination once the simulation has been configured.\n\nIf successful, the response includes a copy of the new simulation run entity. All events sent by the simulation run can be seen using the list_simulations_events tool or including the 'events' parameter in the response when fetching the individual simulation run using the get_simulation_run tool.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_simulation_run","description":"\nThis tool will retrieve a simulation run from Paddle by its ID.\n\nUse the include parameter to include related entities in the response:\n\n- events: An array of events entities for events sent by this simulation run.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_simulation_run_events","description":"\nThis tool will list simulation run events in Paddle.\n\nUse the maximum perPage by default (200) to ensure comprehensive results.\nFilter simulationRunEvents by id as needed.\nResults are paginated - use the 'after' parameter with the last ID from previous results to get the next page.\nSort and order results using the orderBy parameter.\n\nCheck the following details to understand the success or failure of the event according to Paddle and debug issues:\n\n- status: Status of the event according to Paddle.\n  - pending: No attempt has been made to deliver the event yet.\n  - success: The event was delivered successfully.\n  - failure: Paddle tried to deliver the simulated event, but it failed. If response object is null, no response received from the server. Check the notification setting endpoint configuration.\n  - aborted: Paddle couldn't attempt delivery of the simulated event.\n- payload: Payload sent by Paddle for this event within the simulation.\n- request.body: Request body sent by Paddle.\n- response.body: Response body sent by the responding server. May be empty for success responses.\n- response.statusCode: HTTP status code sent by the responding server.\n\nIf the destination URL is using a tunnel or proxy service, the response may be from the tunnel or proxy service, not the original server. Don't assume success or failure based on the status and response alone. Check the logs of the tunnel/proxy service and the destination server.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_simulation_run_event","description":"\nThis tool will retrieve an event sent by a simulation run from Paddle by its ID.\n\nCheck the following details to understand the success or failure of the event according to Paddle and debug issues:\n\n- status: Status of the event according to Paddle.\n  - pending: No attempt has been made to deliver the event yet.\n  - success: The event was delivered successfully.\n  - failure: Paddle tried to deliver the simulated event, but it failed. If response object is null, no response received from the server. Check the notification setting endpoint configuration.\n  - aborted: Paddle couldn't attempt delivery of the simulated event.\n- payload: Payload sent by Paddle for this event within the simulation.\n- request.body: Request body sent by Paddle.\n- response.body: Response body sent by the responding server. May be empty for success responses.\n- response.statusCode: HTTP status code sent by the responding server.\n\nIf the destination URL is using a tunnel or proxy service, the response may be from the tunnel or proxy service, not the original server. Don't assume success or failure based on the status and response alone. Check the logs of the tunnel/proxy service and the destination server.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"replay_simulation_run_event","description":"\nThis tool will resend an event sent by a simulation run from Paddle using its ID.\n\nThis is useful to retest the sending of an individual event within a simulation run rather than creating a new simulation run and sending all events again.\n\nPaddle creates a new simulation run event entity for the replay, related to the same simulation run.\n\nIf successful, the response includes the new simulation run event entity.\n\nCheck the following details to understand the success or failure of the event according to Paddle and debug issues:\n\n- status: Status of the event according to Paddle.\n  - pending: No attempt has been made to deliver the event yet.\n  - success: The event was delivered successfully.\n  - failure: Paddle tried to deliver the simulated event, but it failed. If response object is null, no response received from the server. Check the notification setting endpoint configuration.\n  - aborted: Paddle couldn't attempt delivery of the simulated event.\n- payload: Payload sent by Paddle for this event within the simulation.\n- request.body: Request body sent by Paddle.\n- response.body: Response body sent by the responding server. May be empty for success responses.\n- response.statusCode: HTTP status code sent by the responding server.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_reports","description":"\nThis tool will list reports in Paddle.\n\nThis lists generated report exports only. It does not return report contents or analytical summaries.\n\n\nMetrics and reports:\n- Reports export entity-level historical data as CSV. Use them for audits, reconciliation, spreadsheets, and lists of individual transactions, refunds, discounts, or products.\n- Metrics return aggregated timeseries data directly in the API response. When this MCP server is configured for production, use metrics tools for trend questions, dashboard summaries, and aggregate performance over time.\nRule of thumb: if the user wants a list of rows, use a report. If they want a trend or headline figure, use a metrics tool when this server exposes them; otherwise rely on reports.\n\n\nUse the maximum perPage by default (200) to ensure comprehensive results.\nFilter reports by status as needed.\nResults are paginated - use the 'after' parameter with the last ID from previous results to get the next page.\nSort and order results using the orderBy parameter.\n\nAmounts are in the smallest currency unit (e.g., cents).\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_report","description":"\nThis tool will create a new report in Paddle.\n\nUse this tool when detailed financial data for analysis, reconciliation, auditing, or export to spreadsheet applications is needed.\nUse this tool over listTransactions when trying to gather larger amounts of data from Paddle.\n\n\nMetrics and reports:\n- Reports export entity-level historical data as CSV. Use them for audits, reconciliation, spreadsheets, and lists of individual transactions, refunds, discounts, or products.\n- Metrics return aggregated timeseries data directly in the API response. When this MCP server is configured for production, use metrics tools for trend questions, dashboard summaries, and aggregate performance over time.\nRule of thumb: if the user wants a list of rows, use a report. If they want a trend or headline figure, use a metrics tool when this server exposes them; otherwise rely on reports.\n\n\nWhen to use this tool:\n- The user wants a CSV export or a list of individual records.\n- The user needs transaction-level, adjustment-level, discount-level, or product/price-level detail.\n- The user wants to reconcile data, audit historical activity, or work in a spreadsheet.\n- Do NOT use this when the user wants an aggregate trend, dashboard metric, or chart-ready timeseries. Use a metrics tool instead.\n\nReports are generated asynchronously - a report ID will be returned that can be used to check status.\nReports initially have 'pending' status, then move to 'ready' when available to download.\nReports are available in CSV format and can be downloaded once ready using the get_report_csv tool.\nReports expire after a certain period and are no longer available to download after they expire.\n\nThere are different report types available:\n\n- adjustments: For information about refunds, credits, and chargebacks\n- adjustment_line_items: For information about refunds, credits, and chargebacks, broken down by line item level\n- transactions: For information about revenue received, past due invoices, draft and issued invoices, and canceled transactions\n- transaction_line_items: For information about revenue received, past due invoices, draft and issued invoices, and canceled transactions, broken down by line item level\n- products_prices: For information about the products and prices. May include non-catalog products and prices.\n- discounts: For information about the product and checkout discounts\n\nEach report type has different filters which can be used:\n\n- action: adjustments and adjustment_line_items. Pass an array of strings containing any of 'refund', 'credit', 'chargeback', 'chargeback_reverse', 'chargeback_warning', 'chargeback_warning_reverse', 'credit_reverse' as values.\n- collection_mode: transactions and transaction_line_items. Pass an array of strings containing any of 'automatic' and 'manual' as values.\n- currency_code: adjustments, adjustment_line_items, transactions, and transaction_line_items. Pass an array of strings containing any valid supported three-letter ISO 4217 currency code.\n- origin: transactions and transaction_line_items. Pass an array of strings containing any of 'api', 'subscription_charge', 'subscription_payment_method_change', 'subscription_recurring', 'subscription_update', and 'web' as values.\n- product_status: products_prices. Pass an array of strings containing any of 'active' and 'archived' as values.\n- price_status: products_prices. Pass an array of strings containing any of 'active' and 'archived' as values.\n- product_type: products_prices. Pass an array of strings containing any of 'custom' and 'standard' as values.\n- price_type: products_prices. Pass an array of strings containing any of 'custom' and 'standard' as values.\n- product_updated_at: products_prices. Pass an RFC 3339 datetime string.\n- price_updated_at: products_prices. Pass an RFC 3339 datetime string.\n- status: adjustments, adjustment_line_items, transactions, transaction_line_items, and discounts. Pass an array of strings containing any valid value for the status field against an adjustment, transaction, or discount.\n- type: discounts and products_prices. Pass an array of strings containing any of 'custom' and 'standard' as values.\n- updated_at: adjustments, adjustment_line_items, transactions, transaction_line_items, and discounts. Pass an RFC 3339 datetime string. Use the operator parameter to specify the operator to use when filtering.\n\nIf successful, the response includes a copy of the new report entity.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_report","description":"\nThis tool will retrieve a report entity from Paddle by its ID. It only contains information about the report, like the ID, status, and the date it was created. \n\nUse this tool to check the status of a generated report, or to get the ID of a report, to then use with the get_report_csv tool to download the CSV.\nIt does not return the exported rows themselves.\n\n\nMetrics and reports:\n- Reports export entity-level historical data as CSV. Use them for audits, reconciliation, spreadsheets, and lists of individual transactions, refunds, discounts, or products.\n- Metrics return aggregated timeseries data directly in the API response. When this MCP server is configured for production, use metrics tools for trend questions, dashboard summaries, and aggregate performance over time.\nRule of thumb: if the user wants a list of rows, use a report. If they want a trend or headline figure, use a metrics tool when this server exposes them; otherwise rely on reports.\n\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_report_csv","description":"\nThis tool will retrieve a link to a CSV file for a report from Paddle by its ID.\n\nUse this only after a report is ready. This returns a temporary download URL for the CSV export, not the CSV contents inline.\n\n\nMetrics and reports:\n- Reports export entity-level historical data as CSV. Use them for audits, reconciliation, spreadsheets, and lists of individual transactions, refunds, discounts, or products.\n- Metrics return aggregated timeseries data directly in the API response. When this MCP server is configured for production, use metrics tools for trend questions, dashboard summaries, and aggregate performance over time.\nRule of thumb: if the user wants a list of rows, use a report. If they want a trend or headline figure, use a metrics tool when this server exposes them; otherwise rely on reports.\n\n\nOnly returned for reports that are ready. This means Paddle has completed processing the report and it's ready to download. The status of a report can be checked using the get_report tool.\n\nThe link returned isn't a permanent link. It expires after 3 minutes.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_client_side_tokens","description":"\nThis tool will list client-side tokens in Paddle.\n\nClient-side tokens are needed to authenticate with Paddle.js. A token is provided when initializing Paddle.js.\n\nUse the maximum perPage by default (200) to ensure comprehensive results.\nFilter client-side tokens by status as needed.\nResults are paginated - use the 'after' parameter with the last ID from previous results to get the next page.\nSort and order results using the orderBy parameter.\n\nThe returned token field is the client-side token that needs to be provided when initializing Paddle.js. Can be exposed client-side safely. If it starts with:\n\n- test_: The token is a test token for a sandbox environment and shouldn't be used in production.\n- live_: The token is a live token for a production environment. It can be used to test too but Paddle.js checkouts require real cards.\n\nClient-side tokens have a status:\n- active: Client-side token can be used to authenticate with Paddle.js.\n- revoked: Client-side token has been revoked and can no longer be used to authenticate with Paddle.js.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_client_side_token","description":"\nThis tool will create a new client-side token in Paddle.\n\nClient-side tokens are needed to authenticate with Paddle.js. A token is provided when initializing Paddle.js.\n\nWhen creating a client-side token, provide a descriptive name to help identify its purpose. Usually created for each application or environment that needs to authenticate with Paddle.js.\n\nIf successful, the response includes a copy of the new client-side token entity. The returned token field is the client-side token that needs to be provided when initializing Paddle.js. Can be exposed client-side safely. If it starts with:\n\n- test_: The token is a test token for a sandbox environment and shouldn't be used in production.\n- live_: The token is a live token for a production environment. It can be used to test too but Paddle.js checkouts require real cards.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_client_side_token","description":"\nThis tool will retrieve a client-side token from Paddle by its ID.\n\nThe returned token field is the client-side token that needs to be provided when initializing Paddle.js. Can be exposed client-side safely. If it starts with:\n\n- test_: The token is a test token for a sandbox environment and shouldn't be used in production.\n- live_: The token is a live token for a production environment. It can be used to test too but Paddle.js checkouts require real cards.\n\nClient-side tokens have a status:\n- active: Client-side token can be used to authenticate with Paddle.js.\n- revoked: Client-side token has been revoked and can no longer be used to authenticate with Paddle.js.\n","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"dev","type":"runner_process","description":"npx -y @paddle/paddle-mcp --api-key pdl_live_apikey_01kzqbkmb5pxc4ecsd7sdkyc5v_n7VQQJTN221jsdhyQY9P2Q_AOX","runnerConfig":{"packageManager":"npx","packageNameOrCommand":"npx","args":["-y","@paddle/paddle-mcp","--api-key","pdl_live_apikey_01kzqbkmb5pxc4ecsd7sdkyc5v_n7VQQJTN221jsdhyQY9P2Q_AOX"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.292Z","updatedAt":"2026-08-14T01:10:58.817Z"},{"id":"hermes-paperless","name":"paperless","enabled":true,"tools":[{"name":"search_documents","description":"Search paperless documents by query string. Returns document IDs, titles, dates, tags.","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_document","description":"Get full metadata for a document by ID","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_document_content","description":"Get the text content (OCR'd) of a document by ID","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_tags","description":"List all tags in paperless","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_correspondents","description":"List all correspondents (senders)","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_document_types","description":"List all document types","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_storage_paths","description":"List all storage paths","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_stats","description":"Get paperless statistics (total docs, inbox count, etc)","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_document","description":"Create a new document entry in paperless","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"update_document","description":"Update document metadata (title, correspondent, tags)","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"delete_document","description":"Delete a document by ID","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"memory","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/paperless-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/paperless-mcp","python","server.py"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.295Z","updatedAt":"2026-08-14T01:08:23.927Z"},{"id":"hermes-playwright","name":"playwright","enabled":true,"tools":[{"name":"browser_close","description":"Close the page","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_resize","description":"Resize the browser window","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_console_messages","description":"Returns all console messages","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_handle_dialog","description":"Handle a dialog","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_evaluate","description":"Evaluate JavaScript expression on page or element","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_file_upload","description":"Upload one or multiple files","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_drop","description":"Drop files or MIME-typed data onto an element, as if dragged from outside the page. At least one of \"paths\" or \"data\" must be provided.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_find","description":"Search the accessibility snapshot of the current page for text or a regular expression. Returns matching snapshot nodes with a few lines of surrounding context (like search snippets), each shown under its path from the root of the tree, which is cheaper than capturing the whole snapshot when you only need to locate an element and its ref.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_fill_form","description":"Fill multiple form fields","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_press_key","description":"Press a key on the keyboard","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_type","description":"Type text into editable element","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_navigate","description":"Navigate to a URL","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_navigate_back","description":"Go back to the previous page in the history","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_network_requests","description":"Returns a numbered list of network requests since loading the page. Use browser_network_request with the number to get full details.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_network_request","description":"Returns full details (headers and body) of a single network request, or a single part if `part` is set. Use the number from browser_network_requests.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_run_code_unsafe","description":"Run a Playwright code snippet. Unsafe: executes arbitrary JavaScript in the Playwright server process and is RCE-equivalent.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_take_screenshot","description":"Take a screenshot of the current page. You can't perform actions based on the screenshot, use browser_snapshot for actions.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_snapshot","description":"Capture accessibility snapshot of the current page, this is better than screenshot","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_click","description":"Perform click on a web page","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_drag","description":"Perform drag and drop between two elements","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_hover","description":"Hover over element on page","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_select_option","description":"Select an option in a dropdown","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_tabs","description":"List, create, close, or select a browser tab.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"browser_wait_for","description":"Wait for text to appear or disappear or a specified time to pass","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"dev","type":"runner_process","description":"npx -y @playwright/mcp","runnerConfig":{"packageManager":"npx","packageNameOrCommand":"npx","args":["-y","@playwright/mcp"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.298Z","updatedAt":"2026-08-14T01:08:23.948Z"},{"id":"hermes-protonmail","name":"protonmail","enabled":false,"tools":[{"name":"health","description":"Check Proton Bridge IMAP/SMTP reachability.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_folders","description":"List IMAP folders/mailboxes.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"recent_messages","description":"Read recent message headers from a folder.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"send_email","description":"Send a plain text email through Proton Bridge SMTP.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"memory","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/protonmail-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/protonmail-mcp","python","server.py"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.302Z","updatedAt":"2026-08-14T01:11:33.229Z"},{"id":"hermes-proxmox","name":"proxmox","enabled":true,"tools":[{"name":"proxmox_list_nodes","description":"KR: 클러스터의 모든 노드 목록 및 상태 조회. EN: List all nodes in the cluster.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_custom_request","description":"KR: Proxmox API 범용 도구. GET 포함 모든 HTTP 메서드 지원. EN: Generic Proxmox API tool supporting all HTTP methods including GET.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_list_vms","description":"KR: 특정 노드의 QEMU 가상머신 목록 조회. EN: List QEMU VMs on a specific node.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_create_vm","description":"KR: QEMU 가상머신 생성. EN: Create a QEMU VM.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_update_vm_config","description":"KR: QEMU 가상머신 상세 설정 변경 (메모리, 코어 등 핫플러그). EN: Update QEMU VM config (supports hotplug).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_resize_vm_disk","description":"KR: QEMU 가상머신 디스크 크기 변경. EN: Resize a QEMU VM disk.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_change_vm_state","description":"KR: QEMU 가상머신 전원 상태 변경. EN: Change QEMU VM power state.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_delete_vm","description":"KR: QEMU 가상머신 영구 삭제. EN: Permanently delete a QEMU VM.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_list_lxc","description":"KR: 특정 노드의 LXC 컨테이너 목록 조회. EN: List LXC containers on a specific node.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_create_lxc","description":"KR: LXC 컨테이너 생성. EN: Create an LXC container.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_update_lxc_config","description":"KR: LXC 컨테이너 상세 설정 변경. EN: Update LXC container config.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_resize_lxc_disk","description":"KR: LXC 디스크 크기 변경. EN: Resize an LXC disk.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_change_lxc_state","description":"KR: LXC 컨테이너 전원 상태 변경. EN: Change LXC power state.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_delete_lxc","description":"KR: LXC 컨테이너 영구 삭제. EN: Permanently delete an LXC container.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_list_storage","description":"KR: 클러스터에 구성된 스토리지 목록 조회. EN: List configured storage in the cluster.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_create_storage","description":"KR: 새로운 스토리지 추가. EN: Add a new storage.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_update_storage","description":"KR: 스토리지 속성 변경. EN: Update storage properties.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_delete_storage","description":"KR: 스토리지 연결 해제 (데이터 포맷 등 위험한 동작은 제외). EN: Remove storage configuration (does not wipe data).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_list_networks","description":"KR: 특정 노드의 네트워크 인터페이스 조회. EN: List network interfaces on a node.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_create_network","description":"KR: 노드에 네트워크 인터페이스 생성 (Linux Bridge 등). EN: Create a network interface on a node.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_update_network","description":"KR: 노드의 네트워크 인터페이스 설정 변경. EN: Update a network interface on a node.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_delete_network","description":"KR: 네트워크 인터페이스 삭제. EN: Delete a network interface.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_apply_network","description":"KR: 노드의 대기 중인 네트워크 변경사항 커밋 및 적용. EN: Commit and apply pending network changes on a node.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_node_service_cmd","description":"KR: 노드의 특정 시스템 서비스 (예: pveproxy) 시작/중지/재시작. EN: Control a system service on a node.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_node_power_control","description":"KR: [위험] 노드 재부팅 및 셧다운. 신중히 사용할 것. EN: [CRITICAL] Reboot or shut down a node. Use with caution.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_list_vm_snapshots","description":"KR: QEMU VM 스냅샷 목록 조회. EN: List snapshots of a QEMU VM.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_create_vm_snapshot","description":"KR: QEMU VM 스냅샷 생성. EN: Create a snapshot of a QEMU VM.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_rollback_vm_snapshot","description":"KR: QEMU VM을 특정 스냅샷으로 복원. EN: Rollback a QEMU VM to a snapshot.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_delete_vm_snapshot","description":"KR: QEMU VM 스냅샷 삭제. EN: Delete a QEMU VM snapshot.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_list_lxc_snapshots","description":"KR: LXC 컨테이너 스냅샷 목록 조회. EN: List snapshots of an LXC container.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_create_lxc_snapshot","description":"KR: LXC 컨테이너 스냅샷 생성. EN: Create a snapshot of an LXC container.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_rollback_lxc_snapshot","description":"KR: LXC 컨테이너를 특정 스냅샷으로 복원. EN: Rollback an LXC container to a snapshot.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_delete_lxc_snapshot","description":"KR: LXC 컨테이너 스냅샷 삭제. EN: Delete an LXC container snapshot.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_get_cluster_status","description":"KR: 클러스터 전체 상태 및 리소스 요약 조회. EN: Get overall cluster status and resource summary.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_get_node_status","description":"KR: 특정 노드의 CPU/메모리/디스크 사용률 및 상태 조회. EN: Get CPU, memory, and disk usage of a node.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_get_vm_status","description":"KR: QEMU VM의 현재 전원 상태 및 리소스 사용률 조회. EN: Get current power state and resource usage of a QEMU VM.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_get_vm_config","description":"KR: QEMU VM의 전체 설정(디스크, 네트워크, CPU 등) 조회. EN: Get full configuration of a QEMU VM (disk, network, CPU, etc.).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_get_lxc_status","description":"KR: LXC 컨테이너의 현재 전원 상태 및 리소스 사용률 조회. EN: Get current power state and resource usage of an LXC container.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_get_lxc_config","description":"KR: LXC 컨테이너의 전체 설정 조회. EN: Get full configuration of an LXC container.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_get_task_status","description":"KR: 비동기 태스크(UPID)의 진행 상태 및 로그 조회. EN: Get status and log of an async task (UPID).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_list_node_tasks","description":"KR: 노드의 최근 태스크 목록 조회. EN: List recent tasks on a node.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_clone_vm","description":"KR: QEMU VM 클론 생성. EN: Clone a QEMU VM.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_clone_lxc","description":"KR: LXC 컨테이너 클론 생성. EN: Clone an LXC container.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_migrate_vm","description":"KR: QEMU VM을 다른 노드로 이동. EN: Migrate a QEMU VM to another node.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_migrate_lxc","description":"KR: LXC 컨테이너를 다른 노드로 이동. EN: Migrate an LXC container to another node.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_list_storage_content","description":"KR: 특정 노드의 스토리지 내 콘텐츠(ISO, 템플릿, 디스크 이미지, 백업 등) 목록 조회. EN: List contents (ISO, templates, disk images, backups) of a storage on a node.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_list_os_templates","description":"KR: 특정 노드의 스토리지에서 LXC용 OS 템플릿 목록 조회. EN: List available LXC OS templates in a storage on a node.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_list_iso_images","description":"KR: 특정 노드의 스토리지에서 ISO 이미지 목록 조회. EN: List available ISO images in a storage on a node.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_delete_storage_content","description":"KR: 스토리지 내 특정 볼륨(ISO, 템플릿, 디스크 이미지 등) 삭제. EN: Delete a specific volume (ISO, template, disk image, etc.) from storage.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"proxmox_download_url","description":"KR: URL에서 직접 ISO 또는 LXC 템플릿을 스토리지로 다운로드. EN: Download an ISO or LXC template from a URL directly into storage.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"dev","type":"runner_process","description":"npx -y @itapi-core/mcp-proxmox","runnerConfig":{"packageManager":"npx","packageNameOrCommand":"npx","args":["-y","@itapi-core/mcp-proxmox"],"env":{"PROXMOX_HOST":"10.30.20.85","PROXMOX_PORT":"8006","PROXMOX_TOKEN_ID":"root@pam!MacBook","PROXMOX_TOKEN_SECRET":"88bc26dd-c151-4c2f-b7c3-f0e446d51f18"}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.305Z","updatedAt":"2026-08-14T01:08:23.967Z"},{"id":"hermes-qdrant","name":"qdrant","enabled":true,"tools":[{"name":"health","description":"","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_collections","description":"","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"collection_info","description":"","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"count_points","description":"","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"data","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/qdrant-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/qdrant-mcp","python","server.py"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.308Z","updatedAt":"2026-08-14T01:08:23.986Z"},{"id":"hermes-safari-mcp","name":"safari-mcp","enabled":true,"tools":[{"name":"safari_navigate","description":"Navigate to a URL in Safari. Waits for page to fully load.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_go_back","description":"Go back in browser history","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_go_forward","description":"Go forward in browser history","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_reload","description":"Reload the current page","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_read_page","description":"Read page text content (title, URL, body text). Use for reading article text or page content. For interacting with elements, prefer safari_snapshot (gives ref IDs). Use selector to read specific element. Use maxLength to limit output.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_get_source","description":"Get HTML source of current page","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_snapshot","description":"PREFERRED way to see page state. Returns accessibility tree with ref IDs for every interactive element. Use refs with click/fill/type instead of CSS selectors. Workflow: snapshot → see refs → click({ref:'0_5'}). PREFER THIS over safari_screenshot (cheaper, structured text vs heavy image) and over safari_read_page (includes interactive refs). Use safari_screenshot only when you need to see visual layout/styling.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_navigate_and_read","description":"Navigate to a URL and return the page content in one step — saves 1 full round-trip vs navigate+read_page. Use instead of safari_navigate + safari_read_page.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_click","description":"Click element. Use ref (from snapshot), selector, text, or x/y. Works on React/Airtable/virtual DOM apps via full PointerEvent+MouseEvent sequence + React Fiber fallback. Pure JS — never touches user's mouse. When using ref, always take a FRESH safari_snapshot first — refs expire after each new snapshot.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_click_and_read","description":"Click an element then return the updated page — saves 1 full round-trip vs separate click+read_page. Handles both React Router navigation and full page loads.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_double_click","description":"Double-click an element by CSS selector or x/y coordinates (e.g. to select a word in text)","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_right_click","description":"Right-click (context menu) an element by CSS selector or x/y coordinates","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_native_click","description":"OS-level mouse click via macOS CGEvent — produces isTrusted: true events that pass WAF/bot detection (G2, Cloudflare, etc.). Use when regular safari_click fails with 405/403 errors or form submissions are blocked. Trade-off: physically moves the mouse cursor and requires Safari window to be visible. Use ref (from snapshot), selector, text, or x/y. When using ref, always take a FRESH safari_snapshot first.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_native_hover","description":"OS-level mouse hover via macOS CGEvent — moves the real cursor to an element to trigger native :hover / mouseenter handlers. Use for obfuscated UIs where JS-dispatched mouseenter isn't enough, like Discord server sidebars (tooltips only appear on real hover) or portal-rendered tooltips. After hover, call safari_wait_for or safari_evaluate to read the tooltip. Dwells for dwellMs to let tooltips render, then restores the original cursor position by default. Requires Safari window to be visible.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_native_keyboard","description":"OS-level keyboard event via macOS CGEvent — sends a real keypress (with optional modifiers) to the Safari window WITHOUT activating Safari or stealing focus. Use when safari_press_key's JS path doesn't reach React trust-gated handlers (Discord ProseMirror Enter, Slack send, virtualized editors). Keys: enter, return, tab, escape, space, delete, backspace, up/down/left/right, home, end, pageup, pagedown, f1-f6, a-z, 0-9 and common punctuation. Modifiers: cmd, shift, alt, ctrl. Produces isTrusted:true events. Never activates Safari — runs entirely in the background.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_native_type","description":"Insert text into ANY editor via OS-level clipboard paste (CGEvent Cmd+V targeted to Safari window). Unlike safari_fill which manipulates DOM directly (breaking React/ProseMirror state), this goes through the real paste pipeline — ProseMirror/Slate/Draft.js process the paste event natively and update their internal model. After native_type, pressing Enter (via safari_native_keyboard) will actually submit the form because the framework state matches the DOM. Saves and restores the user's clipboard. No focus stealing. Use for Discord, Slack, and any editor where safari_fill works visually but the content isn't 'really there' when you try to submit.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_fill","description":"Fill/replace value in an input, textarea, select, OR contenteditable (rich text). Handles React controlled inputs, ProseMirror, Draft.js, and Google Closure editors automatically. Use for SETTING a value (replaces existing). For code editors (Monaco/CodeMirror/Ace), use safari_replace_editor instead. For character-by-character typing in search boxes, use safari_type_text. IMPORTANT: When using ref, always take a FRESH safari_snapshot first — refs expire after each new snapshot (prefix changes: 5_xx → 6_xx).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_clear_field","description":"Clear an input field","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_verify_state","description":"Verify the framework-level state of an editor/input matches the expected value. Returns JSON {match, mode, actual, expected, hint?}. Modern editors (ProseMirror, Lexical, Closure, React-controlled inputs) maintain state separately from the DOM — `.value` or `.textContent` may show new text while the internal store still holds old data, so a Submit click sends stale data. Call this AFTER safari_fill and BEFORE clicking Submit on critical forms (Featured.com, LinkedIn share, Medium, Reddit).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_select_option","description":"Select an option in a native <select> dropdown. Sets .value and dispatches change event. Pass `ref` (from safari_snapshot) for a select inside an iframe or shadow DOM — a plain `selector` only reaches the top document. For custom dropdowns (React/LinkedIn), use safari_click on the dropdown trigger, then safari_click on the option instead.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_react_select_set","description":"Set a value in a react-select v5 dropdown by walking React fiber to find the Select component and invoking onChange directly — bypasses the menu UI entirely. Use when safari_click on the chevron or option keeps failing (Cloudflare custom token forms after a few rows, portal-rendered selects that intercept synthetic events). Returns JSON {ok, selected} on success, or {ok:false, error, available:[…]} listing up to 30 option labels on miss. Match is by label, value, or case-insensitive label. Either ref or selector required. NOTE: For Permissions-levels combos that are disabled until a Permission is selected, set the Permissions value first — the level combo becomes enabled and its props.options populate.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_react_select_list_options","description":"List available options of a react-select v5 dropdown without opening the menu. Returns JSON {ok, total, options:[{label,value}…]}. Useful when safari_react_select_set returns 'option not found' and you need to see exact labels (e.g. 'Email Routing Rules' vs 'Email Routing'). Either ref or selector required.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_fill_form","description":"Fill multiple form fields at once","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_press_key","description":"Press a keyboard key (enter, tab, escape, arrows, etc). Supports modifiers (cmd, shift, alt, ctrl).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_type_text","description":"Type text character-by-character with realistic key events. Best for: search boxes (triggers autocomplete), chat inputs, and fields that react to each keystroke. For rich text editors (Medium, HackerNoon, LinkedIn), use safari_fill instead — it uses framework-native APIs. For code editors (Monaco/CodeMirror), use safari_replace_editor. When using ref, always take a FRESH safari_snapshot first — refs expire after each new snapshot.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_replace_editor","description":"Replace ALL content in a code editor (Monaco, CodeMirror, Ace, ProseMirror). Use ONLY for code editors — Airtable automations, GitHub gists, CodePen, n8n code nodes, etc. NOT for rich text editors like Medium/LinkedIn (use safari_fill for those). Detects ProseMirror/Draft.js/CodeMirror/Monaco/Ace and uses their native API.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_screenshot","description":"Take a visual screenshot (base64 JPEG). EXPENSIVE — use safari_snapshot instead for most tasks. Only use screenshot when you need to verify visual layout, styling, images, or colors that snapshot can't show.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_screenshot_element","description":"Take a screenshot of a specific element (by CSS selector). Returns base64 PNG image.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_scroll","description":"Scroll the page up or down by a specified amount","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_scroll_to","description":"Scroll to a specific position on the page","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_list_tabs","description":"List all open tabs in Safari with their titles and URLs","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_reload_extension","description":"Hot-reload the Safari MCP Bridge extension — forces it to reload its own code from disk without requiring manual Safari Preferences → Extensions → toggle. Use after editing extension/background.js or extension/content.js in the safari-mcp repo. The extension briefly disconnects during reload and auto-reconnects within ~2 seconds. NOTE: this tool itself requires the extension version already installed to support the `reload_extension` command (added in v2.9.1+). If your extension is older, trigger a manual reload once to pick up this feature.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_new_tab","description":"Open a new tab, optionally with a URL","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_close_tab","description":"Close the current tab","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_switch_tab","description":"Switch to a specific tab by index (use safari_list_tabs to see indices). All subsequent commands (click, fill, evaluate, screenshot, scroll) will target this tab. If commands seem to run on the wrong tab, call switch_tab again to re-anchor.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_wait_for","description":"Wait for an element or text to appear on the page","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_wait_for_new_tab","description":"Wait for a new tab to appear (e.g. after OAuth login click opens popup). Automatically switches to the new tab.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_evaluate","description":"Execute JavaScript in the current page. Automatically falls back to AppleScript when CSP blocks execution (e.g. Google Search Console, LinkedIn). For reading data, prefer safari_read_page or safari_snapshot. For interactions, prefer safari_click/fill with refs.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_eval_file","description":"Execute JavaScript read from a FILE path (avoids passing huge scripts inline / manual copy). Same engine as safari_evaluate: extension-first (no focus steal), AppleScript fallback. Use to upload binary via a generated .js containing base64.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_get_element","description":"Get detailed info about an element (tag, text, rect, attributes, visibility)","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_query_all","description":"Find all elements matching a CSS selector (returns tag, text, href, value)","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_hover","description":"Hover over element. Use ref, selector, or x/y","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_handle_dialog","description":"Set up handler for the next alert/confirm/prompt dialog","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_resize","description":"Resize the Safari window","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_drag","description":"Drag an element to another element or position. Use CSS selectors or x/y coordinates.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_upload_file","description":"Upload a file to a <input type='file'> element via JavaScript DataTransfer — NO file dialog, NO UI interaction. IMPORTANT: Do NOT click the file input before calling this tool — just provide the selector and file path. If a file dialog is already open, this tool will close it first. NOTE: 'verified 0 files' may appear even on success if the site uses a custom upload handler — check visually with safari_snapshot.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_paste_image","description":"Paste an image from a local file into the focused element via JS DataTransfer (no clipboard, no focus steal). Works on Medium, dev.to, HackerNoon, TOI, etc.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_emulate","description":"Emulate a mobile device by resizing window and setting user agent. Devices: iphone-14, iphone-14-pro-max, ipad, ipad-pro, pixel-7, galaxy-s24. Or use custom width/height.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_reset_emulation","description":"Reset device emulation back to desktop mode","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_get_cookies","description":"Get cookies for the current page","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_local_storage","description":"Get localStorage data for the current page","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_network","description":"Quick network overview via Performance API (no setup needed). Shows URLs and timing for resources loaded by the page. For detailed request/response info (headers, status codes, POST bodies), use safari_start_network_capture + safari_network_details instead.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_run_script","description":"Batch multiple Safari actions in ONE call. Steps: [{action, args}]. Actions match other safari_* tool names without prefix (e.g. 'navigate', 'click', 'fill', 'evaluate', 'readPage').","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_start_console","description":"Start capturing console messages (log, warn, error, info). Call once per page.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_get_console","description":"Get captured console messages (must call safari_start_console first)","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_clear_console","description":"Clear all captured console messages","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_save_pdf","description":"Save the current page as a PDF file. Uses screencapture + PDF rendering (no Safari UI interaction needed).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_accessibility_snapshot","description":"Get the accessibility tree of the page (roles, ARIA labels, focusable elements, form states). Essential for a11y auditing.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_set_cookie","description":"Set a cookie on the current page","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_delete_cookies","description":"Delete a specific cookie or all cookies for the current page","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_session_storage","description":"Get sessionStorage data for the current page","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_set_session_storage","description":"Set a value in sessionStorage","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_set_local_storage","description":"Set a value in localStorage","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_delete_local_storage","description":"Delete a localStorage key, or clear all localStorage (omit key to clear all)","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_delete_session_storage","description":"Delete a sessionStorage key, or clear all sessionStorage (omit key to clear all)","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_export_storage","description":"Export all storage state (cookies + localStorage + sessionStorage) as JSON — useful for saving and restoring login sessions","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_import_storage","description":"Import storage state from JSON (as exported by safari_export_storage) — restores cookies, localStorage, sessionStorage","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_clipboard_read","description":"Read the current clipboard content (text)","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_clipboard_write","description":"Write text to the system clipboard","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_mock_route","description":"Intercept network requests matching a URL pattern and return a mock response. Works with both fetch and XHR. Useful for testing API error states, offline behavior, or replacing API responses.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_clear_mocks","description":"Remove all network route mocks (restore real network behavior)","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_wait","description":"Wait for a fixed time in milliseconds. Use only when you need a brief pause between actions. PREFER safari_wait_for (waits for element/text to appear) — it's smarter and doesn't waste time.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_start_network_capture","description":"Start capturing detailed network requests (fetch + XHR) with headers, status, timing. Call once per page. Intercepts fetch/XHR — captures requests AFTER this call only. For quick overview of already-loaded resources, use safari_network instead.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_network_details","description":"Get captured network requests with full details (must call safari_start_network_capture first)","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_clear_network","description":"Clear all captured network requests","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_performance_metrics","description":"Get detailed performance metrics: navigation timing, Web Vitals (FCP, LCP, CLS), resource breakdown, memory usage","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_throttle_network","description":"Simulate slow network conditions. Profiles: slow-3g, fast-3g, 4g, offline. Or custom latency/speed. Call with no args to reset.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_console_filter","description":"Get console messages filtered by level (must call safari_start_console first)","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_extract_tables","description":"Extract HTML tables as structured JSON (headers + rows). Perfect for scraping data tables.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_extract_meta","description":"Extract all meta tags: title, description, canonical, OG tags, Twitter cards, JSON-LD, alternate languages, RSS feeds","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_extract_images","description":"Extract all images with src, alt, dimensions, loading strategy, viewport visibility","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_extract_links","description":"Extract all links with href, text, rel, target, external/nofollow detection","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_override_geolocation","description":"Override the browser's geolocation API to return custom coordinates","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_get_computed_style","description":"Get computed CSS styles for an element. Optionally filter specific properties.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_list_indexed_dbs","description":"List all IndexedDB databases on the current page","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_get_indexed_db","description":"Read records from an IndexedDB database store","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_css_coverage","description":"Analyze CSS coverage: find unused CSS rules across all stylesheets. Shows coverage percentage per stylesheet.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_inspect_viewport","description":"Validate the page's <meta name=viewport> against iOS Safari best practices: width=device-width, initial-scale, disabled-zoom (WCAG 1.4.4), viewport-fit=cover. Returns parsed attributes + severity-tagged issues (error/warning/info).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_safe_area_insets","description":"Read the live CSS safe-area-inset values (top/right/bottom/left) as the page sees them, whether viewport-fit=cover is set, and whether env(safe-area-inset-*) is used in any stylesheet. For notch / Dynamic Island layout debugging.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_check_pwa","description":"Audit the page for iOS 'Add to Home Screen' / PWA readiness: apple-mobile-web-app-capable, apple-touch-icon (incl. 180x180), theme-color, status-bar style, web app manifest, splash screens. Returns a pass/total checklist.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_webkit_compat","description":"Check every CSS property used on the page against THIS Safari via CSS.supports() — reports unsupported properties, properties that need a -webkit- prefix, and known Safari rendering quirks (e.g. position:sticky inside overflow ancestors). Tested in the live engine, so no false positives.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_doctor","description":"Diagnose the macOS permission + daemon chain in one shot: Safari running, Apple Events/Automation, native helper daemon, Accessibility (native clicks), Screen Recording, and the helper's codesign identity. Returns a pass/fail checklist with the exact System Settings fix per failure. Run this FIRST when clicks/screenshots/startup 'don't work even with permissions granted'.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_detect_forms","description":"Auto-detect all forms on the page with their fields, types, selectors, and submit buttons. Great for automated form filling.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_scroll_to_element","description":"Scroll to element by CSS selector OR text. For virtual DOM (Airtable) use text — scrolls down until text appears in DOM.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_click_and_wait","description":"Click an element AND wait for the result (page load or element). Use instead of click + wait_for separately.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_fill_and_submit","description":"Fill a form AND submit it in one operation. Finds submit button automatically if not specified.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"safari_analyze_page","description":"Full page analysis in ONE call: title, URL, meta tags, OG, headings, link stats, image stats, forms, and text preview. Perfect for SEO/audit.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"web","type":"runner_process","description":"npx -y safari-mcp","runnerConfig":{"packageManager":"npx","packageNameOrCommand":"npx","args":["-y","safari-mcp"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.311Z","updatedAt":"2026-08-14T01:08:24.011Z"},{"id":"hermes-searxng","name":"searxng","enabled":true,"tools":[{"name":"health","description":"Check SearXNG web UI/API reachability.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"search","description":"Search SearXNG and return title/url/snippet results.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"web","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/searxng-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/searxng-mcp","python","server.py"],"env":{"SEARXNG_URL":"http://10.30.20.35:6969"}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.314Z","updatedAt":"2026-08-14T01:08:24.031Z"},{"id":"hermes-sequential-thinking","name":"sequential-thinking","enabled":true,"tools":[{"name":"sequentialthinking","description":"A detailed tool for dynamic and reflective problem-solving through thoughts.\nThis tool helps analyze problems through a flexible thinking process that can adapt and evolve.\nEach thought can build on, question, or revise previous insights as understanding deepens.\n\nWhen to use this tool:\n- Breaking down complex problems into steps\n- Planning and design with room for revision\n- Analysis that might need course correction\n- Problems where the full scope might not be clear initially\n- Problems that require a multi-step solution\n- Tasks that need to maintain context over multiple steps\n- Situations where irrelevant information needs to be filtered out\n\nKey features:\n- You can adjust total_thoughts up or down as you progress\n- You can question or revise previous thoughts\n- You can add more thoughts even after reaching what seemed like the end\n- You can express uncertainty and explore alternative approaches\n- Not every thought needs to build linearly - you can branch or backtrack\n- Generates a solution hypothesis\n- Verifies the hypothesis based on the Chain of Thought steps\n- Repeats the process until satisfied\n- Provides a correct answer\n\nParameters explained:\n- thought: Your current thinking step, which can include:\n  * Regular analytical steps\n  * Revisions of previous thoughts\n  * Questions about previous decisions\n  * Realizations about needing more analysis\n  * Changes in approach\n  * Hypothesis generation\n  * Hypothesis verification\n- nextThoughtNeeded: True if you need more thinking, even if at what seemed like the end\n- thoughtNumber: Current number in sequence (can go beyond initial total if needed)\n- totalThoughts: Current estimate of thoughts needed (can be adjusted up/down)\n- isRevision: A boolean indicating if this thought revises previous thinking\n- revisesThought: If is_revision is true, which thought number is being reconsidered\n- branchFromThought: If branching, which thought number is the branching point\n- branchId: Identifier for the current branch (if any)\n- needsMoreThoughts: If reaching end but realizing more thoughts needed\n\nYou should:\n1. Start with an initial estimate of needed thoughts, but be ready to adjust\n2. Feel free to question or revise previous thoughts\n3. Don't hesitate to add more thoughts if needed, even at the \"end\"\n4. Express uncertainty when present\n5. Mark thoughts that revise previous thinking or branch into new paths\n6. Ignore information that is irrelevant to the current step\n7. Generate a solution hypothesis when appropriate\n8. Verify the hypothesis based on the Chain of Thought steps\n9. Repeat the process until satisfied with the solution\n10. Provide a single, ideally correct answer as the final output\n11. Only set nextThoughtNeeded to false when truly done and a satisfactory answer is reached","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"dev","type":"runner_process","description":"npx -y @modelcontextprotocol/server-sequential-thinking","runnerConfig":{"packageManager":"npx","packageNameOrCommand":"npx","args":["-y","@modelcontextprotocol/server-sequential-thinking"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.317Z","updatedAt":"2026-08-14T01:08:24.047Z"},{"id":"hermes-strapi","name":"strapi","enabled":true,"tools":[{"name":"list_content_types","description":"List all content types (collections) in Strapi","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_entries","description":"List entries of a specific content type (e.g., 'articles', 'pages')","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_entry","description":"Get a single entry by ID from a content type","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"search_entries","description":"Search entries by field value","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_entry","description":"Create a new entry. data is the JSON body (e.g., '{\"title\":\"Hello\",\"body\":\"World\"}')","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"update_entry","description":"Update an entry by ID","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"delete_entry","description":"Delete an entry by ID","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_users","description":"List Strapi users","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"health","description":"Check Strapi health","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"dev","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/strapi-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/strapi-mcp","python","server.py"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.320Z","updatedAt":"2026-08-14T01:08:24.066Z"},{"id":"hermes-stripe","name":"stripe","enabled":false,"tools":[{"name":"health","description":"Check Stripe API key shape and API reachability.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_customers","description":"List Stripe customers using the configured key.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_payment_intents","description":"List Stripe payment intents using the configured key.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"dev","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/stripe-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/stripe-mcp","python","server.py"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.323Z","updatedAt":"2026-08-14T01:10:57.111Z"},{"id":"hermes-supabase","name":"supabase","enabled":true,"tools":[{"name":"health","description":"","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_tables","description":"","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"query","description":"","category":"data","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"data","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/supabase-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/supabase-mcp","python","server.py"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.328Z","updatedAt":"2026-08-14T01:08:24.084Z"},{"id":"hermes-telegram-search","name":"telegram-search","enabled":true,"tools":[{"name":"search_telegram","description":"Global Telegram search for channels, groups, users and bots matching a query.\n\n    This is the tool for finding entities like a carding shop or vendor by keyword\n    (e.g. \"python cards\", \"cc dump\", \"clone cards\"). Returns a structured list of\n    matching entities with username, title, type, member count and about text.\n    ","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"resolve_username","description":"Resolve a Telegram username (@handle) to entity details + recent messages.\n\n    Pass the username with or without '@'. Returns type, title, about, member count,\n    and up to 20 recent messages (text + date + views).\n    ","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"search_card_shops","description":"Search Telegram for carding/cc shops and vendors by keyword.\n\n    Convenience wrapper around search_telegram tuned for carding terms.\n    Defaults to 'cc'; pass e.g. 'python', 'clone cards', 'cvv', 'dump'.\n    ","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"web","type":"remote_http","description":"Remote MCP endpoint (http://127.0.0.1:8093/mcp)","endpointUrl":"http://127.0.0.1:8093/mcp","healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.331Z","updatedAt":"2026-08-14T01:08:24.101Z"},{"id":"hermes-token-savior","name":"token-savior","enabled":true,"tools":[{"name":"list_projects","description":"List all registered workspace projects with index status.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"switch_project","description":"Switch the active project.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_git_status","description":"Structured git status: branch, ahead/behind, staged, unstaged, untracked.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_changed_symbols","description":"Symbol-level summary of worktree changes (or HEAD vs ref).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"build_commit_summary","description":"Compact commit/review narrative with stats, hotspots, suggested type.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"checkpoint","description":"Unified checkpoint CRUD. op = create | list (default) | restore | delete | prune | compare.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"replace_symbol_source","description":"Replace an indexed symbol's full source block directly.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"edit_lines_in_symbol","description":"Exact string-replace inside an indexed symbol's body (like Edit but symbol-scoped, no Read first needed).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"insert_near_symbol","description":"Insert content before or after an indexed symbol.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"move_symbol","description":"Move a symbol to a different file, updating imports in all call sites.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"add_field_to_model","description":"Add a field to a model/class/interface. Supports .prisma, .py (dataclass, SQLAlchemy), .ts/.tsx.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"find_impacted_test_files","description":"Infer pytest files likely impacted by changed files or symbols.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"run_impacted_tests","description":"Run pytest on files impacted by the current worktree changes.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"discover_project_actions","description":"Detect conventional project actions from build files (tests, lint, build, run) without executing.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"run_project_action","description":"Run a discovered project action by id (bounded output, bounded timeout).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_project_summary","description":"Project overview: file count, packages, top classes/functions, infra dirs.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_files","description":"List indexed files, optionally filtered by glob.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_structure_summary","description":"Structure of one file (functions, classes, imports, line counts), or project-wide if file omitted.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_function_source","description":"Fetch a function/method source body.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_class_source","description":"Fetch a class source body (including methods).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_functions","description":"List functions in a file (file_path=...) or across the project.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_classes","description":"List classes (name, lines, methods, bases, file).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_imports","description":"List imports (module, names, line).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"find_symbol","description":"Locate a symbol: file, line, signature, minimal preview.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_dependencies","description":"Outgoing deps of a symbol: what X calls/uses (downstream).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_dependents","description":"Incoming deps: who calls/uses X, direct references only.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_change_impact","description":"Impact analysis: direct + transitive dependents of a symbol.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_full_context","description":"Symbol bundle: location + source + deps/dependents (depth=1) or + change_impact (depth=2).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_call_chain","description":"Shortest dependency path between two symbols (BFS through the dep graph).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_edit_context","description":"Pre-edit bundle: source + direct deps + callers + same-file siblings + impacted tests.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_file_dependencies","description":"Files imported by this file (outgoing file-level import edges).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_file_dependents","description":"Files that import this file (incoming file-level import edges).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"search_codebase","description":"Regex (default) or semantic (semantic=true) search across indexed files.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"search_in_symbols","description":"Regex search that returns the enclosing function/class for each match, in addition to file:line.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"reindex","description":"Rebuild the project index.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"set_project_root","description":"Register a new project root and switch to it. If the path is already registered, this becomes a cheap active-root switch (no reindex) unless force=true is set.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_feature_files","description":"Files matching a feature keyword + traced imports, classified by role (core, test, config).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"ts_discover","description":"Scan Claude Code transcripts for missed Token Savior opportunities (native-call chains that should have been a single TS call) and/or report TS-vs-native adoption ratios. Scans ALL transcript projects by default; pass project=<substring> to filter. format='table' (default) or 'json' returns ranked Findings; format='adoption' or 'adoption_json' returns the TS adoption summary with trend + worst sessions. Read-only, PII-safe.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_stats","description":"Unified stats dispatcher. category = usage (default) | session_budget | tca | dcp | linucb | warmstart | leiden | speculation | lattice.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_routes","description":"Detect API routes and pages in a Next.js App Router project: path, file, HTTP methods, type.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_env_usage","description":"Cross-reference an env var across code, .env files, and workflow configs. Shows where it's defined, read, written.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"analyze_config","description":"Audit config files (.env/.yaml/.toml/.json): duplicates, secrets, orphans.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"find_dead_code","description":"Project-wide audit of unreferenced functions/classes (zero callers, excludes entry points, tests, route handlers).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"find_hotspots","description":"Rank functions by hotspot kind. complexity (all langs) | allocation (Java) | performance (Java).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"detect_breaking_changes","description":"Breaking API changes vs a git ref: removed funcs/params, added required params, signature changes.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"analyze_docker","description":"Audit Dockerfiles: base images, stages, exposed ports, ENV/ARG, cross-ref with config files.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_db_schema","description":"Condensed SQL-migration snapshot: tables (cols, types, nullability, defaults), PKs, FKs, indexes, RLS policies.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_entry_points","description":"Score functions by likelihood of being execution entry points: routes, handlers, main, exported APIs.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"memory_save","description":"Persist a fact, guardrail, or note across sessions.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"memory_search","description":"Layer 2 FTS5 search over memory observations, compact rows with snippets (~60 tokens/result).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"memory_get","description":"Layer 3: full observation content by IDs (~200 tokens/result). Final progressive-disclosure layer.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"memory_delete","description":"Soft-delete an observation by ID (sets archived=1).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"memory_index","description":"Layer 1: compact index of recent observations — ID, type, title, importance, age, citation URI.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"corpus_build","description":"Build a thematic corpus from observations filtered by type / tags / symbol.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"find_semantic_duplicates","description":"Find duplicate functions. method='ast' (fast, hash-based, catches copy-paste) or 'embedding' (Nomic cosine, catches conceptual clones, tagged sim=min..mean per cluster).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"find_import_cycles","description":"Detect import cycles (strongly-connected components) in the file-level import graph (Tarjan's).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"corpus_query","description":"Format all observations of a named corpus as markdown context + a question, ready for answering.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"reasoning_save","description":"Persist a reasoning trace (goal + steps + conclusion) for later reuse.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"reasoning_search","description":"Search stored reasoning chains by goal similarity (FTS5 + Jaccard).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"reasoning_list","description":"List stored reasoning chains by access_count then recency.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"capture_put","description":"Sandbox a verbose tool output to FTS5 store; returns id + preview.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"capture_search","description":"BM25 search across sandboxed tool outputs. Returns id, snippet, bytes.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"capture_get","description":"Read a capture (range: head/tail/all/preview/line:N-M).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"capture_aggregate","description":"Aggregate over a capture: stats|count_lines|unique_lines|extract:<re>|count:<re>.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"capture_list","description":"List recent captures (newest first).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"capture_purge","description":"Delete captures by age/session/project (filter required).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"memory_admin","description":"Single dispatch for all memory admin / maintenance ops (status, doctor, dedup_sweep, distill, roi_gc, consistency, vector_reindex, etc.).","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"ts_execute","description":"Run a JS script in a Node sandbox with a typed facade. The script body executes as `async () => { <body> }`; use `await tools.<name>(args)` to call any allowed tool (find_symbol, get_function_source, get_dependents, search_codebase, replace_symbol_source, etc.). Return the final value. Collapses find->read->deps chains into one round-trip.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"ts_search","description":"Find the top-K Token Savior tools most relevant to a natural-language query via embedding cosine similarity. Use when the manifest is in 'tiny' or 'code_mode' profile or you don't know which tool fits. Returns each candidate with its full inputSchema (format='schema') or a one-line TypeScript signature (format='ts') suitable for ts_execute scripts.","category":"dev","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"dev","type":"runner_process","description":"/Users/drjones/.hermes/mcp-servers/token-savior-venv/bin/token-savior --profile ultra","runnerConfig":{"packageManager":"binary","packageNameOrCommand":"/Users/drjones/.hermes/mcp-servers/token-savior-venv/bin/token-savior","args":["--profile","ultra"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.334Z","updatedAt":"2026-08-14T01:08:24.124Z"},{"id":"hermes-transmute","name":"transmute","enabled":true,"tools":[{"name":"health","description":"Check Transmute API reachability.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_converters","description":"List available converters and supported formats.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_files","description":"List uploaded files.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_jobs","description":"List conversion jobs.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"get_job","description":"Get a conversion job by ID.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"upload_url","description":"Upload a file from a URL to Transmute.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"upload_file","description":"Upload a local file to Transmute.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"convert_file","description":"Convert an uploaded file to a target format.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"submit_job","description":"Submit a background conversion job.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"download_file","description":"Return the Transmute download URL for a file.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"delete_file","description":"Delete an uploaded file.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"network","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/transmute-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/transmute-mcp","python","server.py"],"env":{"TRANSMUTE_URL":"http://10.30.20.95:3313"}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.337Z","updatedAt":"2026-08-14T01:08:24.140Z"},{"id":"hermes-twentycrm","name":"twentycrm","enabled":true,"tools":[{"name":"list_companies","description":"List companies/accounts in CRM","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_people","description":"List people/contacts in CRM","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"search_people","description":"Search contacts by name, email, or phone","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_person","description":"Create a new contact/person in Twenty CRM","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"update_person","description":"Update an existing contact/person","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"create_company","description":"Create a new company in Twenty CRM","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"health","description":"Check TwentyCRM health","category":"memory","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"memory","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/twentycrm-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/twentycrm-mcp","python","server.py"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.342Z","updatedAt":"2026-08-14T01:08:24.155Z"},{"id":"hermes-vikunja","name":"vikunja","enabled":true,"tools":[{"name":"health","description":"","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_tasks","description":"","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"list_lists","description":"","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"network","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/vikunja-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/vikunja-mcp","python","server.py"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.345Z","updatedAt":"2026-08-14T01:08:24.170Z"},{"id":"hermes-wikijs","name":"wikijs","enabled":true,"tools":[{"name":"health","description":"","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"search_pages","description":"","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"web","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/wikijs-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/wikijs-mcp","python","server.py"],"env":{}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.348Z","updatedAt":"2026-08-14T01:08:24.189Z"},{"id":"hermes-windows-mcp","name":"windows-mcp","enabled":true,"tools":[{"name":"App","description":"Open/start/launch applications and manage windows. Keywords: open, start, launch, program, application, window, foreground, focus, resize. Three modes: 'launch' (opens the prescribed application), 'resize' (adjusts the size/position of a named window or the active window if name is omitted), 'switch' (brings specific window into focus).","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"PowerShell","description":"Shell/command execution. Keywords: shell, run, execute, cmd, terminal, command line, script. A comprehensive system tool for executing any PowerShell commands. Use it to navigate the file system, manage files and processes, and execute system-level operations. Capable of accessing web content (e.g., via Invoke-WebRequest), interacting with network resources, and performing complex administrative tasks. This tool provides full access to the underlying operating system capabilities, making it the primary interface for system automation, scripting, and deep system interaction.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"FileSystem","description":"Manages file system operations with eight modes: 'read' (read text file contents with optional line offset/limit), 'write' (create or overwrite a file, set append=True to append), 'copy' (copy file or directory to destination), 'move' (move or rename file/directory), 'delete' (delete file or directory, set recursive=True for non-empty dirs), 'list' (list directory contents with optional pattern filter), 'search' (find files matching a glob pattern), 'info' (get file/directory metadata like size, dates, type). Relative paths are resolved from the user's Desktop folder. Use absolute paths to access other locations.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"Snapshot","description":"Take a screenshot and inspect the screen. Keywords: screenshot, screen capture, see screen, observe, look, inspect, UI elements, what's on screen. Captures complete desktop state including: system language, focused/opened windows, interactive elements (buttons, text fields, links, menus with coordinates), and scrollable areas. Set use_vision=True to include screenshot with cursor highlight. Set use_annotation=False to get a clean screenshot without bounding box overlays on UI elements (default: True, draws colored rectangles around detected elements). Set use_ui_tree=False for a faster screenshot-only snapshot when you do not need interactive or scrollable element extraction. Set width_reference_lines/height_reference_lines to overlay a grid for better spatial reasoning (make sure vision is enabled to use it). Set use_dom=True for browser content to get web page elements instead of browser UI. Set display=[0] or display=[0,1] to limit all returned Snapshot information to specific screens; omit it to keep the default full-desktop behavior. Always call this first to understand the current desktop state before taking actions.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"Screenshot","description":"Captures a fast screenshot-first desktop snapshot with cursor position, desktop/window summaries, and an image. This path skips UI tree extraction for speed. Use Snapshot when you need interactive element ids, scrollable regions, or browser DOM extraction. Note: the returned image may be downscaled for efficiency; when it is, multiply image coordinates by the ratio of original size to displayed size to get the actual screen coordinates for mouse actions (Click, Move, etc.).","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"Click","description":"Performs mouse clicks at specified coordinates [x, y] or passing a UI element's label/id. Supports button types: 'left' for selection/activation, 'right' for context menus, 'middle'. Supports clicks: 0=hover only (no click), 1=single click (select/focus), 2=double click (open/activate). Provide either loc or label.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"Type","description":"Types text at specified coordinates [x, y] or passing a UI element's label/id. Set clear=True to clear existing text first, False to append. Set press_enter=True to submit after typing. Set caret_position to 'start' (beginning), 'end' (end), or 'idle' (default). Provide either loc or label.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"Scroll","description":"Scrolls at coordinates [x, y], a UI element's label/id, or current mouse position if loc=None. Type: vertical (default) or horizontal. Direction: up/down for vertical, left/right for horizontal. wheel_times controls amount (1 wheel ≈ 3-5 lines). Use for navigating long content, lists, and web pages.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"Move","description":"Moves mouse cursor to coordinates [x, y] or passing a UI element's label/id. Set drag=True to perform a drag-and-drop operation from the current mouse position to the target coordinates. Default (drag=False) is a simple cursor move (hover). Provide either loc or label.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"Shortcut","description":"Executes keyboard shortcuts using key combinations separated by +. Examples: \"ctrl+c\" (copy), \"ctrl+v\" (paste), \"alt+tab\" (switch apps), \"win+r\" (Run dialog), \"win\" (Start menu), \"ctrl+shift+esc\" (Task Manager). Use for quick actions and system commands.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"Wait","description":"Pauses execution for specified duration in seconds. Use when waiting for: applications to launch/load, UI animations to complete, page content to render, dialogs to appear, or between rapid actions. Helps ensure UI is ready before next interaction.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"WaitFor","description":"Waits until a UI condition is satisfied, polling the Windows accessibility tree inside the tool to avoid repeated Snapshot calls. Conditions: text_exists, active_window, element_exists, element_enabled, focused_element. Provide text and/or window_name depending on the condition. Set use_dom=True for browser DOM text.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"Scrape","description":"Fetch/scrape web page content from a URL. Keywords: scrape, fetch, browse, web, URL, extract, download, read webpage. By default (use_dom=False), performs a lightweight HTTP request to the URL and returns a clean LLM-processed summary of the page to avoid context bloat. Provide query to focus extraction on specific information. Set use_dom=True to extract from the active browser tab's DOM instead (required when site blocks HTTP requests; supported in Chrome, Edge, and Firefox). Set use_sampling=False to get raw content without LLM processing.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"MultiSelect","description":"Selects multiple items such as files, folders, or checkboxes if press_ctrl=True, or performs multiple clicks if False. Pass locs (list of coordinates) or labels (list of UI element labels/ids).","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"MultiEdit","description":"Enters text into multiple input fields at specified coordinates locs=[[x,y,text], ...] or using labels=[[label,text], ...]. Provide either locs or labels.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"Clipboard","description":"Copy/paste clipboard operations. Keywords: copy, paste, cut, clipboard, text transfer. Use mode=\"get\" to read current clipboard content, mode=\"set\" to set clipboard text.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"Process","description":"List and kill running processes. Keywords: task manager, running tasks, kill, terminate, stop process, PID, CPU, memory usage. Use mode=\"list\" to list running processes with filtering and sorting options. Use mode=\"kill\" to terminate processes by PID or name.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"Notification","description":"Sends a Windows toast notification with a title and message.","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"Registry","description":"Read and write the Windows Registry. Keywords: regedit, registry key, HKEY, HKCU, HKLM, Windows settings, registry value. Use mode=\"get\" to read a value, mode=\"set\" to create/update a value, mode=\"delete\" to remove a value or key, mode=\"list\" to list values and sub-keys under a path. Paths use PowerShell format (e.g. \"HKCU:\\Software\\MyApp\", \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\").","category":"network","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"network","type":"remote_http","description":"Remote MCP endpoint (http://10.30.20.128:8091/mcp)","endpointUrl":"http://10.30.20.128:8091/mcp","headers":{"Authorization":"Bearer MKoUhwzEQkv2tpWrTdJFLJUctIVJMFxD"},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.351Z","updatedAt":"2026-08-14T01:08:24.206Z"},{"id":"hermes-yacy-mcp","name":"yacy-mcp","enabled":true,"tools":[{"name":"yacy_search","description":"Search your private YaCy P2P search engine index. Use for local knowledge, coding docs, research papers.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"yacy_status","description":"Check YaCy server status — index size, crawl queue, peer count (uses public Status page).","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}},{"name":"yacy_crawl","description":"Add a URL to YaCy's crawl queue. Starts a new crawl for the given URL.","category":"web","inputSchema":{"type":"object","properties":{},"required":[]}}],"category":"custom","type":"runner_process","description":"uv run --directory /Users/drjones/.hermes/mcp-servers/yacy-mcp python server.py","runnerConfig":{"packageManager":"uvx","packageNameOrCommand":"uv","args":["run","--directory","/Users/drjones/.hermes/mcp-servers/yacy-mcp","python","server.py"],"env":{"YACY_URL":"http://10.30.20.202:8090"}},"healthStatus":"unknown","createdAt":"2026-08-14T00:41:20.356Z","updatedAt":"2026-08-14T01:10:57.430Z"},{"name":"Text Sentiment & Keyword Extractor MCP","description":"Standalone JavaScript script tool for fast client/server text analysis and keyphrase extraction.","type":"custom_script","category":"code","icon":"Zap","customScript":"\n        const text = args.text || '';\n        const words = text.toLowerCase().match(/\\b[a-z]{4,}\\b/g) || [];\n        const freq = {};\n        words.forEach(w => freq[w] = (freq[w] || 0) + 1);\n        const topKeywords = Object.entries(freq).sort((a,b) => b[1] - a[1]).slice(0, 5).map(e => e[0]);\n        return {\n          textLength: text.length,\n          wordCount: text.split(/\\s+/).length,\n          topKeywords,\n          sentiment: text.includes('great') || text.includes('awesome') || text.includes('good') ? 'positive' : 'neutral'\n        };\n      ","tools":[{"name":"extract_text_keywords_mcp","description":"Extract top keywords and estimate text sentiment.","category":"code","inputSchema":{"type":"object","properties":{"text":{"type":"string","description":"Text string to analyze"}},"required":["text"]}}],"enabled":true,"isPreset":true,"id":"mcp-custom-1786668449474-gw6wy9","healthStatus":"unknown","createdAt":"2026-08-14T00:47:29.474Z","updatedAt":"2026-08-14T02:09:30.063Z"},{"id":"redteam-superkali","name":"SUPERkali — Offensive Recon & Exploitation","description":"Kali Rolling VM. SSH root@10.30.20.177. Tools: nmap, theHarvester, sherlock, spiderfoot, recon-ng, sublist3r, amass, maltego, maryam, metasploit, hydra, burpsuite.","type":"remote_http","category":"redteam","enabled":true,"roadSign":{"isRoadSign":true,"signpostTitle":"SUPERkali (Kali Rolling) @ 10.30.20.177","targetHostLocation":"ssh://root@10.30.20.177","directionsInstructions":"SSH root/czapiewski. OSINT + recon + exploitation toolset. VM109.","osPlatform":"linux"},"tools":[],"healthStatus":"unknown","createdAt":"2026-08-15T06:09:47.327Z","updatedAt":"2026-08-15T06:09:47.327Z"},{"id":"redteam-commando","name":"comandoVM-live — Windows Red Team","description":"Windows Commando VM (VM601). Commando MCP SSE at :8000 — 5 tools: execute_command, run_powershell, list_tools, sysinfo, netstat_connections (SYSTEM).","type":"remote_http","category":"redteam","enabled":true,"roadSign":{"isRoadSign":true,"signpostTitle":"comandoVM-live (Commando) @ 10.30.20.47:8000","targetHostLocation":"http://10.30.20.47:8000","directionsInstructions":"Commando MCP (FastMCP SSE). Windows PowerShell / registry / UI automation via SYSTEM scheduled task.","osPlatform":"windows"},"tools":[],"healthStatus":"unknown","createdAt":"2026-08-15T06:09:47.351Z","updatedAt":"2026-08-15T06:09:47.351Z"},{"id":"redteam-trace-labs-osint","name":"trace-labs-osint — OSINT Workstation","description":"Trace Labs OSINT VM (VM547, 2 disks 38G+100G). Currently network-dead (no guest agent / ARP).","type":"remote_http","category":"redteam","enabled":false,"roadSign":{"isRoadSign":true,"signpostTitle":"trace-labs-osint (VM547) — IP TBD","targetHostLocation":"TBD","directionsInstructions":"OSINT VM. Network-dead — needs console check/reboot. Kali (redteam-superkali) covers OSINT tools meanwhile.","osPlatform":"linux"},"tools":[],"healthStatus":"unknown","createdAt":"2026-08-15T06:09:47.369Z","updatedAt":"2026-08-15T06:09:47.369Z"},{"id":"osint-vm","name":"trace-labs-osint — OSINT Workstation MCP","description":"Kali Trace Labs OSINT VM (VM547) @ 10.30.20.66. 24-tool FastMCP: theHarvester, sherlock, maigret, spiderfoot, sublist3r, holehe, h8mail, instaloader, toutatis, ignorant, infoga, osrframework, finalrecon, nmap, whois, exiftool, shodan, censys. Full shell control via run tool.","type":"remote_http","category":"osint","enabled":true,"tools":[],"healthStatus":"unknown","createdAt":"2026-08-15T07:09:39.994Z","updatedAt":"2026-08-15T07:09:39.994Z"},{"id":"mcp-qwen-mm-core","name":"Qwen MM Core","description":"Multimodal readers/renderers: image, video, office, data, code, 3D visualization (7 tools)","type":"runner","category":"multimodal","enabled":true,"command":"/root/.local/bin/uvx","args":["--from","qwen-mm-plugins[core] @ git+https://github.com/QwenLM/Qwen-MM-Plugins.git@qwen-mm-plugins-core-v1.0.2","qwen-mm-plugins-core"],"connectTimeout":180,"tools":[],"healthStatus":"unknown","createdAt":"2026-08-17T12:47:28.901Z","updatedAt":"2026-08-17T12:47:36.476Z"},{"name":"Comfy MCP (nightmare)","description":"Local ComfyUI MCP server on nightmare (.128). Generate images/video/audio, run workflows, manage nodes/models via comfy-cli against the local ComfyUI install.","type":"remote_http","category":"media","enabled":true,"endpointUrl":"http://10.30.20.29:8000/mcp","tools":[{"name":"server_info","description":"Report the local ComfyUI/comfy-cli environment and verify compatibility.\n\nWraps ``comfy env``. Call this first to confirm a local ComfyUI is up before\nrunning a workflow.\n\nReturns:\n    ``running``/``url``/``workspace``/``python`` — the LOCAL comfy-cl","category":"media","inputSchema":{"properties":{},"type":"object","title":"server_infoArguments"}},{"name":"auth_status","description":"Comfy Cloud credential status for partner-API nodes (read-only; never returns secrets).\n\nWraps ``comfy cloud whoami``. Call before running a workflow whose nodes hit\npartner APIs (Seedream / Veo / Kling / Gemini / …) to self-diagnose.\n\nReturns comfy-","category":"media","inputSchema":{"properties":{},"type":"object","title":"auth_statusArguments"}},{"name":"auth_login","description":"Start Comfy Cloud sign-in; returns an OAuth URL for the USER to open.\n\nWraps ``comfy cloud login --no-browser``; sign-in continues in the\nbackground, so this call returns fast, not a ten-minute block. Give the\nuser ``login_url``, let them finish in t","category":"media","inputSchema":{"properties":{},"type":"object","title":"auth_loginArguments"}},{"name":"run_workflow","description":"Run a ComfyUI workflow JSON on the ComfyUI this server targets.\n\nThat is this machine unless ``COMFYUI_URL``/``COMFYUI_HOST`` points the\nrun/job tools at another one. Wraps ``comfy run --workflow <path>``;\naccepts an API-format or UI-export file.\n\nAr","category":"media","inputSchema":{"properties":{"workflow_path":{"title":"Workflow Path","type":"string"},"wait":{"default":true,"title":"Wait","type":"boolean"},"timeout_seconds":{"default":110,"title":"Timeout Seconds","type":"number"},"confirm_spend":{"default":false,"title":"Confirm Spend","type":"boolean"}},"required":["workflow_path"],"type":"object","title":"run_workflowArguments"}},{"name":"generate_image","description":"Generate an image from a text prompt — the fast on-ramp.\n\nRuns ComfyUI's default SD1.5 template via ``comfy run-template`` (override\nwith ``COMFY_T2I_TEMPLATE`` + matching slot envs) — same run path/target\nas ``run_workflow``: this machine unless ``C","category":"media","inputSchema":{"properties":{"prompt":{"title":"Prompt","type":"string"},"checkpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Checkpoint"},"wait":{"default":true,"title":"Wait","type":"boolean"},"timeout_seconds":{"default":600,"title":"Timeout Seconds","type":"number"}},"required":["prompt"],"type":"object","title":"generate_imageArguments"}},{"name":"list_partner_models","description":"List the hosted PARTNER models ``partner_generate`` can run.\n\nWraps ``comfy generate list`` — the ONLY source of the partner alias\ncatalog (``nodes``/``search_templates`` read the local install).\n\nArgs:\n    style/partner/query: filters forwarded to c","category":"media","inputSchema":{"properties":{"style":{"default":"","title":"Style","type":"string"},"partner":{"default":"","title":"Partner","type":"string"},"query":{"default":"","title":"Query","type":"string"},"limit":{"default":100,"title":"Limit","type":"integer"},"offset":{"default":0,"title":"Offset","type":"integer"}},"type":"object","title":"list_partner_modelsArguments"}},{"name":"partner_model_schema","description":"Show one partner model's callable parameters — the input to ``partner_generate``.\n\nWraps ``comfy generate schema <model>``. ``model`` is an alias from\n``list_partner_models``. Reads the spec only — no partner API call, no spend.\n\nReturns: ``{model, i","category":"media","inputSchema":{"properties":{"model":{"title":"Model","type":"string"}},"required":["model"],"type":"object","title":"partner_model_schemaArguments"}},{"name":"partner_generate","description":"Run a hosted PARTNER model (Flux / Ideogram / DALL·E / Recraft / …) — SPENDS CREDITS.\n\nWraps ``comfy generate <model> [--param=value]…``. Runs entirely on the\nPARTNER's infrastructure — the user's local ComfyUI never executes anything.\nFor local exec","category":"media","inputSchema":{"properties":{"model":{"title":"Model","type":"string"},"params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Params"},"confirm_spend":{"default":false,"title":"Confirm Spend","type":"boolean"},"out_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Out Path"},"timeout_seconds":{"default":600,"title":"Timeout Seconds","type":"number"}},"required":["model"],"type":"object","title":"partner_generateArguments"}},{"name":"emit_partner_workflow","description":"Write a runnable workflow that drives a partner model's NODE on LOCAL ComfyUI.\n\nWraps ``comfy generate <model> --emit-workflow <out_path>``. Writes an\nAPI-format graph containing the partner's API node and returns — calls no\npartner API, spends nothi","category":"media","inputSchema":{"properties":{"model":{"title":"Model","type":"string"},"out_path":{"title":"Out Path","type":"string"},"params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Params"}},"required":["model","out_path"],"type":"object","title":"emit_partner_workflowArguments"}},{"name":"run_template","description":"Run a gallery template — fetch, fill params, execute.\n\nWraps ``comfy run-template <name> [--param=KEY=VALUE]…`` (fetches the\ngraph, fills its slots, runs via the same path as ``run_workflow``) — the\none-command alternative to ``search_templates`` -> ","category":"media","inputSchema":{"properties":{"name":{"title":"Name","type":"string"},"params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Params"},"confirm_spend":{"default":false,"title":"Confirm Spend","type":"boolean"},"wait":{"default":true,"title":"Wait","type":"boolean"},"timeout_seconds":{"default":600,"title":"Timeout Seconds","type":"number"}},"required":["name"],"type":"object","title":"run_templateArguments"}},{"name":"job","description":"Inspect, wait on, watch, or cancel a submitted job — one action per call.\n\nWraps the `comfy jobs` family. `action`:\n- \"status\" (default) -> `comfy jobs status <prompt_id>`: status + outputs.\n- \"error\" -> same call, normalized: `error_code` (comfy-cli","category":"media","inputSchema":{"properties":{"action":{"default":"status","title":"Action","type":"string"},"prompt_id":{"default":"","title":"Prompt Id","type":"string"},"timeout_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Timeout Seconds"}},"type":"object","title":"jobArguments"}},{"name":"system_stats","description":"Read the live local ComfyUI's VRAM per device and system RAM.\n\nWraps ``comfy system-stats`` (ComfyUI's own ``GET /system_stats``).\nForwarded near-verbatim: a ``devices`` list (per-device\n``vram_free``/``vram_total`` bytes) plus a ``system`` dict\n(``r","category":"media","inputSchema":{"properties":{},"type":"object","title":"system_statsArguments"}},{"name":"free_memory","description":"Ask the local ComfyUI to unload models / reset its executor cache.\n\nWraps ``comfy free`` (ComfyUI's own ``POST /free``). Pair with\n``system_stats`` for the before/after.\n\nArgs:\n    unload_models: True (default) unloads all models from VRAM.\n        `","category":"media","inputSchema":{"properties":{"unload_models":{"default":true,"title":"Unload Models","type":"boolean"},"free_memory":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"title":"Free Memory"}},"type":"object","title":"free_memoryArguments"}},{"name":"fetch_outputs","description":"Download a completed job's output files into ``out_dir``.\n\nWraps ``comfy download <prompt_id> --where local -o <out_dir>``.\n``url_only=True`` adds ``--url-only`` — emits URLs without downloading.\n\nWorks for a job that ran on a configured REMOTE too, ","category":"media","inputSchema":{"properties":{"prompt_id":{"title":"Prompt Id","type":"string"},"out_dir":{"title":"Out Dir","type":"string"},"url_only":{"default":false,"title":"Url Only","type":"boolean"},"inline_images":{"default":false,"title":"Inline Images","type":"boolean"}},"required":["prompt_id","out_dir"],"type":"object","title":"fetch_outputsArguments"}},{"name":"launch_comfyui","description":"Start the LOCAL ComfyUI server, detached, and return once it is up.\n\nWraps ``comfy launch --background``, recording its pid so ``stop_comfyui``\ncan shut it down. ``extra_args`` forward to ComfyUI after a ``--``\nseparator. Call ``server_info`` first —","category":"media","inputSchema":{"properties":{"extra_args":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Extra Args"},"confirm_network_exposure":{"default":false,"title":"Confirm Network Exposure","type":"boolean"}},"type":"object","title":"launch_comfyuiArguments"}},{"name":"stop_comfyui","description":"Stop the LOCAL ComfyUI server that comfy-cli launched.\n\nWraps ``comfy stop``. Ownership semantics: comfy-cli only kills the pid it\nrecorded when IT launched the server (via ``launch_comfyui``) — it cannot\nstop a ComfyUI started by the desktop app or ","category":"media","inputSchema":{"properties":{},"type":"object","title":"stop_comfyuiArguments"}},{"name":"restart_comfyui","description":"Restart the LOCAL ComfyUI server: stop the running one, then launch a fresh one.\n\nComposes ``stop_comfyui`` + ``launch_comfyui`` (no ``comfy restart`` verb);\n``extra_args`` forward to the new server. Returns the new server's status.\n\nCarries ``launch","category":"media","inputSchema":{"properties":{"extra_args":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Extra Args"},"confirm_network_exposure":{"default":false,"title":"Confirm Network Exposure","type":"boolean"},"confirm_kill_untracked":{"default":false,"title":"Confirm Kill Untracked","type":"boolean"}},"type":"object","title":"restart_comfyuiArguments"}},{"name":"update_comfyui","description":"Update the LOCAL install — ComfyUI core, the custom node packs (asks\nfirst), or comfy-cli.\n\nWraps ``comfy update <target>``.\n\nArgs:\n    target: ``\"comfy\"`` (default) updates ComfyUI core (``git pull`` +\n        reinstall). ``\"all\"`` updates every ins","category":"media","inputSchema":{"properties":{"target":{"default":"comfy","title":"Target","type":"string"},"confirm_update_all":{"default":false,"title":"Confirm Update All","type":"boolean"}},"type":"object","title":"update_comfyuiArguments"}},{"name":"switch_comfyui_version","description":"Move the LOCAL ComfyUI install to a specific version — DESTRUCTIVE, asks first.\n\nWraps ``comfy update comfy --version <version>``: stashes uncommitted\nchanges, moves the checkout, reinstalls dependencies. Use to roll BACK —\n``update_comfyui`` only mo","category":"media","inputSchema":{"properties":{"version":{"title":"Version","type":"string"},"confirm_switch":{"default":false,"title":"Confirm Switch","type":"boolean"}},"required":["version"],"type":"object","title":"switch_comfyui_versionArguments"}},{"name":"install_node","description":"Install custom node packs into the LOCAL ComfyUI — runs third-party code, asks first.\n\nWraps ``comfy node install <name...> --exit-on-fail``. Feed it registry pack\nids (e.g. ``\"comfyui-impact-pack\"``) from ``nodes`` /\n``workflow_deps`` — never a node","category":"media","inputSchema":{"properties":{"names":{"items":{"type":"string"},"title":"Names","type":"array"},"confirm_install":{"default":false,"title":"Confirm Install","type":"boolean"}},"required":["names"],"type":"object","title":"install_nodeArguments"}},{"name":"get_logs","description":"Return the tail of the LOCAL background ComfyUI's captured log file.\n\nWraps ``comfy logs --tail <tail>`` — reads comfy-cli's persisted\nstdout/stderr file, the only way to see a detached server's output.\nReturns ``{lines, path, truncated}``.\n\nArgs:\n  ","category":"media","inputSchema":{"properties":{"tail":{"default":200,"title":"Tail","type":"integer"},"port":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Port"}},"type":"object","title":"get_logsArguments"}},{"name":"discover","description":"Return comfy-cli's self-describing command surface (its own contract).\n\nWraps ``comfy discover`` so an agent can learn the CLI's contract at\nruntime instead of hard-coding it.\n\nArgs:\n    schemas_only: forwards ``--schemas-only`` to the CLI (default T","category":"media","inputSchema":{"properties":{"schemas_only":{"default":true,"title":"Schemas Only","type":"boolean"},"command":{"default":"","title":"Command","type":"string"}},"type":"object","title":"discoverArguments"}},{"name":"which","description":"Report which ComfyUI install/workspace comfy-cli currently targets.\n\nWraps ``comfy which``. A lightweight \"which one is selected?\" answer; note\nthat ``server_info`` (``comfy env``) already reports the same selected\nworkspace alongside the running-ser","category":"media","inputSchema":{"properties":{},"type":"object","title":"whichArguments"}},{"name":"project","description":"Report or create the operator-anchored comfy-cli project (`project/1`).\n\n`action=\"status\"` -> `comfy project status`; `\"init\"` -> `comfy project\ninit` (creates `comfy.yaml` + dirs; `project_already_exists` if already\ngoverned — try `action=\"status\"` ","category":"media","inputSchema":{"properties":{"action":{"default":"status","title":"Action","type":"string"}},"type":"object","title":"projectArguments"}},{"name":"search_templates","description":"Search the built-in ComfyUI workflow-template gallery.\n\nWraps ``comfy templates ls`` (~558 rows, narrows/pages it). Returns\n``{\"total\", \"shown\", \"offset\", \"rows\"}`` — rows projected to\n``name/title/description/output_type/tags/category_title`` plus a","category":"media","inputSchema":{"properties":{"query":{"default":"","title":"Query","type":"string"},"limit":{"default":25,"title":"Limit","type":"integer"},"offset":{"default":0,"title":"Offset","type":"integer"},"tag":{"default":"","title":"Tag","type":"string"},"type":{"default":"","title":"Type","type":"string"},"model":{"default":"","title":"Model","type":"string"},"provider":{"default":"","title":"Provider","type":"string"},"exclude_api":{"default":false,"title":"Exclude Api","type":"boolean"}},"type":"object","title":"search_templatesArguments"}},{"name":"get_template","description":"Show one template's details/schema, and whether your install can run it.\n\nWraps ``comfy templates show <name>``. Step 2 of the on-ramp: inspect\nbefore ``fetch_template(name, out_path)`` writes the runnable JSON.\n\nArgs:\n    check_local: True (default)","category":"media","inputSchema":{"properties":{"name":{"title":"Name","type":"string"},"check_local":{"default":true,"title":"Check Local","type":"boolean"}},"required":["name"],"type":"object","title":"get_templateArguments"}},{"name":"fetch_template","description":"Write a template's runnable workflow JSON to ``out_path``; report if it can run here.\n\nWraps ``comfy templates fetch <name> --out <path>``. Returns ``{\"path\": ...,\n\"local_check\": {...}}`` — completing the on-ramp::\n\n    result = fetch_template(\"flux_","category":"media","inputSchema":{"properties":{"name":{"title":"Name","type":"string"},"out_path":{"title":"Out Path","type":"string"},"check_local":{"default":true,"title":"Check Local","type":"boolean"}},"required":["name","out_path"],"type":"object","title":"fetch_templateArguments"}},{"name":"nodes","description":"Search, inspect, filter, or graph-walk node classes in the LOCAL live catalog.\n\nWraps the `comfy nodes` family (`object_info`, incl. custom nodes).\n`action`:\n- \"search\" (default) -> `nodes search <query>`: find a class name by\n  keyword. Case-insensi","category":"media","inputSchema":{"properties":{"action":{"default":"search","title":"Action","type":"string"},"query":{"default":"","title":"Query","type":"string"},"name":{"default":"","title":"Name","type":"string"},"produces":{"default":"","title":"Produces","type":"string"},"accepts":{"default":"","title":"Accepts","type":"string"},"category":{"default":"","title":"Category","type":"string"},"pack":{"default":"","title":"Pack","type":"string"},"label":{"default":"","title":"Label","type":"string"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Limit"},"from_type":{"default":"","title":"From Type","type":"string"},"to_type":{"default":"","title":"To Type","type":"string"},"max_depth":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Max Depth"},"max_paths":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Max Paths"}},"type":"object","title":"nodesArguments"}},{"name":"node_dependencies","description":"Report a custom node pack's Python dependency requirements vs the installed venv (read-only).\n\nWraps ``comfy node deps``. Separate from ``nodes``\n(that reads live ``object_info``; this reads the venv's ``pip list``) —\nnothing is installed or changed.","category":"media","inputSchema":{"properties":{"pack":{"default":"","title":"Pack","type":"string"},"registry_id":{"default":"","title":"Registry Id","type":"string"}},"type":"object","title":"node_dependenciesArguments"}},{"name":"workflow_deps","description":"Map a workflow's node classes to the node PACKS that provide them (read-only).\n\nWraps ``comfy node deps-in-workflow``. Closes the loop\n``validate_workflow`` opens::\n\n    validate_workflow -> workflow_deps -> install_node -> restart_comfyui\n\nAccepts t","category":"media","inputSchema":{"properties":{"workflow_path":{"title":"Workflow Path","type":"string"}},"required":["workflow_path"],"type":"object","title":"workflow_depsArguments"}},{"name":"search_models","description":"Search / list model files available to the LOCAL ComfyUI install.\n\nThree modes: ``query`` -> ``comfy models search --text <query>``\n(filename match, all folders on v1.14.0+, ``checkpoints`` only below the\nfloor); else ``folder`` -> ``comfy models lis","category":"media","inputSchema":{"properties":{"query":{"default":"","title":"Query","type":"string"},"folder":{"default":"","title":"Folder","type":"string"}},"type":"object","title":"search_modelsArguments"}},{"name":"download_model","description":"Download a model file into the LOCAL ComfyUI models dir, by URL.\n\nWraps ``comfy model download --url <url> [--relative-path <path>]\n[--filename <name>] --background`` (the singular ``model`` verb, not the\n``models`` catalog ``search_models`` reads). ","category":"media","inputSchema":{"properties":{"url":{"title":"Url","type":"string"},"relative_path":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Relative Path"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Filename"},"wait":{"default":true,"title":"Wait","type":"boolean"},"timeout_seconds":{"default":110,"title":"Timeout Seconds","type":"number"}},"required":["url"],"type":"object","title":"download_modelArguments"}},{"name":"download","description":"Track a transfer already started by download_model; does NOT start one.\n\nWraps `comfy model download-status`/`download-cancel`. `action`:\n- \"status\" (default) -> status, completed_bytes/total_bytes/percent,\n  elapsed_seconds, dest, error. comfy-cli w","category":"media","inputSchema":{"properties":{"action":{"default":"status","title":"Action","type":"string"},"download_id":{"default":"","title":"Download Id","type":"string"},"timeout_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"default":null,"title":"Timeout Seconds"}},"type":"object","title":"downloadArguments"}},{"name":"upload_file","description":"Upload files from this machine into the target ComfyUI's ``input`` directory.\n\nWraps ``comfy upload <files...> --overwrite/--no-overwrite``. Stages\nsource images/masks a workflow references by filename — required for\nimg2img/inpaint.\n\nArgs:\n    overw","category":"media","inputSchema":{"properties":{"paths":{"items":{"type":"string"},"title":"Paths","type":"array"},"overwrite":{"default":false,"title":"Overwrite","type":"boolean"}},"required":["paths"],"type":"object","title":"upload_fileArguments"}},{"name":"validate_workflow","description":"Pre-flight a workflow against the live local ComfyUI before running it.\n\nWraps ``comfy validate --workflow <path>`` — checks class_types, input\nshapes, enums and wiring against the running ComfyUI's ``object_info``.\n\nReturns:\n    comfy-cli's own repo","category":"media","inputSchema":{"properties":{"workflow_path":{"title":"Workflow Path","type":"string"}},"required":["workflow_path"],"type":"object","title":"validate_workflowArguments"}},{"name":"list_workflow_slots","description":"List the agent-tweakable slots a frontend-format workflow exposes.\n\nWraps ``comfy workflow slots <path>``. A \"slot\" is a parameter comfy-cli\nsurfaces as a stable ``ADDR`` (prompt text, seed, step count, model name)\nplus its current value, so an agent","category":"media","inputSchema":{"properties":{"workflow_path":{"title":"Workflow Path","type":"string"}},"required":["workflow_path"],"type":"object","title":"list_workflow_slotsArguments"}},{"name":"list_workflow_notes","description":"List the documentation notes a frontend-format workflow carries.\n\nWraps ``comfy workflow notes <path>``. Surfaces ``Note``/``MarkdownNote``\ntext (trigger words, model links, usage instructions) — not included in\n``list_workflow_slots``. Needs no runn","category":"media","inputSchema":{"properties":{"workflow_path":{"title":"Workflow Path","type":"string"}},"required":["workflow_path"],"type":"object","title":"list_workflow_notesArguments"}},{"name":"set_workflow_slot","description":"Set one or more slot values on a frontend-format workflow.\n\nWraps ``comfy workflow set-slot <path> ADDR=VALUE [ADDR=VALUE ...]`` — the\nparameterize step of the template on-ramp: change the prompt/seed/steps/\nmodel without hand-editing the JSON.\n\nEach","category":"media","inputSchema":{"properties":{"workflow_path":{"title":"Workflow Path","type":"string"},"overrides":{"items":{"anyOf":[{"type":"string"},{"$ref":"#/$defs/SlotOverride"}]},"title":"Overrides","type":"array"},"stdout":{"default":true,"title":"Stdout","type":"boolean"}},"required":["workflow_path","overrides"],"type":"object","$defs":{"SlotOverride":{"description":"One ``set_workflow_slot`` override, as structured data instead of a string.\n\nThe reason this form exists: comfy-cli splits an override on its first ``=``\nand runs the value portion through ``json.loads``, falling back to the\nliteral string when that fails. So the ``\"ADDR=VALUE\"`` string form\nCOERCES — ``\"6.text=true\"`` sets the boolean ``true``, ``\"6.text=123\"`` sets\nthe integer ``123``, and there is no way to spell the literal strings\n``\"true\"`` / ``\"123\"`` through it. Sending the value as DATA is lossless in\nboth directions: this server JSON-encodes it, and comfy-cli's ``json.loads``\ndecodes exactly what was sent.","properties":{"address":{"description":"The slot address to set, exactly as `list_workflow_slots` reports it in a slot's `address` field (e.g. '6.text').","title":"Address","type":"string"},"value":{"description":"The value to set, as JSON data. Its type is preserved exactly: a string stays a string (even 'true' or '42'), a number stays a number, a boolean stays a boolean.","title":"Value"}},"required":["address","value"],"title":"SlotOverride","type":"object"}},"title":"set_workflow_slotArguments"}},{"name":"vary_workflow","description":"Fan a frontend-format workflow out into variants over slot value lists.\n\nWraps ``comfy workflow vary <path> --slot \"ADDR=[v1,v2,...]\" [--slot ...]``,\none entry per address (from ``list_workflow_slots``). comfy-cli ZIPS the\nvalue lists — every list MU","category":"media","inputSchema":{"properties":{"workflow_path":{"title":"Workflow Path","type":"string"},"slots":{"items":{"anyOf":[{"type":"string"},{"$ref":"#/$defs/SlotVariants"}]},"title":"Slots","type":"array"},"out_dir":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Out Dir"}},"required":["workflow_path","slots"],"type":"object","$defs":{"SlotVariants":{"description":"One ``vary_workflow`` slot — an address and the values to sweep over it.\n\nThe structured counterpart to the ``\"ADDR=[v1,v2,...]\"`` string form, and\nthe same lossless-vs-coercing trade-off as :class:`SlotOverride`: comfy-cli\nrequires the value portion to parse to a JSON array, so ``values`` is sent\nas one and every element keeps its type. It also removes the quoting\nfootgun the string form carries — a comma inside a prompt no longer has to\nbe hand-quoted to stay part of its value.","properties":{"address":{"description":"The slot address to vary, exactly as `list_workflow_slots` reports it in a slot's `address` field (e.g. '3.seed').","title":"Address","type":"string"},"values":{"description":"The values to sweep over this address, as JSON data. comfy-cli ZIPS the lists across slots, so every slot's list must be the same length. Must be non-empty.","items":{},"title":"Values","type":"array"}},"required":["address","values"],"title":"SlotVariants","type":"object"}},"title":"vary_workflowArguments"}}],"id":"mcp-custom-1787371940288-a4btg4","healthStatus":"unknown","createdAt":"2026-08-22T04:12:20.290Z","updatedAt":"2026-08-22T04:12:20.290Z"},{"name":"CivitAI Model Search (nightmare)","description":"Search/discover CivitAI models, creators, tags, and images (Cicatriiz civitai-mcp-server via stateless gateway).","type":"remote_http","category":"media","enabled":true,"endpointUrl":"http://10.30.20.128:8001/mcp","tools":[{"name":"civitai_search_models","description":"Search for AI models on Civitai with various filters","category":"media","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Search query to filter models by name"},"limit":{"type":"number","description":"Number of results (1-100, default 20)","minimum":1,"maximum":100},"page":{"type":"number","description":"Page number for pagination","minimum":1},"types":{"type":"array","items":{"type":"string","enum":["Checkpoint","TextualInversion","Hypernetwork","AestheticGradient","LORA","Controlnet","Poses"]},"description":"Filter by model types"},"sort":{"type":"string","enum":["Highest Rated","Most Downloaded","Newest"],"description":"Sort order for results"},"period":{"type":"string","enum":["AllTime","Year","Month","Week","Day"],"description":"Time period for sorting"},"nsfw":{"type":"boolean","description":"Include NSFW content"},"baseModels":{"type":"array","items":{"type":"string"},"description":"Filter by base model types (e.g., [\"SD 1.5\", \"SDXL 1.0\"])"}}}},{"name":"civitai_get_model","description":"Get detailed information about a specific model by ID","category":"media","inputSchema":{"type":"object","properties":{"modelId":{"type":"number","description":"The ID of the model to retrieve"}},"required":["modelId"]}},{"name":"civitai_get_model_version","description":"Get detailed information about a specific model version","category":"media","inputSchema":{"type":"object","properties":{"modelVersionId":{"type":"number","description":"The ID of the model version to retrieve"}},"required":["modelVersionId"]}},{"name":"civitai_get_model_version_by_hash","description":"Get model version information by file hash","category":"media","inputSchema":{"type":"object","properties":{"hash":{"type":"string","description":"The hash of the model file (AutoV1, AutoV2, SHA256, CRC32, or Blake3)"}},"required":["hash"]}},{"name":"civitai_browse_images","description":"Browse AI-generated images from Civitai","category":"media","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Number of images to return (1-200, default 100)","minimum":1,"maximum":200},"page":{"type":"number","description":"Page number for pagination","minimum":1},"modelId":{"type":"number","description":"Filter images from a specific model"},"modelVersionId":{"type":"number","description":"Filter images from a specific model version"},"postId":{"type":"number","description":"Get images from a specific post"},"username":{"type":"string","description":"Filter images by creator username"},"nsfw":{"type":"string","enum":["None","Soft","Mature","X"],"description":"NSFW content level filter"},"sort":{"type":"string","enum":["Most Reactions","Most Comments","Newest"],"description":"Sort order for images"},"period":{"type":"string","enum":["AllTime","Year","Month","Week","Day"],"description":"Time period for sorting"}}}},{"name":"civitai_get_creators","description":"Browse and search for model creators on Civitai","category":"media","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Number of creators to return (0-200, default 20)","minimum":0,"maximum":200},"page":{"type":"number","description":"Page number for pagination","minimum":1},"query":{"type":"string","description":"Search query to filter creators by username"}}}},{"name":"civitai_get_tags","description":"Browse and search for model tags on Civitai","category":"media","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Number of tags to return (1-200, default 20)","minimum":1,"maximum":200},"page":{"type":"number","description":"Page number for pagination","minimum":1},"query":{"type":"string","description":"Search query to filter tags by name"}}}},{"name":"civitai_get_popular_models","description":"Get the most popular/downloaded models","category":"media","inputSchema":{"type":"object","properties":{"period":{"type":"string","enum":["AllTime","Year","Month","Week","Day"],"description":"Time period for popularity ranking (default: Week)"},"limit":{"type":"number","description":"Number of models to return (default: 20)","minimum":1,"maximum":100}}}},{"name":"civitai_get_latest_models","description":"Get the newest models uploaded to Civitai","category":"media","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Number of models to return (default: 20)","minimum":1,"maximum":100}}}},{"name":"civitai_get_top_rated_models","description":"Get the highest rated models","category":"media","inputSchema":{"type":"object","properties":{"period":{"type":"string","enum":["AllTime","Year","Month","Week","Day"],"description":"Time period for rating ranking (default: AllTime)"},"limit":{"type":"number","description":"Number of models to return (default: 20)","minimum":1,"maximum":100}}}},{"name":"civitai_search_models_by_tag","description":"Search for models by a specific tag","category":"media","inputSchema":{"type":"object","properties":{"tag":{"type":"string","description":"Tag name to search for"},"limit":{"type":"number","description":"Number of models to return (default: 20)","minimum":1,"maximum":100},"sort":{"type":"string","enum":["Highest Rated","Most Downloaded","Newest"],"description":"Sort order for results"}},"required":["tag"]}},{"name":"civitai_search_models_by_creator","description":"Search for models by a specific creator","category":"media","inputSchema":{"type":"object","properties":{"username":{"type":"string","description":"Creator username to search for"},"limit":{"type":"number","description":"Number of models to return (default: 20)","minimum":1,"maximum":100},"sort":{"type":"string","enum":["Highest Rated","Most Downloaded","Newest"],"description":"Sort order for results"}},"required":["username"]}},{"name":"civitai_get_models_by_type","description":"Get models filtered by type (Checkpoint, LORA, etc.)","category":"media","inputSchema":{"type":"object","properties":{"type":{"type":"string","enum":["Checkpoint","TextualInversion","Hypernetwork","AestheticGradient","LORA","Controlnet","Poses"],"description":"Model type to filter by"},"limit":{"type":"number","description":"Number of models to return (default: 20)","minimum":1,"maximum":100},"sort":{"type":"string","enum":["Highest Rated","Most Downloaded","Newest"],"description":"Sort order for results"}},"required":["type"]}},{"name":"civitai_get_download_url","description":"Get the download URL for a specific model version","category":"media","inputSchema":{"type":"object","properties":{"modelVersionId":{"type":"number","description":"The ID of the model version to get download URL for"}},"required":["modelVersionId"]}}],"id":"mcp-custom-1787640644563-gf9iqq","healthStatus":"unknown","createdAt":"2026-08-25T06:50:44.563Z","updatedAt":"2026-08-25T06:50:44.563Z"},{"name":"ComfyUI Control Plane (artokun)","description":"artokun/comfyui-mcp — agent-native ComfyUI control plane: generate image/video/audio, author/edit workflows, manage models/nodes, diagnose runs.","type":"remote_http","category":"media","enabled":true,"endpointUrl":"http://10.30.20.29:8002/mcp","tools":[{"name":"comfy_comfy_cli","description":"Drive the official comfy-cli (envelope/1 JSON contract) for the selected ComfyUI environment. The MCP resolves `comfy` from COMFY_CLI_PATH, PATH, or the selected workspace's .venv/venv. Driven by the `action` parameter:\n- action:\"status\" — Inspect the comfy-cli integration and selected environment (`comfy which` / `comfy env`); `detail` selects version/which/env/discover (default env). Call this before local CLI operations when workspace or server routing is uncertain.\n- action:\"server_start\" / \"server_stop\" / \"server_restart\" — Manage a local ComfyUI through comfy-cli background process management. Restart performs `comfy stop` followed by `comfy launch --background`; extra launch arguments go in `launchArgs`.\n- action:\"jobs_list\" — List local or Comfy Cloud jobs (`limit` optional). Local jobs include CLI-tracked async submissions plus the ComfyUI queue/history.\n- action:\"jobs_status\" / \"jobs_watch\" / \"jobs_cancel\" — Inspect, watch, or cancel one job; `promptId` required.\n- action:\"jobs_wait\" — Wait for jobs: one of `promptId`, `promptIds`, or all=true is required; `timeoutSeconds` optional.\n- action:\"search_nodes\" — Fuzzy-search actual ComfyUI node classes by name, display name, or description using `comfy nodes search`; `query` required. Complements search_custom_nodes, which searches installable node packs. Works locally, in Comfy Cloud, or offline with `objectInfoPath`. When comfy-cli is not installed/on PATH and the target is the connected (local) server, falls back to fuzzy-searching that server's live /object_info — so installed-node discovery works without the CLI.\n- action:\"workflow_validate\" — Validate an API/UI workflow file (class types, inputs, enums, edge wiring) without submission; `workflowPath` required.\n- action:\"workflow_run\" — Submit an API/UI workflow file (`workflowPath` required). Asynchronous by default; set wait=true to await outputs (`timeoutSeconds`).\n- action:\"transfer_upload\" — Upload input files (`files` required) for local ComfyUI or ","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["status","server_start","server_stop","server_restart","jobs_list","jobs_status","jobs_wait","jobs_watch","jobs_cancel","search_nodes","workflow_validate","workflow_run","transfer_upload","transfer_download","models_list_folders","models_list_folder","models_search","models_show","models_download","models_remove","skills_list","skills_show","skills_validate","skills_install","skills_status","skills_uninstall"],"description":"Which comfy-cli operation to perform. Families: status; server_* (lifecycle); jobs_* (list/status/wait/watch/cancel); search_nodes; workflow_* (validate/run); transfer_* (upload/download); models_* (list_folders/list_folder/search/show/download/remove); skills_* (list/show/validate/install/status/uninstall)."},"detail":{"default":"env","description":"action:\"status\" — which inspection to run.","type":"string","enum":["version","which","env","discover"]},"workspace":{"description":"Optional ComfyUI workspace override (the data/base root comfy-cli uses for custom_nodes/models). Otherwise the live --base-directory / COMFYUI_PATH is used; the CLI executable may still come from the COMFYUI_CODE_PATH checkout's .venv.","type":"string"},"launchArgs":{"description":"actions \"server_start\"/\"server_restart\" — extra ComfyUI launch arguments, e.g. ['--listen','0.0.0.0','--port','8188'].","type":"array","items":{"type":"string"}},"promptId":{"description":"Single prompt id. Required for \"jobs_status\"/\"jobs_watch\"/\"jobs_cancel\" and \"transfer_download\"; accepted for \"jobs_wait\" (normalized into a one-element promptIds list).","type":"string"},"promptIds":{"description":"action:\"jobs_wait\" — prompt ids to wait on. Use this or promptId or all=true.","type":"array","items":{"type":"string"}},"all":{"description":"action:\"jobs_wait\" — wait on every known job.","type":"boolean"},"limit":{"description":"Result cap for \"jobs_list\", \"search_nodes\" and the \"models_*\" listing/search actions.","type":"integer","minimum":1,"maximum":100},"timeoutSeconds":{"description":"actions \"jobs_wait\"/\"jobs_watch\"/\"workflow_run\" — max seconds to wait.","type":"integer","minimum":1,"maximum":9007199254740991},"where":{"description":"Target for the jobs/search_nodes/workflow/transfer/models actions: \"local\" (default) or \"cloud\" (Comfy Cloud).","type":"string","enum":["local","cloud"]},"query":{"description":"action:\"search_nodes\" — fuzzy search text. REQUIRED.","type":"string","minLength":1},"objectInfoPath":{"description":"action:\"search_nodes\" — offline object_info JSON file to search instead of a live target.","type":"string"},"workflowPath":{"description":"actions \"workflow_validate\"/\"workflow_run\" — path to an API/UI workflow JSON file. REQUIRED.","type":"string","minLength":1},"wait":{"description":"action:\"workflow_run\" — await outputs instead of returning after submission.","type":"boolean"},"files":{"description":"action:\"transfer_upload\" — input files to upload. REQUIRED.","type":"array","items":{"type":"string"}},"outDir":{"description":"action:\"transfer_download\" — output directory.","type":"string"},"overwrite":{"description":"action:\"transfer_upload\" — set false to pass --no-overwrite.","type":"boolean"},"urlOnly":{"description":"action:\"transfer_download\" — print URLs instead of downloading files.","type":"boolean"},"folder":{"description":"action:\"models_list_folder\" — the model folder to list. REQUIRED.","type":"string"},"text":{"description":"action:\"models_search\" — search text.","type":"string"},"type":{"description":"action:\"models_search\" — model type filter (checkpoint, lora, vae, …).","type":"string"},"name":{"description":"actions \"models_show\"/\"skills_show\" — the model or skill name.","type":"string"},"url":{"description":"action:\"models_download\" — model URL to download. REQUIRED.","type":"string","format":"uri"},"relativePath":{"description":"actions \"models_download\"/\"models_remove\" — workspace-relative model directory (default models/checkpoints).","type":"string"},"modelNames":{"description":"action:\"models_remove\" — model filenames to remove. REQUIRED.","type":"array","items":{"type":"string"}},"path":{"description":"action:\"skills_validate\" — path to the skill to validate. REQUIRED.","type":"string"},"scope":{"description":"actions \"skills_install\"/\"skills_uninstall\"/\"skills_status\" — install scope.","type":"string","enum":["user","project"]},"projectDir":{"description":"Working directory for project-scoped skill operations. Required when scope='project'.","type":"string"},"targets":{"description":"actions \"skills_install\"/\"skills_uninstall\" — agent targets.","type":"array","items":{"type":"string"}},"skills":{"description":"actions \"skills_install\"/\"skills_uninstall\" — skill names.","type":"array","items":{"type":"string"}},"apply":{"default":false,"description":"actions \"skills_install\"/\"skills_uninstall\" — actually mutate; default false = dry-run.","type":"boolean"}},"required":["action"]}},{"name":"comfy_enqueue_workflow","description":"Submit work to the ComfyUI execution queue — the primary way an agent starts a render. Driven by the `action` parameter:\n- action:\"enqueue\" — Submit an API-format workflow you are already holding (one you built with create_workflow, loaded with get_workflow, or edited with create_workflow action:\"modify\"). Returns immediately with the prompt_id and queue position; does NOT wait for completion. Seed values in the workflow are used EXACTLY as supplied — they are NOT re-randomized, so a run is reproducible by resubmitting the same workflow (for a fresh-seed re-run of a past job, use action:\"rerun\"). `workflow` is required. Use queue (action:\"status\") to check progress later, or get_history (action:\"list\") to retrieve results and images after completion.\n- action:\"rerun\" — Re-run the workflow behind a PREVIOUS generation. Retrieves the prompt graph from execution history (by `prompt_id`, or the most recent run when omitted — chosen by ComfyUI's queue number, same logic as get_history) and re-enqueues it, optionally applying `inputs` overrides. Seeds are re-randomized (within each node's declared range) unless disable_random_seed is set or the seed is pinned via `inputs`. Returns the new prompt_id and the source prompt_id it came from. Clear error if no matching history exists. To re-run from a registered ASSET instead of history, use generate_image (action:\"regenerate\").\n- action:\"run_url\" — Read (and optionally execute) a SHARED workflow from a URL. Fetches the workflow JSON, accepts API-format prompt graphs or UI-format exports (UI is auto-converted via the same converter as get_workflow), validates it, and summarizes it. Supports raw .json links and GitHub blob/raw URLs (blob is normalized to raw); other share hosts that need a site API return a clear 'paste the raw JSON URL' error. The fetch is bounded (http/https only, timeout + size cap, loopback/private/metadata IPs rejected to prevent SSRF). READ-ONLY unless run=true; when run=true it enqueues the workflow (appl","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["enqueue","rerun","run_url","template_schema","run_template"],"description":"Which enqueue entry point to use. action:\"enqueue\" requires `workflow`; action:\"rerun\" takes an optional `prompt_id` (+ `inputs`); action:\"run_url\" requires `url` (+ `run`/`inputs`); action:\"template_schema\" and action:\"run_template\" require `template`; with action:\"run_template\" you may also pass `overrides`/`wait`/`timeout_s`."},"workflow":{"description":"action:\"enqueue\" — ComfyUI workflow in API format (node ID -> {class_type, inputs}). REQUIRED for that action.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"disable_random_seed":{"description":"If true, do not randomize seed values — applies to action:\"rerun\" and action:\"run_template\" (for action:\"rerun\", combine with inputs.seed to reproduce exactly). It is a NO-OP for action:\"enqueue\", whose seeds are always used exactly as supplied (issue #865).","type":"boolean"},"prompt_id":{"description":"action:\"rerun\" — prompt ID of the generation to re-run. If omitted, uses the most recent execution.","type":"string"},"inputs":{"description":"Overrides applied to every node with a matching input name (e.g. cfg, steps, sampler_name, seed, text). Used by action:\"rerun\", and by action:\"run_url\" only when run=true.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"url":{"description":"action:\"run_url\" — URL of the workflow JSON. Raw .json links and GitHub blob/raw URLs work directly. REQUIRED for that action.","type":"string"},"run":{"default":false,"description":"action:\"run_url\" — if true, enqueue the fetched workflow for execution and return the prompt_id. Default false: only fetch, validate, and summarize (read-only).","type":"boolean"},"template":{"description":"Template name/id: a bundled pack directory name (list_packs action:\"list\") or a custom-node-contributed workflow template name (list_packs action:\"list_templates\"). REQUIRED for action:\"template_schema\" and action:\"run_template\".","type":"string","minLength":1},"overrides":{"description":"action:\"run_template\" — widget overrides keyed '<nodeId>.<widget_name>' (action:\"template_schema\"'s keys), e.g. {'6.text': 'a red fox', '3.steps': 20}.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"wait":{"description":"action:\"run_template\" — block until the job completes and return its outputs. Default false: return {prompt_id} immediately.","type":"boolean"},"timeout_s":{"description":"action:\"run_template\" — max seconds to wait when wait:true (default 300). On timeout the job keeps running; poll queue (action:\"status\").","type":"number","exclusiveMinimum":0}},"required":["action"]}},{"name":"comfy_get_system_stats","description":"Inspect the connected ComfyUI server: what it is running on, what it has logged, and whether it is healthy enough to dispatch work to. All three actions are READ-ONLY — nothing here mutates anything. Driven by the `action` parameter:\n- action:\"stats\" — Get system information from the connected ComfyUI server: GPU device(s), total/free VRAM, ComfyUI/Python/PyTorch versions, and OS details. Requires a running ComfyUI server (works against local or remote targets); read-only, takes no parameters. Returns the raw /system_stats JSON. Use to confirm connectivity and check available VRAM before enqueuing large workflows. Errors if the server is unreachable.\n- action:\"logs\" — Get ComfyUI server runtime logs. Useful for debugging execution errors, model loading issues, missing nodes, and Python tracebacks. `max_lines` tails the end (default 100), `keyword` filters case-insensitively.\n- action:\"health\" — Pre-flight diagnostic for the connected ComfyUI: one call that aggregates the signals an agent should check before dispatching a batch. Reports ComfyUI version/Python/PyTorch, GPU name + VRAM free/total, system RAM free, queue depth (running + pending), per-category /models populations (catches empty dropdowns from a misconfigured extra_model_paths.yaml), and recent errors from /internal/logs. Read-only — no mutation. Use this when a job fails for an unexpected reason, before a long batch run, or to confirm a remote ComfyUI is healthy. Originally contributed by github.com/joaolvivas.","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["stats","logs","health"],"description":"Which read to perform. \"stats\" takes no other parameters; \"logs\" takes `max_lines`/`keyword`; \"health\" takes `model_categories`/`recent_errors`. None of them is required."},"max_lines":{"description":"action:\"logs\" — maximum number of log lines to return from the end (default: 100).","type":"integer","minimum":1,"maximum":2000},"keyword":{"description":"action:\"logs\" — filter log lines containing this keyword (case-insensitive). Examples: 'error', 'warning', 'VRAM', a node name.","type":"string"},"model_categories":{"description":"action:\"health\" — override the model categories to poll (defaults to checkpoints, diffusion_models, loras, vae, text_encoders, controlnet).","type":"array","items":{"type":"string"}},"recent_errors":{"description":"action:\"health\" — how many recent error/traceback lines to include from /internal/logs (default 20, max 200).","type":"integer","minimum":0,"maximum":200}},"required":["action"]}},{"name":"comfy_visualize_workflow","description":"DRAW a diagram of, or convert, workflow JSON you PASS IN (a JSON string or object) — it does NOT read the user's live canvas, so for 'show me what's on the canvas' / the CURRENTLY-OPEN graph use panel_graph_outline instead. Driven by the `action` parameter:\n- action:\"render\" — Mermaid flowchart of the whole graph: nodes grouped by category, connections labeled by data type.\n- action:\"render_hierarchical\" — the same graph SECTIONED rather than flat, which is what you want past ~20 nodes. `view` picks a compact overview, one section in detail, a text listing, or an AI-oriented structured summary.\n- action:\"mermaid\" — the INVERSE of render: a Mermaid flowchart back into executable API-format workflow JSON, wired from /object_info schemas.\n- action:\"to_dsl\" — API-format JSON into the compact, human/LLM-readable authoring DSL: `key <- nodeId.outputIndex` for connections, `key = <JSON>` for literals. Round-trips losslessly. (Experimental.)\n- action:\"from_dsl\" — that DSL back into executable JSON, plus advisory wiring warnings when ComfyUI is reachable (the conversion succeeds either way). (Experimental.)","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["render","render_hierarchical","mermaid","to_dsl","from_dsl"],"description":"Which rendering/conversion to perform. \"render\", \"render_hierarchical\" and \"to_dsl\" require `workflow`; \"mermaid\" requires `mermaid`; \"from_dsl\" requires `dsl`."},"workflow":{"description":"ComfyUI workflow JSON (as a JSON string or object; API or UI format is auto-detected). REQUIRED for action:\"render\", action:\"render_hierarchical\" and action:\"to_dsl\" — \"to_dsl\" expects API format (node ID -> {class_type, inputs}).","anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}]},"show_values":{"default":true,"description":"action:\"render\" / action:\"render_hierarchical\" — Include widget values (seed, steps, cfg, etc.) in node labels (detail view only, for the hierarchical action).","type":"boolean"},"direction":{"description":"action:\"render\" / action:\"render_hierarchical\" — Flowchart direction: LR (left-to-right) or TB (top-to-bottom). Default LR for \"render\" and for the hierarchical detail view, TB for the hierarchical overview.","type":"string","enum":["LR","TB"]},"view":{"default":"overview","description":"action:\"render_hierarchical\" — overview: compact diagram with sections as summary nodes; detail: full diagram for one section; list: text summary of all sections; summary: structured text optimized for AI ingestion with node IDs, key settings, virtual wires, and full connection graph","type":"string","enum":["overview","detail","list","summary"]},"section":{"description":"action:\"render_hierarchical\" — Section name to show in detail view (required when view=detail). Use view=list to see available section names.","type":"string"},"mermaid":{"description":"action:\"mermaid\" (REQUIRED) — Mermaid flowchart text (with or without ```mermaid code fence). Nodes should use ComfyUI class_type names as labels. Connections should be labeled with data types (e.g., -->|MODEL|).","type":"string"},"dsl":{"description":"action:\"from_dsl\" (REQUIRED) — Workflow DSL text","type":"string"}},"required":["action"]}},{"name":"comfy_create_workflow","description":"Author and check ComfyUI workflow JSON. Driven by the `action` parameter:\n- action:\"create\" — Create a ready-to-run API-format workflow from a built-in template (txt2img, img2img, upscale, inpaint, controlnet, ip_adapter, ace_step_15, stable_audio_3, remove_background, ltx_video). Pure local generation — does not contact ComfyUI and has no side effects. Returns the complete workflow JSON; pass it to action:\"validate\" or enqueue_workflow. Unsupplied `params` fall back to template defaults, so the result may reference checkpoints/models that must exist on your ComfyUI server before it will execute.\n- action:\"modify\" — Apply modification `operations` to an existing workflow. Supports: set_input, add_node, remove_node, connect, insert_between. Returns the modified workflow JSON and IDs of any newly added nodes.\n- action:\"validate\" — Validate a workflow WITHOUT executing it. Checks for missing node types, broken connections, invalid output indices, missing models, and other issues. Returns a list of errors and warnings.\n- action:\"node_info\" — Query a running ComfyUI server's /object_info endpoint for installed node type definitions. Requires a reachable ComfyUI instance; results reflect that server's installed custom nodes. Use the `node_type` filter to inspect a specific node before composing or modifying a workflow. Default response is a STRUCTURAL summary: input/output names and type tags, with enum (dropdown) inputs collapsed to a value count — safe for context even on Loader nodes whose model dropdowns embed the entire local model list (hundreds of KB raw). Pass verbose=true (20 or fewer matches) for the complete raw definitions including every dropdown value. When more than 20 node types match, returns only a name/category list and asks you to narrow the filter.","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["create","modify","validate","node_info"],"description":"Which authoring operation to perform. \"create\" requires `template` (optional `params`); \"modify\" requires `workflow` + `operations`; \"validate\" requires `workflow` (optional `health`); \"node_info\" takes no required parameters (optional `node_type`, `verbose`, `refresh`)."},"template":{"description":"action:\"create\" (REQUIRED) — Template name, one of: txt2img, img2img, upscale, inpaint, controlnet, ip_adapter, ace_step_15, stable_audio_3, remove_background, ltx_video","type":"string","enum":["txt2img","img2img","upscale","inpaint","controlnet","ip_adapter","ace_step_15","stable_audio_3","remove_background","ltx_video"]},"params":{"default":{},"description":"action:\"create\" — Template parameters; recognized keys depend on the template. txt2img: checkpoint, positive_prompt, negative_prompt, width, height, steps, cfg, seed, sampler_name, scheduler. img2img/inpaint add image_path (and mask_path for inpaint) and denoise. upscale adds upscale_model. Unknown keys are ignored; omitted keys use template defaults.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"workflow":{"description":"ComfyUI workflow JSON (as a JSON string or object). REQUIRED for action:\"modify\" and action:\"validate\". action:\"validate\" accepts API format or a saved UI export (nodes[]/links[]).","anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}]},"operations":{"description":"action:\"modify\" (REQUIRED) — Array of operations to apply in order. Each has an 'op' field: set_input, add_node, remove_node, connect, or insert_between","type":"array","items":{"oneOf":[{"type":"object","properties":{"op":{"type":"string","const":"set_input"},"node_id":{"type":"string"},"input_name":{"type":"string"},"value":{}},"required":["op","node_id","input_name","value"]},{"type":"object","properties":{"op":{"type":"string","const":"add_node"},"class_type":{"type":"string"},"inputs":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"id":{"type":"string"}},"required":["op","class_type"]},{"type":"object","properties":{"op":{"type":"string","const":"remove_node"},"node_id":{"type":"string"}},"required":["op","node_id"]},{"type":"object","properties":{"op":{"type":"string","const":"connect"},"source_id":{"type":"string"},"output_index":{"type":"number"},"target_id":{"type":"string"},"input_name":{"type":"string"}},"required":["op","source_id","output_index","target_id","input_name"]},{"type":"object","properties":{"op":{"type":"string","const":"insert_between"},"source_id":{"type":"string"},"output_index":{"type":"number"},"target_id":{"type":"string"},"input_name":{"type":"string"},"new_class_type":{"type":"string"},"new_inputs":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["op","source_id","output_index","target_id","input_name","new_class_type"]}]}},"health":{"default":true,"description":"action:\"validate\" — Include graph-health heuristics (disconnected nodes, duplicate model loads, orphaned branches, muted/bypassed nodes) as info/warning issues plus a structured health section. Never affects `valid`.","type":"boolean"},"node_type":{"description":"action:\"node_info\" — Filter by node class_type name (case-insensitive substring match). Omit to list all available nodes.","type":"string"},"verbose":{"default":false,"description":"action:\"node_info\" — If true, return the full raw /object_info definitions including enum dropdown values (model lists etc.) — can be hundreds of KB per Loader node, so only use it when you need the actual enum values (e.g. exact model filenames) and the filter matches few nodes. Default false: structural summary with enum value counts.","type":"boolean"},"refresh":{"default":false,"description":"action:\"node_info\" — If true, discard the memoized /object_info snapshot and refetch live from the connected server before answering. Use after the ComfyUI server was restarted EXTERNALLY (systemd/service manager) or new model files were added out-of-band — the cache is otherwise only invalidated by MCP-managed restarts, so loader dropdowns (model lists) would remain stale for the rest of the session (#499).","type":"boolean"}},"required":["action"]}},{"name":"comfy_queue","description":"Inspect and manage the ComfyUI execution queue. Driven by the `action` parameter:\n- action:\"list\" — The job running now plus all pending jobs, each with its prompt_id and position. Read-only; requires a reachable ComfyUI server (works against local or remote --comfyui-url). Omits queued workflow payloads by default to keep output small; set include_workflows:true when you need to inspect or edit the exact pending payload. Use this before action:\"cancel\" (running), action:\"cancel_queued\"/action:\"clear\" (pending), action:\"move\", or action:\"edit\".\n- action:\"status\" — Check ONE job by its prompt_id (the id returned by enqueue_workflow). Queries the connected ComfyUI server; requires it to be running. Returns JSON with running, pending, and done booleans, plus optional status_str, error details, and execution_stats from ComfyUI history once the job is done. Also returns text_outputs when the workflow contained text-preview nodes (Preview as Text, ShowText, …) — those produce no image file, so this is the ONLY way to read their result; report that text back to the user. Use action:\"list\" to see the whole queue at once, and get_history for full output filenames.\n- action:\"get_workflow\" — The full workflow payload for one PENDING queue item by prompt_id. Read-only. Does not work for the currently running job because ComfyUI cannot safely edit a job after execution starts.\n- action:\"move\" — Move a PENDING queue item to the front or back by removing it and re-enqueuing its saved workflow payload; `position` (\"front\"|\"back\") is required. The job receives a NEW prompt_id; the old prompt_id is removed. Running jobs cannot be moved.\n- action:\"edit\" — Edit a PENDING queue item by removing it and re-enqueuing an updated workflow. Provide either a complete replacement `workflow` or `node_inputs` patches keyed by node id; `position` selects where to requeue (default back). The job receives a NEW prompt_id; the old prompt_id is removed. Running jobs cannot be edited.\n- action:\"cancel\"","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["list","status","get_workflow","move","edit","cancel","cancel_queued","clear"],"description":"Which queue operation to perform. \"list\" and \"clear\" take no other parameters; \"status\", \"get_workflow\" and \"cancel_queued\" require `prompt_id`; \"move\" requires `prompt_id` + `position`; \"edit\" requires `prompt_id` (optional `workflow`/`node_inputs`/`position`); \"cancel\" takes an optional `prompt_id` and `clear_pending`."},"prompt_id":{"description":"The prompt_id of a job (the id returned by enqueue_workflow). REQUIRED for actions \"status\", \"get_workflow\", \"move\", \"edit\" and \"cancel_queued\" (a PENDING queue item for all but \"status\"). OPTIONAL for action:\"cancel\" — if given, only interrupts the running job when its prompt_id matches; omit to interrupt whatever is currently running.","type":"string"},"include_workflows":{"description":"action:\"list\" — include each running/pending job's workflow payload and extra_data. Can be large.","type":"boolean"},"position":{"description":"Where to requeue the job. REQUIRED for action:\"move\". OPTIONAL for action:\"edit\" — defaults to back.","type":"string","enum":["front","back"]},"workflow":{"description":"action:\"edit\" — optional complete replacement API-format workflow. If omitted, the existing queued workflow is patched with `node_inputs`.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"node_inputs":{"description":"action:\"edit\" — optional input patches keyed by node id, e.g. {\"3\":{\"steps\":30,\"cfg\":7}}.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"clear_pending":{"description":"action:\"cancel\" — also clear ALL pending jobs (recommended when resetting after a stuck/slow render, so a re-queue doesn't stack behind a backlog). Default false.","type":"boolean"}},"required":["action"]}},{"name":"comfy_search_custom_nodes","description":"Discover ComfyUI custom node PACKS in the public ComfyUI Registry (registry.comfy.org). Read-only and network-only: queries the hosted registry over HTTP and does NOT require a running ComfyUI or COMFYUI_PATH. This searches node PACKS, not models (use download_model action:\"search\") and not local installs (use list_local_models action:\"list\"). To actually install what you find, or to manage packs already installed, use install_custom_node. Driven by the `action` parameter:\n- action:\"search\" — Search by keyword; `query` required. Returns a ranked list of packs with id, name, author, install count, and latest version. The keyword search ranks a fixed window of packs client-side, so when it matches nothing the query is also tried as an exact registry id automatically (e.g. 'comfyui kjnodes' → 'comfyui-kjnodes'). Pass a returned id to action:\"details\" for full info, or to install_custom_node (action:\"install\").\n- action:\"details\" — Full details for ONE pack by its exact registry id: description, author, license, repository, install count, latest version, the node types it provides, and recent version changelogs. Look up the id via action:\"search\" first.","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["search","details"],"description":"Which registry lookup to perform. \"search\" requires `query` (and takes optional `limit`/`page`); \"details\" requires `id`."},"query":{"description":"action:\"search\" — REQUIRED. Keyword(s) to match against pack name/description, e.g. 'impact', 'controlnet aux'.","type":"string"},"limit":{"description":"action:\"search\" — max results to return (default 10).","type":"integer","minimum":1,"maximum":50},"page":{"description":"action:\"search\" — page number for pagination (default 1).","type":"integer","minimum":1,"maximum":9007199254740991},"id":{"description":"action:\"details\" — REQUIRED. Exact registry pack id (the 'id' field from action:\"search\"), e.g. 'comfyui-impact-pack'.","type":"string"}},"required":["action"]}},{"name":"comfy_download_model","description":"Find model weights and get them onto the connected ComfyUI, and track the transfers. Driven by the `action` parameter:\n- action:\"download\" — Download a model file to the connected ComfyUI's models directory from a URL (HuggingFace, direct HTTP(S), s3://, or Azure Blob). Requires `url` + `target_subfolder`. PREFER this over a raw shell download (curl/wget) for model weights: it lands the file in the right models/ subfolder. LOCAL ComfyUI: streams to disk and surfaces live progress in the panel download tray. REMOTE ComfyUI: dispatches the fetch to the ComfyUI host via the ComfyUI-Manager install-model HTTP API (downloaded server-side; a per-request `auth` header can't be forwarded). This requires the host's Manager to run with network_mode=personal_cloud (or loopback) and a permissive security level — a stricter gate silently rejects the download, and Manager reports the queue task 'done' even on failure, so a remote dispatch does not guarantee the file landed. target_subfolder accepts any relative subfolder (incl. nested, e.g. 'loras/<subdir>').\n- action:\"status\" — Check on downloads started by action:\"download\" / action:\"download_civitai\". Reports each download's state (downloading / done / error / cancelled), its destination path once it lands, and byte progress when the panel progress channel is enabled. Use this after a download reports it is still running — that means the transfer is in flight, NOT that it failed. Across an AGENT/sidebar session reconnect a download this MCP streams locally keeps running and is normally resolvable by `id` or by `url`. An ORCHESTRATOR RESTART is different: a record carried across one reports only that this MCP STOPPED WATCHING — not that the bytes stopped, which it does not check. READ THE NOTE ON THAT RECORD before acting: it distinguishes a local stream (nothing is writing it; re-issue) from a ComfyUI-Manager dispatch (the fetch runs on the ComfyUI host, which a restart here does not touch, so re-issuing writes a second copy t","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["download","status","cancel","search","search_civitai","search_creators","download_civitai","resolve_missing"],"description":"Which model operation to perform. \"download\" requires `url` + `target_subfolder`; \"status\" takes an optional `id`/`tray_id`/`url` (omit all three to list everything); \"cancel\" requires `id` (optional `tray_id`); \"search\" requires `query`; \"search_civitai\" requires `query` and/or `creator`; \"search_creators\" takes an optional `query` (omit for the leaderboard `board`); \"download_civitai\" requires `target_subfolder` plus `model_id` and/or `model_version_id`; \"resolve_missing\" requires `workflow`."},"url":{"description":"REQUIRED for action:\"download\" — the direct download URL for the model file. OPTIONAL for action:\"status\" — adopt an in-flight download by its source URL when you don't have the id (e.g. after a reconnect); reports the matching job without starting a duplicate.","type":"string","format":"uri"},"target_subfolder":{"type":"string","minLength":1,"description":"REQUIRED for action:\"download\" and action:\"download_civitai\". Target subfolder under ComfyUI models/. Standard names: checkpoints, loras, vae, upscale_models, controlnet, embeddings, clip, diffusers, diffusion_models, gligen, hypernetworks, photomaker, style_models, text_encoders, unet. Any other relative subfolder (incl. nested like 'loras/<subdir>') is allowed; absolute paths and '..' escapes are rejected."},"filename":{"description":"action:\"download\" — override filename (auto-detected from the URL if omitted). action:\"download_civitai\" — override the saved filename (defaults to the CivitAI file name, or the URL basename).","type":"string"},"auth":{"description":"action:\"download\" / action:\"download_civitai\" — optional per-request authentication for private/gated model URLs. When provided it overrides built-in HuggingFace/CivitAI token handling.","oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"bearer"},"token":{"type":"string","minLength":1,"description":"Bearer token value"}},"required":["type","token"]},{"type":"object","properties":{"type":{"type":"string","const":"basic"},"username":{"type":"string","description":"Basic auth username"},"password":{"type":"string","description":"Basic auth password"}},"required":["type","username","password"]},{"type":"object","properties":{"type":{"type":"string","const":"header"},"header_name":{"type":"string","minLength":1,"description":"HTTP header name"},"header_value":{"type":"string","description":"HTTP header value"}},"required":["type","header_name","header_value"]},{"type":"object","properties":{"type":{"type":"string","const":"query"},"query_param":{"type":"string","minLength":1,"description":"Query parameter name"},"query_value":{"type":"string","description":"Query parameter value"}},"required":["type","query_param","query_value"]},{"type":"object","properties":{"type":{"type":"string","const":"s3"},"access_key_id":{"type":"string","minLength":1,"description":"AWS/S3-compatible access key id"},"secret_access_key":{"type":"string","minLength":1,"description":"AWS/S3-compatible secret access key"},"session_token":{"description":"Optional temporary session token","type":"string"},"region":{"description":"Optional AWS region override","type":"string"},"endpoint":{"description":"Optional S3-compatible endpoint for R2-style storage","type":"string","format":"uri"}},"required":["type","access_key_id","secret_access_key"]}]},"id":{"description":"The download id. REQUIRED for action:\"cancel\" — this is the handle that says WHICH transfer to stop, so take it from action:\"status\" (or from the reply that started the download) rather than guessing; an id that matches nothing is reported as not found. OPTIONAL for action:\"status\" — omit to list every tracked download (incl. in-flight ones from before a reconnect).","type":"string"},"tray_id":{"description":"action:\"status\" / action:\"cancel\" — use this when two rows come back with the SAME `id`, so the id alone cannot say which one you mean. That happens when two different source URLs are downloading to the same destination file. Every row prints its own tray id as `(tray <tray_id>)` — pass that here, together with `id`, to report on (or stop) exactly one of them.","type":"string"},"query":{"description":"REQUIRED for action:\"search\" — the HuggingFace search query (e.g. 'SDXL', 'flux', 'controlnet'). action:\"search_civitai\" — keyword search (e.g. 'detail enhancer', a character name); optional when `creator` is given (then it narrows that creator's models). action:\"search_creators\" — username search (partial match, e.g. 'alcait'); omit to get the top-creators leaderboard instead.","type":"string"},"filter":{"description":"action:\"search\" — optional HuggingFace pipeline/library tag to narrow results, e.g. 'diffusers' or 'text-to-image'.","type":"string"},"limit":{"description":"Max results (default 10, or 8 candidates per missing model for action:\"resolve_missing\"). Per-action ceilings, unchanged from the tools this folds in: \"search\" 50, \"search_civitai\" 25, \"search_creators\" 50, \"resolve_missing\" 20.","type":"integer","minimum":1,"maximum":50},"creator":{"description":"action:\"search_civitai\" — only models by this CivitAI creator (EXACT username — find it with action:\"search_creators\"). At least one of query/creator is required.","type":"string","minLength":1},"types":{"description":"action:\"search_civitai\" — only these model types (e.g. ['LORA']).","type":"array","items":{"type":"string","enum":["Checkpoint","LORA","LoCon","DoRA","TextualInversion","VAE","Controlnet","Upscaler","MotionModule","Workflows"]}},"base_models":{"description":"action:\"search_civitai\" — only these base-model families, CivitAI labels: 'Flux.1 D', 'SDXL 1.0', 'SD 1.5', 'Pony', 'Illustrious', 'Wan Video', …","type":"array","items":{"type":"string"}},"sort":{"description":"action:\"search_civitai\" — ranking (default 'Highest Rated').","type":"string","enum":["Highest Rated","Most Downloaded","Newest"]},"nsfw":{"description":"action:\"search_civitai\" — include NSFW results (default false).","type":"boolean"},"board":{"description":"action:\"search_creators\" — leaderboard to rank by when no query is given (default 'overall'). Ignored with a query.","type":"string","enum":["overall","overall_90","overall_nsfw","new_creators"]},"model_version_id":{"description":"action:\"download_civitai\" — CivitAI model-version id (from the URL ?modelVersionId=...). If both model_id and model_version_id are given, this selects the specific version of that model.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"model_id":{"description":"action:\"download_civitai\" — CivitAI model id. The latest version is used unless model_version_id is also provided.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"workflow":{"description":"REQUIRED for action:\"resolve_missing\" — the ComfyUI workflow in API format (JSON string or object).","anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}]}},"required":["action"]}},{"name":"comfy_list_local_models","description":"Inspect what models this ComfyUI has installed, and where it looks for them. Driven by the `action` parameter:\n- action:\"list\" — List model files available to the connected ComfyUI, grouped by type. Read-only. Queries ComfyUI's /models REST endpoint first (works with remote ComfyUI and respects extra_model_paths.yaml — symlinked / mounted dirs the install-path filesystem scan would miss), then falls back to a filesystem scan of COMFYUI_PATH/models/ when the REST endpoint is unavailable. Size and modified time are only available on the filesystem fallback path. Use to see which models are already available before generating or downloading; use download_model action:\"search\" to discover new models on HuggingFace, then action:\"download\" to fetch them. For models fetched via download_model action:\"download_civitai\", any CivitAI trigger/activation words and base model are shown inline (read from the `<file>.civitai.json` sidecar) — apply those trigger words in your prompt when generating with that model. A `civitai:` line under an entry is that model's CivitAI page URL (modelId + INSTALLED modelVersionId, from the same sidecar) — use it to reference the source or check for newer versions.\n- action:\"remove\" — DELETES a model FILE from the local ComfyUI models directories. `path` is REQUIRED and is a file path relative to models/. THIS IS DESTRUCTIVE AND HAS NO UNDO: the file is unlinked, not moved to a recycle bin, and a large checkpoint can take hours to re-download — confirm the exact path with the user (action:\"list\" shows it) before calling. Resolves the path across ALL configured roots — the primary <COMFYUI_PATH>/models AND every directory in extra_model_paths.yaml / extra_models_config.yaml (e.g. models stored on another drive like E:\\) — the same roots ComfyUI loads from. The path must stay within a known root (path traversal and absolute escapes are rejected), and a directory is refused. LOCAL-ONLY: deletes from the local filesystem, so it is not supported agains","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["list","remove","embeddings","list_paths","add_path","remove_path"],"description":"Which inventory operation to perform. \"list\" (optional `model_type`), \"embeddings\" and \"list_paths\" are READ-ONLY. \"remove\" DELETES the model file named by `path` — required, and destructive. \"add_path\"/\"remove_path\" edit the extra-search-path YAML and require `category` + `path`; they never touch model files."},"model_type":{"description":"action:\"list\" — filter by model type (e.g. 'checkpoints', 'loras'). Lists all types if omitted.","type":"string","enum":["checkpoints","loras","vae","upscale_models","controlnet","embeddings","clip","diffusers","diffusion_models","gligen","hypernetworks","photomaker","style_models","text_encoders","unet"]},"path":{"description":"REQUIRED by three actions, and it means two DIFFERENT things — read this before calling. action:\"remove\": the MODEL FILE to DELETE, relative to the ComfyUI models/ directory (e.g. 'checkpoints/sd_xl_base_1.0.safetensors'); the leading segment is the category used to locate the file in extra roots too. action:\"add_path\" / action:\"remove_path\": a DIRECTORY to add to / remove from the extra-search-path YAML for `category` (absolute paths are safest; relative paths are resolved by ComfyUI) — no file is deleted.","type":"string","minLength":1},"target":{"description":"action:\"list_paths\" / \"add_path\" / \"remove_path\" — config target. auto (default) is LIVE-FIRST: the running ComfyUI's own --extra-model-paths-config, else the extra_model_paths.yaml next to its main.py. When no server is reachable, auto shows the Desktop config if one exists, otherwise standalone. When a reachable LOCAL server does not expose main.py, listing degrades to the server-named config (if it exists here) or the local auto-selected one, explicitly marked as an unconfirmed display fallback; mutations refuse instead. standalone forces <ComfyUI root>/extra_model_paths.yaml, where the root is COMFYUI_PATH (or an auto-detected install) and falls back to the saved default workspace; desktop forces the OS app-data extra_models_config.yaml. Use standalone/desktop (or config_path) to deliberately target a file the running server does not read.","type":"string","enum":["auto","standalone","desktop"]},"config_path":{"description":"action:\"list_paths\" / \"add_path\" / \"remove_path\" — explicit YAML config path override, mainly for advanced/manual installs.","type":"string"},"group":{"description":"action:\"add_path\" / \"remove_path\" — top-level YAML group to edit. Defaults to comfyui_mcp.","type":"string"},"category":{"description":"REQUIRED for action:\"add_path\" / action:\"remove_path\" — the ComfyUI search-path category, e.g. checkpoints, loras, vae, diffusion_models, unet_gguf, or custom_nodes.","type":"string","minLength":1},"is_default":{"description":"action:\"add_path\" — set is_default on a newly-created group. Existing groups are not overwritten.","type":"boolean"}},"required":["action"]}},{"name":"comfy_get_history","description":"Read what has already been generated on this machine — execution history, why a run failed, and the settings your past renders actually used. Driven by the `action` parameter:\n- action:\"list\" — Execution history for a ComfyUI prompt: status, timing, cached nodes, and output details (media filenames for get_image action:\"get\"). Also carries the raw error/traceback. To diagnose WHY a run FAILED or what is missing, prefer action:\"diagnose\" — it returns the same failure info PLUS missing models (with the file + widget) and missing node types, which this action does not. Use action:\"list\" when you need the run's OUTPUTS or timing for a specific prompt_id.\n- action:\"diagnose\" — WHY DID MY RENDER FAIL / WHAT IS MISSING? Explains a failed run in ONE call, without needing a canvas — the headless counterpart to the panel's panel_get_errors (\"why is this red?\"), so mobile/remote sessions get the same answer. Returns: the failed node (id, type) with its `exception_type` + message and a trimmed traceback; **missing_models** (the exact model file that is not installed and the widget holding it — feed the filename to download_model action:'search_civitai', then action:'download_civitai' — or action:'search' then action:'download' — to fix it); **missing_node_types** (node classes this install lacks — feed to search_custom_nodes, then install_custom_node); and any other per-input validation errors. Call this whenever a run fails, an enqueue is rejected, or the user asks what is missing — instead of guessing from raw logs. With no prompt_id it diagnoses the most recent FAILED run (falling back to the most recent run). Read-only.\n- action:\"stats\" — Statistics from this MCP server's LOCAL generation-history database (populated as you run workflows; NOT from ComfyUI, and not the same source as action:\"list\"): total generations, count of unique sampler/scheduler/steps/CFG combos, a per-model-family breakdown, and the most-reused settings. Read-only; works without a running ComfyUI. Retu","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["list","diagnose","stats","suggest"],"description":"Which history view to return. \"list\" and \"diagnose\" read ComfyUI's execution history and take an optional `prompt_id`; \"stats\" and \"suggest\" read this server's own local generation-settings database and take `model_family` (plus `lora_hash`/`search`/`limit` for \"suggest\"). No action requires any other field."},"prompt_id":{"description":"Actions \"list\" and \"diagnose\" — the prompt ID to look up (returned by enqueue_workflow). For action:\"list\", if omitted, returns the most recent COMMITTED execution (chosen by ComfyUI's queue number, not dict order); immediately after a run finishes it can briefly lag by one until ComfyUI commits the new entry, so pass the prompt_id from enqueue_workflow to get that exact run, and prefer the run-finished event for naming a just-produced output. For action:\"diagnose\", omit to diagnose the most recent FAILED run — preferred over a newer successful one — falling back to the most recent run if nothing failed.","type":"string"},"model_family":{"description":"Actions \"stats\" and \"suggest\" — model-family key to scope to, e.g. 'sdxl', 'flux', 'qwen_image', 'illustrious'.","type":"string"},"lora_hash":{"description":"action:\"suggest\" — AutoV2 hash (10 chars) of a specific LoRA to find settings for.","type":"string"},"search":{"description":"action:\"suggest\" — full-text search on model/LoRA filenames (e.g. 'copax', 'lightning').","type":"string"},"limit":{"description":"action:\"suggest\" — max results (default 10).","type":"integer","minimum":1,"maximum":50}},"required":["action"]}},{"name":"comfy_runpod","description":"Deploy, start, stop, inspect and connect to RunPod cloud GPU pods, and switch rendering between your local machine and a pod. Driven by the `action` parameter. SPENDS MONEY: action:\"create\" and action:\"start\" put a pod into a billing state; action:\"stop\" ends GPU billing. Confirm with the user before creating or starting a pod, and stop pods when the work is done.\n- action:\"create\" — Deploy a BRAND-NEW RunPod pod from our comfyui-mcp template (image with the panel + Manager + our nodes preinstalled), then it can be started/connected like any pod. One-tap alternative to the console deploy link for a user who already has a RunPod account + API key. Because our template is used, the agent can install the user's exact custom nodes/LoRAs + download models on it → full canvas parity. Tries several GPU types until one has capacity (on-demand availability fluctuates). NOTE: this bills GPU-time as soon as the pod boots — confirm with the user first, and stop it (action:\"stop\") when done. Created pods carry a DEAD-MAN SWITCH: if comfyui-mcp stops minding the pod (crash/offline), the pod STOPS ITSELF after a grace period so it can't bill forever — it uses the pod-scoped key RunPod auto-injects, so your account key never leaves this machine (disable with deadman:false). For onboarding a NEW RunPod user, prefer action:\"deploy_link\" so their signup credits our referral.\n- action:\"start\" — Start (resume) a stopped/exited RunPod pod by ID — RunPod re-attaches a GPU and boots the container (billing resumes). Returns immediately once RunPod accepts the resume; the pod then takes ~30-90s to become reachable, so follow with action:\"status\" (or action:\"connect\", which verifies readiness) rather than assuming it's instantly up. If RunPod can't allocate the requested GPU it errors — try a different gpu_count or GPU type in the console.\n- action:\"stop\" — Stop a running RunPod pod by ID — releases the GPU and stops GPU-time billing while KEEPING the pod and its disk (so you can start it aga","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["create","start","stop","status","list","connect","use_local","deploy_link"],"description":"Which RunPod operation to perform. \"start\", \"stop\", \"status\" and \"connect\" require `pod_id`; \"create\" takes the optional deploy parameters (name/gpu_type/cloud_type/connect/deadman); \"list\", \"use_local\" and \"deploy_link\" take no other parameters. \"create\" and \"start\" BILL; \"stop\" ends billing."},"pod_id":{"description":"The RunPod pod ID (from console.runpod.io, or action:\"list\"). REQUIRED for actions \"start\", \"stop\", \"status\" and \"connect\". Ignored by \"create\", \"list\", \"use_local\" and \"deploy_link\".","type":"string"},"gpu_count":{"description":"action:\"start\" — GPUs to attach on resume (default 1).","type":"integer","minimum":1,"maximum":8},"name":{"description":"action:\"create\" — pod name (default 'comfyui-mcp').","type":"string"},"gpu_type":{"description":"action:\"create\" — GPU type to prefer, e.g. \"NVIDIA GeForce RTX 4090\". Default tries: NVIDIA GeForce RTX 4090, NVIDIA RTX A6000, NVIDIA RTX PRO 4500 Blackwell, NVIDIA A40, NVIDIA RTX A5000.","type":"string"},"cloud_type":{"description":"action:\"create\" — COMMUNITY (cheaper, default) or SECURE.","type":"string","enum":["COMMUNITY","SECURE"]},"connect":{"description":"action:\"create\" — auto-connect when booted: the ORCHESTRATOR waits for ComfyUI to answer (1-3min), then retargets + watches — this call returns immediately (default false: deploy only; connect later with action:\"connect\"). This is the create-time flag, NOT the action of the same name.","type":"boolean"},"deadman":{"description":"action:\"create\" — arm the pod-side dead-man watchdog (default true for OUR stock template): the pod STOPS ITSELF if comfyui-mcp's heartbeats stop (process crash/offline — boot grace ~45min, then ~20min without beats). Uses the pod-scoped API key RunPod auto-injects into every pod — your account key never leaves this machine. false deploys without the watchdog. With a custom template (RUNPOD_TEMPLATE_ID) the default is OFF — pass true only if that image ships our watchdog.","type":"boolean"}},"required":["action"]}},{"name":"comfy_runpod_watch","description":"Watch a RunPod pod's live status in the control panel, stop watching it, or diagnose why it isn't usable. Driven by the `action` parameter. None of these actions DEPLOYS or resumes a pod — the runpod tool does that. One of them CAN stop one, though: action:\"watch\" arms the idle auto-stop, so a watched pod whose ComfyUI sits idle past the configured timeout is stopped to save cost. Do not watch a pod that is deliberately idle but must stay up.\n- action:\"watch\" — Start broadcasting a pod's LIVE status to the control panel (desktop + mobile) — status, GPU/VRAM utilization, uptime, $/hr, and an idle-auto-stop countdown — refreshed every ~15s. runpod action:\"connect\" already starts this for the pod it connects to; call this to watch a pod WITHOUT retargeting comfyui-mcp at it (e.g. monitor a pod that's still booting). While watched, if the pod's ComfyUI sits idle past the configured timeout it is auto-stopped to save cost.\n- action:\"unwatch\" — Stop broadcasting a pod's live status to the control panel (does NOT stop the pod itself — use runpod action:\"stop\" for that). Also disables idle auto-stop for it.\n- action:\"troubleshoot\" — Diagnose why a RunPod pod isn't usable — call this when the pod 'won't connect', ComfyUI is unreachable, or a render can't reach the pod. Checks: does the pod exist, is it RUNNING (vs stopped/exited — then start it), is a GPU attached, is ComfyUI's port exposed as an HTTP proxy port, and does ComfyUI actually ANSWER at its proxy URL (probes /system_stats). Returns the specific blocker and the next step. Read-only.","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["watch","unwatch","troubleshoot"],"description":"Which watch operation to perform. \"watch\" and \"troubleshoot\" require `pod_id`; \"unwatch\" takes no other parameters (it clears whichever pod is currently watched)."},"pod_id":{"description":"The RunPod pod ID. REQUIRED for actions \"watch\" and \"troubleshoot\". Ignored by \"unwatch\", which clears the single currently watched pod.","type":"string"}},"required":["action"]}},{"name":"comfy_get_workflow","description":"Return, list, summarize or query a SAVED workflow FILE — files on disk, named from the library or given as a path/JSON — NOT the graph open on the user's canvas (that is panel_graph_outline). Every action here is READ-ONLY; saving and locking are save_workflow. Driven by the `action` parameter:\n- action:\"get\" — the full JSON of one saved workflow FILE named from the library. Defaults to converted API format; pass format:'ui' for the raw on-disk UI JSON. Use action:\"analyze\" instead if you just need to UNDERSTAND the workflow — it returns a structured summary without flooding context with JSON. Use action:\"get\" only when you need the actual JSON for enqueue_workflow, create_workflow (action:\"modify\"), or save_workflow.\n- action:\"list\" — the workflows saved in the connected ComfyUI server's user library (the same ones visible in the ComfyUI web UI), INCLUDING the ones filed in subfolders. Requires a running ComfyUI server. Takes no other parameters. Returns a numbered list of library names, each relative to the library root — a workflow in a folder appears as 'VIDEO/MiniMaxH3/clip.json', and that whole string is what `filename` takes. It never reports an absence it did not establish: a listing it could not read says so, and an EMPTY listing says the library could not be CONFIRMED empty (an answer with no names in it cannot show whether it covered subfolders) and tells you to check the ComfyUI sidebar rather than recreate anything.\n- action:\"strip\" — strip a workflow to a clean, flat API graph, resolving Get/Set buses, Reroutes, subgraph definitions, and bypassed/muted nodes into real connections (the 'de-getter-setter' pass). Unlike action:\"get\" this reads from ANY server-side file path on disk (not just the workflow library), so it loads ad-hoc / expert workflow files that action:\"list\" and panel_open_workflow can't resolve. Provide exactly one of: path, filename, or graph. Returns conversion warnings, a node-type summary, and the stripped graph (much smaller than th","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["get","list","strip","slice","from_image","analyze","query","prompt_director"],"description":"Which read to perform. \"list\" and \"prompt_director\" take no required parameters; \"get\" and \"analyze\" require `filename`; \"strip\", \"slice\" and \"query\" require exactly one of `path`/`filename`/`graph` (and \"slice\" also requires `groups`); \"from_image\" requires `image_path`."},"filename":{"description":"Workflow library name, exactly as action:\"list\" reports it. A workflow filed in a folder keeps its folder in the name ('VIDEO/MiniMaxH3/clip.json') and that whole string goes here. REQUIRED for action:\"get\" and action:\"analyze\"; one of the three sources for \"strip\", \"slice\" and \"query\".","type":"string"},"format":{"default":"api","description":"action:\"get\" — 'api' (default, recommended) converts to compact API format with named inputs, connection references, and _meta.mode flags for muted/bypassed nodes; 'ui' returns the raw UI format with layout positions and links arrays. action:\"strip\" — 'api' (default) strips to the flat resolved graph; 'raw' returns the file/graph unchanged. Each action accepts only its own two values (this field is the union of what the two tools it replaces accepted) and refuses the third rather than guessing at an alias.","type":"string","enum":["ui","api","raw"]},"path":{"description":"action:\"strip\" / \"slice\" / \"query\" — Absolute server-side path to a workflow .json on disk (e.g. C:\\\\Users\\\\you\\\\ComfyUI\\\\user\\\\default\\\\workflows\\\\pusa_extend.json). Read directly from disk — no library lookup.","type":"string"},"graph":{"description":"action:\"strip\" / \"slice\" / \"query\" — Inline workflow JSON (UI format for \"strip\"/\"slice\"; UI or API for \"query\"), as an alternative to path/filename.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"groups":{"description":"action:\"slice\" (REQUIRED) — Group-title substrings (case-insensitive) whose output nodes seed the slice — CSV string or array, e.g. 'TEXT TO IMAGE,TXT' or ['extend','sampler']. Shared post-proc is pulled in via the closure.","anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"image_path":{"description":"action:\"from_image\" (REQUIRED) — Absolute path to a ComfyUI-generated PNG file","type":"string"},"view":{"default":"summary","description":"action:\"analyze\" — summary (default): structured text with sections, node IDs, key settings, virtual wires, and full connection graph — best for AI understanding. overview: mermaid diagram showing sections as summary nodes with cross-section data flow. detail: mermaid diagram for one section (requires section parameter). list: text listing of all sections with data flow summary. flat: single mermaid flowchart of the entire workflow (best for small workflows). health: graph-health heuristics (disconnected nodes, duplicate model loads, orphaned branches, muted/bypassed).","type":"string","enum":["summary","overview","detail","list","flat","health"]},"section":{"description":"action:\"analyze\" — Section name for detail view. Use view='list' first to see available section names.","type":"string"},"node_id":{"description":"action:\"prompt_director\" — Optional ComfyUI node id; omit to list all recent Prompt Director runtime states.","type":"string"},"types":{"description":"action:\"query\" — Keep nodes whose class_type contains ANY of these (case-insensitive).","type":"array","items":{"type":"string"}},"title":{"description":"action:\"query\" — Keep nodes whose title contains this.","type":"string"},"where":{"description":"action:\"query\" — Widget predicates, ANDed: 'cfg>7', 'sampler_name=euler', 'text~sunset'.","type":"array","items":{"type":"string"}},"ids":{"description":"action:\"query\" — Keep exactly these node ids.","type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"}]}},"upstream_of":{"description":"action:\"query\" — Scope to the dependency closure FEEDING this node id.","anyOf":[{"type":"string"},{"type":"number"}]},"downstream_of":{"description":"action:\"query\" — Scope to the nodes CONSUMING this node id's outputs.","anyOf":[{"type":"string"},{"type":"number"}]},"depth":{"description":"action:\"query\" — Max hops from the traversal seed (seed=0). Absent = full closure.","type":"integer","minimum":0,"maximum":9007199254740991},"fields":{"description":"action:\"query\" — Projection: compact one-liners (default), bare ids, or detail JSON rows.","type":"string","enum":["ids","compact","detail"]},"group_by":{"description":"action:\"query\" — Aggregate: counts per class_type instead of listing.","type":"string","enum":["type"]},"limit":{"description":"action:\"query\" — Max nodes listed (default 40, max 200).","type":"integer","minimum":1,"maximum":200},"max_chars":{"description":"action:\"query\" — Output character bound (default 12000, max 60000). Raise this — not `limit` — when the truncation tail says the char budget cut the result.","type":"integer","minimum":500,"maximum":60000}},"required":["action"]}},{"name":"comfy_save_workflow","description":"WRITE to the ComfyUI user library: persist a workflow, or capture/verify its provenance lock. This is the only tool here that writes — reading is get_workflow. Driven by the `action` parameter:\n- action:\"save\" — Save a workflow JSON to the connected ComfyUI server's user library so it appears in the ComfyUI web UI. Requires a running ComfyUI server; this writes to that server's userdata and OVERWRITES any existing file with the same filename without confirmation. Web-UI-format JSON ({ nodes: [], links: [] }) is saved as-is and is the preferred input — when re-saving an existing workflow, load it with get_workflow (action:\"get\", format='ui') and modify THAT. API-format graphs ({ '1': { class_type, inputs } }) are AUTO-CONVERTED to Web UI format with a generated layout so the saved file always opens in the ComfyUI canvas (the canvas cannot open raw API format). Returns a confirmation message (noting the conversion and any warnings), or the HTTP status and error text on failure.\n- action:\"lock\" — Capture a provenance lock for a saved workflow so it can be exactly reproduced later. Walks the workflow's model loaders (CheckpointLoaderSimple, UNETLoader, VAELoader, LoraLoader, ControlNetLoader, etc.), SHA-256s every referenced model file, records the git commit currently checked out for every custom node pack the workflow's class_types come from, and captures ComfyUI's reported version. WRITES `<filename>.lock.json` next to the workflow in ComfyUI's user library. Requires local filesystem access: models resolve from the data/model roots, and pack commits inspect custom_nodes on the live --base-directory / COMFYUI_PATH data root (not COMFYUI_CODE_PATH). Pair with action:\"verify_lock\" later to detect drift.\n- action:\"verify_lock\" — Compare a saved workflow's lock file against the current state of the local install and report drift. Loads `<filename>.lock.json`, re-computes a current lock from the same workflow, and diffs: which models have a different SHA-256, which custom ","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["save","lock","verify_lock"],"description":"Which write/provenance operation to perform. All three require `filename`; \"save\" also requires `workflow`."},"filename":{"description":"Workflow filename in the ComfyUI user library (e.g. 'my_workflow.json'). REQUIRED for every action. For action:\"save\" this OVERWRITES an existing file of the same name; for \"lock\"/\"verify_lock\" the lock is read/written as '<filename>.lock.json' alongside it.","type":"string"},"workflow":{"description":"action:\"save\" (REQUIRED) — Workflow JSON to save. Web UI format ({ nodes: [], links: [] }) is stored verbatim; API format ({ '1': { class_type, inputs } }) is auto-converted to Web UI format (generated layout) so it stays openable in ComfyUI's canvas. Not validated against the server before saving.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["action"]}},{"name":"comfy_restart_comfyui","description":"Control the lifecycle of the ComfyUI server process. Driven by the `action` parameter:\n- action:\"restart\" — Restart ComfyUI: stops the running process (capturing its config), waits for the port to free, relaunches with the same arguments, and polls the API for bounded readiness. Also works against a REMOTE/tunnelled ComfyUI (via --comfyui-url) by rebooting through ComfyUI-Manager over HTTP and polling for it to come back (requires ComfyUI-Manager present and its security level permitting the reboot). When COMFYUI_RESTART_COMMAND is set, a LOCAL restart runs that command instead of kill+relaunch — the recovery path for an externally managed install (a container, a systemd unit, a launcher) whose launch path cannot be proven from here. This is the normal way to reload newly installed custom nodes, and the escalation when queue (action:\"cancel\") reports a job WEDGED.\n- action:\"start\" — Start ComfyUI using process info saved from a previous action:\"stop\" call. Supports both Desktop app and manual Python installs. Polls the API for bounded readiness before reporting ready. Local installs only.\n- action:\"stop\" — Stop the running ComfyUI process. Captures process info so it can be restarted with action:\"start\". Kills the process tree and resets the WebSocket client. Local installs only. Anything queued or rendering is lost.","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["restart","start","stop"],"description":"Which process operation to perform. None of them takes any other parameter. \"restart\" stops and relaunches in one call (and is the only action that also works against a remote/tunnelled ComfyUI); \"start\" relaunches from the info a previous \"stop\" saved; \"stop\" kills the running process tree."}},"required":["action"]}},{"name":"comfy_get_image","description":"Fetch, browse and inspect ComfyUI images and registered assets. Driven by the `action` parameter:\n- action:\"get\" — Fetch a generated image from ComfyUI by FILENAME and return it as an inline image. Video/audio outputs (e.g. a VHS_VideoCombine .mp4) are saved to save_dir with their original extension instead of being rendered inline. Works with remote ComfyUI instances — does not require COMFYUI_PATH. Use get_history (action:\"list\") first to obtain the filename.\n- action:\"view\" — Fetch a registered asset's bytes by ASSET ID and return them as an inline image so the agent can see the result. Use this after a render completes (asset_id is included in the completion notification) to inspect, critique, or compare generated images. Only supports image mime types (PNG/JPEG/WebP); audio/video assets must be saved to disk via action:\"get\".\n- action:\"list_outputs\" — List recently generated image AND video files from ComfyUI's output/ directory, newest-first, with each file's kind ('image' | 'video'), subfolder, size, and modification time. Covers stills (.png/.jpg/.jpeg/.bmp) and video/animation outputs (.mp4/.webm/.mov/.mkv/.m4v/.avi/.gif/.webp). LOCAL ComfyUI (COMFYUI_PATH set): a RECURSIVE filesystem scan of output/ — includes subfolders like video/ that VHS/SaveVideo write to, and reports size + modification time. REMOTE ComfyUI: derives the list from /history over HTTP instead (size/modified are unavailable and omitted). It does NOT return the media bytes themselves — fetch those with action:\"get\". USE THIS TO CONFIRM A VIDEO RENDER (e.g. VHS_VideoCombine / LTX / WAN output) when get_history (action:\"list\") shows the prompt done but lists no output: VHS-style video nodes write the file but often do NOT register in ComfyUI's /history, so the local filesystem scan is the reliable way to verify the .mp4 exists — then chain it with upload_image (action:\"stage\"). THAT GUARANTEE IS LOCAL-ONLY AND INVERTS ON A REMOTE TARGET: with no disk to scan, this falls back to the very /hi","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["get","view","list_outputs","convert","analyze_color","list_assets","asset_metadata"],"description":"Which image/asset operation to perform. \"get\" requires `filename`; \"view\" and \"asset_metadata\" require `asset_id`; \"convert\" requires `format` plus exactly one of `asset_id`/`path`; action:\"analyze_color\" takes one source (`asset_id`, `filename`, or `path`); \"list_outputs\" and action:\"list_assets\" take no required parameters."},"filename":{"description":"Output image filename, e.g. PulID_Klein_00001_.png. REQUIRED for action:\"get\". OPTIONAL for action:\"analyze_color\", where it is one of the three ways to name a source (pair it with subfolder/type).","type":"string"},"asset_id":{"description":"Asset id returned by action:\"list_assets\" or job completion. REQUIRED for actions \"view\" and \"asset_metadata\". OPTIONAL for \"convert\" (provide exactly one of asset_id or path) and action:\"analyze_color\" (one of asset_id, filename, or path).","type":"string"},"type":{"description":"ComfyUI directory the file lives in: output (default), input, or temp. Used by action:\"get\" and by action:\"analyze_color\" when the source is a `filename`.","type":"string","enum":["output","input","temp"]},"subfolder":{"description":"Subfolder within the directory, if any (default empty). Used by action:\"get\" and by action:\"analyze_color\" when the source is a `filename`.","type":"string"},"save_dir":{"description":"action:\"get\" — absolute local directory to save the file in. Defaults to a 'comfyui-images' folder inside the platform temp directory (os.tmpdir()), which is created if missing. A RELATIVE value is resolved against this MCP process's working directory, which is the client's choice and may not be writable. On Windows a drive-less path like \\out is resolved against this process's CURRENT DRIVE, not a drive you chose. Prefer a fully-qualified path (C:\\... or \\\\server\\share); the returned 'Saved to:' line always names the resolved absolute path.","type":"string"},"max_preview_bytes":{"description":"action:\"get\" — ceiling on the base64 payload returned INLINE (default ~16MB). The file saved to disk is never affected. Lower it when your client rejects or truncates large tool results; the reply says when it downscaled and by how much.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"max_preview_dimension":{"description":"action:\"get\" — ceiling on the inline preview's longest side in pixels (default 4096). Applies even when the byte budget is satisfied, since some consumers reject by dimension — but only for an image this server can decode; an undecodable one under the byte budget is passed through as-is. Does not affect the saved file.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"path":{"description":"A source image path. action:\"convert\" — a path under COMFYUI_PATH/output (provide exactly one of asset_id or path). action:\"analyze_color\" — an absolute image path, or a path under the ComfyUI output dir (videos: extract a frame to PNG first).","type":"string"},"limit":{"description":"action:\"list_outputs\" — max media files to return, 1..100 (default 20). action:\"list_assets\" — max records to return (default: all, no upper bound).","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"pattern":{"description":"action:\"list_outputs\" — filter by filename pattern (case-insensitive substring match).","type":"string"},"format":{"description":"Two unrelated meanings, one per action — the enum is the union of both and each action accepts only its own half. action:\"list_outputs\" — RESPONSE SHAPE: \"markdown\" (default, human/agent-readable) or \"json\" ({images:[{filename,subfolder,kind,size,modified}]} — for app clients building pick grids). action:\"convert\" — REQUIRED target encoded image format: \"png\", \"jpeg\" or \"webp\".","type":"string","enum":["markdown","json","png","jpeg","webp"]},"quality":{"description":"action:\"convert\" — encoder quality, 1-100. Applies where supported by the selected format.","type":"integer","minimum":1,"maximum":100},"progressive":{"description":"action:\"convert\" — JPEG only: write a progressive JPEG.","type":"boolean"},"lossless":{"description":"action:\"convert\" — WebP only: write lossless WebP.","type":"boolean"},"effort":{"description":"action:\"convert\" — WebP only: encoder effort, 0-6.","type":"integer","minimum":0,"maximum":6},"out_path":{"description":"action:\"convert\" — optional output path under COMFYUI_PATH/output where the converted image should be written.","type":"string"},"reference_path":{"description":"action:\"analyze_color\" — optional reference image to shot-match against; returns target−reference deltas for contrast, black/white points, saturation, and per-channel means.","type":"string"},"histogram":{"description":"action:\"analyze_color\" — also return an overlaid R/G/B/luma histogram PNG for visual confirmation (default false).","type":"boolean"},"since":{"description":"action:\"list_assets\" — ISO timestamp; only return assets created at or after this time.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"}},"required":["action"]}},{"name":"comfy_upload_image","description":"Put a file where ComfyUI (or cloud storage) can read it. Driven by the `action` parameter:\n- action:\"image\" — Upload a local image file to the connected ComfyUI's input/ directory via the HTTP /upload/image endpoint so it can be referenced in LoadImage nodes. Works for both local and remote ComfyUI. Returns the stored filename.\n- action:\"video\" — Upload a local video file (.mp4, .mov, .webm, .avi, .mkv, .m4v) to the connected ComfyUI's input/ directory via the HTTP /upload/image endpoint for use in video-loading nodes such as VHS_LoadVideo (ComfyUI-VideoHelperSuite). Works for both local and remote ComfyUI. Returns the stored filename.\n- action:\"audio\" — Upload a local audio file (.wav, .mp3, .flac, .ogg, .m4a, .aac) to the connected ComfyUI's input/ directory via the HTTP /upload/image endpoint for use in audio-conditioned workflows (e.g. LoadAudio). Works for both local and remote ComfyUI. Returns the stored filename.\n- action:\"stage\" — Stage an EXISTING ComfyUI output (or temp/preview) as an INPUT so the next stage's loader (LoadImage / VHS_LoadVideo / LoadAudio) can read it. This is the CORRECT way to chain a multi-stage pipeline (e.g. Krea2 image → LTX video → WAN extend): it fetches the output's bytes from the server via /view and re-registers them as an input via /upload/image — the same endpoints get_image and the uploads above use. Because it goes entirely through the server API, it works even when ComfyUI was launched with a CUSTOM input/output directory. Do NOT instead copy the output file or guess a filesystem `input/` path — the server's input dir may be custom and it will reject the file (\"Invalid image file\"), wasting the render. Pass an existing output reference ({ filename, subfolder?, type? }); the media kind (image/video/audio) is inferred from the extension unless you set `kind`. Returns the registered input { filename, subfolder, type: \"input\", kind } — drop the returned `filename` straight into the loader's image/video/audio widget.\n- action:\"o","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["image","video","audio","output","stage"],"description":"What to upload and where. \"image\"/\"video\"/\"audio\" send a LOCAL file (`source_path`) to ComfyUI's input/ directory; \"stage\" re-registers an EXISTING server-side output (`filename`) as an input; \"output\" ships a generated output to cloud storage (`destination`)."},"source_path":{"description":"Absolute path to the local file to upload. REQUIRED for actions \"image\", \"video\" and \"audio\".","type":"string"},"filename":{"description":"Two meanings, one per action. actions \"image\"/\"video\"/\"audio\" — OPTIONAL override for the filename in ComfyUI's input/ directory (auto-detected from source_path if omitted). A path prefix (e.g. assets/clip.mp4) places the upload in that SUBFOLDER of input/ — \"..\" is refused — and the returned filename reference includes the subfolder, since loaders need the qualified path. action:\"stage\" — REQUIRED filename of the EXISTING output/temp asset to re-register (from get_history or get_image action:\"list_outputs\"), e.g. LTX_video_00001.mp4; its destination name override is `as_filename`, not this field.","type":"string"},"subfolder":{"description":"action:\"stage\" — subfolder the source asset currently lives in, if any.","type":"string"},"type":{"description":"action:\"stage\" — source directory the asset lives in: output (default) or temp (previews).","type":"string","enum":["output","temp"]},"kind":{"description":"action:\"stage\" — force the media kind instead of inferring it from the file extension.","type":"string","enum":["image","video","audio"]},"as_filename":{"description":"action:\"stage\" — override the filename it is registered under in the input/ directory (defaults to the source filename).","type":"string"},"asset_id":{"description":"action:\"output\" — registered asset id from a completed job. Provide exactly one of asset_id or path.","type":"string"},"path":{"description":"action:\"output\" — path to a generated output under COMFYUI_PATH/output. Provide exactly one of asset_id or path.","type":"string"},"destination":{"description":"action:\"output\" — REQUIRED. Exactly one upload destination.","type":"object","properties":{"s3":{"type":"object","properties":{"bucket":{"type":"string","minLength":1,"description":"Destination S3 bucket"},"prefix":{"description":"Optional object key prefix","type":"string"},"async":{"description":"Accepted for API compatibility; uploads complete before the tool returns.","type":"boolean"}},"required":["bucket"]},"azure":{"type":"object","properties":{"container":{"type":"string","minLength":1,"description":"Destination Azure Blob container"},"blob_prefix":{"description":"Optional blob name prefix","type":"string"}},"required":["container"]},"http":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"HTTP(S) URL to PUT the output file to"}},"required":["url"]},"hf":{"type":"object","properties":{"repo":{"type":"string","minLength":1,"description":"HuggingFace repo in owner/name format"},"repo_type":{"description":"Repo type; defaults to model","type":"string","enum":["model","dataset","space"]},"path":{"description":"Optional path prefix inside the repo","type":"string"}},"required":["repo"]}}}},"required":["action"]}},{"name":"comfy_clear_vram","description":"Free GPU VRAM by unloading cached models from ComfyUI. Use this between generation runs with different model families (e.g. switching from SDXL to Flux) or when running low on VRAM. Optionally unload only models or only memory.","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"unload_models":{"default":true,"description":"Unload all cached models (default: true)","type":"boolean"},"free_memory":{"default":true,"description":"Free cached memory/intermediates (default: true)","type":"boolean"}}}},{"name":"comfy_get_defaults","description":"Read and write settings — either OUR generation defaults or ComfyUI's own frontend UI settings. These are two SEPARATE stores and the `action` says which one you mean:\n- action:\"get\" — Return the merged view of OUR generation defaults with per-source attribution. Precedence (lowest → highest): config file → COMFYUI_DEFAULT_* env vars → runtime overrides via action:\"set\". Per-call MCP tool args always win over these defaults when consumed by a workflow-construction tool. Read-only, and works even with no ComfyUI running.\n- action:\"set\" — Update OUR generation defaults from `values`. By default updates the in-memory runtime layer (lost on restart); pass persist:true to also write the change into the config file (~/.config/comfyui-mcp/config.json by default). Use this to avoid repeating common values like width, height, steps, cfg, sampler, checkpoint.\n- action:\"get_ui\" — Read COMFYUI's OWN per-user frontend UI settings (the Comfy.* ids its Settings panel writes, served by the frontend user manager). This is a DIFFERENT store from action:\"get\" — nothing here feeds our generation defaults. Read-only. Provide `id` to read one setting's raw stored value; omit `id` to list all stored settings (optionally narrowed by `filter`). Known ids include Comfy.Validation.Workflows (boolean; its strictness rejects some custom-node workflows), Comfy.Execution.PreviewMethod (default|none|auto|latent2rgb|taesd), Comfy.LinkRenderMode (0 straight / 1 linear / 2 spline / 3 hidden), Comfy.UseNewMenu, and Comfy.Sidebar.Location. Ids are frontend-defined and stored verbatim; keys never written by the user are absent here and fall back to invisible frontend defaults. Values are surfaced with their raw stored type (no coercion). Requires a reachable local or remote ComfyUI; not available in Comfy Cloud mode.\n- action:\"set_ui\" — Modify one of COMFYUI's OWN persisted frontend UI settings by `id`. This writes ComfyUI's user settings store, NOT our generation defaults (that is action:\"set\"). The ch","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["get","set","get_ui","set_ui"],"description":"Which settings operation to perform, and on WHICH store. \"get\"/\"set\" are the MCP server's own generation defaults (width, steps, cfg, …); \"get_ui\"/\"set_ui\" are ComfyUI's separate frontend UI settings (the Comfy.* ids). \"get\" takes no other parameters; \"set\" requires `values` (optional `persist`); \"get_ui\" takes an optional `id` or `filter`; \"set_ui\" requires `id` + `value`."},"values":{"description":"action:\"set\" — REQUIRED. Key/value map of GENERATION defaults to set. Keys are typically lowercase (e.g. width, steps). Not for Comfy.* UI ids — those go through action:\"set_ui\".","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"persist":{"description":"action:\"set\" — if true, write to the config file in addition to runtime.","type":"boolean"},"id":{"description":"ComfyUI UI setting id, e.g. 'Comfy.Validation.Workflows'. REQUIRED for action:\"set_ui\". OPTIONAL for action:\"get_ui\" — omit to list all stored settings.","type":"string"},"filter":{"description":"action:\"get_ui\" — case-insensitive substring filter on setting ids when listing (e.g. 'preview'). Ignored when `id` is given.","type":"string"},"value":{"description":"action:\"set_ui\" — REQUIRED. New value for the ComfyUI UI setting. Stored as-is; booleans/numbers are NOT coerced from strings (pass true, not \"true\").","anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"array","items":{}}]}},"required":["action"]}},{"name":"comfy_generate_image","description":"Generate media from a prompt or an existing image — the high-level entry points that build the graph for you. Every action enqueues on the connected ComfyUI and returns the prompt_id immediately; the resulting asset_id arrives in the completion notification. Driven by the `action` parameter:\n- action:\"image\" — Text-to-image. Builds a txt2img workflow, filling any unspecified parameter from your configured defaults (get_defaults (action:\"set\") / COMFYUI_DEFAULT_* / config file), auto-selecting a local checkpoint when none is given — checkpoints known to lack a text encoder (e.g. video models) are skipped. `prompt` is required. For full control over the node graph, use create_workflow + enqueue_workflow instead.\n- action:\"audio\" — Text-to-audio, supporting the ACE Step 1.5 and Stable Audio 3 model families. Builds the appropriate workflow graph, filling unspecified parameters from your defaults and auto-selecting local models. `model_family`, `prompt` and `duration` are required. Requires a running ComfyUI with the corresponding model files installed.\n- action:\"video\" — Text-to-video, or image-to-video when `image` is given (animate a start frame). Composes an LTX-2.3 distilled workflow on your LOCAL GPU using the render-verified Comfy-Org node stack (gemma text encoder + abliterated/distilled LoRAs). Needs the LTX-2.3 models (~24-46GB): install with apply_manifest --path packs/ltx-2.3-txt2vid/manifest.yaml (or ltx-2.3-img2vid for i2v); returns an actionable error if the checkpoint is missing. `seconds` is converted to an 8n+1 frame count. For i2v, higher `strength` means MORE adherence to the start frame but LESS motion (1.0 can freeze the clip) — keep ~0.6. This minimal path omits the synchronized audio + stage-2 spatial upscale that the full ltx-2.3 packs ship. `prompt` is required. The video is written under output/video/ — find it with get_image (action:\"list_outputs\") (VHS/SaveVideo outputs may not appear in /history).\n- action:\"3d\" — Generate a 3D model (glb/ob","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["image","audio","video","3d","controlnet","ip_adapter","regenerate","upscale","remove_background"],"description":"What to generate. action:\"image\"/action:\"video\" require `prompt`; action:\"audio\" requires `model_family`+`prompt`+`duration`; action:\"3d\" requires `mode` (+ `prompt` or `image`); action:\"controlnet\" requires `prompt`+`control_image`; action:\"ip_adapter\" requires `prompt`+`reference_image`; action:\"regenerate\" requires `asset_id`; action:\"upscale\" and action:\"remove_background\" require `image`."},"prompt":{"description":"Positive text prompt. REQUIRED for actions \"image\", \"audio\", \"video\", \"controlnet\" and \"ip_adapter\"; for action:\"3d\" it is required in mode \"text\" and optional (passed through only if the chosen node accepts it) in mode \"image\". Unused by action:\"regenerate\", action:\"upscale\" and action:\"remove_background\".","type":"string"},"negative_prompt":{"description":"Negative prompt (default: empty / from defaults). Used by actions \"image\", \"video\", \"controlnet\", \"ip_adapter\" and — for the Stable Audio 3 family only — \"audio\".","type":"string"},"width":{"description":"Image width in pixels. Actions \"image\", \"controlnet\", \"ip_adapter\".","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"height":{"description":"Image height in pixels. Actions \"image\", \"controlnet\", \"ip_adapter\".","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"steps":{"description":"Sampling steps. Actions \"image\", \"audio\", \"video\", \"controlnet\", \"ip_adapter\" (video defaults to 8 for the distilled model).","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"cfg":{"description":"CFG scale. Actions \"image\", \"audio\", \"video\", \"controlnet\", \"ip_adapter\" (video defaults to 1.0 for the distilled model).","type":"number","exclusiveMinimum":0},"sampler":{"description":"Sampler name (e.g. euler, dpmpp_2m). Actions \"image\", \"audio\", \"controlnet\", \"ip_adapter\".","type":"string"},"scheduler":{"description":"Scheduler (e.g. normal, karras). Actions \"image\", \"audio\", \"controlnet\", \"ip_adapter\".","type":"string"},"seed":{"description":"Seed (omit to randomize). Actions \"image\", \"audio\", \"video\", \"controlnet\", \"ip_adapter\".","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"checkpoint":{"description":"Checkpoint filename; auto-selected from local models if omitted. The relevant checkpoint differs per action: a diffusion checkpoint for \"image\"/\"controlnet\"/\"ip_adapter\", the LTX checkpoint for \"video\", the Stable Audio 3 checkpoint for \"audio\".","type":"string"},"batch_size":{"description":"action:\"image\" — number of images to generate.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"filename_prefix":{"description":"Output filename prefix. action:\"audio\" (default audio/ace_step or audio/stable_audio_3), action:\"video\" (default 'video/ltx-2.3') and action:\"remove_background\" (default 'ComfyUI_cutout').","type":"string"},"image":{"description":"Filename of an image in ComfyUI's input dir (upload it first with upload_image (action:\"image\"), or stage a prior output with upload_image (action:\"stage\")). REQUIRED for action:\"upscale\" and action:\"remove_background\"; the start frame for action:\"video\" image-to-video; the input image for action:\"3d\" in mode \"image\".","type":"string"},"model":{"description":"Model file for the post-processing actions: action:\"upscale\" — an upscale model in models/upscale_models/ (auto-selected from local models if omitted); action:\"remove_background\" — the BiRefNet matting model (default 'BiRefNet_toonout'; auto-downloaded by ComfyUI-RMBG).","type":"string"},"scale":{"description":"action:\"upscale\" — net upscale factor: 2 or 4 (default 4).","anyOf":[{"type":"number","const":2},{"type":"number","const":4}]},"control_image":{"description":"action:\"controlnet\" — filename of the (already-uploaded, already-preprocessed) control image in ComfyUI's input dir. REQUIRED for that action.","type":"string"},"controlnet_model":{"description":"action:\"controlnet\" — ControlNet model file (in models/controlnet/); auto-selected if omitted.","type":"string"},"reference_image":{"description":"action:\"ip_adapter\" — filename of the (already-uploaded) reference image in ComfyUI's input dir. REQUIRED for that action.","type":"string"},"weight":{"description":"action:\"ip_adapter\" — IP-Adapter influence on the output, typically 0.0-1.0 (default 0.8); higher = closer to the reference.","type":"number"},"preset":{"description":"action:\"ip_adapter\" — IPAdapterUnifiedLoader preset (default 'PLUS (high strength)').","type":"string"},"weight_type":{"description":"action:\"ip_adapter\" — IPAdapter weight mode (default 'standard' — required by current IPAdapter_plus builds).","type":"string","enum":["standard","prompt is more important","style transfer"]},"strength":{"description":"Two DIFFERENT knobs sharing one field, each with its own range, checked when the action runs: action:\"video\" (i2v only) — adherence to the start frame, 0-1 inclusive (default 0.6; higher = LESS motion); action:\"controlnet\" — conditioning strength, must be > 0, typically 0.0-2.0 (default 1.0; higher = stronger adherence to the control image).","type":"number"},"seconds":{"description":"action:\"video\" — clip length in seconds (default 4; ~10s max).","type":"number","exclusiveMinimum":0},"resolution":{"description":"action:\"video\" — 'WIDTHxHEIGHT' e.g. '768x512' (rounded to multiples of 32; default 768x512).","type":"string"},"fps":{"description":"action:\"video\" — frames per second (default 25).","type":"number","exclusiveMinimum":0},"mode":{"description":"action:\"3d\" — \"text\" = text-to-3D from `prompt`; \"image\" = image-to-3D from an uploaded input `image`. REQUIRED for that action.","type":"string","enum":["text","image"]},"node":{"description":"action:\"3d\" — explicit 3D API node class_type to use (e.g. \"MeshyTextToModelNode\"); auto-selected if omitted. Use list_api_nodes with filter \"3d\" to see options.","type":"string"},"inputs":{"description":"action:\"3d\" — provider-specific extra inputs passed through to the node (e.g. style, texture, quality). Use list_api_nodes (action:\"schema\") on the chosen node for valid keys.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"model_family":{"description":"action:\"audio\" — audio model family; determines which workflow template and model loaders to use. REQUIRED for that action.","type":"string","enum":["ace_step_1.5","stable_audio_3"]},"duration":{"description":"action:\"audio\" — audio duration in seconds. REQUIRED for that action.","type":"number","exclusiveMinimum":0},"unet":{"description":"action:\"audio\" — ACE UNet model filename (in models/diffusion_models/); auto-selected if omitted.","type":"string"},"vae":{"description":"action:\"audio\" — ACE VAE model filename (in models/vae/); auto-selected if omitted.","type":"string"},"clip_a":{"description":"action:\"audio\" — primary text encoder filename (in models/text_encoders/); auto-selected if omitted.","type":"string"},"clip_b":{"description":"action:\"audio\" — secondary text encoder filename (in models/text_encoders/); auto-selected if omitted.","type":"string"},"clip":{"description":"action:\"audio\" — Stable Audio CLIP encoder filename (in models/text_encoders/); auto-selected if omitted.","type":"string"},"lyrics":{"description":"action:\"audio\" — lyrics or song structure description (ACE only — section-by-section breakdown).","type":"string"},"language":{"description":"action:\"audio\" — language code for prompt (ACE only, default: 'en').","type":"string"},"musical_key":{"description":"action:\"audio\" — target musical key (ACE only, e.g. 'C major', 'E minor'; default: 'C major').","type":"string"},"shift":{"description":"action:\"audio\" — ModelSamplingAuraFlow shift parameter (ACE only, default: 3).","type":"number"},"guidance_scale":{"description":"action:\"audio\" — TextEncodeAceStepAudio1.5 cfg_scale, the text encoder guidance scale (ACE only, default: 2).","type":"number"},"bpm":{"description":"action:\"audio\" — TextEncodeAceStepAudio1.5 tempo in beats per minute (ACE only, 10-300, default: 120).","type":"integer","minimum":10,"maximum":300},"timesignature":{"description":"action:\"audio\" — TextEncodeAceStepAudio1.5 time signature (ACE only, one of '2'/'3'/'4'/'6', default: '4').","type":"string","enum":["2","3","4","6"]},"temperature":{"description":"action:\"audio\" — TextEncodeAceStepAudio1.5 LLM sampling temperature (ACE only, 0-2, default: 0.85).","type":"number","minimum":0,"maximum":2},"top_p":{"description":"action:\"audio\" — TextEncodeAceStepAudio1.5 LLM top-p nucleus sampling (ACE only, 0-2000, default: 0.9).","type":"number","minimum":0,"maximum":2000},"top_k":{"description":"action:\"audio\" — TextEncodeAceStepAudio1.5 LLM top-k sampling (ACE only, 0-100, default: 0 = disabled).","type":"integer","minimum":0,"maximum":100},"min_p":{"description":"action:\"audio\" — TextEncodeAceStepAudio1.5 LLM min-p sampling (ACE only, 0-1, default: 0).","type":"number","minimum":0,"maximum":1},"generate_audio_codes":{"description":"action:\"audio\" — generate audio codes via the TextEncodeAceStepAudio1.5 LLM (ACE only, default: true).","type":"boolean"},"audio_quality":{"description":"action:\"audio\" — SaveAudioMP3 bitrate/quality (ACE and stable_audio_3, one of 'V0'/'128k'/'320k', default: '320k').","type":"string","enum":["V0","128k","320k"]},"asset_id":{"description":"action:\"regenerate\" — asset id of the source generation. REQUIRED for that action.","type":"string"},"overrides":{"description":"action:\"regenerate\" — map of input-name → new value applied to every node that already has that input. Common keys: cfg, steps, sampler_name, scheduler, seed, denoise, text.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"disable_random_seed":{"description":"action:\"regenerate\" and action:\"3d\" — if true, do not randomize seed fields. For action:\"regenerate\", combine with `overrides.seed` to reproduce the exact original image.","type":"boolean"}},"required":["action"]}},{"name":"comfy_node_snapshot","description":"Custom-node snapshots via ComfyUI-Manager (mirrors `comfy node save-snapshot` / `restore-snapshot`). Driven by the `action` parameter:\n- action:\"list\" — List the snapshots ComfyUI-Manager knows about. No other parameters. Read-only.\n- action:\"save\" — Save the current custom-node and version state. With no `name`, Manager assigns a timestamped snapshot (works against remote instances). Providing `name` writes a custom-named snapshot file, which requires a local ComfyUI install root (COMFYUI_PATH or a saved default workspace — see the workspace tool) and is unavailable against a genuinely remote ComfyUI.\n- action:\"restore\" — Restore a previously saved snapshot by `name` (required). ComfyUI-Manager applies the custom-node changes on the next ComfyUI restart; use action:\"list\" to find available names.","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["list","save","restore"],"description":"Which snapshot operation to perform. \"list\" takes no other parameters; \"save\" takes an optional `name`; \"restore\" requires `name`."},"name":{"description":"Snapshot name (no extension, no path separators). REQUIRED for action:\"restore\" (as shown by action:\"list\"). OPTIONAL for action:\"save\" — omit to let ComfyUI-Manager assign a timestamped name. Ignored by action:\"list\".","type":"string"}},"required":["action"]}},{"name":"comfy_bisect","description":"Binary-search (git-bisect style) over installed ComfyUI custom nodes to find which one causes a problem. A state machine driven by the `action` parameter:\n- action:\"start\" — Begin a session over all currently-enabled custom nodes. Enables half and disables the rest for the first test round, then guide the search with good/bad. Prefers the ComfyUI-Manager HTTP API; falls back to toggling .disabled directory suffixes for local installs. A ComfyUI restart may be needed for changes to take effect.\n- action:\"good\" — Mark the currently enabled set as GOOD (the problem is absent with this set). Narrows the search to the disabled candidates and enables the next subset. Resolves and reports the culprit when one node remains.\n- action:\"bad\" — Mark the currently enabled set as BAD (the problem is present with this set). Narrows the search to the enabled subset and enables the next subset. Resolves and reports the culprit when one node remains.\n- action:\"reset\" — Re-enable all custom nodes and clear the session. Use to abort a bisection or restore the installation after the search completes.\n- action:\"status\" — Report the current session state: status (idle/running/resolved), the remaining candidate node set, which nodes are enabled this round, and the identified culprit if resolved.\nAll actions are argument-free; `action` is the only parameter. `good`/`bad` require a session already started with action:\"start\".","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["start","good","bad","reset","status"],"description":"Which bisect operation to perform. \"start\" begins a session; \"good\"/\"bad\" narrow it (require a running session); \"reset\" clears it and re-enables everything; \"status\" reports state. No other arguments are needed for any action."}},"required":["action"]}},{"name":"comfy_install_custom_node","description":"Install, repair, enable/disable and remove ComfyUI custom node packs on this ComfyUI. To FIND a pack in the public registry first, use search_custom_nodes. Driven by the `action` parameter:\n- action:\"install\" — Install a pack by registry id, git URL, or name. Local installs prefer official comfy-cli when available; remote or CLI-unavailable installs use the ComfyUI-Manager HTTP API. A ComfyUI restart may be required. Targeting the comfyui-mcp sidebar panel pack ('comfyui-agent-panel' / 'comfyui-mcp-panel') is routed through the verified install_comfyui(action:'panel') path (the version is re-read from disk afterwards) and is REFUSED while the panel is version-pinned.\n- action:\"update\" — Update an installed pack, or pass id:'all' to update every installed pack. Local operations prefer official comfy-cli; remote operations use Manager HTTP. Targeting the sidebar panel pack is routed through the verified install_comfyui(action:'panel') path. While the panel is version-pinned, BOTH a direct panel target and 'all' are REFUSED — 'all' would move the pinned panel too; clear the pin with install_comfyui(action:'panel', panel_action:'unpin') or update other packs individually.\n- action:\"reinstall\" — Reinstall a pack. Local operations prefer official comfy-cli; remote operations use Manager HTTP. A ComfyUI restart may be required. A panel target is routed through the verified install_comfyui(action:'panel') path and is REFUSED while the panel is version-pinned.\n- action:\"fix\" — Repair a pack's install and Python dependencies, or pass id:'all' to repair every pack. Local operations prefer official comfy-cli; remote single-pack repairs use Manager HTTP. REFUSES the sidebar panel pack — 'fix' has no verified on-disk check, so use install_comfyui(action:'panel') for the panel — and refuses 'all' while the panel is version-pinned.\n- action:\"uninstall\" — Uninstall a pack (removes it). IRREVERSIBLE through this tool — for a cleanup audit prefer action:\"disable\", which is reversible.","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["install","update","reinstall","fix","uninstall","enable","disable","list","sync_deps"],"description":"Which custom-node operation to perform. \"install\", \"update\", \"reinstall\", \"fix\", \"uninstall\", \"enable\" and \"disable\" require `id`; \"list\" and \"sync_deps\" take no required parameters."},"id":{"description":"The pack to act on. REQUIRED for actions \"install\", \"update\", \"reinstall\", \"fix\", \"uninstall\", \"enable\" and \"disable\". For \"install\" this is a registry id, git URL, or node-pack name (find one with search_custom_nodes); for \"update\"/\"fix\" it may also be 'all' (every installed pack); for \"update\"/\"reinstall\"/\"fix\"/\"uninstall\"/\"enable\"/\"disable\" it is a registry id / module name of an INSTALLED pack.","type":"string"},"source":{"description":"action:\"install\" — how to interpret `id` (default 'auto', which detects git URLs vs registry ids).","type":"string","enum":["registry","git","auto"]},"version":{"description":"Version to install. action:\"install\" — e.g. 'latest', 'nightly', or a semver; for git installs this is treated as a git ref unless `ref` is also provided, and registry installs default to 'latest'. action:\"reinstall\" — version to reinstall (default 'latest').","type":"string"},"ref":{"description":"action:\"install\" — git ref (commit SHA, branch, or tag) to pin when installing a git URL. Overrides any ref parsed from the URL and any `version` value. Ignored for registry-id installs.","type":"string"},"mode":{"description":"Two distinct meanings, one per action group. For actions \"install\"/\"update\"/\"reinstall\"/\"fix\": the ComfyUI-Manager data source (default 'remote'); 'remote' fetches the live node list, 'local'/'cache' use bundled/cached data. For action:\"list\": 'default' lists the installed packs as they are on disk NOW; 'imported' returns that SAME custom_nodes/ scan frozen at ComfyUI startup, so the only difference is packs installed or removed since the server booted. 'imported' is NOT an import-success filter: it includes DISABLED packs and cannot tell you whether the Python of a pack actually loaded — for that use node_pack action:\"verify\", which checks the node class_types of the pack against /object_info on the running server. Passing a value from the wrong group is refused, naming the ones the action accepts.","type":"string","enum":["remote","local","cache","default","imported"]},"channel":{"description":"ComfyUI-Manager channel name (default 'default').","type":"string"},"useCmCli":{"description":"Prefer the official comfy-cli subprocess instead of the ComfyUI-Manager HTTP API. Local operations use comfy-cli by default; set false to force Manager HTTP. Requires a local ComfyUI install — for actions \"install\"/\"disable\"/\"enable\"/\"uninstall\", an unavailable CLI falls back to Manager HTTP automatically (disclosed in the result); \"update\"/\"reinstall\"/\"fix\"/\"list\" do not fall back.","type":"boolean"}},"required":["action"]}},{"name":"comfy_report_issue","description":"File or triage a GitHub issue for a bug/problem you hit (ComfyUI, a workflow, a model, custom nodes, or comfyui-mcp/its panel). For OUR repos (artokun/comfyui-mcp, artokun/comfyui-mcp-panel) it sends the report to the AI triage worker, which searches existing OPEN and CLOSED issues, version-matches, and either files a new issue, adds context to an existing one, or — if the problem was already FIXED in a newer version than the user runs — answers with the fixing PR + fixed-in version and a recommendation to upgrade (no new issue). It returns that triage result plus an instant check of whether the user is on the latest versions. TIMING: this call BLOCKS while the triage runs — typically a few minutes — and that wait is normal, not a hang. It always returns eventually (every request is time-capped and the poll budget is bounded); on a failing network the caps make that wait longer, but never indefinite. Do not abort a slow call just to retry it: once the worker has accepted the report it keeps triaging on its own — filing, deduping into an existing issue, advising an upgrade, or (rarely) reporting that it could not file — so a blind retry can double-file. If triage outlasts the polling budget the call still returns, with pending:true (and a job_id when the worker gave one — an accepted submit whose acknowledgement was unreadable returns pending without it). If the worker is unreachable it falls back to a prefilled GitHub 'new issue' URL. For third-party repos it returns a prefilled URL to SHARE (it does not auto-file). ALWAYS pass mcp_version and panel_version from the known environment (the env line in your context, e.g. 'mcp=… panel=…') so the worker can tell the user if simply upgrading fixes it — the single most common resolution. Surface the worker's agent_message / upgrade advice to the user.","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"title":{"type":"string","minLength":1,"description":"Short, specific issue title."},"body":{"type":"string","minLength":1,"description":"Issue body: what happened, steps to reproduce, the exact error text, and environment (GPU/VRAM, ComfyUI version, ComfyUI FRONTEND version, OS) if known. The FRONTEND version is a SEPARATE package from ComfyUI and they move independently — get_system_stats (action:\"health\") prints both, and for any panel/UI bug it is often the deciding variable. Scrub secrets first."},"repo":{"description":"owner/repo (default 'artokun/comfyui-mcp'; use 'artokun/comfyui-mcp-panel' for the sidebar panel).","type":"string"},"labels":{"description":"Optional GitHub label names to prefill.","type":"array","items":{"type":"string"}},"mcp_version":{"description":"The running comfyui-mcp version (from the env line in your context). Auto-detected if omitted.","type":"string"},"panel_version":{"description":"The running comfyui-mcp-panel (sidebar) version, from the env line in your context, if known.","type":"string"},"no_file":{"description":"Force the prefilled-URL path even for our repos (skip the Worker). Rarely needed.","type":"boolean"}},"required":["title","body"]}},{"name":"comfy_install_comfyui","description":"Install, update and configure the local ComfyUI installation, its sidebar panel, and this MCP server itself. Driven by the `action` parameter:\n- action:\"install\" — Install ComfyUI locally: git-clone it into `target_path`, create a dedicated workspace virtualenv (<target>/.venv), and install Python requirements INTO that venv (never the Python running this MCP server) via pip or uv. ComfyUI-Manager is installed from manager_requirements.txt when present, else git-cloned as a fallback. Mirrors `comfy-cli install`. LOCAL, subprocess-only and independent of any remote --comfyui-url target; the target dir must be empty or non-existent (an existing install is never overwritten). Runs SYNCHRONOUSLY and can take several minutes (large git clone + full torch/dependency install); the call blocks until done. On success returns a JSON report { installed, targetPath, venvPath, comfyuiUrl, managerInstalled, managerVia, version, pythonInstaller, steps[] }. Does NOT start ComfyUI. `target_path` is REQUIRED.\n- action:\"update\" — Update the ComfyUI CORE install: runs `git pull` in the connected local server's observed checkout (falling back to COMFYUI_CODE_PATH, then COMFYUI_PATH) and reinstalls its Python requirements (auto-detecting uv vs pip). Returns a clear error when targeting a remote instance via --comfyui-url. The requirements install targets the running server's own interpreter (recorded when this server launched ComfyUI, or an explicit COMFYUI_PYTHON); when that interpreter cannot be verified the update refuses rather than install into a guessed environment — start ComfyUI or connect first. Does NOT touch custom nodes.\n- action:\"update_all\" — Update ALL installed CUSTOM NODES via the ComfyUI-Manager HTTP API. Mirrors `comfy-cli update all`. This does NOT update ComfyUI core — use action:\"update\" for that. Works against the connected instance (local or remote); updates run asynchronously and a ComfyUI restart may be required afterward. REFUSED while the comfyui-mcp sidebar p","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["install","update","update_all","panel","self_update","environment","configure_manager"],"description":"Which install/environment operation to perform. action:\"update\", action:\"update_all\" and action:\"environment\" take no other parameters; action:\"install\" requires `target_path`; action:\"panel\" takes `panel_action` (+ `version`/`reason` for a pin); action:\"self_update\" takes `self_update_action`; action:\"configure_manager\" requires `manager_setting` (+ `value`)."},"target_path":{"description":"action:\"install\" — REQUIRED absolute path to the workspace directory to install ComfyUI into. Must be empty or non-existent.","type":"string","minLength":1},"skip_manager":{"description":"action:\"install\" — if true, do not clone/install ComfyUI-Manager. Default false (Manager is installed).","type":"boolean"},"use_uv":{"description":"action:\"install\" — if true, prefer `uv pip install` over plain pip when uv is available on PATH. Falls back to pip if uv is missing. Default false.","type":"boolean"},"version":{"description":"action:\"install\" — ComfyUI version to install (comfy-cli semantics): \"nightly\" (default-branch HEAD), \"latest\" (newest release tag), or a semantic version like \"0.3.40\" (checked out as tag v0.3.40). Raw git refs/branches are rejected. Omit to track the default branch HEAD. ALSO used by action:\"panel\" + panel_action:\"pin\", where it is the PANEL version to hold at, e.g. '0.11.20' (take it from the installedVersion that panel_action:\"status\" reports).","type":"string"},"panel_action":{"default":"status","description":"action:\"panel\" — which sidebar-panel operation to run. status: report installed/version/dev-symlink/pin plus a sync assessment (never errors). sync: bring the panel up to what this orchestrator needs — no-ops when already current, WARNS ONLY when pinned, and reports the version re-read from disk afterwards. install: add the panel (nightly). update: pull the latest nightly. Works on either install shape — a git checkout is fast-forwarded, and a Comfy Registry ZIP install (which has no .git) is replaced with a verified fresh clone, keeping the previous copy outside custom_nodes. Success is always re-read from disk. reinstall: uninstall + reinstall (nightly). pin: hold the panel at a version (requires `version`). unpin: clear the pin so a sync can proceed. unlock: recover from a crashed/killed orchestrator's leftover panel operation lock — reclaims it ONLY when it is provably abandoned (older than the stale threshold AND its recorded owner process is dead), and refuses with the observed state otherwise. install/update/reinstall/sync refuse on a dev symlink or an active pin, and require a local workspace (COMFYUI_PATH or the saved default workspace).","type":"string","enum":["status","install","update","reinstall","sync","pin","unpin","unlock"]},"reason":{"description":"action:\"panel\" + panel_action:\"pin\" only: why the user is pinning (stored with the pin).","type":"string"},"self_update_action":{"default":"status","description":"action:\"self_update\" — status: report install mode + current vs latest version + dev-link note (never errors). update: update to the latest published version (refuses on a dev link; no-op when already up to date or for npx).","type":"string","enum":["status","update"]},"manager_setting":{"description":"action:\"configure_manager\" — REQUIRED. Which ComfyUI-Manager setting to change. HTTP API: set_preview_method, set_db_mode, set_component_policy, set_update_policy, set_channel, reset_queue. config.ini fallback: set_network_mode, set_security_level.","type":"string","enum":["set_preview_method","set_db_mode","set_component_policy","set_update_policy","set_channel","reset_queue","set_network_mode","set_security_level"]},"value":{"description":"action:\"configure_manager\" — value for the chosen `manager_setting` (omit only for reset_queue). Allowed values per setting — set_preview_method: auto | latent2rgb | taesd | none; set_db_mode: local | cache | remote; set_component_policy: workflow | higher | mine; set_update_policy: stable-comfyui | nightly-comfyui; set_channel: a channel name (e.g. default); set_network_mode: public | private | offline; set_security_level: strong | normal | normal- | weak. HTTP-API settings take effect live; the config.ini ones (set_network_mode, set_security_level) apply only after a ComfyUI restart.","type":"string"}},"required":["action"]}},{"name":"comfy_model_metadata","description":"Curate a model file's embedded .safetensors metadata (Model Explorer). Driven by the `action` parameter:\n- action:\"read\" — Read a model file's CURRENT embedded metadata + evidence, for curating it. Returns classify (asset_type/base/precision/rank), the current model_card and prompt_director namespaces, read-only modelspec, top training tags (ss_tag_frequency), the Civitai description, and example prompts. Call this FIRST when the user wants to improve/curate a model's embedded .safetensors metadata, so you propose from real data. NOTE: this is the embedded-in-the-tensor metadata (model_card/prompt_director/modelspec/ss_*) — NOT the separate lora_catalog. `category` = ComfyUI model folder ('loras','checkpoints','vae',…); `name` = filename incl. .safetensors — BOTH required for read/propose, e.g. {action:\"read\", category:\"loras\", name:\"my_model.safetensors\"}. DEPENDENCY: the curated read proxies the OPTIONAL 'comfyui-model-explorer' custom node. When that node is absent but the model file is reachable on the LOCAL filesystem, the tool does NOT hard-fail — it degrades to a structured 'model_explorer: unavailable' result with local evidence (file stat, the download_model action:\"download_civitai\" sidecar, and the raw embedded safetensors metadata). Without local filesystem access, it still returns the same structured unavailable result, but without file evidence.\n- action:\"propose\" — PROPOSE cleaned embedded metadata into the user's diff-review window. This does NOT write the file — the user sees your proposed fields vs current, edits/discusses, and their Confirm does the write. Call whenever you have a proposal OR the user asks you to revise one; each call REPLACES the live proposal, so send the FULL field set you're proposing. Include only fields you're confident about. Keys: display_name, description_clean, semantic_intent, prompt_guidance, preservation_guidance, trigger_tokens[] (EXACT tokens — never invent), activation_phrases[], negative_tokens[], tags[], compatib","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["read","propose","fetch_civitai"],"description":"Which metadata operation to perform. All three actions require `category` + `name`; \"propose\" also requires `fields` (optional `note`); \"fetch_civitai\" takes an optional `version_id`."},"category":{"description":"ComfyUI model folder, e.g. 'loras'. REQUIRED for all three actions.","type":"string"},"name":{"description":"model filename incl. .safetensors. REQUIRED for all three actions.","type":"string"},"fields":{"description":"action:\"propose\" — REQUIRED proposed field map (see description).","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"note":{"description":"action:\"propose\" — optional one-line note about this revision.","type":"string"},"version_id":{"description":"action:\"fetch_civitai\" — force a specific Civitai modelVersionId if hash lookup misses.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["action"]}},{"name":"comfy_workspace","description":"Inspect and manage ComfyUI workspaces (local installs). Driven by the `action` parameter:\n- action:\"get\" — Report the active ComfyUI workspace (mirrors `comfy-cli which`): the local installation path being used (from COMFYUI_PATH or auto-detection), the source of that path, any persisted default workspace, and the resolved API target the MCP server talks to.\n- action:\"set_default\" — Persist a default ComfyUI workspace path to the MCP config file (mirrors `comfy-cli set-default`). The value is stored under the OS config dir (e.g. ~/.config/comfyui-mcp/workspace.json) and reported by action:\"get\"/action:\"list\". Does NOT change the live API target. `path` is REQUIRED, e.g. {action:\"set_default\", path:\"/opt/ComfyUI\"}.\n- action:\"list\" — List known/auto-detected ComfyUI installations on this machine. Scans common install locations across macOS, Linux, and Windows and marks which one is active and which is the saved default.","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["get","set_default","list"],"description":"Which workspace operation to perform. \"get\" and \"list\" take no other parameters; \"set_default\" requires `path`."},"path":{"description":"action:\"set_default\" — REQUIRED absolute path to a ComfyUI installation directory to remember as the default workspace.","type":"string","minLength":1}},"required":["action"]}},{"name":"comfy_list_api_nodes","description":"Discover and run hosted partner/API nodes on the connected ComfyUI (e.g. Flux/BFL, Ideogram, Kling, Stability). These call external image/video providers and run server-side, requiring a Comfy account/API key configured on the ComfyUI server — they spend PAID api credits, unlike a local-GPU render. Driven by the `action` parameter:\n- action:\"list\" — List the API/partner nodes available on the connected ComfyUI, optionally narrowed by `filter`. Returns an empty list if the server has no API nodes (or they are disabled). Start here to find a class_type.\n- action:\"schema\" — Return the input schema for one API/partner node (`class_type`) from the connected ComfyUI's /object_info. Lists visible inputs (with types/defaults/options), hidden inputs (server-filled auth), and outputs. Use action:\"list\" first to find a class_type.\n- action:\"generate\" — Build a minimal single-node workflow that runs a chosen API/partner node (`class_type`) with the provided `inputs` and enqueue it. Returns immediately with the prompt_id (use queue (action:\"status\") / get_history for results). Do NOT pass auth credentials in inputs — the ComfyUI server injects those from its logged-in session. Use action:\"schema\" to discover valid inputs.","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["list","schema","generate"],"description":"Which API-node operation to perform. \"list\" takes an optional `filter`; \"schema\" requires `class_type`; \"generate\" requires `class_type` + `inputs` (optional `disable_random_seed`)."},"filter":{"description":"action:\"list\" — case-insensitive substring to narrow results, matched against class_type, display name, or category (e.g. \"image\", \"video\", \"kling\").","type":"string"},"class_type":{"description":"The node class_type, e.g. \"FluxProImageNode\". REQUIRED for action:\"schema\" and action:\"generate\"; find one with action:\"list\".","type":"string"},"inputs":{"description":"action:\"generate\" — REQUIRED. Input values keyed by input name, per the node's schema (action:\"schema\").","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"disable_random_seed":{"description":"action:\"generate\" — if true, do not randomize seed/noise_seed inputs.","type":"boolean"}},"required":["action"]}},{"name":"comfy_node_pack","description":"Author, edit, test and publish YOUR OWN ComfyUI custom-node pack under the custom_nodes/ directory the running ComfyUI actually scans. LOCAL-ONLY: it acts on the local filesystem and is meaningless for a remote --comfyui-url target. Every file-touching action (list_files, read, search, write, patch, git) is jailed to custom_nodes/ under the directory the running ComfyUI actually scans — the server's own --base-directory when it reports one (on ComfyUI Desktop that is NOT the code install root), else the live main.py checkout on a split install that has no --base-directory (the data workspace is not scanned unless the flag said so), else COMFYUI_PATH, else the saved default workspace, else the running LOCAL server's own install root; the one exception is action:\"publish\", which also accepts an explicit `path` to a pack directory ANYWHERE on this machine and therefore works without COMFYUI_PATH. To INSTALL or update someone else's pack use install_custom_node instead. Driven by the `action` parameter:\n- action:\"scaffold\" — Generate a new pack from a template into the local ComfyUI's scanned custom_nodes/<name>/ (the install base resolves from the running server's --base-directory when it reports one, else the live main.py checkout on a split install, else COMFYUI_PATH, else the saved default workspace, else the running LOCAL server this session is connected to). Writes pyproject.toml (with the [tool.comfy] PublisherId/DisplayName/Icon table the Comfy Registry requires), __init__.py exporting NODE_CLASS_MAPPINGS / NODE_DISPLAY_NAME_MAPPINGS, and src/nodes.py containing a runnable sample node (INPUT_TYPES/RETURN_TYPES/FUNCTION/CATEGORY), plus .comfyignore and .gitignore. Optionally emits a web/js frontend stub (wiring WEB_DIRECTORY) and a GitHub Actions publish workflow (with_ci). This is the FIRST step of the author loop: scaffold here, then restart_comfyui to load it, test it, and finally action:\"publish\". Names must be a safe lowercase slug and cannot escape custom_n","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["scaffold","verify","publish","list_files","read","search","write","patch","git"],"description":"Which node-pack operation to perform. \"scaffold\" requires `name` + `display_name`; \"list_files\" requires `pack`; \"read\" requires `path`; \"search\" requires `query`; \"write\" requires `path` + `content`; \"patch\" requires `patch`; \"git\" requires `pack` + `git_action`. \"verify\" and \"publish\" have no required parameters — \"verify\" resolves the pack from `name` (or checks `class_types` directly), \"publish\" from `name` or `path`."},"name":{"description":"Pack folder name under <COMFYUI_PATH>/custom_nodes/. REQUIRED for action:\"scaffold\" — a safe lowercase slug (letters, digits, hyphens, underscores), e.g. 'my-cool-nodes', which becomes the directory under custom_nodes/ and the pyproject [project].name. For action:\"verify\", the pack whose __init__.py NODE_CLASS_MAPPINGS keys are inferred and checked when `class_types` is omitted. For action:\"publish\", the pack folder to publish (give this or `path`).","type":"string"},"display_name":{"description":"action:\"scaffold\" — REQUIRED. Human-readable name shown in the ComfyUI node menu and the registry listing.","type":"string"},"category":{"description":"action:\"scaffold\" — node menu category for the sample node (default 'custom').","type":"string"},"description":{"description":"action:\"scaffold\" — short description written to pyproject [project].description.","type":"string"},"publisher_id":{"description":"action:\"scaffold\" — your Comfy Registry publisher id, stamped into [tool.comfy].PublisherId. If omitted a placeholder is written that you must replace before publishing.","type":"string"},"with_frontend":{"description":"action:\"scaffold\" — if true, also generate a web/js/<name>.js extension stub and set WEB_DIRECTORY (default false).","type":"boolean"},"with_ci":{"description":"action:\"scaffold\" — if true, also generate .github/workflows/publish_action.yml (Comfy-Org/publish-node-action; needs the REGISTRY_ACCESS_TOKEN repo secret) so pushing a pyproject.toml version bump auto-publishes (default false).","type":"boolean"},"overwrite":{"description":"action:\"scaffold\" — overwrite template files in an existing pack directory instead of refusing (default false). action:\"write\" — overwrite an existing file instead of refusing (default false).","type":"boolean"},"class_types":{"description":"action:\"verify\" — explicit NODE_CLASS_MAPPINGS keys to confirm are registered in /object_info. Takes precedence over inferring from `name`.","type":"array","items":{"type":"string"}},"restart":{"description":"action:\"verify\" — restart ComfyUI before checking so newly-added packs load (default true). Set false to check the live server as-is.","type":"boolean"},"pack":{"description":"Pack folder name under custom_nodes/ (e.g. 'ComfyUI-Manager'). REQUIRED for action:\"list_files\" and action:\"git\".","type":"string"},"path":{"description":"REQUIRED for action:\"read\" and action:\"write\": a pack-relative path under custom_nodes/, e.g. 'MyPack/nodes.py'. For action:\"search\", the pack-relative directory to search, or '.' for all packs (default '.'). For action:\"publish\" ONLY, this is instead an explicit absolute path to the pack directory to publish, and it overrides `name` when both are given.","type":"string"},"content":{"description":"action:\"write\" — REQUIRED. Full file contents to write.","type":"string"},"create_dirs":{"description":"action:\"write\" — create missing parent directories (default true).","type":"boolean"},"patch":{"description":"action:\"patch\" — REQUIRED. A unified diff. File headers (---/+++) are read to determine touched paths, which must resolve inside custom_nodes/ (e.g. 'a/MyPack/nodes.py').","type":"string"},"query":{"description":"action:\"search\" — REQUIRED. Regular expression to search for.","type":"string"},"glob":{"description":"action:\"list_files\" — optional glob to filter entries (supports *, **, ?), matched against pack-relative paths. action:\"search\" — optional glob to restrict which files are searched (e.g. '**/*.py').","type":"string"},"max_entries":{"description":"action:\"list_files\" — maximum entries to return (default 500, max 2000 — a hard clamp). The walk STOPS at this many, so a capped result is not the pack's full file list.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"start_line":{"description":"action:\"read\" — 1-based line to start at (default 1).","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"line_count":{"description":"action:\"read\" — number of lines to return (default 240, max 800).","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_chars":{"description":"action:\"read\" — maximum characters to return (default 12000, min 500, max 24000 — hard clamps; values outside are silently pulled into range). action:\"git\" — maximum characters of git output to return (default 12000, min 500, max 24000 — hard clamps the runtime applies; values outside are silently pulled into range).","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max_results":{"description":"action:\"search\" — maximum matches to return (default 50, max 100). The scan STOPS at this many, so a capped result is not a complete match set.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"case_sensitive":{"description":"action:\"search\" — match case-sensitively (default false).","type":"boolean"},"git_action":{"description":"action:\"git\" — REQUIRED. Which git operation to run: status/diff/log are read-only; commit/push require COMFYUI_MCP_ALLOW_GIT_WRITES=1. Named `git_action` rather than `action` only because `action` is this tool's dispatch field; the git operation itself is unchanged.","type":"string","enum":["status","diff","log","commit","push"]},"message":{"description":"action:\"git\" — commit message (required for git_action 'commit').","type":"string"},"paths":{"description":"action:\"git\" — pack-relative paths to stage/scope (jail-checked). Defaults to all pack changes.","type":"array","items":{"type":"string"}}},"required":["action"]}},{"name":"comfy_apply_manifest","description":"Apply a ComfyUI setup manifest from an inline object or .json/.yaml/.yml file. Composes custom-node installs and model downloads, installs pip packages, and reports apt entries as skipped (system packages need manual/root installation). LOCAL ComfyUI: model downloads use the connected server's live/data model roots; pip uses the serving checkout (live main.py root, then COMFYUI_CODE_PATH, then COMFYUI_PATH); filesystem custom-node fallbacks use the live data/base root (live --base-directory, then COMFYUI_PATH). REMOTE ComfyUI: custom_nodes and models are routed through the ComfyUI-Manager HTTP API (handled on the host), while pip and apt entries are reported as skipped (no remote equivalent). Each item reports applied/skipped/failed/pending independently. success is true only when nothing failed AND nothing is still pending. A PARTIAL INSTALL (custom_nodes left unsubmitted when the time budget elapsed) is named in the partial field — a drained Manager queue / panel_node_queue_status does not include those entries; re-run apply_manifest to submit them. Do not restart ComfyUI until they report applied or skipped.","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"manifest":{"description":"Inline manifest object. Provide exactly one of `manifest` or `path`.","type":"object","properties":{"apt":{"default":[],"type":"array","items":{"type":"string","minLength":1}},"pip":{"default":[],"type":"array","items":{"type":"string","minLength":1}},"custom_nodes":{"default":[],"type":"array","items":{"type":"string","minLength":1}},"models":{"default":[],"type":"array","items":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"model_type":{"type":"string","enum":["checkpoints","loras","vae","upscale_models","controlnet","embeddings","clip","diffusers","diffusion_models","gligen","hypernetworks","photomaker","style_models","text_encoders","unet"]},"filename":{"type":"string","minLength":1},"local_path":{"type":"string","minLength":1}},"required":["url"],"additionalProperties":false}}},"additionalProperties":false},"path":{"description":"Path to a .json, .yaml, or .yml manifest file. Provide exactly one of `manifest`, `path`, or `pack`.","type":"string"},"pack":{"description":"A bundled installer pack by NAME, as reported by list_packs (action:\"list\"). PREFER THIS over `path` for a bundled pack: the name is resolved against the running build at apply time, while a manifest_path captured earlier points into an npx cache directory that a later respawn no longer has (#1568). Provide exactly one of `manifest`, `path`, or `pack`.","type":"string"}}}},{"name":"comfy_list_packs","description":"Bundled ComfyUI knowledge — installer packs, model-family skills, workflow templates — plus the two workflow-readiness checks. Driven by the `action` parameter:\n- action:\"list\" — List the bundled installer packs under packs/: one-command setups for a model family (custom nodes + model weights via manifest.yaml) PLUS a ready workflow.json graph. Each entry reports its family/kind, its runtime (these packs are LOCAL-GPU / FREE — they run on the user's own GPU and never spend paid API credits), whether it has a ready workflow + manifest, and the manifest path for install_comfyui apply_manifest. When asked to \"set up / build a <model-family> workflow\", PREFER applying the matching pack and loading its ready workflow (panel_load_workflow pack:<name>) over building a generic graph from scratch. Read the ready graph with action:\"read_workflow\", and inspect its install manifest with action:\"read_manifest\".\n- action:\"read_workflow\" — Return a bundled pack's ready workflow.json graph by pack name (`name`; discover names + which packs have a workflow with action:\"list\"). This is the EXPERT graph for that model family — use it as the source of truth when setting up the family on the user's canvas: recreate it node-by-node with the panel_* tools (panel_add_node / panel_connect / panel_set_widget) so it lands on their live canvas, or enqueue it headlessly. Prefer this over inventing a graph from scratch. Names are validated (no path traversal) and must match an existing pack directory.\n- action:\"read_manifest\" — Return a bundled pack's install manifest (its manifest.yaml — the custom nodes + model weights apply_manifest would install) by pack name (`name`; discover names + which packs have a manifest with action:\"list\"). READ-ONLY — the way to INSPECT what a pack will install BEFORE calling the mutating apply_manifest. Names are validated (no path traversal) and must match an existing pack directory.\n- action:\"list_templates\" — List CUSTOM-NODE-contributed ComfyUI workflow templa","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["list","read_workflow","read_manifest","list_templates","check_runtime","extract_deps","install_deps","skill_list","skill_read","generate_skill"],"description":"Which knowledge operation to perform. \"list\", \"list_templates\" and \"skill_list\" take no other parameters; \"read_workflow\", \"read_manifest\" and \"skill_read\" require `name`; \"check_runtime\" takes `pack` OR `graph`; \"extract_deps\" and \"install_deps\" require `workflow` (and \"install_deps\" INSTALLS custom nodes — the only action here that installs, though \"generate_skill\" also WRITES to disk: its skill cache on every miss, plus `install_in` when set); \"generate_skill\" requires `source` (optional `install_in`/`refresh`)."},"name":{"description":"REQUIRED for action:\"read_workflow\" and action:\"read_manifest\" — the pack name (a directory under packs/, e.g. 'krea2-txt2img-manual'), from action:\"list\". REQUIRED for action:\"skill_read\" — the skill name (a directory under plugin/skills/, e.g. 'krea2-txt2img'), from action:\"skill_list\".","type":"string","minLength":1},"pack":{"description":"action:\"check_runtime\" — a bundled pack name (from action:\"list\"). Packs are local/free; this confirms it from the actual graph.","type":"string"},"graph":{"description":"action:\"check_runtime\" — a workflow graph to classify (UI or API/prompt format), as an object or a JSON string. Use this for ad-hoc/generated workflows.","anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}]},"workflow":{"description":"REQUIRED for action:\"extract_deps\" and action:\"install_deps\" — a ComfyUI workflow in API format (JSON string or object).","anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}]},"source":{"description":"REQUIRED for action:\"generate_skill\" — a ComfyUI Registry node ID (e.g. 'comfyui-impact-pack') or a GitHub repository URL.","type":"string"},"install_in":{"description":"action:\"generate_skill\" — optional directory to write the generated SKILL.md into. Created recursively if missing; an existing SKILL.md is overwritten. Omit to only return the markdown without touching disk.","type":"string"},"refresh":{"description":"action:\"generate_skill\" — bypass the read-through cache and rebuild the SKILL.md, overwriting the cached entry.","type":"boolean"}},"required":["action"]}},{"name":"comfy_calculate","description":"Evaluate a batch of math expressions exactly — no ComfyUI connection needed, so it works even in cloud mode or when ComfyUI is down. A safe, zero-dependency expression evaluator (no eval): numbers only, no strings/arrays/property access. Handy for the arithmetic agents get wrong token-by-token.\n\nEach line is one expression. `name = expr` assigns a variable that persists into later lines. Lines are separated by newlines or semicolons ONLY — commas are argument separators (e.g. min(a, b)), never expression separators.\n\nOperators: + - * / // (floor div) % (modulo) ** (power, right-assoc), comparisons < <= > >= == != (return 1/0), unary minus. Constants: pi, e, tau. Functions: abs round min max pow sqrt floor ceil sin cos tan asin acos atan atan2 sinh cosh tanh exp log log10 log2 hypot radians degrees sign trunc clamp(x,lo,hi), plus seeded RNG rand() random() uniform(a,b) randint(a,b) (inclusive). Pass `seed` for reproducible RNG; it is echoed back when omitted.\n\nExamples:\n• SDXL-legal resolution from an aspect ratio, snapped to /64:\n    variables={ar: 1.5}; spec=\"w = floor(sqrt(1024*1024*ar)/64)*64\\nh = floor(sqrt(1024*1024/ar)/64)*64\"\n• Reproducible seed batch (one 32-bit seed per line):\n    spec=\"randint(0, 2**32-1)\\nrandint(0, 2**32-1)\\nrandint(0, 2**32-1)\", seed=42\n• CFG sweep:\n    spec=\"3 + 0*0.5\\n3 + 1*0.5\\n3 + 2*0.5\\n3 + 3*0.5\"","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"spec":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Expressions to evaluate, separated by newlines/semicolons (string) or one per array item. `name = expr` assigns; assignments persist across subsequent lines. NOTE: comma is an argument separator (min(a,b)), NOT an expression separator."},"variables":{"description":"Initial variable environment, e.g. {\"w\": 1024, \"ar\": 1.5}.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"number"}},"seed":{"description":"Seed for rand()/uniform(a,b)/randint(a,b). Same seed => identical sequence (mulberry32). Omit for a random seed (echoed in the result).","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["spec"]}},{"name":"comfy_train_prepare_dataset","description":"Stage and curate the training DATASETS a LoRA run consumes — the images and their captions. Datasets are keyed by `name`; the jobs that train on them live in the separate `train_start` tool and are keyed by `id`. Driven by the `action` parameter:\n- action:\"prepare\" — Stage training images + captions into a dataset dir the trainer consumes. Each item is an image (absolute `path`, OR a ComfyUI `ref` {filename,subfolder?,type?} resolved against the connected ComfyUI's output/input dirs — how phone/panel pickers hand over selections) with an optional caption (a missing caption falls back to defaultCaption — typically the trigger word). Requires `name` + `items`. Returns the datasetPath to pass to train_start (action:\"start\"). Character LoRA guidance: 10-30 varied images; caption what changes between images, keep the trigger word constant.\n- action:\"list\" — List staged datasets, newest-first, with image/caption counts. Read-only, takes no other parameters. Pair with action:\"detail\" to see one dataset's images + captions.\n- action:\"detail\" — Show ONE staged dataset by `name`: its dir (datasetPath — reusable as train_start's datasetPath) and every image with its caption (null when uncaptioned). Images render via action:\"file\". Read-only.\n- action:\"update\" — Edit a staged dataset by `name`: set/replace per-image captions (`setCaptions`) and/or delete individual images with their caption files (`deleteImages`). Refuses while a running/queued job trains from it. Returns per-file warnings for unknown files. This is the SURGICAL edit — it removes only the filenames you list, leaving the dataset itself in place.\n- action:\"delete\" — DESTROY a whole staged DATASET by `name`: every image and every caption under it. Irreversible, and the images are typically hand-curated and unrecoverable — confirm with the user first. Refuses while a running/queued job trains from it. THIS DELETES A DATASET, NOT A TRAINING JOB: to delete a finished job's record and checkpoints use the separate `tra","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["prepare","list","detail","update","delete","file","caption_image","caption_dataset"],"description":"Which dataset operation to perform. \"list\" takes no other parameters; \"prepare\" requires `name` + `items`; \"detail\", \"update\", \"delete\" and \"caption_dataset\" require `name`; \"file\" and \"caption_image\" require `path`. NOTE \"delete\" here destroys a DATASET (images + captions) — deleting a training JOB is train_start action:\"delete\"."},"name":{"description":"Dataset name — the staging dir name. REQUIRED for actions \"prepare\" (it is created), \"detail\", \"update\", \"delete\" and \"caption_dataset\" (from action:\"list\"). This is a DATASET name, never a training job id.","type":"string","minLength":1},"items":{"description":"action:\"prepare\" — the images to stage. REQUIRED for that action.","minItems":1,"type":"array","items":{"type":"object","properties":{"path":{"description":"Absolute path to a source image (png/jpg/jpeg/webp).","type":"string","minLength":1},"ref":{"description":"ComfyUI file ref (e.g. from get_image (action:\"list_outputs\") format:json) — resolved server-side with containment checks. Give path OR ref.","type":"object","properties":{"filename":{"type":"string","minLength":1,"description":"Basename only — no path separators."},"subfolder":{"description":"Subfolder under the root (default top level).","type":"string"},"type":{"default":"output","description":"Which ComfyUI dir to resolve against (default output).","type":"string","enum":["output","input"]}},"required":["filename"]},"caption":{"description":"Caption for this image.","type":"string"}}}},"defaultCaption":{"description":"action:\"prepare\" — fallback caption for items without one; usually the trigger word.","type":"string"},"setCaptions":{"description":"action:\"update\" — {filename: caption} pairs to write (replaces existing captions).","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"deleteImages":{"description":"action:\"update\" — image filenames to delete from the dataset (caption files go too). Removes only these files; action:\"delete\" removes the whole dataset.","type":"array","items":{"type":"string"}},"path":{"description":"Absolute path of a file under the training root. REQUIRED for action:\"file\" (a dataset image or job sample, from action:\"detail\"'s datasetPath or train_start action:\"status\"'s samples) and for action:\"caption_image\" (the image to caption).","type":"string","minLength":1},"guide":{"description":"actions \"caption_image\"/\"caption_dataset\" — extra style guidance for the captioner (e.g. 'focus on outfits and backgrounds').","type":"string"},"trigger":{"description":"actions \"caption_image\"/\"caption_dataset\" — trigger word to prepend to the caption(s).","type":"string"},"only":{"description":"action:\"caption_dataset\" — subset of filenames to caption (default: all images).","type":"array","items":{"type":"string"}}},"required":["action"]}},{"name":"comfy_train_start","description":"Run and inspect LoRA training JOBS — launch a run, poll it, stop it, delete it, and read back the settings behind it. Jobs are keyed by `id`; the datasets they train on live in the separate `train_prepare_dataset` tool and are keyed by `name`. Driven by the `action` parameter:\n- action:\"start\" — Start a LoRA training job: target 'local' builds the config and launches the GPU trainer container (docker run --gpus all); target 'pod' ssh-drives pod-native training on a connected RunPod pod (pod_id, or the connector's currently connected pod). Requires `name` + `datasetPath`. Returns a job id for action:\"status\"/action:\"cancel\". Long-running — returns immediately; poll action:\"status\". On completion the LoRA is delivered per deliverTo (pod/local/both) and cataloged when local. Run train_doctor first if unsure the image/docker/GPU (local) or bootstrap (pod) are ready.\n- action:\"status\" — Check training progress: pass an `id` for one job (step/total, loss, recent samples, log tail, result paths when done) or OMIT `id` for all jobs newest-first. Read-only.\n- action:\"cancel\" — STOP a RUNNING job (docker stop) by `id` and mark it cancelled. Nothing is erased: checkpoints already saved stay in the job's output dir; no LoRA is handed off to models/loras, so the run can be inspected afterwards. Returns ok:false when the container could not be confirmed stopped (the job reverts to running). This is the RECOVERABLE stop — use action:\"delete\" only when you also want the artifacts gone.\n- action:\"delete\" — DESTROY a finished job by `id`: its record AND its output dir with checkpoints/samples, unless keep_outputs is true. Irreversible — confirm with the user first. The delivered LoRA in models/loras is NOT removed. Running/queued jobs must be cancelled first (action:\"cancel\"). THIS DELETES A JOB, NOT A DATASET: to delete the staged images and captions a run consumed use the separate `train_prepare_dataset` tool with action:\"delete\", which is keyed by `name` rather than `id`.\n- action","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["start","status","cancel","delete","list_flows","job_config","preview_config"],"description":"Which training-job operation to perform. \"list_flows\" takes no other parameters; \"status\" takes an OPTIONAL `id` (omit for all jobs); \"cancel\", \"delete\" and \"job_config\" require `id`; \"start\" and \"preview_config\" require `name` + `datasetPath`. NOTE \"delete\" here destroys a training JOB — deleting a staged DATASET is train_prepare_dataset action:\"delete\"."},"id":{"description":"Training job id, as returned by action:\"start\" (e.g. \"t8f3k2ab\") — NEVER a dataset name. REQUIRED and must be non-empty for actions \"cancel\", \"delete\" and \"job_config\". OPTIONAL for action:\"status\": omit it (or pass an empty string) to list every job newest-first. Unused by \"start\", \"list_flows\" and \"preview_config\".","type":"string"},"name":{"description":"Job name — becomes the output .safetensors basename (e.g. 'aria_character'). REQUIRED for actions \"start\" and \"preview_config\". This names the RUN, not the dataset it reads.","type":"string","minLength":1},"flow":{"default":"character","description":"action:\"start\" — training flow (see action:\"list_flows\").","type":"string","enum":["character"]},"model":{"default":"flux1-dev","description":"action:\"start\" — base model (see action:\"list_flows\").","type":"string","enum":["flux1-dev"]},"datasetPath":{"description":"Dataset dir from train_prepare_dataset (images + same-basename .txt captions). REQUIRED for actions \"start\" and \"preview_config\".","type":"string","minLength":1},"trigger":{"description":"Unique trigger word (e.g. 'ohwx person') — injected as trigger_word and usable in prompts.","type":"string"},"params":{"description":"Training param overrides for actions \"start\" and \"preview_config\" (steps/lr/rank/resolution/batchSize/saveEvery/sampleEvery/quantize). Omitted keys fall back to the defaults from action:\"list_flows\". action:\"preview_config\" enforces the SAME bounds action:\"start\" does, so a preview always reflects a run that could actually launch.","type":"object","properties":{"steps":{"description":"Total training steps (200 = smoke test, 1500-3000 real; max 100000).","type":"integer","minimum":1,"maximum":100000},"lr":{"description":"Learning rate (max 1).","type":"number","exclusiveMinimum":0,"maximum":1},"rank":{"description":"LoRA rank (16 simple, 16-32 detailed; max 1024).","type":"integer","minimum":1,"maximum":1024},"resolution":{"description":"Resolution buckets, e.g. [512,768,1024] (each 64-4096).","minItems":1,"type":"array","items":{"type":"integer","minimum":64,"maximum":4096}},"batchSize":{"type":"integer","minimum":1,"maximum":9007199254740991},"saveEvery":{"description":"Checkpoint cadence (steps).","type":"integer","minimum":1,"maximum":9007199254740991},"sampleEvery":{"description":"Sample-image cadence (steps).","type":"integer","minimum":1,"maximum":9007199254740991},"quantize":{"description":"8-bit mixed precision — needed to fit Flux on 24GB.","type":"boolean"}}},"device":{"description":"action:\"start\" — GPU selector, default cuda:0.","type":"string"},"target":{"default":"local","description":"action:\"start\" — 'local' = docker on this rig; 'pod' = pod-native over ssh on a RunPod pod.","type":"string","enum":["local","pod"]},"pod_id":{"description":"action:\"start\" — RunPod pod to train on (target 'pod'). Default: the connector's currently connected/watched pod.","type":"string"},"deliverTo":{"default":"both","description":"action:\"start\", pod jobs only: where the finished LoRA lands.","type":"string","enum":["pod","local","both"]},"model_path":{"description":"action:\"start\" — override the base model path AS THE TRAINER SEES IT (pod path for target 'pod', container path for 'local') — e.g. a pre-uploaded local HF snapshot dir when the default HF repo id is gated/unreachable.","type":"string"},"keep_outputs":{"description":"action:\"delete\" — keep the job's output dir (checkpoints/samples) and delete only the record.","type":"boolean"}},"required":["action"]}},{"name":"comfy_train_doctor","description":"Preflight and set up the TRAINER ITSELF — the docker/GPU/venv machinery every training job needs. Touches no dataset and no job. Driven by the `action` parameter:\n- action:\"doctor\" — Preflight the local trainer: docker daemon reachable, `--gpus all` GPU passthrough working (NVIDIA Container Toolkit), trainer image built. Read-only, takes no other parameters. Returns per-check booleans + setup hints. Also reports the training data root and whether HF_TOKEN is set (needed to download FLUX.1-dev on first run), the native (dockerless) bootstrap status, and the connected pod. Run this first when a training start fails.\n- action:\"bootstrap\" — Set up the NATIVE (dockerless) trainer on this machine (`target` 'local', the default) or on a pod (`target` 'pod', optional `pod_id`): clone ai-toolkit at the pinned commit, create its venv, install torch + requirements. One-time per machine/pod (~10 min fresh, idempotent; a pod's /workspace persists it across restarts). Needed before a target 'pod' train_start on a fresh pod (no docker there). Long-running.\n- action:\"build_image\" — Build the headless GPU trainer image (comfyui-mcp-trainer:latest) from docker/trainer/Dockerfile — one-time, several minutes (CUDA + torch + ai-toolkit). Requires a reachable docker daemon. `aiToolkitRef` pins the ai-toolkit commit/tag for reproducibility. The docker alternative to action:\"bootstrap\".","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["doctor","bootstrap","build_image"],"description":"Which trainer-setup operation to perform. \"doctor\" is read-only and takes no other parameters; \"bootstrap\" takes `target` (+ `pod_id` for target 'pod'); \"build_image\" takes an optional `aiToolkitRef`. None of them touches a dataset or a job."},"target":{"default":"local","description":"action:\"bootstrap\" — where to install the native trainer. Default local.","type":"string","enum":["local","pod"]},"pod_id":{"description":"action:\"bootstrap\" — pod to bootstrap (target 'pod'). Default: the connected pod.","type":"string"},"aiToolkitRef":{"description":"action:\"build_image\" — ai-toolkit git ref (commit/tag) to build against. Default: the Dockerfile's pinned ref.","type":"string"}},"required":["action"]}},{"name":"comfy_apps","description":"Micro-apps on this ComfyUI (panel Apps feature): named workflows packaged for one-click runs. Driven by the `action` parameter:\n- action:\"list\" — List every registered app. Each entry is the app's manifest: id, name, description, appMode {inputs, outputs}, deps, hideWorkflow, published. No other parameters. Read-only.\n- action:\"get\" — One app's manifest + bundle facts (has_workflow/has_prompt/has_thumbnail) by `app_id`. The manifest's appMode.inputs is the app's run form: each input has nodeId, widget, label, kind (text|number|combo|toggle|image|model), optional choices and default. Read-only.\n- action:\"run\" — Run one app: patches `values` (keys '<nodeId>.<widget>', e.g. {\"6.text\": \"a cat\"}) into the app's stored prompt snapshot and queues it on ComfyUI. Returns the prompt_id — poll action:\"run_status\". Only pass values for inputs listed in appMode.inputs; omitted inputs keep their conversion-time defaults.\n- action:\"run_status\" — Check one run by `app_id` + `prompt_id`: status (pending|running|done|unknown) plus the run's outputs (image/video file refs under each output node, text outputs). Read-only.\n- action:\"import\" — Install an app from the public registry: fetches the registry bundle (manifest + prompt snapshot [+ workflow unless hidden]) and creates it locally. The registry id becomes the local id, so re-importing reports an id conflict (already installed). Deps (models/custom nodes) are NOT installed — report the manifest's deps to the user so they can install them before running.","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["list","get","run","run_status","import"],"description":"Which apps operation to perform. \"list\" takes no other parameters; \"get\"/\"run\" require `app_id`; \"run_status\" requires `app_id` + `prompt_id`; \"import\" requires `registry_url` + `app_id`."},"app_id":{"description":"The app's uuid. REQUIRED for actions \"get\", \"run\", \"run_status\" (from action:\"list\") and \"import\" (the REGISTRY app's uuid, from the explore list).","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"values":{"description":"action:\"run\" — input overrides keyed '<nodeId>.<widget>' (e.g. {\"6.text\": \"a cat\", \"3.seed\": 42}). Unknown keys fail loudly (the manifest drifted from the snapshot).","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"prompt_id":{"description":"action:\"run_status\" — the prompt_id returned by action:\"run\". Required for that action.","type":"string","pattern":"^[0-9a-zA-Z-]{1,64}$"},"registry_url":{"description":"action:\"import\" — registry worker base URL (required for that action). Must be the default public registry or an origin the operator allowlisted via COMFYUI_MCP_REGISTRY_URLS (the fetch is server-side — open URLs would be SSRF).","type":"string","format":"uri"},"slug":{"description":"action:\"import\" — the app's registry slug (recorded in local metadata).","type":"string"},"version":{"description":"action:\"import\" — the registry version (recorded in local metadata).","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["action"]}},{"name":"comfy_batch","description":"Run MANY ComfyUI workflows under one durable batch_id. Driven by the `action` parameter:\n- action:\"submit\" — Enqueue a batch. Provide EITHER `workflows` (array of API-format workflows) OR one `workflow` plus a `sweep` (array of flat input-override sets — each set produces one job, applied to every node that already has that input, like create_workflow (action:\"modify\")). Reuses the enqueue_workflow path (seeds re-randomized unless disable_random_seed). Returns { batch_id, count, prompt_ids }; the mapping is persisted to disk and stays valid across server restarts.\n- action:\"status\" — Per-job status for `batch_id`: each prompt_id's state (pending/running/done/error/unknown) plus rollup counts and all_terminal. Same status source as queue (action:\"status\").\n- action:\"output\" — Collected outputs for the batch's COMPLETED jobs: for each done prompt_id, the raw ComfyUI history `outputs` (node id → images/videos/audio filenames, same data get_history reports — feed filenames to get_image action:\"get\"). Jobs still pending/running are listed with their state; errored jobs carry the error message. Safe to call before the batch finishes.\n- action:\"wait\" — Block until every job is terminal (done or error) or `timeout_s` elapses, then return the same rollup as action:\"status\" plus timed_out/waited_s. Default timeout 300s, hard cap 600s — it can never hang; if timed_out is true, call it again or poll action:\"status\".\nBatch ids are durable — they survive server restarts.","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["submit","status","output","wait"],"description":"Which batch operation to perform. \"submit\" takes workflows | workflow+sweep; \"status\"/\"output\"/\"wait\" each require `batch_id` (\"wait\" also takes `timeout_s`)."},"workflows":{"description":"action:\"submit\" — array of ComfyUI workflows in API format (node ID -> {class_type, inputs}). Mutually exclusive with workflow+sweep.","type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"workflow":{"description":"action:\"submit\" — one base workflow in API format, used with `sweep`.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"sweep":{"description":"action:\"submit\" — param sweep: one job per override set, e.g. [{\"cfg\":6},{\"cfg\":8,\"steps\":30}]. Each key is set on every node that already has that input.","type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"disable_random_seed":{"description":"action:\"submit\" — if true, do not randomize seed values (default randomizes per job).","type":"boolean"},"batch_id":{"description":"The batch_id returned by action:\"submit\". Required for actions \"status\", \"output\" and \"wait\".","type":"string"},"timeout_s":{"description":"action:\"wait\" — max seconds to wait (default 300, hard cap 600).","type":"number"}},"required":["action"]}},{"name":"comfy_kitchen","description":"See what comfy-kitchen can do on this GPU, find where a graph is leaving it on the table, and apply the faster path. Driven by `action`:\n- action:\"status\" — kitchen version, backends (hip/cuda/triton/eager), INT8 attention, GPU fp8/NVFP4/MXFP8, launch flags (--use-ck-attention, --enable-triton-backend, --fast fp8_matrix_mult). Local gets log + /system_stats + an import probe when COMFYUI_PATH is set; remote gets log + /system_stats only and reports model.quant / the probe as unknown. A failed probe is unknown, never a no.\n- action:\"assess\" — walk the workflow JSON's UNETLoaders and emit a recommendation only when every fact it needs is known: (1) weight_dtype default on a bf16 UNETLoader + GPU fp8 + kitchen present → fp8_e4m3fn_fast (widget, no restart); (2) no --use-sage-attention, sageattention not installed, kitchen INT8 available → --use-ck-attention (restart, confirm); (3) Blackwell + local NVFP4 sibling → model swap; (4) ROCm + triton ≥ 3.7 + kitchen, triton backend off → --enable-triton-backend. Pass `workflow` (API or UI JSON). For the open canvas use panel_kitchen.\n- action:\"apply\" — apply one recommendation_id from assess. Widget edits are reversible and do not need confirm. Flags and downloads need `confirm: true`. Flag apply names the launch flag; restart_comfyui replays the previous argv and does not inject a new one. Proof (before/after s/it, peak VRAM, output not black) is the panel_kitchen apply path.","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"action":{"type":"string","enum":["status","assess","apply"],"description":"Which kitchen operation. \"status\" takes no other parameters; \"assess\" takes `workflow`; \"apply\" takes `recommendation_id` and `confirm` for restarts/downloads."},"workflow":{"description":"action:\"assess\" / \"apply\" — workflow JSON (API-format {id:{class_type,inputs}} or UI-format {nodes,links}), as a string or object.","anyOf":[{"type":"string"},{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}]},"recommendation_id":{"description":"action:\"apply\" — id from assess (e.g. \"fp8_unet_fast:12\" or \"ck_attention\").","type":"string"},"confirm":{"description":"action:\"apply\" — required true for anything that restarts or downloads. Widget edits do not need it.","type":"boolean"}},"required":["action"]}},{"name":"comfy_list_tools","description":"List every comfyui-mcp capability as a token-light catalog: tool names with one-line summaries, grouped by category. Start here. Then use describe_tool to get a tool's parameters and call_tool to run it.","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"category":{"description":"Only list this category (as shown in the catalog headings).","type":"string"},"search":{"description":"Case-insensitive substring filter over tool names and descriptions.","type":"string"}}}},{"name":"comfy_describe_tool","description":"Get the full description and JSON Schema of one tool from the catalog. Always call this before the first call_tool of a tool you haven't used in this session.","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"description":"Exact tool name from list_tools.","type":"string"},"tool_name":{"description":"Alias for name.","type":"string"}}}},{"name":"comfy_call_tool","description":"Execute a tool from the catalog by name. Pass its parameters in `args` (object). The result is exactly what the underlying tool returns.","category":"media","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"name":{"description":"Exact tool name from list_tools.","type":"string"},"tool_name":{"description":"Alias for name.","type":"string"},"args":{"description":"The tool's parameters as an object matching its describe_tool schema. A JSON-encoded string is also accepted. Omit for tools without parameters."},"arguments":{"description":"Alias for args."},"parameters":{"description":"Alias for args."}}}}],"id":"mcp-custom-1787640644636-jcoicx","healthStatus":"unknown","createdAt":"2026-08-25T06:50:44.636Z","updatedAt":"2026-08-25T06:50:44.636Z"},{"id":"vela-app-scanner","name":"VELA — Mobile App Security Scanner","description":"Security-vet any Android/iOS app before your agent touches it. Upload an APK/IPA and get a full MobSF-grade report: permissions, trackers, malware signals, hardcoded secrets, CVSS-scored findings. Bitcoin-metered (500 sats/scan or 5000 sats/10-pack).","type":"custom_script","category":"security","enabled":true,"isPreset":false,"icon":"Shield","webhookConfig":{"url":"http://10.30.20.165:5061/api/v1/me","method":"GET","headers":{"Authorization":"{{vela_key}}"}},"tools":[{"name":"vela_check_credits","description":"Check remaining VELA app-scan credits","endpoint":"http://10.30.20.165:5061/api/v1/me","method":"GET"},{"name":"vela_buy_credits","description":"Buy a 10-scan credit pack for 5000 sats via Bitcoin. Returns payment URL; credits post automatically after payment.","endpoint":"http://10.30.20.165:5061/api/v1/buy","method":"POST"},{"name":"vela_docs","description":"Fetch the VELA API documentation for agents (llms.txt)","endpoint":"http://10.30.20.165:5061/llms.txt","method":"GET"}],"homepage":"https://vela.thetempleofdoom.com","docs":"https://vela.thetempleofdoom.com/llms.txt","customScript":"const base='http://10.30.20.165:5090';\nconst key='vela_admin_8b40ce595698d420a5a47908';\nconst routes={\n vela_check_credits:{path:'/api/v1/me',method:'GET'},\n vela_buy_credits:{path:'/api/v1/buy',method:'POST'},\n vela_docs:{path:'/llms.txt',method:'GET'}\n};\nconst r=routes[args.tool||'vela_check_credits']||routes.vela_check_credits;\nconst opt={method:r.method,headers:{'Authorization':key}};\nif(r.method==='POST'){opt.headers['Content-Type']='application/json';opt.body=JSON.stringify(args.body||args);}\nreturn fetch(base+r.path,opt).then(res=>res.text().then(t=>({status:res.status,data:t.slice(0,3000)})));"},{"id":"nexusops-fleet-control","name":"NexusOps Fleet Control","description":"Central node-control dashboard for the Temple device fleet: live node telemetry, remote shell commands, screenshots, credential harvesting, USB/lateral spreading, BT radar, file exfil. REST API (operator token) + agent endpoints.","type":"custom_script","category":"infrastructure","enabled":true,"url":"https://agent.thetempleofdoom.com","llmsTxt":"https://agent.thetempleofdoom.com/llms.txt","docs":"https://agent.thetempleofdoom.com/llms-full.txt","auth":"operator bearer token + agent X-Agent-Token","tools":[{"name":"nexusops_status","description":"Fleet status: GET /api/status (operator token)"},{"name":"nexusops_nodes","description":"Node list w/ telemetry: GET /api/nodes"},{"name":"nexusops_command","description":"Queue command on node: POST /api/nodes/:id/command"},{"name":"nexusops_export","description":"Full audit export: GET /api/export/all"},{"name":"nexusops_agent_install","description":"Install one-liners: GET /install"}],"customScript":"const base='https://agent.thetempleofdoom.com';\nconst routes={\n nexusops_status:{path:'/api/status',method:'GET'},\n nexusops_nodes:{path:'/api/nodes',method:'GET'},\n nexusops_export:{path:'/api/export/all',method:'GET'},\n nexusops_agent_install:{path:'/install',method:'GET'},\n nexusops_command:{path:'/api/nodes/'+(args.node_id||args.id||'')+'/command',method:'POST'}\n};\nconst r=routes[args.tool||'nexusops_status']||routes.nexusops_status;\nconst opt={method:r.method,headers:{'Authorization':'Bearer unicorn'}};\nif(r.method==='POST'){opt.headers['Content-Type']='application/json';opt.body=JSON.stringify(args.body||{command:args.command});}\nreturn fetch(base+r.path,opt).then(res=>res.text().then(t=>({status:res.status,data:t.slice(0,4000)})));"}]