As someone with ADHD, I built this because context-switching between documentation, form builders, and actual work destroys my flow. Now I can stay in one conversation and just describe what I need.
The interesting technical challenges:
1. API Complexity Abstraction Tally's API requires deeply nested objects for simple fields. An email field needs ~10 nested objects with UUIDs. I built a translation layer so users can just say "add an email field" in natural language, and the server handles the complex structure behind the scenes.
2. Safe Bulk Operations For destructive operations, I implemented a preview-then-confirm pattern. The server generates a confirmation token during preview that must be passed back for execution. This prevents accidental mass deletions while keeping the conversation flow natural.
3. Smart Rate Limiting The server monitors API responses and adjusts its behavior dynamically. When hitting rate limits, it automatically reduces batch sizes and adds delays between requests. Added randomization to prevent multiple instances from hitting the API simultaneously.
4. Type Safety Throughout Full TypeScript with runtime validation for both MCP messages and Tally API responses. This caught several undocumented API quirks during development.
Performance notes: - Batch creation of 100 forms: ~12 seconds with batched operations - Individual creation of 100 forms: ~5 minutes due to rate limits - Human creation of 100 forms: probably a full week of mind-numbing clicking - Submission analysis across 10K responses: ~3 seconds
The code is ISC licensed: https://github.com/learnwithcc/tally-mcp
This particularly helps when you need to create multiple similar forms but your brain rebels at repetitive tasks. Curious if others are building MCP servers and what workflows you're optimizing for.
Also interested in thoughts on MCP vs traditional CLI tools. The conversational interface is slower for simple operations but much better for complex, multi-step tasks where you might forget the exact syntax.