원클릭으로
eney-debug
Build an Eney MCP skill, deploy it locally, launch it in the Eney app via deeplink, and iterate on issues with the user.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Build an Eney MCP skill, deploy it locally, launch it in the Eney app via deeplink, and iterate on issues with the user.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Create a new Eney MCP skill using the CLI scaffolding tool, then implement widget components with Eney UIX.
Reference documentation for Eney UIX widgets and UI generation. Covers Form, Paper, Actions, and all components for building native macOS UIs in MCP extensions.
Set up SSH key commit signing for Git and GitHub so all commits (including those made via Claude Code) are cryptographically verified.
Add and run tests for an Eney MCP skill using the UIX test session API and node:test.
| name | eney-debug |
| description | Build an Eney MCP skill, deploy it locally, launch it in the Eney app via deeplink, and iterate on issues with the user. |
| metadata | {"author":"macpaw","version":"2.0"} |
Build MCP extensions, deploy locally, launch in Eney, and iterate based on user feedback.
Determine which MCP to debug — ask the user or infer from the current directory. Read its manifest:
cat extensions/<mcp-name>/manifest.json
cd extensions/<mcp-name> && npm run build
Fix any TypeScript errors before proceeding.
The CLI dev command watches for changes, compiles with tsc, and deploys to the Eney MCP folder:
cd extensions/<mcp-name> && eney-skills-cli dev
This does three things on every build:
Compiles TypeScript and deploys the output (compiled JS, manifest.json, node_modules) to:
~/Library/Application Support/com.macpaw.assistant-macos.client-setapp/MCP/<mcp-name>/
Extracts tools from the MCP server via the MCP protocol
Generates tool definition JSONs in ~/.eney/tools/<widget-name>.json so Eney discovers the tools locally without needing backend publishing
It watches for file changes and rebuilds automatically (ignores node_modules/, dist/, and package-lock.json).
For a one-time build without watching:
cd extensions/<mcp-name> && npm run build
Open the widget directly in Eney using a deeplink:
open "eney://run?manifestID=eney_core&commandID=<tool_id>"
Where <tool_id> is the snake_case id from the generated ~/.eney/tools/<tool-name>.json (e.g., new_password, append_to_note). This is the widget name with hyphens replaced by underscores.
After launching, ask the user:
After each code change, the dev watcher auto-rebuilds and redeploys. Re-launch with the deeplink to test:
open "eney://run?manifestID=eney_core&commandID=<tool_id>"
Repeat until the user is satisfied.
If the tool doesn't load, verify it was deployed correctly:
ls -la "$HOME/Library/Application Support/com.macpaw.assistant-macos.client-setapp/MCP/<mcp-name>/"
Expected contents: index.js, components/, manifest.json, node_modules/
Also check that tool definitions were generated:
ls -la ~/.eney/tools/
Expected: one <widget-name>.json file per tool in the MCP.
Check the server can start:
cd extensions/<mcp-name> && npm start
It should print a "running on stdio" message to stderr.
| Problem | Cause | Fix |
|---|---|---|
| Build fails | TypeScript errors | Run npm run build and fix errors |
Property 'onChange' is missing | onChange is required on all form fields | Add onChange={setter} even for display-only fields |
Type 'number' is not assignable to 'number | null' | NumberField value is nullable | Use useState<number | null>(defaultValue) |
| Server won't start | Missing dependencies | Run npm install then rebuild |
| Widget not rendering | Using HTML elements instead of Eney widgets | Use only Form, Paper, ActionPanel, etc. from @macpaw/eney-api |
| Props not received from LLM | Missing .describe() on Zod schema fields | Add .describe("...") to every field |
| defineWidget error | Missing required fields | Ensure { name, description, schema, component } are all provided |
| Widget not registered | Missing uixServer.registerWidget() in index.ts | Import and register the widget |
| Import paths wrong | Missing .js extension in imports | Use .js extensions for local imports (e.g., ./components/widget.js) |
| Deeplink doesn't open tool | Wrong commandID | Use the widget name from defineWidget(), not the manifest name |
| Tool not visible in Eney | Missing tool JSON in ~/.eney/tools/ | Run dev — it generates tool definitions automatically |
manifest.json has manifest_version: "0.3" and correct name/versionindex.ts creates McpServer and registers all widgets via uixServer.registerWidget()defineWidget({ name, description, schema, component }).describe() on every field.js extension (TypeScript ESM requirement)npm run build passesdev deploys to the Eney MCP folder~/.eney/tools/