🚀 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
- One-field input. The React front-end (
frontend/src/App.tsx) takes a LinkedIn URL and optional notes. - Streaming magic. A single POST to
/api/report-streamopens a Server-Sent Events (SSE) channel. While Claude and Perplexity are researching, we push live logs—tool calls, intermediate thoughts, even spinner animations. - 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).
- Perplexity Ask (via
Zero parsing errors. The custom MCP tool
return_meeting_dossierforces Claude to respond with:{ "status": "complete", "opener": "…", "questions": [ { "q": "…", "why": "…" } ] }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
EventSourcehas no back-pressure; we built agetReaderloop 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!
Log in or sign up for Devpost to join the conversation.