{"_id":"@aromo/mcp","name":"@aromo/mcp","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.1":{"name":"@aromo/mcp","version":"0.1.1","description":"Model Context Protocol server for Aromo — exposes the Aromo headless API to Claude Desktop and other MCP clients","license":"MIT","type":"module","keywords":["aromo","mcp","model-context-protocol","restaurant","claude","ai-agent"],"homepage":"https://docs.aromo.ai/mcp","repository":{"type":"git","url":"git+https://github.com/bma342/eatsuite.git","directory":"aromo-kotlin/mcp"},"bugs":{"url":"https://github.com/bma342/eatsuite/issues"},"publishConfig":{"access":"public"},"bin":{"aromo-mcp":"bin/aromo-mcp.js"},"main":"./dist/index.js","types":"./dist/index.d.ts","engines":{"node":">=20"},"scripts":{"build":"tsc","dev":"tsx src/index.ts","test":"node --test --import tsx 'src/**/*.test.ts'","typecheck":"tsc --noEmit","prepack":"npm run build && npm test","pack:dry":"npm pack --dry-run"},"dependencies":{"@modelcontextprotocol/sdk":"^1.0.0","@napi-rs/keyring":"^1.3.0"},"devDependencies":{"@types/node":"^22.10.0","tsx":"^4.19.2","typescript":"^5.7.2"},"_id":"@aromo/mcp@0.1.1","gitHead":"ada0f2789aae16a41323da8e17c95b7c18c4637b","_nodeVersion":"22.21.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-ThyjxT0Zx3ZYJBGtNa/pKRcQo9m9JShgfDnerjmFQM0Wk//+P08qdY4D8++sKr0I0hKYJF++HRy+66VPMsiCnA==","shasum":"095407ad554731b4fc5d8c22f826674347961159","tarball":"https://registry.npmjs.org/@aromo/mcp/-/mcp-0.1.1.tgz","fileCount":25,"unpackedSize":52769,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDiPX5QGsKF++aJiOPXlMagGBp9t3XdDyrvvWlT18MYlAIgZQefMU36ZccUUqFafsl2DqkJPWYlz27vOvG3+Jfwm5c="}]},"_npmUser":{"name":"bma342","email":"bryce.aspinwall@gmail.com"},"directories":{},"maintainers":[{"name":"bma342","email":"bryce.aspinwall@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp_0.1.1_1780053871084_0.9496310479761629"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-29T11:24:30.837Z","0.1.1":"2026-05-29T11:24:31.257Z","modified":"2026-05-29T11:24:31.484Z"},"maintainers":[{"name":"bma342","email":"bryce.aspinwall@gmail.com"}],"description":"Model Context Protocol server for Aromo — exposes the Aromo headless API to Claude Desktop and other MCP clients","homepage":"https://docs.aromo.ai/mcp","keywords":["aromo","mcp","model-context-protocol","restaurant","claude","ai-agent"],"repository":{"type":"git","url":"git+https://github.com/bma342/eatsuite.git","directory":"aromo-kotlin/mcp"},"bugs":{"url":"https://github.com/bma342/eatsuite/issues"},"license":"MIT","readme":"# @aromo/mcp\n\nModel Context Protocol server for Aromo. Exposes the Aromo headless API to Claude Desktop and other MCP clients as a dynamic catalog of tools. Whatever the backend's `/mcp/v1/tools` endpoint returns shows up in Claude — no per-tool code lives in this package.\n\nThe catalog covers `wizard.*` (multi-step admin flows the operator confirms), `datapoint.*` (read-only metrics), `pending_change.*` (approval queue), `menu.bulk_import_*` (CSV + image bundle), `section.*` (setup orchestrator), `operation.*` (long-running polling), and `start.*` (the W11 ingestion dock: drop a Toast CSV, auto-extract menu items + modifier groups + categories + baselines, approve, materialize).\n\n## What it does\n\nAromo's backend already speaks MCP at `/mcp/v1/tools` — this package is a thin stdio wrapper that:\n\n1. Spawns under Claude Desktop (or another MCP client) via stdio.\n2. Reads credentials from `aromo login`'s on-disk file or env vars.\n3. Translates `tools/list` and `tools/call` JSON-RPC messages into HTTP calls against `/mcp/v1/*`.\n4. Maps Aromo's `ToolInvocationResult` (status / deep_link / value) into MCP content blocks.\n\nThat's the whole job. Tool registration, prompts, schemas — all of it comes from the backend. Add a new wizard there, it appears in Claude Desktop on the next connection.\n\n## Install\n\n```bash\nnpm install -g @aromo/mcp\n```\n\n## Authenticate\n\nThe MCP server reads the credentials `aromo login` writes. So before configuring Claude Desktop, run:\n\n```bash\naromo login\n```\n\nOr for non-interactive (CI, Docker): set `AROMO_API_KEY` directly. No CLI install needed in that case.\n\n## Configure Claude Desktop\n\nAdd to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS, `%APPDATA%\\Claude\\claude_desktop_config.json` on Windows):\n\n```json\n{\n  \"mcpServers\": {\n    \"aromo\": {\n      \"command\": \"aromo-mcp\"\n    }\n  }\n}\n```\n\nFor a non-default API URL:\n\n```json\n{\n  \"mcpServers\": {\n    \"aromo\": {\n      \"command\": \"aromo-mcp\",\n      \"env\": {\n        \"AROMO_API_URL\": \"https://staging.aromo.ai/api/v1\"\n      }\n    }\n  }\n}\n```\n\nRestart Claude Desktop. The tools surface with dots rewritten to `__` (MCP doesn't allow dots in tool names; the wrapper substitutes `__` and reverses on call):\n\n| Backend name | Claude Desktop tool name |\n|---|---|\n| `wizard.create-campaign` | `wizard__create-campaign` |\n| `datapoint.sales.daily` | `datapoint__sales__daily` |\n| `start.bundle_create` | `start__bundle_create` |\n| `pending_change.approve` | `pending_change__approve` |\n| `menu.bulk_import_with_images` | `menu__bulk_import_with_images` |\n\n## Example: Toast CSV → live menu via Claude Desktop\n\nOnce configured, an owner can drop a Toast item-selection export into Claude Desktop and tell Claude \"set up my menu\". Claude will:\n\n1. Call `start__bundle_create` → gets a `bundle_id`\n2. Call `start__bundle_attach_file` with the CSV base64-encoded → backend classifies it\n3. Call `start__bundle_ready` then `start__bundle_publish` → extractors run, ~189 proposals land in the audit table\n4. Call `start__proposals_list` → reads back what was proposed, summarizes for the owner\n5. After owner confirms, call `start__proposals_bulk_approve` and `start__materialize` → real menu items, modifier groups, and category assignments land in the operator's DB\n\nEnd-to-end on a real Toast bundle: 148 menu items + 41 modifier groups with 334 attachments materialized in a single conversation.\n\n## Environment\n\n| Var | Purpose |\n|---|---|\n| `AROMO_API_URL` | API base URL. Default `https://api.aromo.ai/api/v1`. |\n| `AROMO_API_KEY` | Skip the on-disk credential file entirely. Use for CI / Docker. |\n| `AROMO_CLIENT_ID`, `AROMO_USER_ID` | Cosmetic only when `AROMO_API_KEY` is set (shown in the boot log). |\n| `AROMO_CONFIG_DIR` | Override config dir lookup. |\n| `AROMO_CREDS_FILE` | Override credentials file path. |\n| `AROMO_DEBUG` | Print stack traces on errors. |\n\n## Code-sharing with @aromo/cli\n\nThe `credentials.ts` resolver mirrors `@aromo/cli`'s credential resolution — same OS keychain (service `aromo-cli`) and same file-fallback format. They're duplicated rather than imported because v0.1 ships both packages independently before the SDK pipeline fires.\n\nLookup order on read: `AROMO_API_KEY` env → OS keychain (matching `apiUrl`) → file fallback. Both keychain and file are checked for \"exactly one stored host\" auto-selection when `AROMO_API_URL` is unset.\n\nOnce both packages publish (and the workspace is set up), the shared bits move to `@aromo/core` and both consumers import from there. Tracked in `HEADLESS_API_PIVOT.md` §9 Phase 1.5.\n\n## Development\n\n```bash\nnpm install\nnpm test            # node --test, 19 tests\nnpm run build       # tsc → dist/\nnpm run dev         # tsx src/index.ts — runs the binary directly\n\n# Smoke-test that the protocol handshake works:\necho '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"smoke\",\"version\":\"0\"}}}' \\\n  | AROMO_API_KEY=fake node bin/aromo-mcp.js\n```\n","readmeFilename":"README.md","_rev":"1-5d79ff5bb2665938a58d1f52696db316"}