proxima-primitive is an Astro component library I put together in a single day: 32 components, seven categories, shadcn-style docs where every example is not a screenshot but a live render right on the page. Separate from the docs site, the repository ships an MCP server: an agent can query it directly and get props, source and examples without touching a single file by hand.

A stack with no extra weight
Astro 7.2.9 and Tailwind v4, no React, Vue or any other rendering library -
every component is a server-rendered .astro file. The dependencies that
actually show up in the interface: shiki for code highlighting in the docs,
astro-icon for icons, tw-glass and tw-shimmer, two Tailwind plugins each
with a showcase component built around it. zod validates the MCP tool
inputs. Nothing else on top.
Components worth the visit
The library is honestly full of down-to-earth things like Button, Badge
and Breadcrumbs, but the motion section is where it gets interesting.


tw-glass builds the effect with zero JavaScript: the filter is a data:
URI holding an inline SVG displacement map on a CSS custom property, and
backdrop-filter reads it natively. filterUnits="objectBoundingBox" means
the refraction scales with the element instead of being pinned to a pixel
size.






The local MCP server
The repository has a .mcp.json at its root, and it is not a demo, it is a
working server: bun mcp/server.ts, JSON-RPC over stdio, no port and no
hosting. An agent working inside this repository picks it up automatically;
an agent elsewhere just needs the absolute path to server.ts in its client
config.
{
"mcpServers": {
"proxima-components": {
"command": "bun",
"args": ["mcp/server.ts"]
}
}
}Four tools:
| Tool | What it does |
|---|---|
list_components |
every component by category, with an optional category filter |
get_component |
full docs: description, usage examples, props |
get_component_source |
raw source of the implementation file |
search_components |
keyword search across names, descriptions and docs |
Every component is also readable as a resource at
proxima://components/{id}. The point is not to stop an agent from reading
files at all, it is to remove the guesswork: asking search_components for
“gradient text” beats scanning src/components by name.
Why the docs and the MCP server cannot drift apart
The server keeps no separate copy of component data. mcp/registry.ts
hand-parses src/content/components/*.mdx: the frontmatter, the docs body,
and every ```astro fence in order. The same file also renders the page in
the browser. One source means it is impossible for the docs to say one thing
and the MCP tool to answer another.
That is also written down as a hard rule in the project’s CLAUDE.md: add a
component or change its props, and update mcp/registry.ts in the same pass,
then verify:
bun -e 'import { loadComponents } from "./mcp/registry.ts"; console.log(await loadComponents())'A second rule sits next to it: a new component is not done until it shows up
in the docs navigation. The sidebar in DocsLayout.astro is built from the
components collection, grouped by the category in its frontmatter - a
valid category is usually enough, but a running astro dev does not always
pick up a new collection file, so the real check is a clean build.