{"_id":"@muovi/mcp-server","_rev":"4-9c7ab04c7b140b7f3473eb137e5e3e7d","name":"@muovi/mcp-server","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.0":{"name":"@muovi/mcp-server","version":"0.1.0","keywords":["mcp","model-context-protocol","muovi","argentina","service-marketplace","claude","llm-tools"],"author":{"url":"https://muovi.com.ar","name":"Muovi","email":"hola@muovi.com.ar"},"license":"MIT","_id":"@muovi/mcp-server@0.1.0","maintainers":[{"name":"mmiani","email":"marianomiani@gmail.com"}],"homepage":"https://muovi.com.ar","bugs":{"url":"https://github.com/muovi-ar/muovi-web/issues"},"bin":{"muovi-mcp-server":"bin/muovi-mcp-server.js"},"dist":{"shasum":"77088b503131819c286e757e598ec030d86cbe85","tarball":"https://registry.npmjs.org/@muovi/mcp-server/-/mcp-server-0.1.0.tgz","fileCount":56,"integrity":"sha512-70j+q2lGytJs81ElKnHitFySPKtAmlmknRRrGtbkk9exOjR4URbt+tx1RNvTI1I8TpjNOREbSdwGluEaMrEAvQ==","signatures":[{"sig":"MEUCIAzfsorwYZYnM8VgbGzIzfkiFW8WUr9IsMULbrpJgN5IAiEAsW3PNElM6gm2sP/RDYLYsPswqUJmWxm6cD6OK6Ndan0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104034},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"9db474065759fe125e988ef2929597d845495ed5","scripts":{"test":"vitest run","build":"tsc -p .","clean":"rm -rf dist","typecheck":"tsc --noEmit -p .","test:watch":"vitest","prepublishOnly":"npm run clean && npm run build && npm test"},"_npmUser":{"name":"mmiani","email":"marianomiani@gmail.com"},"repository":{"url":"git+https://github.com/muovi-ar/muovi-web.git","type":"git","directory":"packages/mcp-server"},"_npmVersion":"11.12.1","description":"Model Context Protocol (MCP) server that exposes Muovi's public /v1 API to LLM agents (Claude Desktop, Cursor, Claude Code). Read-only, stdio mode.","directories":{},"_nodeVersion":"25.6.1","dependencies":{"zod":"^3.25.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.0.0","js-yaml":"^4.1.0","typescript":"^5.8.0","@types/node":"^22.10.0","@types/js-yaml":"^4.0.9"},"_npmOperationalInternal":{"tmp":"tmp/mcp-server_0.1.0_1780931105076_0.6439064578010314","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@muovi/mcp-server","version":"0.1.1","keywords":["mcp","model-context-protocol","muovi","argentina","service-marketplace","claude","llm-tools"],"author":{"url":"https://muovi.com.ar","name":"Muovi","email":"hola@muovi.com.ar"},"license":"MIT","_id":"@muovi/mcp-server@0.1.1","maintainers":[{"name":"mmiani","email":"marianomiani@gmail.com"}],"homepage":"https://muovi.com.ar","bugs":{"url":"https://github.com/muovi-ar/muovi-web/issues"},"bin":{"muovi-mcp-server":"bin/muovi-mcp-server.js"},"dist":{"shasum":"d6cd9e2dfaedd215a5a6b21eaee0a648d62fdb1a","tarball":"https://registry.npmjs.org/@muovi/mcp-server/-/mcp-server-0.1.1.tgz","fileCount":56,"integrity":"sha512-9DFqdW5j3W+oBJdsKbE3qY1wFEPX/RM5JeK4yhEk6e0mJq69jY2IUNBha2BLqczfbvVUjQL9lA40D/Kg13v3Ww==","signatures":[{"sig":"MEUCID6KRjJg07QCDZM3fL6S/svXciyRIzoAMAWuZV5mbugUAiEAo6fLhzqxLUEgv4Au/LKT9bscctGDR/c1976uGZwH1Qs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107093},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"0d85e1ab640121e7b40e3b4a35dd0159b44435c1","mcpName":"ar.com.muovi/mcp-server","scripts":{"test":"vitest run","build":"tsc -p .","clean":"rm -rf dist","typecheck":"tsc --noEmit -p .","test:watch":"vitest","prepublishOnly":"npm run clean && npm run build && npm test"},"_npmUser":{"name":"mmiani","email":"marianomiani@gmail.com"},"repository":{"url":"git+https://github.com/muovi-ar/muovi-web.git","type":"git","directory":"packages/mcp-server"},"_npmVersion":"11.12.1","description":"Model Context Protocol (MCP) server that exposes Muovi's public /v1 API to LLM agents (Claude Desktop, Cursor, Claude Code). Read-only, stdio mode.","directories":{},"_nodeVersion":"25.6.1","dependencies":{"zod":"^3.25.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.0.0","js-yaml":"^4.1.0","typescript":"^5.8.0","@types/node":"^22.10.0","@types/js-yaml":"^4.0.9"},"_npmOperationalInternal":{"tmp":"tmp/mcp-server_0.1.1_1784130570275_0.21841944827035964","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@muovi/mcp-server","version":"0.1.2","keywords":["mcp","model-context-protocol","muovi","argentina","service-marketplace","claude","llm-tools"],"author":{"url":"https://muovi.com.ar","name":"Muovi","email":"hola@muovi.com.ar"},"license":"MIT","_id":"@muovi/mcp-server@0.1.2","maintainers":[{"name":"mmiani","email":"marianomiani@gmail.com"}],"homepage":"https://muovi.com.ar","bugs":{"url":"https://github.com/mmiani/mcp-server/issues"},"bin":{"muovi-mcp-server":"bin/muovi-mcp-server.js"},"dist":{"shasum":"9b9b1a4a50ccc4aa14867e04d6234af9c495c0aa","tarball":"https://registry.npmjs.org/@muovi/mcp-server/-/mcp-server-0.1.2.tgz","fileCount":56,"integrity":"sha512-OSRfNsYfFpW9b2czF1YZdIUVI/ROgzld0gHL0L/MDTVk9/QyG9wjbKTzrR4kIp2siXm2Uq8Q6IYyD38aNaPfuA==","signatures":[{"sig":"MEYCIQDl7N8aMf8c/VCDRq7VoGq7cQ5+wjA+DcQYd2uGJdg0qAIhALYJj3QvF1v80o/x3/9tyuoWBoEDDTUC/3wOPO6DvV+K","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107051},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"5573e013b56abd8a6d97236580bc681918c3f639","mcpName":"ar.com.muovi/mcp-server","scripts":{"test":"vitest run","build":"tsc -p .","clean":"rm -rf dist","typecheck":"tsc --noEmit -p .","test:watch":"vitest","prepublishOnly":"npm run clean && npm run build && npm test"},"_npmUser":{"name":"mmiani","email":"marianomiani@gmail.com"},"repository":{"url":"git+https://github.com/mmiani/mcp-server.git","type":"git"},"_npmVersion":"11.12.1","description":"Model Context Protocol (MCP) server that exposes Muovi's public /v1 API to LLM agents (Claude Desktop, Cursor, Claude Code). Read-only, stdio mode.","directories":{},"_nodeVersion":"25.6.1","dependencies":{"zod":"^3.25.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.0.0","js-yaml":"^4.1.0","typescript":"^5.8.0","@types/node":"^22.10.0","@types/js-yaml":"^4.0.9"},"_npmOperationalInternal":{"tmp":"tmp/mcp-server_0.1.2_1784134124175_0.7693106029435026","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@muovi/mcp-server","mcpName":"ar.com.muovi/mcp-server","version":"0.1.4","description":"Model Context Protocol (MCP) server that exposes Muovi's public /v1 API to LLM agents (Claude Desktop, Cursor, Claude Code). Read-only, stdio mode.","license":"MIT","author":{"name":"Muovi","email":"hola@muovi.com.ar","url":"https://muovi.com.ar"},"homepage":"https://muovi.com.ar","repository":{"type":"git","url":"git+https://github.com/muovi-latam/mcp-server.git"},"bugs":{"url":"https://github.com/muovi-latam/mcp-server/issues"},"keywords":["mcp","model-context-protocol","muovi","argentina","latam","local-services","service-marketplace","home-services","claude","llm-tools"],"type":"module","main":"dist/index.js","types":"dist/index.d.ts","bin":{"muovi-mcp-server":"bin/muovi-mcp-server.js"},"engines":{"node":">=18"},"scripts":{"build":"tsc -p .","clean":"rm -rf dist","typecheck":"tsc --noEmit -p .","test":"vitest run","test:watch":"vitest","prepublishOnly":"npm run clean && npm run build && npm test"},"dependencies":{"@modelcontextprotocol/sdk":"^1.29.0","zod":"^3.25.0"},"devDependencies":{"@types/node":"^22.10.0","js-yaml":"^4.1.0","@types/js-yaml":"^4.0.9","typescript":"^5.8.0","vitest":"^3.0.0"},"publishConfig":{"access":"public"},"gitHead":"103049bc69417b486ca7c457f23d6f8d7b4de10d","_id":"@muovi/mcp-server@0.1.4","_nodeVersion":"25.6.1","_npmVersion":"11.12.1","dist":{"integrity":"sha512-EjETFtnGYxD3WU+UscJic+v3g81pILlHnGa4mT8xwHBGAqpkzd69r37ibrdCf6Azz4RZ32ofvQG7rYDzNhOy4Q==","shasum":"a453610dae56a86f7e88d0e5a63d3dbf459ec435","tarball":"https://registry.npmjs.org/@muovi/mcp-server/-/mcp-server-0.1.4.tgz","fileCount":56,"unpackedSize":107071,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIG7IO+qPQJeA/DjkT0ec5OZll9xdT5ypEy7WxzGSG4e7AiEA/RQbDu4nD6pNVvl9ZifYn/fU1urXR/mWi4aN/FJtcss="}]},"_npmUser":{"name":"mmiani","email":"marianomiani@gmail.com"},"directories":{},"maintainers":[{"name":"mmiani","email":"marianomiani@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-server_0.1.4_1784301723101_0.9468527434508309"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-08T15:05:04.723Z","modified":"2026-07-17T15:22:03.798Z","0.1.0":"2026-06-08T15:05:05.224Z","0.1.1":"2026-07-15T15:49:30.408Z","0.1.2":"2026-07-15T16:48:44.305Z","0.1.4":"2026-07-17T15:22:03.239Z"},"bugs":{"url":"https://github.com/muovi-latam/mcp-server/issues"},"author":{"name":"Muovi","email":"hola@muovi.com.ar","url":"https://muovi.com.ar"},"license":"MIT","homepage":"https://muovi.com.ar","keywords":["mcp","model-context-protocol","muovi","argentina","latam","local-services","service-marketplace","home-services","claude","llm-tools"],"repository":{"type":"git","url":"git+https://github.com/muovi-latam/mcp-server.git"},"description":"Model Context Protocol (MCP) server that exposes Muovi's public /v1 API to LLM agents (Claude Desktop, Cursor, Claude Code). Read-only, stdio mode.","maintainers":[{"name":"mmiani","email":"marianomiani@gmail.com"}],"readme":"# @muovi/mcp-server\n\n[![npm version](https://img.shields.io/npm/v/%40muovi%2Fmcp-server.svg)](https://www.npmjs.com/package/@muovi/mcp-server)\n\n**Model Context Protocol (MCP) server for [Muovi](https://muovi.com.ar)** — LATAM's trust-first local services marketplace.\n\nThis package lets MCP-aware clients (Claude Desktop, Cursor, Claude Code, and any other MCP host) discover Muovi's verified LATAM service professionals, browse the service catalog and city list, read reviews, and deep-link a user into the on-platform task-creation flow. It is a thin, read-only wrapper over Muovi's public [`/v1` REST API](https://muovi.com.ar/openapi.yaml).\n\n**Stdio mode.** The package ships an `npx`-runnable binary that speaks JSON-RPC over stdin/stdout. The hosted HTTP/SSE variant is tracked separately (Muovi MOB-142).\n\n## What it exposes\n\nSix tools, all read-only:\n\n| Tool | Wraps | Purpose |\n| --- | --- | --- |\n| `muovi_search_professionals` | `GET /v1/professionals` | Search verified pros by service, city, neighborhood, verification status, min rating, min review count. |\n| `muovi_get_professional` | `GET /v1/professionals/{slug}` | Fetch a single pro's full public profile (bio, portfolio, specialties, verifications). |\n| `muovi_list_services` | `GET /v1/services` | The full live service catalog. |\n| `muovi_list_cities` | `GET /v1/cities` | Every Argentine city Muovi serves, with neighborhoods. |\n| `muovi_get_reviews` | `GET /v1/professionals/{slug}/reviews` | Paginated reviews for a pro, most-recent first. |\n| `muovi_create_task_link` | (pure formatter) | Builds the canonical deep-link the user should follow to start a task with a specific pro for a specific service. Makes no HTTP call. |\n\n## Anti-leakage policy\n\nMuovi is on-platform-only. **Phone, email, and WhatsApp handles are never returned** by the public API — contact between consumers and professionals happens exclusively through Muovi's in-app conversation flow, reachable from each pro's `profile_url`.\n\nThis server enforces the policy twice:\n\n1. The `/v1` API strips contact data server-side.\n2. Every tool response in this package also runs through a local anti-leakage detector (a Node-compatible mirror of [`src/lib/anti-leakage/detector.ts`](https://github.com/muovi-latam/muovi-web/blob/main/src/lib/anti-leakage/detector.ts) in the Muovi web repo). If a leak is detected at the agent boundary the tool returns a stable error to the LLM client and refuses to surface the payload.\n\nHosts that integrate this server **must not** synthesise off-platform contact handles from any field. Driving the user to `profile_url` (optionally with the deep-link query string) is the only sanctioned contact channel.\n\n## Installation & configuration\n\n### Claude Desktop\n\nOpen `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\\Claude\\claude_desktop_config.json` (Windows) and add the server under `mcpServers`:\n\n```json\n{\n  \"mcpServers\": {\n    \"muovi\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@muovi/mcp-server\"]\n    }\n  }\n}\n```\n\nIf you have a Muovi API key (see [Authentication](#authentication-optional) below), pass it via env:\n\n```json\n{\n  \"mcpServers\": {\n    \"muovi\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@muovi/mcp-server\"],\n      \"env\": {\n        \"MUOVI_API_KEY\": \"your-key-here\"\n      }\n    }\n  }\n}\n```\n\nRestart Claude Desktop after editing the config.\n\n### Cursor\n\nAdd to `~/.cursor/mcp.json` (or your workspace's `.cursor/mcp.json`):\n\n```json\n{\n  \"mcpServers\": {\n    \"muovi\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@muovi/mcp-server\"]\n    }\n  }\n}\n```\n\n### Claude Code\n\nRegister the server with the Claude Code CLI:\n\n```bash\nclaude mcp add muovi --command \"npx\" --args \"-y\" \"@muovi/mcp-server\"\n```\n\nOr add it manually to your Claude Code settings:\n\n```json\n{\n  \"mcpServers\": {\n    \"muovi\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@muovi/mcp-server\"]\n    }\n  }\n}\n```\n\n### Manual / scripting\n\n```bash\nnpx -y @muovi/mcp-server\n```\n\nThe process reads JSON-RPC on stdin and replies on stdout. All log output goes to stderr.\n\n## Authentication (optional)\n\nAll `/v1` endpoints are public and unauthenticated by default. If your client has been issued a Muovi API key (higher rate-limit tier), set `MUOVI_API_KEY` in the server's environment and the package will forward it as the `X-API-Key` header on every request.\n\nYou can also override the API base URL for testing:\n\n```bash\nMUOVI_API_BASE_URL=https://staging.muovi.com.ar/api/v1 npx -y @muovi/mcp-server\n```\n\n## Example agent workflow\n\nA typical Claude conversation that uses these tools:\n\n1. User asks for \"an electrician in Palermo who's properly licensed\".\n2. Agent calls `muovi_list_services` to map \"electrician\" → `electricidad`.\n3. Agent calls `muovi_list_cities` to confirm `palermo` is a valid neighborhood under `caba`.\n4. Agent calls `muovi_search_professionals` with `{ service: \"electricidad\", city: \"caba\", neighborhood: \"palermo\", has_matricula: true, min_rating: 4.5 }`.\n5. Agent picks the top pro and calls `muovi_get_professional` for the full bio + portfolio.\n6. Agent optionally calls `muovi_get_reviews` for social proof.\n7. Agent calls `muovi_create_task_link` with `{ professional_slug, service_slug: \"electricidad\" }` and surfaces the resulting URL.\n8. User follows the link, lands on Muovi, completes the on-platform task creation flow.\n\nStep 8 — the on-platform flow — is Muovi's enforcement point for trust, payments, and disputes. MCP never bypasses it.\n\n## Local development\n\nThis package is the standalone [`muovi-latam/mcp-server`](https://github.com/muovi-latam/mcp-server) repo. Clone it, install, and run tests:\n\n```bash\ngit clone git@github.com:muovi-latam/mcp-server.git\ncd mcp-server\nnpm install\nnpm test            # unit + integration + OpenAPI drift checks\nnpm run typecheck   # strict TypeScript\nnpm run build       # emits dist/\n```\n\nThe OpenAPI drift test parses `public/openapi.yaml` and asserts each tool's input schema matches the corresponding operation's parameters exactly — adding a query param to `/v1` requires updating the corresponding tool (and vice versa).\n\n## Publishing\n\n`npm publish` is intentionally **not** wired into CI. Releases are cut manually from a clean tag:\n\n```bash\nnpm version patch    # or minor / major\nnpm publish --access public\ngit push --follow-tags\n```\n\n`prepublishOnly` runs `clean + build + test` before any publish.\n\n### MCP Registry (mcp-publisher)\n\nBeyond npm, this server is listed in the [Model Context Protocol registry](https://registry.modelcontextprotocol.io) via the committed [`server.json`](./server.json) manifest. Publishing to the registry is a **manual step — there is deliberately no CI auto-publish** (the registry is a low-frequency, human-gated surface, and namespace auth is interactive).\n\n**Committed namespace:** `ar.com.muovi/mcp-server` — the reverse-DNS form of `muovi.com.ar`. This value lives in **both** `server.json` (`name`) and `package.json` (`mcpName`) and the two **must stay byte-identical** (the `server-json` test enforces equality). It must also match the identity you authenticate as with `mcp-publisher` (see below).\n\n#### One-time namespace ownership setup\n\nProve ownership of the `ar.com.muovi` namespace once, before the first publish:\n\n- **DNS (preferred):** add the TXT record that `mcp-publisher login dns` prints to the `muovi.com.ar` zone, then authenticate against that domain. This ties the namespace to the domain we already control.\n- **GitHub OAuth (fallback):** `mcp-publisher login github` — authenticates via the `muovi-latam` GitHub org. Only use this if DNS verification is unavailable; the authenticated identity still has to line up with the committed `ar.com.muovi/mcp-server` namespace.\n\nIf the committed namespace and the authenticated identity disagree, `mcp-publisher publish` will reject the manifest — fix the namespace (in both files) or the login, do not force it.\n\n#### Publish steps\n\n```bash\nmcp-publisher validate ./server.json   # checks against the live registry schema\nmcp-publisher publish                   # publishes server.json under the authenticated namespace\n```\n\n`validate` is the step that confirms the manifest matches the current registry schema version — run it every time; the pinned `$schema` in `server.json` is a hint, not a guarantee the live schema hasn't moved.\n\n#### Version-bump discipline\n\nThe `server-json` test asserts that four version fields agree. On **every** version bump, update all of them together, then re-publish to both npm and the registry:\n\n1. `package.json` → `version`\n2. `src/server.ts` → `PACKAGE_VERSION`\n3. `server.json` → `version`\n4. `server.json` → `packages[0].version`\n\n#### Honest gating notes\n\nThe manifest advertises capabilities that are not yet fully live. Keep these caveats in mind (and do not overstate them to users):\n\n- **Remote transport** (`remotes[].url` = `https://mcp.muovi.com.ar/`) is only truthful once that endpoint reliably answers JSON-RPC `initialize` over streamable-HTTP. That hosted surface is tracked in **MOB-207**; until it lands, the **stdio** package (`npx @muovi/mcp-server`) is the only transport that actually works.\n- **`muovi_get_professional`** and **`muovi_get_reviews`** remain broken against production until **MOB-263** deploys the backing `/v1` endpoints. The tools are registered and pass drift checks, but live calls will fail until then.\n\n## License\n\n[MIT](./LICENSE).\n\n## Links\n\n- [Muovi](https://muovi.com.ar)\n- [Public `/v1` API spec](https://muovi.com.ar/openapi.yaml)\n- [Model Context Protocol](https://modelcontextprotocol.io)\n- [Report an issue](https://github.com/muovi-latam/mcp-server/issues)\n","readmeFilename":"README.md"}