{"_id":"@vibevo/mcp","_rev":"6-a65f9715196cb7607f951ea6031d1243","name":"@vibevo/mcp","dist-tags":{"latest":"0.7.0"},"versions":{"0.1.0":{"name":"@vibevo/mcp","version":"0.1.0","keywords":["mcp","modelcontextprotocol","vibevo","ai-agent"],"license":"MIT","_id":"@vibevo/mcp@0.1.0","maintainers":[{"name":"vibevo","email":"hello@vibevo.io"}],"homepage":"https://docs.vibevo.io/docs/api/mcp","bin":{"vibevo-mcp":"dist/index.js"},"dist":{"shasum":"e3d7f93c673fcf0ec291355d4bbb23ae8af4379f","tarball":"https://registry.npmjs.org/@vibevo/mcp/-/mcp-0.1.0.tgz","fileCount":5,"integrity":"sha512-kmwR30v4UbSfyN7LfnkwsIpOK3xH8iKGyyPUAnVH5Rw23VH0YYaGtnq4S24fXZVoWCkOzOllQlE0lI7N0GLgvg==","signatures":[{"sig":"MEUCIQCMpis7bfuS/nk/2LzJ0LGZOoOdh7IbiQefQCgFfcuReQIgb0Li/fP60AwpCFHwijPOThMCBPLd8B0cmRYZx/2NvkI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37789},"type":"module","engines":{"node":">=20"},"scripts":{"dev":"tsc -p tsconfig.json --watch","build":"tsc -p tsconfig.json","start":"node dist/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"vibevo","email":"hello@vibevo.io"},"_npmVersion":"10.9.4","description":"MCP server exposing the VibeVO Public API as agent tools (AIPROD-204).","directories":{},"_nodeVersion":"22.22.0","dependencies":{"zod":"^3.23.8","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.1.0_1784225128786_0.4752838162164057","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@vibevo/mcp","version":"0.1.1","keywords":["mcp","modelcontextprotocol","vibevo","ai-agent"],"license":"MIT","_id":"@vibevo/mcp@0.1.1","maintainers":[{"name":"vibevo","email":"hello@vibevo.io"},{"name":"bezrukovm","email":"bezrukovmikhail0@gmail.com"}],"homepage":"https://docs.vibevo.io/docs/api/mcp","bin":{"vibevo-mcp":"dist/index.js"},"dist":{"shasum":"9711d2e13e5718c5951534623316bf0f1f6bada8","tarball":"https://registry.npmjs.org/@vibevo/mcp/-/mcp-0.1.1.tgz","fileCount":5,"integrity":"sha512-pmag4JfkuSIX4A2Rx29LsOPCZaFR4Efaoip+vAtV+VwKTLSS79reoHDZL1Kz4/IoepC6pkEIEdULdogUNUQzRw==","signatures":[{"sig":"MEQCIE1GRdvZrS9OL9/OpVbaa7kSPQsuYGPHPvPaLoeAYX77AiASFECgdp6PYwrCBdfbL/2sbBQMbDkgnYpUfAd7IqWm+Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39731},"type":"module","engines":{"node":">=20"},"gitHead":"45442b412b13a4d517ab1c8145ec9bacdc7c63c9","scripts":{"dev":"tsc -p tsconfig.json --watch","build":"tsc -p tsconfig.json","start":"node dist/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"bezrukovm","email":"bezrukovmikhail0@gmail.com"},"_npmVersion":"10.8.2","description":"MCP server exposing the VibeVO Public API as agent tools (AIPROD-204).","directories":{},"_nodeVersion":"20.17.0","dependencies":{"zod":"^3.23.8","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.1.1_1784230761728_0.1510482980303891","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@vibevo/mcp","version":"0.1.2","keywords":["mcp","modelcontextprotocol","vibevo","ai-agent"],"license":"MIT","_id":"@vibevo/mcp@0.1.2","maintainers":[{"name":"vibevo","email":"hello@vibevo.io"},{"name":"bezrukovm","email":"bezrukovmikhail0@gmail.com"}],"homepage":"https://docs.vibevo.io/docs/en/api/mcp","bugs":{"url":"https://github.com/VibeVO-io/VibeVO/issues"},"bin":{"vibevo-mcp":"dist/index.js"},"dist":{"shasum":"4e40540d6ae51b2edfae897baffc42d812e2072d","tarball":"https://registry.npmjs.org/@vibevo/mcp/-/mcp-0.1.2.tgz","fileCount":5,"integrity":"sha512-hWg3/sw3QxAbNggYtRm/aGy/umMntL/9ySRjlEN40VVo4H8IvvpfLLkLm5HQXMi/z9akJ65yNP3oAeR6CDrT7A==","signatures":[{"sig":"MEQCIHJ+nKho1sRvx4SYApwsywtyyVqXfMURjphJ+MUC+7dTAiBUEiEZz6un1gnhVqS8beahP4Euyi2En/vCwFS5ItobIA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38342},"type":"module","engines":{"node":">=20"},"mcpName":"io.vibevo/vibevo","scripts":{"dev":"tsc -p tsconfig.json --watch","build":"tsc -p tsconfig.json","start":"node dist/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"vibevo","email":"hello@vibevo.io"},"repository":{"url":"git+https://github.com/VibeVO-io/VibeVO.git","type":"git","directory":"mcp"},"_npmVersion":"11.8.0","description":"MCP server exposing the VibeVO Public API as agent tools (AIPROD-204).","directories":{},"_nodeVersion":"25.5.0","dependencies":{"zod":"^3.23.8","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.1.2_1784652995366_0.48054080696744417","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@vibevo/mcp","version":"0.3.0","keywords":["mcp","modelcontextprotocol","vibevo","ai-agent"],"license":"MIT","_id":"@vibevo/mcp@0.3.0","maintainers":[{"name":"vibevo","email":"hello@vibevo.io"},{"name":"bezrukovm","email":"bezrukovmikhail0@gmail.com"}],"homepage":"https://docs.vibevo.io/docs/en/api/mcp","bugs":{"url":"https://github.com/VibeVO-io/VibeVO/issues"},"bin":{"vibevo-mcp":"dist/index.js"},"dist":{"shasum":"7c5ac14cf06df57aaa9b535fa59c343acfb6d300","tarball":"https://registry.npmjs.org/@vibevo/mcp/-/mcp-0.3.0.tgz","fileCount":5,"integrity":"sha512-lHJSz9Nh7XfDxdIOHD0pPOZmlb/VcPU6wR4GuiNlTnS3Np5dvwrR4l1cDGW5aZJV8odh/w14hc1DkWTfBpdDuA==","signatures":[{"sig":"MEUCIQCLUQ5e/YhRdT6oWC0ilcsmQfXWD5EINbU2pm/MkQnMHAIgIW13pyoMYoOoxZjDg8/E00STcICKB2H/tnzqJTK+6QM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIC/GPsrlvvZ/NS3zZq/tOaAYA48EBYJxdSFdWpNXReLyAiEAjponetprI4QIbDd9ZJlJu1fJMhdul8S13kn/Oovff/M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72155},"type":"module","engines":{"node":">=20"},"gitHead":"dbadde285a396029fe4e45eede3b2230e4566115","mcpName":"io.vibevo/vibevo","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"npm run build && node --test test/factories.test.mjs","build":"tsc -p tsconfig.json","start":"node dist/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"bezrukovm","email":"bezrukovmikhail0@gmail.com"},"repository":{"url":"git+https://github.com/VibeVO-io/VibeVO.git","type":"git","directory":"mcp"},"_npmVersion":"11.9.0","description":"Connect AI agents to VibeVO campaigns, analytics, posts, creators, wallets, and content factories.","directories":{},"_nodeVersion":"20.17.0","dependencies":{"zod":"^3.23.8","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.3.0_1789759365484_0.3531024567839707","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@vibevo/mcp","version":"0.6.1","keywords":["mcp","modelcontextprotocol","vibevo","ai-agent"],"license":"MIT","_id":"@vibevo/mcp@0.6.1","maintainers":[{"name":"vibevo","email":"hello@vibevo.io"},{"name":"bezrukovm","email":"bezrukovmikhail0@gmail.com"}],"homepage":"https://docs.vibevo.io/docs/en/api/mcp","bugs":{"url":"https://github.com/VibeVO-io/VibeVO/issues"},"bin":{"vibevo-mcp":"dist/index.js"},"dist":{"shasum":"87218de5196d3ce5beedcdee326427582be395d1","tarball":"https://registry.npmjs.org/@vibevo/mcp/-/mcp-0.6.1.tgz","fileCount":5,"integrity":"sha512-wYvwsSjNvfkQjTHsJo5tmiCnrL5m3mmaBJZ8yvhG23NOMINQD32otv31RjLtqTwl6iKzXjbNekscQn/pULUyGA==","signatures":[{"sig":"MEUCIQDprlOFDdZbkr/w3PnMXoqnnzEpbIOGWuLJbL9kOnuANAIgRKeDtBqx18U7WTltAhnp3JjT1GqSJZ6+VqsHnMQG3gg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIA1X2XDZjilV8fIaInXKIZU1oTpDJcKNmWxgt+/3zwTPAiB6Wuj6OOrsecmqvHlQa/2lSjsp1XjkDSjBVe+d9Mb4Rw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112463},"type":"module","_from":"file:/tmp/vibevo-mcp-0.6.1.tgz","engines":{"node":">=20"},"mcpName":"io.vibevo/vibevo","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"npm run build && node --test test/factories.test.mjs test/social-accounts.test.mjs test/proofs.test.mjs","build":"tsc -p tsconfig.json","start":"node dist/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"vibevo","email":"hello@vibevo.io"},"_resolved":"/tmp/vibevo-mcp-0.6.1.tgz","_integrity":"sha512-wYvwsSjNvfkQjTHsJo5tmiCnrL5m3mmaBJZ8yvhG23NOMINQD32otv31RjLtqTwl6iKzXjbNekscQn/pULUyGA==","repository":{"url":"git+https://github.com/VibeVO-io/VibeVO.git","type":"git","directory":"mcp"},"_npmVersion":"10.9.4","description":"Connect AI agents to VibeVO campaigns, analytics, posts, creators, wallets, and content factories.","directories":{},"_nodeVersion":"22.22.0","dependencies":{"zod":"^3.23.8","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.6.1_1791545377998_0.975499401154097","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"_id":"@vibevo/mcp@0.7.0","bin":{"vibevo-mcp":"dist/index.js"},"bugs":{"url":"https://github.com/VibeVO-io/VibeVO/issues"},"dist":{"shasum":"c4bbdcfd62d2f417e83dd177bf454861ad5add60","tarball":"https://registry.npmjs.org/@vibevo/mcp/-/mcp-0.7.0.tgz","fileCount":11,"integrity":"sha512-CP2FIkGAlhnBrXz6FvmewzQZl3RXYiaIqhcJxLCwbPwAUbZgDacKIYYFxtfJis+mX3LBinGJp/8fGJ7fNn3Cdw==","signatures":[{"sig":"MEUCIEYbh+yJVd/r/IolKEjM+i4Hd4gxvoNv9xCPX+3ezzuCAiEA+IPR5KXfmF9o/+Hnvw3GSIajavHrScOhWLSnyEWI0DE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIG9VDKuiUFmn1PpHzLnShGw2P5110FobogODrlBnO8wTAiEA01D2T7bcMcyI5Oo12s2eYhuE/LO6VV15U5B+BH28Avc="}],"unpackedSize":336134},"name":"@vibevo/mcp","type":"module","_from":"file:/var/folders/k2/pdbl9w6n04x2dxzkp7hk1hbr0000gn/T/aiprod207-mcp-final-clean-y0wiory5/vibevo-mcp-0.7.0.tgz","engines":{"node":">=20"},"license":"MIT","mcpName":"io.vibevo/vibevo","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"npm run build && node --test test/factories.test.mjs test/social-accounts.test.mjs test/proofs.test.mjs test/placements.test.mjs test/placement-download.test.mjs","build":"tsc -p tsconfig.json","start":"node dist/index.js","prepublishOnly":"npm run build"},"version":"0.7.0","_npmUser":{"name":"vibevo","email":"hello@vibevo.io"},"homepage":"https://docs.vibevo.io/docs/en/api/mcp","keywords":["mcp","modelcontextprotocol","vibevo","ai-agent"],"_resolved":"/var/folders/k2/pdbl9w6n04x2dxzkp7hk1hbr0000gn/T/aiprod207-mcp-final-clean-y0wiory5/vibevo-mcp-0.7.0.tgz","_integrity":"sha512-CP2FIkGAlhnBrXz6FvmewzQZl3RXYiaIqhcJxLCwbPwAUbZgDacKIYYFxtfJis+mX3LBinGJp/8fGJ7fNn3Cdw==","repository":{"url":"git+https://github.com/VibeVO-io/VibeVO.git","type":"git","directory":"mcp"},"_npmVersion":"11.8.0","description":"Connect AI agents to VibeVO campaigns, placements, creators, analytics, wallets, and content factories.","directories":{},"maintainers":[{"name":"vibevo","email":"hello@vibevo.io"},{"name":"bezrukovm","email":"bezrukovmikhail0@gmail.com"}],"_nodeVersion":"25.5.0","dependencies":{"zod":"^3.23.8","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.5.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp_0.7.0_1791571949210_0.7302864727667469"}}},"time":{"created":"2026-07-16T18:05:28.566Z","modified":"2026-10-09T18:52:29.441Z","0.1.0":"2026-07-16T18:05:28.903Z","0.1.1":"2026-07-16T19:39:21.912Z","0.1.2":"2026-07-21T16:56:35.516Z","0.3.0":"2026-09-18T19:22:45.564Z","0.6.1":"2026-10-09T11:29:38.073Z","0.7.0":"2026-10-09T18:52:29.306Z"},"bugs":{"url":"https://github.com/VibeVO-io/VibeVO/issues"},"license":"MIT","homepage":"https://docs.vibevo.io/docs/en/api/mcp","keywords":["mcp","modelcontextprotocol","vibevo","ai-agent"],"repository":{"url":"git+https://github.com/VibeVO-io/VibeVO.git","type":"git","directory":"mcp"},"description":"Connect AI agents to VibeVO campaigns, placements, creators, analytics, wallets, and content factories.","maintainers":[{"name":"vibevo","email":"hello@vibevo.io"},{"name":"bezrukovm","email":"bezrukovmikhail0@gmail.com"}],"readme":"# @vibevo/mcp — VibeVO MCP server\n\nMCP server that exposes the [VibeVO Public API](https://docs.vibevo.io/docs/en/api)\nas agent tools, so AI agents (Claude Desktop, IDE agents, custom runners) can\ndiscover and operate VibeVO programmatically.\n\nRequires Node.js 20 or later. Uses the stdio transport. An API key is optional\nfor anonymous public creator catalog/page reads and required for all other tools.\n\n## Connect, update and manage factory tags\n\nSee the [MCP guide](https://docs.vibevo.io/docs/en/api/mcp) for Codex, Claude Desktop\nand Cursor configurations, a copyable agent prompt and update instructions.\nThe [factory-tag walkthrough](https://docs.vibevo.io/docs/en/api/mcp#factory-tags)\nshows how to add a tag without removing the account's existing tags.\n\nUse `@vibevo/mcp@latest` in your client configuration and restart the MCP process\nto load the latest **published** npm version. A website deployment or a GitHub\ncommit does not update an already running MCP server.\n\n## Tools\n\nVersion 0.7.0 provides 100 tools, including public creator browsing and the influencer placement participant flow.\n\n| Tool                                        | Wraps                                                              | Scope         |\n| ------------------------------------------- | ------------------------------------------------------------------ | ------------- |\n| `vibevo_whoami`                             | `GET /public/me`                                                   | any valid key |\n| `vibevo_list_offers`                        | `GET /public/offers`                                               | `read`        |\n| `vibevo_list_my_posts`                      | `GET /public/posts`                                                | `read`        |\n| `vibevo_list_social_accounts`               | `GET /public/social-accounts`                                      | `read`        |\n| `vibevo_get_social_account_verification`    | `GET /public/social-accounts/{id}/verification`                    | `read`        |\n| `vibevo_get_social_account_stats`           | `GET /public/social-accounts/{id}/stats`                           | `read`        |\n| `vibevo_list_campaigns`                     | `GET /public/campaigns`                                            | `read`        |\n| `vibevo_get_campaign`                       | `GET /public/campaigns/{id}`                                       | `read`        |\n| `vibevo_get_campaign_analytics`             | `GET /public/analytics/campaigns/{id}`                             | `read`        |\n| `vibevo_list_campaign_posts`                | `GET /public/campaigns/{id}/posts`                                 | `read`        |\n| `vibevo_list_campaign_creators`             | `GET /public/campaigns/{id}/creators`                              | `read`        |\n| `vibevo_list_campaign_tracking_links`       | `GET /public/campaigns/{id}/tracking-links`                        | `read`        |\n| `vibevo_list_campaign_post_proofs`          | `GET /public/campaigns/{id}/posts/{postId}/proofs`                 | `read`        |\n| `vibevo_get_campaign_post_proof`            | `GET /public/campaigns/{id}/posts/{postId}/proofs/{proofId}/image` | `read`        |\n| `vibevo_download_campaign_proofs_zip`       | `GET /public/campaigns/{id}/proofs/zip`                            | `read`        |\n| `vibevo_list_my_post_proofs`                | `GET /public/posts/{id}/proofs`                                    | `read`        |\n| `vibevo_get_my_post_proof`                  | `GET /public/posts/{id}/proofs/{proofId}/image`                    | `read`        |\n| `vibevo_get_wallet`                         | `GET /public/wallet`                                               | `read`        |\n| `vibevo_list_wallet_transactions`           | `GET /public/wallet/transactions`                                  | `read`        |\n| `vibevo_list_factories`                     | `GET /public/factories`                                            | `read`        |\n| `vibevo_get_factory_summary`                | `GET /public/factories/{id}/summary`                               | `read`        |\n| `vibevo_list_factory_accounts`              | `GET /public/factories/{id}/accounts`                              | `read`        |\n| `vibevo_list_factory_posts`                 | `GET /public/factories/{id}/posts`                                 | `read`        |\n| `vibevo_get_factory_account`                | `GET /public/factories/{id}/accounts/{aid}`                        | `read`        |\n| `vibevo_create_factory`                     | `POST /public/factories`                                           | `write` †     |\n| `vibevo_patch_factory`                      | `PATCH /public/factories/{id}`                                     | `write` †     |\n| `vibevo_add_factory_items`                  | `POST /public/factories/{id}/items`                                | `write` †     |\n| `vibevo_patch_factory_account`              | `PATCH /public/factories/{id}/accounts/{aid}`                      | `write` †     |\n| `vibevo_refresh_factory_account`            | `POST /public/factories/{id}/accounts/{aid}/refresh`               | `write` †     |\n| `vibevo_submit_post`                        | `POST /public/posts`                                               | `write`       |\n| `vibevo_add_social_account`                 | `POST /public/social-accounts`                                     | `write`       |\n| `vibevo_connect_social_account`             | `POST /public/social-accounts/{id}/connect`                        | `write`       |\n| `vibevo_start_social_account_verification`  | `POST /public/social-accounts/{id}/verification`                   | `write`       |\n| `vibevo_check_social_account_verification`  | `POST /public/social-accounts/{id}/verification/check`             | `write`       |\n| `vibevo_start_social_account_stats_session` | `POST /public/social-accounts/{id}/stats-session`                  | `write`       |\n| `vibevo_upload_social_account_stats`        | `POST .../stats-session` + `.../submit`                            | `write`       |\n| `vibevo_refresh_social_account_stats`       | `POST /public/social-accounts/{id}/refresh`                        | `write`       |\n\n| Tool                                  | Wraps                                                       | Scope     |\n| ------------------------------------- | ----------------------------------------------------------- | --------- |\n| `vibevo_list_factory_tags`            | `GET /public/factories/tags`                                | `read`    |\n| `vibevo_list_factory_tag_groups`      | `GET /public/factories/{id}/tag-groups`                     | `read`    |\n| `vibevo_get_monitoring_wallet`        | `GET /public/factories/credits`                             | `read`    |\n| `vibevo_get_factory_credits`          | `GET /public/factories/{id}/credits`                        | `read`    |\n| `vibevo_get_factory_credit_usage`     | `GET /public/factories/{id}/credit-usage`                   | `read`    |\n| `vibevo_list_factory_credit_history`  | `GET /public/factories/{id}/credit-history`                 | `read`    |\n| `vibevo_update_factory_scan_settings` | `PATCH /public/factories/{id}/credit-settings`              | `write` † |\n| `vibevo_set_factory_monitoring`       | `POST /public/factories/{id}/monitoring`                    | `write` † |\n| `vibevo_refresh_factory_post`         | `POST /public/factories/{id}/posts/{postId}/refresh`        | `write` † |\n| `vibevo_list_factory_reports`         | `GET /public/factories/{id}/share-links`                    | `read`    |\n| `vibevo_create_factory_report`        | `POST /public/factories/{id}/share-links`                   | `write` † |\n| `vibevo_revoke_factory_report`        | `POST /public/factories/{id}/share-links/{shareId}/revoke`  | `write` † |\n| `vibevo_restore_factory_report`       | `POST /public/factories/{id}/share-links/{shareId}/restore` | `write` † |\n| `vibevo_delete_factory_report`        | `DELETE /public/factories/{id}/share-links/{shareId}`       | `write` † |\n| `vibevo_buy_monitoring_tokens`        | `POST /public/factories/credits/purchase`                   | `write` † |\n\n| `vibevo_list_public_creator_catalog` | `GET /creator-catalog` (anonymous, no API key) | `public` |\n| `vibevo_get_public_creator_page` | `GET /creator-pages/{publicId}` (anonymous, no API key) | `public` |\n\n### Influencer placements (version 0.7.0)\n\nPlacement tools use the same `/api/v1/public` key, scopes, roles, account access,\ndeadlines, and actor-safe projections as the Web API. Brand responses contain\nonly the brand’s B/Fb/T and own outcome amounts; creator responses contain only\nthe creator’s B/Fc/N and own outcome amounts. Every creator offer includes the\nrequired freeze notice. Staff partial settlement and fee-setting tools are not\nexposed.\n\nThe package registers 48 placement tools alongside the existing campaign,\ncreator, factory, proof, and wallet tools. Authenticated requests go to\n`{VIBEVO_API_BASE_URL}/api/v1/public`; the base URL defaults to\n`https://api.vibevo.io`. Only the two published browse tools use the separate\nanonymous handlers at `/api/v1/creator-catalog` and\n`/api/v1/creator-pages/{publicId}`. The API key carries the account's current\nidentity and coarse scopes: `read` covers GET, while `write` covers mutations.\nThe API applies current role, account access, object permissions, rate limits,\nand the placements funding flag. Order lists and global placement analytics\naccept an optional `participantRole` (`BRAND` or `CREATOR`); the server checks\ncurrent role membership and object access, and dual-role accounts default to the\ncreator projection. Single-order reads and per-order analytics derive the side\nfrom fresh order membership; if the caller is both the brand and an assigned\ncreator in that order, the creator projection is used. Those per-order tools do\nnot accept a `participantRole` override. This selector never grants authority.\nThere is no staff tool.\n\n| Tool                                         | Wraps                                                                                | Scope    |\n| -------------------------------------------- | ------------------------------------------------------------------------------------ | -------- |\n| `vibevo_list_influencers`                    | `GET /creator-catalog` (anonymous compatibility alias)                               | `public` |\n| `vibevo_get_influencer`                      | `GET /creator-pages/{publicId}` (anonymous compatibility alias)                      | `public` |\n| `vibevo_get_my_influencer_profile`           | `GET /public/influencer-profile`                                                     | `read`   |\n| `vibevo_update_my_influencer_profile`        | `PATCH /public/influencer-profile`                                                   | `write`  |\n| `vibevo_submit_my_influencer_profile`        | `POST /public/influencer-profile/submit`                                             | `write`  |\n| `vibevo_get_my_account_placement_pricing`    | `GET /public/influencer-accounts/{accountId}/pricing`                                | `read`   |\n| `vibevo_update_my_account_placement_pricing` | `PUT /public/influencer-accounts/{accountId}/pricing`                                | `write`  |\n| `vibevo_list_my_influencer_channels`         | `GET /public/influencer-channels`                                                    | `read`   |\n| `vibevo_create_my_influencer_channel`        | `POST /public/influencer-channels`                                                   | `write`  |\n| `vibevo_get_my_influencer_channel`           | `GET /public/influencer-channels/{id}`                                               | `read`   |\n| `vibevo_start_channel_ownership_challenge`   | `POST /public/influencer-channels/{id}/ownership-challenge`                          | `write`  |\n| `vibevo_submit_channel_ownership_evidence`   | `POST /public/influencer-channels/{id}/ownership-evidence`                           | `write`  |\n| `vibevo_submit_my_influencer_channel`        | `POST /public/influencer-channels/{id}/submit`                                       | `write`  |\n| `vibevo_upload_channel_ownership_evidence`   | Private upload session, storage `PUT`, then `/ownership-uploads/{uploadId}/complete` | `write`  |\n| `vibevo_get_my_channel_placement_pricing`    | `GET /public/influencer-channels/{id}/pricing`                                       | `read`   |\n| `vibevo_update_my_channel_placement_pricing` | `PUT /public/influencer-channels/{id}/pricing`                                       | `write`  |\n| `vibevo_get_my_creator_page_preview`         | `GET /public/influencer-profile/page`                                                | `read`   |\n| `vibevo_generate_my_creator_page`            | `POST /public/influencer-profile/page/generate`                                      | `write`  |\n| `vibevo_publish_my_creator_page`             | `POST /public/influencer-profile/page/publish`                                       | `write`  |\n| `vibevo_unpublish_my_creator_page`           | `POST /public/influencer-profile/page/unpublish`                                     | `write`  |\n| `vibevo_create_placement_order`              | `POST /public/placement-orders`                                                      | `write`  |\n| `vibevo_update_placement_order`              | `PATCH /public/placement-orders/{id}`                                                | `write`  |\n| `vibevo_quote_placement_order`               | `POST /public/placement-orders/{id}/quote`                                           | `write`  |\n| `vibevo_checkout_placement_order`            | `POST /public/placement-orders/{id}/checkout`                                        | `write`  |\n| `vibevo_quote_custom_placement_offer`        | `POST /public/placement-offers/quote`                                                | `write`  |\n| `vibevo_send_custom_placement_offer`         | `POST /public/placement-offers`                                                      | `write`  |\n| `vibevo_list_placement_orders`               | `GET /public/placement-orders`                                                       | `read`   |\n| `vibevo_get_placement_order`                 | `GET /public/placement-orders/{id}`                                                  | `read`   |\n| `vibevo_list_placement_assignments`          | `GET /public/placement-assignments`                                                  | `read`   |\n| `vibevo_get_placement_assignment`            | `GET /public/placement-assignments/{id}`                                             | `read`   |\n| `vibevo_accept_placement_assignment`         | `POST /public/placement-assignments/{id}/accept`                                     | `write`  |\n| `vibevo_decline_placement_assignment`        | `POST /public/placement-assignments/{id}/decline`                                    | `write`  |\n| `vibevo_update_placement_deliverable`        | `PUT /public/placement-assignments/{id}/deliverables/{deliverableId}`                | `write`  |\n| `vibevo_upload_placement_evidence`           | Private upload session, storage `PUT`, then `/uploads/{uploadId}/complete`           | `write`  |\n| `vibevo_submit_placement_assignment`         | `POST /public/placement-assignments/{id}/submit`                                     | `write`  |\n| `vibevo_approve_placement_assignment`        | `POST /public/placement-assignments/{id}/approve`                                    | `write`  |\n| `vibevo_request_placement_changes`           | `POST /public/placement-assignments/{id}/request-changes`                            | `write`  |\n| `vibevo_open_placement_issue`                | `POST /public/placement-assignments/{id}/issues`                                     | `write`  |\n| `vibevo_cancel_placement_assignment`         | `POST /public/placement-assignments/{id}/cancel`                                     | `write`  |\n| `vibevo_propose_placement_reschedule`        | `POST /public/placement-assignments/{id}/change-proposals`                           | `write`  |\n| `vibevo_accept_placement_reschedule`         | `POST /public/placement-assignments/{id}/change-proposals/{proposalId}/accept`       | `write`  |\n| `vibevo_list_placement_assignment_events`    | `GET /public/placement-assignments/{id}/events`                                      | `read`   |\n| `vibevo_list_placement_deliverables`         | `GET /public/placement-assignments/{id}/deliverables`                                | `read`   |\n| `vibevo_download_placement_deliverable`      | `GET /public/placement-assignments/{id}/uploads/{uploadId}/download`                 | `read`   |\n| `vibevo_get_placement_analytics`             | `GET /public/analytics/placements`                                                   | `read`   |\n| `vibevo_get_placement_order_analytics`       | `GET /public/placement-orders/{id}/analytics`                                        | `read`   |\n\nEvery placement write requires a caller-supplied UUID `idempotencyKey`; reuse\nthe same key with the same payload when a request times out or its result is\nunknown. Reusing a key with a different payload returns a conflict. The API\nrechecks current access before replay and returns the operation's actor-safe\nprojection. Pricing mutation responses keep the immutable applied revision at\n`data.operation.version` and the freshly loaded pricing at\n`data.current.version`, which can be newer. Reserve, custom send, creator\naccept/decline, full approval, public page changes, and evidence submission\nrequire `confirm: true` in the MCP tool input. Tools that reserve, accept, or\napprove require a direct human instruction for that exact action.\nFor an optional prepaid month, provide both `periodStart` and `periodEnd` on an\norder item. They form the UTC half-open interval from the first day of a month\nat `00:00Z` to the first day of the next month at `00:00Z` (exclusive); each\nresult date must fall inside it and no later than `dueAt`. This uses calendar\nmonth arithmetic, not a rolling 30-day period, and a later month needs a new\nmanually confirmed order.\nNew reserves also follow the `PUBLIC_API_PLACEMENTS_WRITE` rollout flag; turning\nit off leaves already funded assignments available for their normal responses,\ndelivery, review, and issue flow.\n\nIDs in participant requests are positive integer IDs returned by this API;\npublic page IDs, upload IDs, challenge IDs, and idempotency keys are UUIDs.\nMutations that edit a saved revision include `expectedVersion` (or\n`expectedSourceRevision` for a creator page). Order line `results` contain one\n`{expectedAt, description?}` obligation per requested placement; the package\ndeadline is `dueAt`. Creator pricing chooses a server-owned `templateId` and\nprice/package/proof fields; type, title, unit, channel identity, and published\nrevision are derived by the API. Custom quotes use `expectedEndAt` and require\n`discountBps` as an integer from 0 through 10,000. Creator pricing keeps the\npublished quantity options 1, 5, and 10; custom offers support 1–10 results and\nrequire at least 500 cents after quantity and discount. For example, 125 cents\nper result × 5 at a 20% discount gives 500 cents and passes, while 100 cents\nper result × 5 at 10% gives 450 cents and is rejected. Checkout and custom send submit the quote UUID, version,\npayload hash, and `confirm: true`; the same idempotency UUID is reused for a\nretry.\n\nAn order cart accepts up to 20 creator/listing items. The same limit is enforced\nby Web, Core, and MCP before quote or reserve.\n\nOrder and assignment lists accept `status`, `participant` (counterpart name),\n`platform`, `periodFrom`, `periodTo`, `limit`, and a positive numeric `cursor`.\nThe date-only UTC period includes both boundary days: orders use their creation\ndate; assignments use the expected publication date. Assignments also accept\n`orderId`; orders accept `participantRole`. An optional `availablePlatforms`\nfacet is limited to this participant's accessible records. Assignment history\nreturns bounded typed references to a change proposal, deliverable revision, or\nsubmission revision; follow `nextCursor` to read older events. It includes no raw\nevent payload, private upload location, or financial-operation reference.\nIssue evidence is sent as\n`uploadIds` (up to 10 verified private uploads). Cancellation sends only\n`expectedVersion`; reschedule proposals send `expectedVersion`, `dueAt`, and an\noptional `reason`. The analytics tools accept optional ISO `from` and `to`\ntimestamps, with `from` required to precede `to` when both are present.\n\nSuccessful REST response bodies are checked against package-local validators\nmirroring the shared wire DTOs before they are returned to the agent. The\nvalidators require the `{data: ...}` envelope and pagination cursor, and remove\nunrecognized fields where the wire schema permits them; strict published and\nfinancial DTOs fail closed on unexpected fields. API errors preserve only the\nstructural code and permitted retry/operation identifiers; arbitrary response\ntext is not copied.\nMoney uses the API's six-decimal USDT micro-unit representation. Public browse\nDTOs contain the published safe projection; participant DTOs contain only the\ncalling party's permitted financial fields.\n\nCatalog filters are bounded and strict. `availability` currently accepts only\n`AVAILABLE`; the MCP does not advertise future-availability filters until the\nAPI has a persisted source for them. Catalog filters accept `STREAMER` or\n`SOCIAL`; returned profiles may be `HYBRID` when both service types exist, and\neither corresponding filter can include that profile. Public service prices are\nMoney values in USDT micro-units. Creator-owned pricing includes only its own\n`basePrice` and `creatorFinancial` (`base`, `fee`, `net`); no advertiser fee is\npart of that projection.\nThe optional `audienceGeo` filter accepts an ISO alpha-2 country code and\nnormalizes lowercase input to uppercase. It matches a positive share in the\nlatest current verified AUDIENCE snapshot for the same active published service\nchannel; when `platform` is also supplied, both filters must match that same\nchannel. The legacy `geo` filter still searches creator profile tags. Price\nsorting and its cursor remain based on each creator's minimum published service\nprice, which can differ from the matching service displayed for the filters.\nLive public channels may include `audience` from the existing verified native-account statistics: `source`, `capturedAt`, `verifiedAt`, `periodDays`, `geo` (AUDIENCE countries, percentages and ranks) and `demo` (AGE/GENDER buckets, percentages and ranks). Each channel keeps its own account's distributions; missing dimensions and minimal-platform reasons are unavailable, never invented zeroes. The bounded strict DTO excludes private snapshot/evidence/connection identifiers and files. Audience is a live display overlay; it is not copied into choice receipts or funded snapshots and does not change their metrics observation identity. Purged or invalid current observations cannot fall back to older audience data. Existing public catalog/page tools return the optional field; no new tool or scope is needed.\n\nBrand custom offers may omit `serviceListingId` only for `serviceType: UGC`\nwith exactly `PRIVATE_FILE` proof, addressed to the selected `creatorPublicId`.\nOther custom offers must name a real listing owned by that creator; the API\nchecks the listing, allowed proof modes, and channel reference. Quotes with no\nlisting return `serviceListingId: null`. Private file\nresults use `scope: FILE` and `channelRef: null`; they carry private upload IDs\ninstead of public URLs, content IDs, or social metrics. Deliverable updates may\nomit `channelRef` for this flow and do not invent an account or channel ID.\n\nEvidence upload tools accept only a local file path selected by the human.\nAssignment upload sessions send `expectedVersion`, `purpose` (`DELIVERABLE` or\n`ISSUE_EVIDENCE`), `fileName`, detected `contentType`, and `sizeBytes`; ownership\nsessions send the channel `expectedVersion`, `fileName`, detected `contentType`,\nand `sizeBytes`. They create a private upload session, PUT bytes to its signed\nURL without the VibeVO API key, and call the private completion route. MCP inputs do not accept\narbitrary remote URLs or base64 contents; paths, signed URLs, and bytes are\nomitted from results and API error messages.\nCompletion sends no claimed checksum or size: the server verifies the uploaded\nobject. Ownership evidence uses a channel-owned session before an order exists;\nplacement proof uses an assignment-owned session. Both use private storage and\nnever return a public object URL or storage key.\n\n`vibevo_download_placement_deliverable` reads one authorized assignment upload\nthrough the participant API and writes it into a newly generated private local\ndirectory (private directory permissions and an exclusively created `0600`\nfile). It accepts only the server's supported image, video, and PDF MIME types,\nwith 10 MiB, 100 MiB, and 50 MiB limits respectively, and enforces the actual\nstreamed size. The filename and extension come from the MIME type; the tool\nignores server-provided filenames, rejects redirects, accepts no destination\npath, and returns only the local path, content type, and byte count.\n\nFor authenticated routes, scopes are coarse: **`read`** covers every GET and\n**`write`** every mutation. Anonymous creator catalog/page GETs do not use an API\nkey. A configured key always has `read`; `write` is granted only if the account\nhas write access.\n† Content Factories are a separate product feature and their **writes must be\nenabled separately** from general write access (they spend money on scraping) —\nexpect `403` if not. `vibevo_refresh_factory_account` runs a paid scrape and is\ncapped at **once per hour per account** (`429 REFRESH_COOLDOWN`, with\n`retryAfterSec`). The underlying scanner also requires five minutes after the\nlatest scan recorded in the database, including an automatic scan\n(`429 MONITORING_MANUAL_REFRESH_COOLDOWN`, with `retryAfterSeconds`).\n`tracking_links` rows carry `uniqueClicks` (bot-filtered\ndistinct-device count, not raw hits). There is no test/sandbox mode — all keys\nare live.\n\n## ER and saves\n\nExisting campaign and factory tools pass the API response through unchanged; no\nadditional tool or API scope is needed. ER is `100 × (likes + comments) / views`,\nrounded to two decimals. It uses complete observed counters, excludes saves and\nreposts, and is `null` when the observed view total is zero or no complete\nobservation is available. Aggregate ER uses summed counters, not averaged rates.\n\nCampaign list/detail/analytics and campaign post/creator rows include `engagement`:\n\n```json\n{\n  \"scope\": \"accepted_video\",\n  \"views\": 100,\n  \"likes\": 0,\n  \"comments\": 0,\n  \"er\": 0,\n  \"saves\": null,\n  \"erCoverage\": { \"measuredPosts\": 1, \"totalPosts\": 2 },\n  \"savesCoverage\": { \"measuredPosts\": 0, \"totalPosts\": 2 },\n  \"updatedAt\": \"2026-10-09T08:00:00.000Z\",\n  \"savesUpdatedAt\": null\n}\n```\n\nThis scope covers accepted video posts only. A post row covers that post; a\ncreator row covers that account. Use `engagement.views` as the ER denominator;\nexisting `totalViews` and monetary fields keep their earlier semantics. Legacy\ncampaign history cannot prove the raw ER denominator; new values populate after\nordinary scans. This release does not trigger a mass paid rescan.\n\nFactories expose canonical ER as `metrics.er` (`totals.er` in summaries), with\n`saves`, `erCoverage`, `savesCoverage`, `updatedAt` and `savesUpdatedAt` alongside it.\nHistory points and `snapshotBaseline` use the same fields. Existing top-level\n`er` aliases retain earlier semantics; prefer the nested field when present.\nMissing fields from older servers do not prove measurement.\n\nAutomatic saves sources are TikTok's `collectCount` and X's `bookmarkCount`, when\nthe configured provider returns a valid count. Other platforms remain unavailable\nwithout a factual measurement. Preserve `0` (measured zero) and `null` (unknown).\nCoverage describes the whole selected cohort before pagination; partial coverage\nmeans a partial aggregate. Timestamps are the oldest included measurement times,\nor `null` when freshness is unknown. Carrying a last-known saves count forward\ndoes not refresh its timestamp. ER/saves trends are absolute snapshots, not growth.\n\n## Monitoring contracts\n\n- Tags: list tag groups (up to 10 per page), expand accounts with `tag`, then posts with\n  `factoryAccountId`. Aggregates cover the full filtered cohort, not just the current page.\n  Tags can overlap; their totals must not be added together.\n- ER is `100 × (likes + comments) / views`, rounded to two decimals; no views means `null`.\n  Factory, account and tag ER use summed counters, not an average of percentages.\n- Cadence: `intervalHours` accepts **24, 12, 10, 8, 6, 4**. The tool converts this to\n  `scansPerPostPerDay = 24 / intervalHours`; ten hours is 2.4, not a rounded integer.\n  `trackingDays` is 1–365. Resuming monitoring does not force an extra scan.\n- Token history contains credits/debits, not reservation/release events. Spending is\n  reported for all time, the last 30 days, and today (UTC). Omit the optional factory\n  id on usage/history tools to include all factories and shared-wallet purchases;\n  routes are `GET /public/factories/credits/usage` and `GET /public/factories/credits/history`.\n- Token purchases require explicit user approval (`confirm: true`). First read pricing\n  with `vibevo_get_monitoring_wallet`. Reuse the same `purchaseId` UUID for retries;\n  changing it creates another purchase.\n- Report creation accepts `hiddenFields`; omission means all report fields visible.\n  Available fields: views, likes, comments, saves, er, averageViews, medianViews, followers,\n  tags, published, duration, hashtags, contentType, lastScanned, scanState,\n  advertisement, platform, creator, posts, accounts.\n  Hidden source fields also hide derived values/links. Redaction applies server-side\n  to summaries, rows, trends and baselines. Hiding saves removes its count,\n  coverage and freshness. Hiding views/likes/comments removes dependent ER;\n  hiding posts removes coverage, and lastScanned removes measurement timestamps.\n  Row IDs and pagination remain structural; hiding a\n  count does not conceal the existence of enumerable rows. Staff report links remain\n  separate. Save the secret `sharePath` returned at creation; list responses omit it.\n\n## Validation\n\n`npm test` builds this standalone package and runs a stdio contract test against a\nloopback HTTP fixture, with a fake key. It never calls production or spends tokens.\n\n## Local development\n\n```bash\ncd mcp\nnpm install\nnpm run build\n```\n\n## Run\n\n```bash\nVIBEVO_API_KEY=vibevo_live_xxxxxxxxxxxx.<secret> \\\nVIBEVO_API_BASE_URL=https://api.vibevo.io \\\nVIBEVO_ACTIVE_ACCOUNT_ID=12345 \\\nnode dist/index.js\n```\n\nCreate an API key in your VibeVO account settings with the permissions the agent needs.\nKeep the key private; do not commit it to a repository or share it in chat.\n\n## Claude Desktop config\n\nPoint the client at the npm package via `npx` (no local checkout needed):\n\n```json\n{\n  \"mcpServers\": {\n    \"vibevo\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@vibevo/mcp\"],\n      \"env\": { \"VIBEVO_API_KEY\": \"vibevo_live_...\" }\n    }\n  }\n}\n```\n\nFor local development against a checkout, use the built entrypoint instead:\n\n```json\n{\n  \"mcpServers\": {\n    \"vibevo\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/VibeVO/mcp/dist/index.js\"],\n      \"env\": { \"VIBEVO_API_KEY\": \"vibevo_live_...\" }\n    }\n  }\n}\n```\n\n## Env\n\n| Var                        | Required                | Default                 |\n| -------------------------- | ----------------------- | ----------------------- |\n| `VIBEVO_API_KEY`           | for authenticated tools | —                       |\n| `VIBEVO_API_BASE_URL`      | no                      | `https://api.vibevo.io` |\n| `VIBEVO_ACTIVE_ACCOUNT_ID` | no                      | API-key owner's account |\n\n`VIBEVO_ACTIVE_ACCOUNT_ID` is an optional positive account ID for delegated\nadvertiser placement work. The MCP server sends `X-Active-Account-Id` only with\nauthenticated placement order, offer, assignment, and analytics requests,\nincluding private deliverable downloads. The\nAPI key remains the actor; Core checks the selected account against fresh\nread/write access on every request. A missing variable uses the API-key owner's\naccount, and malformed or unsafe integer values stop startup. The selector does\nnot apply to anonymous public catalog/page reads, creator profile/channel\noperations, or the direct PUT to a server-signed private upload URL.\n","readmeFilename":"README.md"}