Skip to content

Ship the Mukoko Events MCP: deploy it live, publish to registry, land dual-domain + search, then split MCP/admin into their own repos #100

Description

@bryanfawcett

Work spec for a follow-up session. The MCP is fully built in code but not serving in production, and several adjacent pieces are staged in open PRs. This issue is the ordered checklist to finish it.

Background — what's already merged to main

This session merged, verified green (lint + 716 app tests + 58 admin tests + builds):

The MCP server code (worker/) is complete: dual-era protocol (legacy + 2026-07-28 beta), titles/annotations, input and output schemas, structured content, server.json. claude plugin validate passes on both manifests.


1. 🔴 Deploy the Worker — make events.mukoko.com/mcp actually live (highest priority)

Current state: POST https://events.mukoko.com/mcp returns the Next.js app HTML with an x-vercel-id header — i.e. the request falls through to Vercel because the Cloudflare Worker route is not intercepting /mcp/*. nhimbe.com/mcp also (correctly) does not serve the MCP.

Do:

  • Ensure the events.mukoko.com DNS record on the mukoko.com Cloudflare zone is Proxied (orange cloud) in front of Vercel (see worker/README.md → "DNS / routing").
  • Deploy the Worker: cd worker && npx wrangler deploy --env production (needs Cloudflare auth / CLOUDFLARE_API_TOKEN). wrangler.toml already registers only the events.mukoko.com/mcp + /mcp/* routes.
  • Verify live:
    curl https://events.mukoko.com/mcp -X POST -H 'content-type: application/json' \
      -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
    
    Expect the 5 tools with title, annotations, inputSchema, outputSchemanot app HTML / an x-vercel-id header.
  • Confirm nhimbe.com/mcp still does not serve the MCP (hard rule: single MCP domain).

2. Publish to the MCP registry

  • worker/server.json (name com.mukoko/nhimbe-events) is ready. Publish per worker/README.md → "MCP registry": verify the com.mukoko DNS namespace via a TXT record on mukoko.com, mcp-publisher login dns --domain mukoko.com, then cd worker && mcp-publisher publish.
  • Keep version in server.json and worker/package.json in lockstep on each release.

3. Land the two open PRs (staged, off an older main — rebase first)

  • feat(seo): dual-domain support — one canonical origin (events.mukoko.com) #92 — dual-domain (events.mukoko.com + nhimbe.com, canonical = events.mukoko.com). Rebase onto main, merge. Then the ops follow-ups (not code): add both domains to the Vercel project; register both /callback URLs in WorkOS; set NEXT_PUBLIC_SITE_URL=https://events.mukoko.com (prod + preview).
  • feat(search): hybrid vector⊕full-text retrieval (RRF) with graceful fallback #93 — hybrid search (vector ⊕ full-text RRF with graceful fallback). Rebase onto main, merge. Then the platform DB asks in docs/search-platform-requests.md: create event_vector_index on events.eventEmbeddings (768-dim cosine + city/category filters) and events_text_index (Atlas Search) on events.events; later upgrade the cluster to 8.1 for native $rankFusion + evaluate automated (Voyage) embeddings.

4. Split MCP and admin into their own repos

Both are extraction-ready (self-contained, share no code with the app beyond HTTP APIs).

  • nyuchi/mukoko-events-mcp ← move worker/ (+ the plugins/, .claude-plugin/marketplace.json, connectors/, and top-level skills/ distribution surfaces, or decide which travel with it). Update repository/source fields in worker/package.json, worker/server.json, plugin.json, marketplace.json. Remove the worker jobs from this repo's ci.yml and add a deploy workflow in the new repo.
  • nyuchi/mukoko-events-admin ← move admin/. It's currently a hoisted npm workspace member that imports the root src/* via @/* tsconfig paths — extraction needs those shared modules vendored or published, so plan that dependency break before moving. Give it its own Vercel project wiring (already documented in admin/README.md).

5. Follow-ups / smaller items

  • Palette → autocomplete: once feat(search): hybrid vector⊕full-text retrieval (RRF) with graceful fallback #93 merges, switch the header ⌘K live search from searchEventsAction to the lighter autocompleteEventsAction for snappier per-keystroke results (src/components/layout/header.tsx).
  • SSR-first sweep: these pages are "use client" and could be server-rendered for the SSR-first goal — evaluate/convert where they don't need client state: /search, /my-events, /calendar, /profile. (Core browse surfaces — home, /discover, /events, /events/[id] — are already SSR.)
  • MongoDB "repeated things": a duplicate-data concern was raised but not pinpointed. Swept collections (campfire.conversations, events.events, identity.persons, entity.entities) were clean; needs the specific collection/screen to investigate.

Guardrails

  • Single MCP domain: the MCP is served only at events.mukoko.com/mcp, never nhimbe.com/mcp. The app stays dual-domain; the MCP does not.
  • Worker owns no data: every tool calls the app's public HTTP API; the app is the single trust boundary (WorkOS bearer verified in src/lib/auth/workos-token.ts).
  • Repo house style: claude/<topic> branches, draft PRs, squash-merge.

🤖 Generated with Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions