For agents
How AI agents connect to the handbook, the habits they follow and a prompt to paste.
Bridge in one paragraph
Read this first. Bridge is many apps for venture networks (Bridge OS first, then Intros, Portfolio, Raise and others), all built on one package, @brdgapp/ui. Each app has its own frame and habits, so start from the app's page under Apps, and tell plan_screen which app you're building for. The look is calm and dense: Mulish, frosted glass cards over a dot-grid background, light and dark, and one blue button per group. Bridge OS as it is today is the standard, with the inconsistencies settled on 2 November 2026; DESIGN.md records it, and where code and DESIGN.md disagree, DESIGN.md wins.
Examples use a sample network: you are Ana Ruiz, Platform Lead at Lanternfield Capital, and you know people like Leah Okonkwo (Saltmarsh Partners) and Priya Natarajan (Quillbase). The sample's today is 16 September 2026. Write copy like that: real people, real intros, sentence case.
What agents get
AI coding agents (Claude Code, Cursor and others) read this handbook the same way people do, but through a connection made for them. Everything they get comes from the same files these pages are built from, so agents and people never see different rules.
Agents can only read. Nothing here changes a file in your app.
Connect an agent
The handbook runs an MCP server at https://apps-bridge-design-system-handbook.vercel.app/mcp. It's open: no login or key.
Bridge OS is already set up: its move onto the package (the open merge request) adds this server to its .mcp.json, so agents in Bridge OS find it on their own once that merges.
Claude Code
Run this in the app's folder. It writes a .mcp.json file you can commit, so everyone on the app gets the server.
claude mcp add --transport http --scope project bridge-handbook https://apps-bridge-design-system-handbook.vercel.app/mcpOr write .mcp.json yourself:
{
"mcpServers": {
"bridge-handbook": {
"type": "http",
"url": "https://apps-bridge-design-system-handbook.vercel.app/mcp"
}
}
}The Claude app (desktop or claude.ai)
For designing or asking questions outside a code editor. In Settings → Connectors, choose Add custom connector, name it bridge-handbook and paste https://apps-bridge-design-system-handbook.vercel.app/mcp. On Team and Enterprise plans, an owner may need to add it for the organization first.
Cursor
Add .cursor/mcp.json to the app's folder (or ~/.cursor/mcp.json for every project):
{
"mcpServers": {
"bridge-handbook": {
"url": "https://apps-bridge-design-system-handbook.vercel.app/mcp"
}
}
}Tools that only start local servers
Some tools can't connect to a web address. mcp-remote bridges the gap:
{
"mcpServers": {
"bridge-handbook": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://apps-bridge-design-system-handbook.vercel.app/mcp"]
}
}
}What the server offers
| Tool | What it does |
|---|---|
orient | Call this first in every session. |
search_handbook | Finds up to 8 pages (components, patterns, templates, foundations) for a job or keyword, best first, each with a one-line reason. |
list_pages | Browse the handbook by section, and for components by level, category or status. |
get_page | One handbook page by slug (e.g. 'components/button', 'patterns/loading-empty-error', 'templates/record-page'). |
get_examples | The real source of a page's live examples, exactly as rendered in the handbook (sample network data included). |
recommend_for_job | 1–4 components for a UI job described in plain words, each with its import path, why it fits, and what to use instead in the cases it doesn't. |
get_tokens | Live token values from the package stylesheet: name, light value, dark value and group, plus contrast for the pairs Bridge uses. |
plan_screen | From a description of a new screen and the Bridge app it's for: the app's frame, widths and habits; what's different if you're coming from another app and how people arrive from it; the template to start from (with why, how sure, and alternatives); similar existing screens and their files; relevant patterns, components, the files the screen touches, and the screen recipe to finish with. |
find_similar_screens | Existing Bridge screens doing a similar job, from the app pages: name, app, route, template and the file that draws it. |
find_icon | The icon for a job, in plain words ('delete a contact', 'a company', 'archive'). |
check_code | Checks one file of UI code against Bridge's mechanical rules: hex and palette colors, other icon sets, emoji, retired icons, Lucide logos and hand-made logos, strokeWidth, dark: patches, Radix or forked imports, hand-made buttons, restyled components, brand fills, page-level loading returns, hidden error states, window.confirm, title tooltips, text under 11px, vague labels, Title Case, two primary buttons. |
get_skill | A step-by-step workflow naming which tools to call in what order. |
get_skill returns a step-by-step workflow. There are these:
design-a-screen: Build a new Bridge screen from a description.pick-components: Choose the right components for a piece of UI.review-a-screen: Review existing code against the handbook.use-a-component: Use one component correctly.apply-foundations: Get color, type, spacing and shape right.
If the server isn't available
Agents fall back in this order:
- The MCP server,
https://apps-bridge-design-system-handbook.vercel.app/mcp. https://apps-bridge-design-system-handbook.vercel.app/llms.txt: the brief, how to build, every rule, the Never list and an index of every page.https://apps-bridge-design-system-handbook.vercel.app/llms-full.txt: all of that plus every component, pattern and template in full, DESIGN.md and the tokens.- The repository itself:
registry/rules.tsfor rules and each component'sguidance.ts.
Add this to each app
Paste this into the app's CLAUDE.md (Claude Code) or AGENTS.md (Cursor and others), so agents use the handbook without being asked.
## Design system
This app uses Bridge's design system: the `@brdgapp/ui` package and its handbook at https://apps-bridge-design-system-handbook.vercel.app.
- Before building any screen, call the `bridge-handbook` MCP server: `orient` first, then `plan_screen` with the Bridge app the screen is for.
- If the MCP server isn't available, read https://apps-bridge-design-system-handbook.vercel.app/llms.txt (short) or https://apps-bridge-design-system-handbook.vercel.app/llms-full.txt (everything).
- Import only from `@brdgapp/ui`. Never hand-make a button, tag, menu, tooltip, dialog or table.
- Colors only as role tokens (`bg-[var(--surface-secondary)]`). No hex, no palette classes, no `dark:` fixes.
- `className` on a package component is for layout only; the look comes from `variant` and `size`.
- Every data region goes through `DataState` with a same-size skeleton.
- Copy is sentence case and real: real-sounding people, intros and organizations. Never Lorem, "Click here" or "Submit".
- Before finishing, run `check_code` on what you wrote and walk the screen recipe.A prompt to paste
For a one-off screen, start the agent with this and fill in the first line.
Build this screen for Bridge <app, e.g. Bridge OS>: <describe the screen>.
Use the bridge-handbook MCP server (https://apps-bridge-design-system-handbook.vercel.app/mcp). Call orient first, then plan_screen with my description and the app (and the app I'm coming from, if I name one).
Read every template, pattern and component it names with get_page, and copy from get_examples.
Import only from @brdgapp/ui. If no component fits a job, tell me instead of making one.
Write sentence-case copy with real-sounding people and intros (the handbook's sample network), never Lorem or "Click here".
When you're done, run check_code on your code, fix what it finds, and walk the screen recipe.
Tell me which template you used, which checks you ran, and anything the checker couldn't judge.Always
- Call
orientfirst, thenplan_screenfor a new screen, thenget_pagefor every template, pattern and component you will use. - Import only from
@brdgapp/ui. If search doesn't return a component for the job, don't invent one: use the closest, or say what's missing. - Start every screen from a template (Picking a template); never invent a new page frame.
- Give every data region its loading, empty and error state through DataState.
- Write real copy in sentence case: real-sounding people, intros and organizations (the sample network: Ana Ruiz, Leah Okonkwo, Priya Natarajan…). Never Lorem, "Click here", "Submit" or Title Case.
- Run
check_codeon what you wrote, fix what it reports, then walk the screen recipe.
Never
| Never | Instead | Rule |
|---|---|---|
| A hand-made button, chip or menu | Use Button, Tag or ActionMenu. | One of each |
| Hex, rgb() or palette classes in a component | Use a role token. | Colors are tokens |
A dark: class to fix a color | Fix the token instead. | Colors are tokens |
| Restyling a package component with className | Pick the variant and size. | The look comes from props |
Filling a button with --primary or --error | Use the -solid tokens. | Fill with -solid |
error ? null | Keep the frame; show the error body. | The frame stays |
if (isLoading) return <Skeleton /> for a whole page | Let each part load on its own. | Each part loads on its own |
| Content that pops in and pushes the page down | Reserve its space with a same-height skeleton. | Reserve the space |
| Glass inside glass | Use dividers or a light bordered box inside a card. | Glass, once |
The browser's title attribute as an explanation | Use InfoHint or Tip. | One of each |
window.confirm | Use ConfirmDialog. | One of each |
| Buttons labeled OK, Yes, Submit or Click here | Name the action. | Say what happens |
| "Are you sure?" as a dialog title | Ask about the specific thing. | Say what happens |
| "Oops", emoji or error codes in user-facing errors | Say what happened and what to do. | Say what happens |
| Text below 11px (other than the Badge) | Use the type scale. | Nothing below 11px |
| Title Case in the interface | Use sentence case. | Sentence case |
Which component for which job
Built from each component's own guidance (its first "when to use" line).
| Job | Component |
|---|---|
primary for the main action of a group, such as Save or Make intro. | Button |
| Close a dialog, drawer or banner. | IconButton |
| An intro's status, using Bridge's status colors (accepted green, forwarded blue, waiting yellow, declined red, requested purple). | Tag |
| A short marker next to a name or title: Alum, Beta, Live, New. | Badge |
| Any region that fetches data: a table, a list, a stat tile, a card body. | DataState |
| Two or three closely related actions on the same thing. | ButtonGroup |
| Several views of one page or record, where people move back and forth. | Tabs |
| Switching how one view is shown: a time range, a sort direction, a theme. | SegmentedControl |
| A short row of filters above a list. | FilterChip |
| A setting that applies the moment it's flipped: notifications, visibility, appearance options. | Switch |
| Any short typed value in a form: names, emails, links, domains, numbers. | Input |
| Any typed value that can run past one line: notes on a contact, a bio, the message in an intro request, feedback. | Textarea |
| One per row, plus “Select all” in the header, when people act on many rows at once. | Checkbox |
| Rarely used or risky settings under “Advanced”, like disconnecting an account. | Collapsible |
| On a person's name or face in a feed, table or list, to show who they are. | Hover card |
| Any block of related content on a page: a list of intros, a table, a settings form, a profile section. | Card |
The loading body of a card, table or list, passed to DataState's skeleton. | Skeleton |
| On a sign-in or sync button: “Continue with Google”, “Sync contacts from Microsoft”. | BrandMark |
| Next to a person's name in rows, lists, feeds, cards and drawers. | Avatar |
| Every question in a form: Add a network, Edit contact, settings that save with a button. | Field |
| Searching a list, table or tab. | SearchInput |
row: a contact-info list on a profile. | CopyField |
| A person's bio on a profile card or row, where space is tight. | ExpandableBio |
| A page-wide message that applies to everything below it. | PageBanner |
| InfoHint: a stat or column whose meaning isn't obvious ("Intros accepted"). | InfoHint, HoverTip and Tip |
| Secondary actions on a row or card: Make intro, Edit, Stop sharing. | ActionMenu |
| Before an action that's hard to undo or affects someone else: Stop sharing, Disconnect, Delete. | ConfirmDialog |
| Confirming an action that happened out of sight: copied, saved, sent. | Toast |
| One filter with three to ten choices above a table or list: degree, status, category. | FilterPill |
| As a DataTable column's header, for columns people compare: dates, counts, ratings. | ColumnSortButton |
| A column whose values are a short fixed list: category, status, source. | ColumnFilterMenu |
| A free-text list of short entries: sectors, types of people, keywords. | TagInput |
| Any list of records people scan, compare or open: people, organizations, intros, invites. | DataTable |
| Creating or editing a record that fits in a few fields. | Dialog |
| Details of a row people opened from a table or feed. | Drawer |
| A picker or filter on a phone, below 768px. Above that, the same choices open as a menu. | Bottom sheet |
| A row of headline numbers on a dashboard or profile. | StatBox |
The screen recipe
Agents walk this before calling a screen done. It's the same list on Build a screen.
- It sits in the app shell: the top bar and page background come from the shell; the page sets only its width (
LAYOUT_*). - Every control is a package component; nothing is hand-made. (One of each)
- No component is restyled:
classNameonly for layout. (The look comes from props) - Colors are tokens: no hex, no palette classes, no
dark:fixes. (Colors are tokens) - One blue button per group of actions. (One blue button per group)
- Every data region goes through DataState and loads on its own; make it slow and make it fail to check. (Each part loads on its own)
- Nothing jumps when data arrives: skeletons are measured. (Reserve the space)
- Counts come from the list they count; a failed count never shows 0. (Counts match what's shown)
- No glass inside glass. (Glass, once)
- Copy: sentence case, verbs on buttons, one date format, no words from the avoid list. (Sentence case)
- Text is 11px or larger (except the Badge); numbers in columns use
tabular-nums. (Nothing below 11px) - Tab through it: everything reachable, focus always visible, every control named. (Every control has a name)
- Check dark mode, 390px and 1440px.
Not decided yet
Until these are settled, follow Bridge OS as it is today.
- How app-cc-mobile (React Native) agents should use the handbook, since the package is web-only.
Known gaps
Where Bridge OS code differs from this page today. Follow the page, not the gap.
- The Bridge skills (
bridge-design-systemand the others) still carry their own design rules. Decided 2026-11-02: they point at this handbook instead. The new versions are drafted and waiting to be uploaded.
Sources
- The tool list is read from the handbook's own MCP server when this page builds.
- The Always list, job map, recipe and Never list come from the same files the MCP server and llms.txt use.
- Setup formats checked against the Claude Code MCP docs (code.claude.com/docs/en/mcp) and Cursor MCP docs (cursor.com/docs/context/mcp) on 2 November 2026.
- Decisions 2026-11-02: #12 (skills point at the handbook), #13 (components.md keeps only Bridge OS's product components), the Bridge OS consistency picks.
- Sample network:
sample/network.ts.