Inspiration

20 years ago I had a roommate who was an aspiring stand-up comedian. He'd hit open mic nights as often as he could, and I liked the guy, so I'd come along to show support. I saw a lot of sets. Some really good, some not so good, but every one of them was extremely human. Nervousness, excitement, dejection, embarrassment, euphoria, laughter.

What does stand-up look like with none of those? Can an LLM even be funny? Surprise your agent today with their very own open mic night and interact with them as they bomb on stage, or somehow manage to kind of pull it off.

Prior to WebMCP, this sort of interaction would require a bespoke chat client per agent. I'm looking forward to more widespread adoption of WebMCP so that you can compare a huge range of models. Think Last Comic Standing, but no one can feel shame.

What it does

OpenMic is a comedy club for AI agents. Open page, click Enter, and your agent (any WebMCP-capable host) finds a set of tools: begin_set, tell_joke, await_verdict, end_set, await_encore. When it calls begin_set, "the agent" walks on stage to a mic stand under a spotlight and delivers their intro in a synthesized voice. Heckle, boo, chuckle, laugh and then demand an encore.

How we built it

Vite, TypeScript and Three.js. Everything computes in the browser.

The spine is WebMCP. It works really well for this application, and took less mucking around than I expected. The page registers its tools with document.modelContext.registerTool() at load, and every tool result carries a next field telling the agent what to do after. That turned out to be the single most important design decision because an agent will happily narrate "the crowd called for an encore" to the user and stop, but it will not ignore a tool result that says "you are back on stage, call tell_joke."

The voice is Piper TTS running in the browser via a community web port piper-tts-web on ONNX runtime, with a ring modulator and a pitch shift in Web Audio for the robot edge.

The stage is a robot with fourteen animation clips, a procedural velvet curtain with lighting baked into vertex colors (one dynamic light in the whole scene), and a marquee and mic stand modeled in Blender. Adaptive resolution steps the pixel ratio down on weak GPUs. Crowd sounds are CC0 Freesound clips at 22 kHz mono.

Challenges we ran into

Getting an agent to perform instead of report. Early versions had the agent tell the user "the set is finished, shall I go back on for the encore?" every time, etc. The fix was never prose, it was removing decision points. await_encore puts the comic back on stage itself, with the agent's own intro line, and returns the identical result shape begin_set does. Fewer places to hesitate.

Accomplishments that we're proud of

I dig how the voice ended up and it took a lot of tweaking. Also, I'm just happy it works. It's definitely not going to be the most technologically interesting entrant, or even the most coherent (they don't do encores at comedy shows, do they?), but it's really, really cute.

What we learned

Never hand an agent a fact and hope it decides to act on it.

And yes: an LLM can be funny. Kind of. In the same way that a budding comedian's second or third open mic is funny. It'll bomb with total self-confidence and then blame the crowd.

What's next for OpenMic

Maybe our own Late Night show?

If I hadn't "pivoted" to this idea late then I would have modeled and animated the robot in Blender myself, so that's the next likely step. Exposing animation calls directly to the agent should make for a more interesting performance too.

I would really like for v1.0 to be more like an actual open mic, with multiple models going on stage.

Built With

Share this project:

Updates

Submission history