apps/e2e/**. Each project runs the same Notes + Tasks apps but wires a different auth mode, transport policy, and consent experience so you can validate clients before touching your own code.
Projects at a glance
| Project | Mode | Default port | Highlights | Serve command |
|---|---|---|---|---|
demo-e2e-public | public | 3003 | Anonymous sessions with scoped tools, Streamable HTTP + JSON fallback | pnpm nx serve demo-e2e-public --port 3003 |
demo-e2e-orchestrated | orchestrated (local) | 3005 | Stateful sessions, consent UI, incremental auth controls | pnpm nx serve demo-e2e-orchestrated --port 3005 |
demo-e2e-transparent | transparent | 3004 | Proxies tokens to a remote IdP while keeping local consent + transport policies | pnpm nx serve demo-e2e-transparent --port 3004 |
All commands assume
pnpm install has already been run at the repo root. Replace the port if it conflicts with another service.Run a demo locally
1
Pick a project
Decide which auth mode to explore (
demo-e2e-public, demo-e2e-transparent, or demo-e2e-orchestrated).2
Configure environment
Transparent mode needs an upstream IdP. Export
IDP_PROVIDER_URL and IDP_EXPECTED_AUDIENCE before serving:3
Serve the project
Run
pnpm nx serve <project> --port <port> and wait for the Listening on log. Requests are available at http://localhost:<port>.curl http://localhost:<port>/health returns ok when the server is ready.demo-e2e-public: instant anonymous access
apps/e2e/demo-e2e-public/src/main.ts
- Exercises the
auth.publicAccesspath without any login UI. - Turns on stateful HTTP so you can hit tools and resources via plain JSON for smoke tests.
- Leaves Streamable HTTP enabled for real MCP clients while skipping the
initializehandshake.
demo-e2e-orchestrated: built-in OAuth server
apps/e2e/demo-e2e-orchestrated/src/main.ts
- Spins up the full OAuth 2.1 stack (authorization code + PKCE) entirely inside FrontMCP.
- Shows the consent UI grouping tools by app, plus incremental auth defaults.
- Uses the same transport defaults documented in Transport controls so you can compare behavior with production builds.
demo-e2e-transparent: pass-through tokens
apps/e2e/demo-e2e-transparent/src/main.ts
- Validates upstream JWTs while reusing the same consent UI and transport toggles.
- Demonstrates how to forward-declare an IdP without shipping secrets—set
IDP_PROVIDER_URL/IDP_EXPECTED_AUDIENCEper environment. - Keeps anonymous access off so every tool call requires a verified token.
If your IdP exposes a JWKS file, frontload the URL in
remote.jwksUri to skip metadata discovery during tests.Test with @frontmcp/testing
You can point the Jest fixtures at any demo by spinning it up through the built-inTestServer helper:
demo-public.e2e.ts

