🚀 Inspiration

We’re all guilty of scrambling for context five minutes before a call—jumping between LinkedIn, company “About” pages, and half-baked Google searches. Meeting prep turns that chaos into a single click: paste a LinkedIn URL and instantly receive an ice-breaker plus smart, open-ended questions you can lead with. No more tab-surfing, no more awkward silences.


🪄 What it does

  1. One-field input. The React front-end (frontend/src/App.tsx) takes a LinkedIn URL and optional notes.
  2. Streaming magic. A single POST to /api/report-stream opens a Server-Sent Events (SSE) channel. While Claude and Perplexity are researching, we push live logs—tool calls, intermediate thoughts, even spinner animations.
  3. Multi-tool reasoning.
    • Perplexity Ask (via @chatmcp/server-perplexity-ask) handles real-time web look-ups.
    • Claude 3 Sonnet synthesizes findings into a strict JSON dossier via the Model Context Protocol (MCP).
  4. Zero parsing errors. The custom MCP tool return_meeting_dossier forces Claude to respond with:

    {
     "status": "complete",
     "opener": "…",
     "questions": [ { "q": "…", "why": "…" } ]
    }
    
  5. Front-end render. As soon as status === "complete", React swaps the spinner for:

  • a two-sentence personalized ice-breaker
  • 3–5 high-leverage questions, each with a one-line rationale.

Total turnaround: 7–12 s, including real-time progress.


🏗️ How we built it

Layer Key files / libs Highlights
Front-end App.tsx, index.css, React 18, TypeScript SSE reader decodes incremental chunks, progressive logs with fadeIn CSS, mobile-first monospace UI
API backend/server.js, Express, Zod, helmet, rate-limit Two endpoints: JSON (/api/report) and streaming (/api/report-stream) with abuse protection (30 req/min)
AI orchestration backend/mcpClient.js, @modelcontextprotocol/sdk, Anthropic SDK Launches Perplexity Ask as a local MCP tool server; dialogue loop retries until return_meeting_dossier fires; schema-validated JSON
Security & Ops .env.example, CORS, TLS-ready reverse proxy No secrets in repo; keys via process.env; helmet removes X-Powered-By

🧱 Challenges we ran into

  • Gumloop scraping limits. Free tier throttled to 100 req/day → added caching and graceful fallback to user-pasted notes.
  • Strict JSON or bust. Claude loves to chat; MCP tools force discipline, but only after we sandboxed the convo and validated each reply.
  • SSE in React 18. Vanilla EventSource has no back-pressure; we built a getReader loop to stream >64 KB payloads without freezes.

✨ Accomplishments we’re proud of

  • Full-stack streaming in <48 h: URL → live logs → final dossier.
  • 99.9 % JSON validity after schema-driven retries—zero judge-side parsing errors.
  • Security-first defaults: helmet, rate-limit, env-only API keys, zero-trust CORS.
  • UX delight: retro monospace, playful 2 px borders, micro-animations.

📚 What we learned

  • Model Context Protocol is the glue that lets any LLM call any tool—no bespoke adapters.
  • Prompt engineering ≠ copywriting: enforcing structure matters more than adjective tuning.
  • SSE > WebSockets for one-way, fire-and-forget updates—lighter infra, no ping/pong.

🔮 What’s next for Meeting prep

Milestone Description
Calendar plug-in Auto-detect participants from invites → pre-generate dossiers 5 min before the call.
Slack slash-command /meetingprep @alice returns dossier in-thread.
Multi-party fusion Collate profiles of all attendees and suggest cross-team synergy questions.
Voice mode Whisper transcription of intros → real-time follow-ups in EarPods.

🛠️ Built With

  • Backend: Node.js • Express • Zod • express-rate-limit • helmet • dotenv • picocolors
  • AI / Tooling: Anthropic Claude 3 Sonnet • Perplexity Ask • Model Context Protocol SDK
  • Frontend: React 18 • TypeScript • Vite/CRA • vanilla CSS animations
  • Utilities: Gumloop Scrape API • AbortController • Server-Sent Events

▶️ Try it out

git clone https://github.com/your-org/when2meet-mcp-2025.git
cd when2meet-mcp-2025
cp backend/.env.example backend/.env    # add your API keys
npm run dev                             # starts both front- and back-end
# open http://localhost:5173 and paste any LinkedIn URL

(Public demo will be live at *https://meetingprep.ai** once quotas reset.)*


📂 GitHub Repo

https://github.com/your-org/when2meet-mcp-2025

Happy judging—see you in the winner’s circle!

Share this project:

Updates