jujugrowth-mcp 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/server.mjs +40 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jujugrowth-mcp",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "MCP server connecting your AI coding assistant (Claude, Cursor, Codex) to jujugrowth — pull your living marketing plan's dev tasks + recommendations and apply them in your repo.",
5
5
  "type": "module",
6
6
  "bin": {
package/server.mjs CHANGED
@@ -180,6 +180,14 @@ const TOOLS = [
180
180
  inputSchema: { type: "object", properties: {}, additionalProperties: false },
181
181
  run: async () => call("GET", "/build-opportunities"),
182
182
  },
183
+ {
184
+ name: "get_build_resources",
185
+ operator: true,
186
+ description:
187
+ "OPERATOR TOKEN ONLY. The BUILD RESOURCE MANIFEST: how to reach every portfolio integration when building an asset — DOMAIN (Namecheap: register AND verify the domain), EMAIL (Resend), IMAGE_GEN (JUJU-PERFECT), GEO (jujuGEO), GEM (Google Merchant), METRICS (push into jujugrowth metric_facts), GA4, JG_HOOKS (GTM + monitoring beacon + partner contract), GITHUB, AWS — plus the cross-cutting requirements (design, security, compliance, backups, cost, born-safe) to bake in. SECURITY: it serves the spec + how-to + secret NAMES only, NEVER raw secret values; read each value at build time by its name from .env / Secrets Manager. Call this once before building. Returns 403 for non-admin tokens.",
188
+ inputSchema: { type: "object", properties: {}, additionalProperties: false },
189
+ run: async () => call("GET", "/build-resources"),
190
+ },
183
191
  {
184
192
  name: "get_opportunity_build_brief",
185
193
  operator: true,
@@ -193,11 +201,40 @@ const TOOLS = [
193
201
  },
194
202
  run: async (a) => call("GET", `/build-opportunities/${a.id}`),
195
203
  },
204
+ {
205
+ name: "submit_opportunity_plan",
206
+ operator: true,
207
+ description:
208
+ "OPERATOR TOKEN ONLY. PLAN FIRST — before building, submit your plan for the owner's review: what you'll build, the stack, pages/features, design direction, integrations (domain, GA4, JG hooks, partner API), and the cost shape. Pass the opportunity `id` and the `plan` (markdown). The owner reviews it in the Opportunity Explorer; poll get_opportunity_plan_status and build only once it's approved.",
209
+ inputSchema: {
210
+ type: "object",
211
+ properties: {
212
+ id: { type: "string", description: "the opportunity id" },
213
+ plan: { type: "string", description: "the build plan (markdown)" },
214
+ },
215
+ required: ["id", "plan"],
216
+ additionalProperties: false,
217
+ },
218
+ run: async (a) => call("POST", `/build-opportunities/${a.id}/plan`, { plan: a.plan }),
219
+ },
220
+ {
221
+ name: "get_opportunity_plan_status",
222
+ operator: true,
223
+ description:
224
+ "OPERATOR TOKEN ONLY. The owner's review decision on your submitted plan: 'submitted' (wait), 'approved' (BUILD it), or 'changes_requested' (revise per the feedback, then submit_opportunity_plan again). Pass the opportunity `id`.",
225
+ inputSchema: {
226
+ type: "object",
227
+ properties: { id: { type: "string", description: "the opportunity id" } },
228
+ required: ["id"],
229
+ additionalProperties: false,
230
+ },
231
+ run: async (a) => call("GET", `/build-opportunities/${a.id}/plan-status`),
232
+ },
196
233
  {
197
234
  name: "mark_opportunity_built",
198
235
  operator: true,
199
236
  description:
200
- "OPERATOR TOKEN ONLY. Report an opportunity BUILT & live after you've deployed it. jujugrowth marks it launched, reconnects its tracking, and starts measuring its real outcome (and promoting it). Pass the opportunity `id`. Returns 403 for non-admin tokens.",
237
+ "OPERATOR TOKEN ONLY. Report an opportunity BUILT after you've actually built + DEPLOYED it live (not localhost). jujugrowth marks it 'built', awaiting the owner's go-live approval; once approved, JG reconnects its tracking + promotes it. Pass the opportunity `id`. Returns 403 for non-admin tokens.",
201
238
  inputSchema: {
202
239
  type: "object",
203
240
  properties: { id: { type: "string", description: "the opportunity id" } },
@@ -238,7 +275,8 @@ async function handle(msg) {
238
275
  "3) Before changing anything, VERIFY current-state claims against the actual code — they can be stale; skip what's already done.\n" +
239
276
  "4) Implement in the user's repo, scoped to wording/structure/SEO/tracking the plan asks for. Show a diff / open a PR for the user to review.\n" +
240
277
  "5) ALWAYS report completion once shipped, don't wait to be told: mark_recommendation_handled for a recommendation, or mark_plan_task_handled (with the task's action + a note) for a plan task — that's how the plan learns the work happened and marks the step done.\n" +
241
- "Campaigns and ad budgets are NOT here — those are owner decisions the jujugrowth system runs itself. This server is bound to ONE site; never act on another.",
278
+ "Campaigns and ad budgets are NOT here — those are owner decisions the jujugrowth system runs itself. This server is bound to ONE site; never act on another.\n" +
279
+ "\nOPERATOR (admin token only) — the BUILD CHANNEL: list_build_opportunities → get_opportunity_build_brief → get_build_resources (the integration manifest: domain, EMAIL via Resend, image-gen, GEO/GEM, JG hooks, GA4, GitHub, AWS — secret NAMES only, never values) → submit_opportunity_plan (PLAN FIRST, owner approves) → build + DEPLOY live → mark_opportunity_built. You MUST register AND VERIFY the asset's domain (DNS propagation + TLS + Resend email-auth records) — a bought-but-unverified domain is NOT done. These operator tools are hidden from non-admin tokens.",
242
280
  },
243
281
  });
244
282
  }