Research Lens · MCP server

Synthesis, against the actual evidence.

The usual AI research workflow is copy and paste. You move transcript chunks into a chat window, the model summarises them, and you get something fluent back. Two things go wrong. The model only sees what you happened to paste, so it cannot tell you how many participants raised a theme or whether round two improved on round one. And the output has no citations, so you cannot trace a claim back to who said it.

That is not a model problem. It is an access problem.

The constraint: the server retrieves and counts. It does not interpret. Every excerpt returns with a participant ID, round and timestamp. The researcher still writes the finding. The tool supplies the evidence and states its limits.

Run the tools

These five tools are what an AI assistant calls over MCP. This page runs the identical functions in your browser so you can read the raw responses without a chat client. docs/verify_parity.mjs diffs this page's output against the server's, so the demo cannot drift from the real implementation.

Design decisions worth defending

Citations are mandatory, not optional

Every excerpt returns as [P14 | R2 | 08:47]. A finding you cannot trace is a finding you cannot defend in a stakeholder review.

Participant counts, not quote counts

pattern_frequency counts distinct participants, because three quotes from one person is not a pattern. It splits by segment for the same reason.

The server says what it cannot tell you

draft_findings ends with a NOT SUPPORTED section: no causal claims, no generalising past the sample. An AI that sounds confident about six participants is a liability in research.

No interpretation

The tools never say what a finding means. That judgment stays with the researcher. This is the line between AI that accelerates research and AI that quietly replaces thinking with plausible text.

The data behind this demo

The schema takes any study: sessions, segments, rounds, tagged excerpts, SUS scores. Quotes here are paraphrased and anonymised for portfolio use.

Stack

TypeScript, Node, @modelcontextprotocol/sdk, stdio transport. The server runs locally and connects to any MCP client. This page is static: no build step, no dependencies, no backend.