The problem
Ask someone where they find the answer and you get a shrug: PDFs, exports, transcripts, shared drives, a Slack thread from last year. There was no single source of truth. Agents had no structured, permissioned way to pull org context either.
Once knowledge becomes uploadable, PHI risk shows up immediately. I added PII/PHI scanning to Ayin Wiki so someone can’t casually drop protected data into the corpus. The design problem after that was making the gate fail closed on real PHI without blocking every technical doc that mentions a URL, version string, or system name.
Research
- Internal knowledge-worker interviews
- Corpus and scanner false-positive review
- Role mapping (reader / creator / admin / agent)
- Ingest-mode experiments
- Pilot sampling (time-to-answer)
I mixed “where do you actually find the answer?” interviews with a hard look at the corpus and how a first-pass scanner behaved on technical writing. That feedback shaped the two-stage PHI gate: catch real PHI, don’t punish legitimate ops and eng content.
Role mapping clarified four surfaces: readers, creators, admins, and agents via MCP. Ingest-mode experiments (rewrite vs format-only) came straight from creators who refused to let a cheap model “improve” careful markdown. In the pilot we sampled median time to a trusted snippet before vs after wiki search / Ask AI.
What I owned
End-to-end product design for the Quasar SPA (reader, creator, admin), the ingest and regen mental models, and the agent path: an MCP server people can connect from their own tools, with Okta so access is identity-bound. I also designed the bridge to an LLM-ready Figma design system so AI-assisted projects start with the same tokens and components as human-built product UI.
Approach
One corpus for people and agents: gate PHI on the way in, Okta on the way out (app and MCP).
Hypothesis: one corpus, two audiences (people in the app and agents on MCP), with upload-time PHI protection and authenticated agent access—not a shared open socket. Goal: faster trusted answers, no casual PHI in the wiki, and a way for individuals to wire their own agents in under Okta.
Product model
- Readers browse, search, and cross-link structured markdown pages.
- Creators upload raw docs, pick an ingest mode, trigger regeneration.
- Admins own prompts, models, categories, quality, workspaces, members.
- Agents hit the same pages through an MCP server I built, with tools like
wiki.search,wiki.getPage, andwiki.listCategory.
MCP server + Okta
The wiki SPA is signed in with Okta—same identity plane as the rest of how people access Ayin. “Ask AI” in the app is for someone already in that session. That wasn’t enough for how teams work with agents, so I built an MCP server on the same corpus: point Claude, Cursor, or another MCP client at Ayin Wiki and pull structured pages without inventing a second knowledge base.
MCP access uses Okta as well, so the agent runs as a real person (or a service identity our org already manages). Permissions and audit stay tied to who connected—same story as human readers in the SPA.
- Same truth: MCP tools read the same structured pages the SPA shows. No “agent corpus” that drifts from what humans approve.
- Same identity: Okta for the browser app and for MCP clients. You’re connecting your agent under our org’s identity, not anonymous scraping.
- Discoverable tools: search, get page, list category—enough for grounded answers and navigation without dumping the whole wiki into context by default.
- Transport: HTTP + SSE for MCP clients that need a durable remote server, not only a local stdio toy.
The product story for hiring managers: this is the same pattern I design for ops AI—sources visible, human-controlled access, no black-box side channel into regulated knowledge.
Decisions that mattered
Two ingest modes
Rewrite for messy source material. Format-only for already-good markdown: body stays intact; only frontmatter, wiki-links, and related/sources append. Cheap models don’t quietly ruin careful writing.
Two-stage PHI gate
I put PII/PHI scanning on the ingest path so protected data can’t slip in with an upload. Stage one is a scanner pass (e.g. Comprehend); stage two is an LLM adjudicator only when something is flagged. Quarantine needs both stages to agree. Fail closed. Keep an audit trail. That keeps real PHI out without blocking every technical doc that looks “personal” to a naive pattern match.
Design system for LLMs
Packaging the Figma system for model consumption means Accelerator prototypes and product UIs start from the same primitives. “AI-first workflows” shouldn’t mean off-brand one-offs.
Median time to locate an approved policy or procedure snippet. Sample of knowledge workers during pilot.
Real PHI blocked; technical docs adjudicated, not auto-rejected
Product intent: prevent PHI in the corpus while keeping ops/eng docs shippable.


Architecture (short)
Quasar SPA → API Gateway / Lambdas → S3 raw/extracted → SQS → regen worker (Bedrock) → pages + DynamoDB. Auth is Okta for both the SPA and the MCP path—people sign into the wiki the same identity way their agents connect over HTTP+SSE.
Results
- One path from raw upload to a human page and an agent-readable surface.
- PHI scanning on upload so protected data can’t casually enter the corpus.
- Two-stage adjudication so technical writers and engineers can still ship real docs.
- An MCP server with Okta so people connect their own agents to the same approved pages.
- A design-system-for-LLM bridge so AI builds stay on product UI language.
Why this still matters
If people and agents read different knowledge, demos lie and decisions drift. If uploads skip PHI checks, you inherit risk. Wiki keeps one corpus, a real gate on the way in, and Okta for both the app and MCP clients—so whoever’s asking, human or agent, hits approved pages under a real identity.
Stack
Vue 3 · Quasar 2 · TypeScript · AWS CDK · Okta (SPA + MCP clients) · API Gateway · Lambda · S3 · SQS · Bedrock · Comprehend · MCP (HTTP+SSE) · CloudFront
