tailwindcss-docs-mcp 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -167
- package/dist/server.js +7 -7
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,75 +1,24 @@
|
|
|
1
1
|
# tailwindcss-docs-mcp
|
|
2
2
|
|
|
3
|
-
[](https://www.npmjs.com/package/tailwindcss-docs-mcp)
|
|
4
|
+
[](https://tailwindcss.com/docs)
|
|
5
|
+
[](https://v3.tailwindcss.com/docs)
|
|
5
6
|
|
|
6
|
-
|
|
7
|
+
## LLMs Hallucinate Tailwind Classes. This Fixes That.
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
Your AI assistant just confidently suggested `bg-opacity-50` — a class that hasn't existed since Tailwind v3. It also recommended `flex-gap-4`, which was never a thing. It's not searching documentation. It's guessing from training data.
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
This MCP server downloads the official Tailwind CSS docs, embeds them locally, and gives your assistant real search over real documentation. No API keys, no external services, everything on your machine. Just Node.js 18+.
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
- **Hybrid search** — semantic similarity + FTS5 keyword matching, combined with reciprocal rank fusion for consistently relevant results.
|
|
14
|
-
- **Query expansion** — understands Tailwind class names. Searching `text-lg` automatically includes "font size"; `mx-auto` includes "margin".
|
|
15
|
-
- **Tailwind v3 + v4** — full documentation for both major versions, switchable per query.
|
|
16
|
-
- **Fully local embeddings** — `snowflake-arctic-embed-xs` (22M params, 384 dims) runs in-process via ONNX. Nothing leaves your machine.
|
|
17
|
-
- **Incremental indexing** — SHA-256 content hashing per chunk. Only changed content gets re-embedded on refresh.
|
|
13
|
+
## Getting Started
|
|
18
14
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
- **Node.js 18+**
|
|
22
|
-
|
|
23
|
-
That's it. No Ollama, no Python, no external services. The embedding model (~27 MB) downloads automatically on first run.
|
|
24
|
-
|
|
25
|
-
## Installation
|
|
26
|
-
|
|
27
|
-
Add to your MCP client configuration:
|
|
28
|
-
|
|
29
|
-
```json
|
|
30
|
-
{
|
|
31
|
-
"mcpServers": {
|
|
32
|
-
"tailwindcss-docs-mcp": {
|
|
33
|
-
"command": "npx",
|
|
34
|
-
"args": ["-y", "tailwindcss-docs-mcp"]
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
<details>
|
|
41
|
-
<summary>Claude Code</summary>
|
|
15
|
+
**Claude Code**
|
|
42
16
|
|
|
43
17
|
```bash
|
|
44
18
|
claude mcp add tailwindcss-docs-mcp -- npx -y tailwindcss-docs-mcp
|
|
45
19
|
```
|
|
46
20
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
<details>
|
|
50
|
-
<summary>VS Code</summary>
|
|
51
|
-
|
|
52
|
-
Add to your user or workspace `settings.json`:
|
|
53
|
-
|
|
54
|
-
```json
|
|
55
|
-
{
|
|
56
|
-
"mcp": {
|
|
57
|
-
"servers": {
|
|
58
|
-
"tailwindcss-docs-mcp": {
|
|
59
|
-
"command": "npx",
|
|
60
|
-
"args": ["-y", "tailwindcss-docs-mcp"]
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
</details>
|
|
68
|
-
|
|
69
|
-
<details>
|
|
70
|
-
<summary>Cursor / Windsurf</summary>
|
|
71
|
-
|
|
72
|
-
Add to your project's `.mcp.json`:
|
|
21
|
+
**Other MCP clients** (Claude Desktop, Cursor, Windsurf, etc.)
|
|
73
22
|
|
|
74
23
|
```json
|
|
75
24
|
{
|
|
@@ -82,110 +31,17 @@ Add to your project's `.mcp.json`:
|
|
|
82
31
|
}
|
|
83
32
|
```
|
|
84
33
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
<details>
|
|
88
|
-
<summary>Tailwind CSS v3</summary>
|
|
89
|
-
|
|
90
|
-
Set the default version via environment variable:
|
|
91
|
-
|
|
92
|
-
```json
|
|
93
|
-
{
|
|
94
|
-
"mcpServers": {
|
|
95
|
-
"tailwindcss-docs-mcp": {
|
|
96
|
-
"command": "npx",
|
|
97
|
-
"args": ["-y", "tailwindcss-docs-mcp"],
|
|
98
|
-
"env": {
|
|
99
|
-
"TAILWIND_DOCS_MCP_DEFAULT_VERSION": "v3"
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
</details>
|
|
107
|
-
|
|
108
|
-
### Getting started
|
|
109
|
-
|
|
110
|
-
On first boot the embedding model downloads in the background (~30 seconds). The server is usable immediately — tools that need embeddings return a status message until the model is ready.
|
|
111
|
-
|
|
112
|
-
The first time you ask a Tailwind question, your assistant will automatically call `fetch_docs` to download and index the documentation. This happens once — subsequent queries use the local index.
|
|
113
|
-
|
|
114
|
-
**Example prompts:**
|
|
115
|
-
|
|
116
|
-
- _"How do I center a div with Tailwind?"_
|
|
117
|
-
- _"Show me the grid layout utilities"_
|
|
118
|
-
- _"What's the dark mode configuration in v4?"_
|
|
119
|
-
- _"Search for responsive padding classes"_
|
|
120
|
-
|
|
121
|
-
## Tools
|
|
122
|
-
|
|
123
|
-
### `search_docs`
|
|
124
|
-
|
|
125
|
-
Search indexed documentation using natural language. Returns relevant snippets with code examples and deep links to tailwindcss.com.
|
|
126
|
-
|
|
127
|
-
| Parameter | Type | Default | Description |
|
|
128
|
-
| --------- | -------- | ------- | ----------------------------- |
|
|
129
|
-
| `query` | `string` | — | Natural language search query |
|
|
130
|
-
| `version` | `string` | `"v4"` | `"v3"` or `"v4"` |
|
|
131
|
-
| `limit` | `number` | `5` | Results to return (1-20) |
|
|
34
|
+
The embedding model downloads on first boot (~30 seconds), the docs index automatically, and every Tailwind question hits the local index from then on. No setup, no commands to run.
|
|
132
35
|
|
|
133
|
-
|
|
36
|
+
**Using Tailwind v3?** Set `"env": { "TAILWIND_DOCS_MCP_DEFAULT_VERSION": "v3" }` in your config.
|
|
134
37
|
|
|
135
|
-
|
|
38
|
+
**Custom data directory?** Set `TAILWIND_DOCS_MCP_PATH` (default: `~/.tailwindcss-docs-mcp`).
|
|
136
39
|
|
|
137
|
-
|
|
138
|
-
| --------- | --------- | ------- | ---------------------------------- |
|
|
139
|
-
| `version` | `string` | `"v4"` | `"v3"` or `"v4"` |
|
|
140
|
-
| `force` | `boolean` | `false` | Re-download even if already cached |
|
|
40
|
+
## What It Does
|
|
141
41
|
|
|
142
|
-
|
|
42
|
+
Your assistant gets four tools — `search_docs`, `fetch_docs`, `list_utilities`, and `check_status` — and calls them automatically when you ask Tailwind questions.
|
|
143
43
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
| Parameter | Type | Default | Description |
|
|
147
|
-
| ---------- | -------- | ------- | ----------------------- |
|
|
148
|
-
| `category` | `string` | — | Filter by category name |
|
|
149
|
-
| `version` | `string` | `"v4"` | `"v3"` or `"v4"` |
|
|
150
|
-
|
|
151
|
-
### `check_status`
|
|
152
|
-
|
|
153
|
-
Check index state — document counts, embedding model status, and last indexed time.
|
|
154
|
-
|
|
155
|
-
| Parameter | Type | Default | Description |
|
|
156
|
-
| --------- | -------- | ------- | --------------------------------------- |
|
|
157
|
-
| `version` | `string` | — | Check specific version, or omit for all |
|
|
158
|
-
|
|
159
|
-
## How it works
|
|
160
|
-
|
|
161
|
-
```
|
|
162
|
-
GitHub MDX ─→ Parse ─→ Chunk by heading ─→ Embed (ONNX) ─→ SQLite
|
|
163
|
-
│
|
|
164
|
-
search_docs ◄───┘
|
|
165
|
-
├─ Semantic: cosine similarity
|
|
166
|
-
├─ Keyword: FTS5 full-text
|
|
167
|
-
└─ Reciprocal rank fusion
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
1. **Fetch** — downloads MDX source files from the `tailwindcss.com` GitHub repo (v3: `master` branch, v4: `next` branch).
|
|
171
|
-
2. **Chunk** — splits documents by heading hierarchy (`##` → `###` → paragraphs), keeping code blocks intact. ~500 tokens per chunk.
|
|
172
|
-
3. **Embed** — generates 384-dim vectors using `snowflake-arctic-embed-xs` running locally via ONNX. No external API calls.
|
|
173
|
-
4. **Search** — runs semantic similarity and FTS5 keyword search in parallel, merges results with reciprocal rank fusion. Class-name queries get boosted keyword weight.
|
|
174
|
-
|
|
175
|
-
## Configuration
|
|
176
|
-
|
|
177
|
-
| Variable | Default | Description |
|
|
178
|
-
| ----------------------------------- | ------------------------- | -------------------------------------- |
|
|
179
|
-
| `TAILWIND_DOCS_MCP_DEFAULT_VERSION` | `v4` | Default Tailwind version for all tools |
|
|
180
|
-
| `TAILWIND_DOCS_MCP_PATH` | `~/.tailwindcss-docs-mcp` | Data directory (database + cache) |
|
|
181
|
-
|
|
182
|
-
## Troubleshooting
|
|
183
|
-
|
|
184
|
-
**"Embedding model is initializing"** — The ONNX model (~27 MB) is still downloading. Wait ~30 seconds and try again, or use `check_status` to monitor progress.
|
|
185
|
-
|
|
186
|
-
**"Index not built for this version"** — Documentation hasn't been fetched yet. Ask your assistant _"Fetch the Tailwind CSS v4 docs"_ or call `fetch_docs` directly.
|
|
187
|
-
|
|
188
|
-
**Getting v3 results when you expect v4** — Set the default version in your MCP config (see [Tailwind CSS v3](#installation) above) or pass `version: "v4"` explicitly in your query.
|
|
44
|
+
Search is hybrid: semantic vectors and full-text keywords run in parallel, merged with reciprocal rank fusion. Class names like `text-lg` or `mx-auto` are automatically expanded to their CSS properties. Both Tailwind v3 and v4 are indexed independently and switchable per query. Everything runs locally via [snowflake-arctic-embed-xs](https://huggingface.co/Snowflake/snowflake-arctic-embed-xs) and SQLite — nothing leaves your machine.
|
|
189
45
|
|
|
190
46
|
## Development
|
|
191
47
|
|
|
@@ -193,20 +49,19 @@ GitHub MDX ─→ Parse ─→ Chunk by heading ─→ Embed (ONNX) ─→ SQLit
|
|
|
193
49
|
git clone https://github.com/vitalis/tailwindcss-docs-mcp.git
|
|
194
50
|
cd tailwindcss-docs-mcp
|
|
195
51
|
bun install
|
|
196
|
-
|
|
197
|
-
bun run
|
|
198
|
-
|
|
199
|
-
bunx biome check src/ test/ # Lint + format check
|
|
52
|
+
bun run test # vitest
|
|
53
|
+
bun run build # tsc
|
|
54
|
+
bunx biome check src/ # lint
|
|
200
55
|
```
|
|
201
56
|
|
|
202
|
-
##
|
|
57
|
+
## Getting Help
|
|
203
58
|
|
|
204
|
-
|
|
59
|
+
[](https://github.com/vitalis/tailwindcss-docs-mcp/issues)
|
|
205
60
|
|
|
206
61
|
## Acknowledgments
|
|
207
62
|
|
|
208
|
-
|
|
63
|
+
[](https://github.com/bradleygolden/hexdocs-mcp)
|
|
209
64
|
|
|
210
65
|
## License
|
|
211
66
|
|
|
212
|
-
[MIT](LICENSE)
|
|
67
|
+
[](LICENSE)
|
package/dist/server.js
CHANGED
|
@@ -52,7 +52,7 @@ export async function createServer(deps, transport) {
|
|
|
52
52
|
version: SERVER_VERSION,
|
|
53
53
|
});
|
|
54
54
|
// Register fetch_docs
|
|
55
|
-
server.tool(TOOL_NAMES.FETCH_DOCS, "
|
|
55
|
+
server.tool(TOOL_NAMES.FETCH_DOCS, "Download and index Tailwind CSS documentation from GitHub. Documentation is indexed automatically on first server start — you do not need to call this unless the user explicitly asks to refresh or re-index, or to index a different version than the default. Use with force: true to re-download after a new Tailwind CSS release.", {
|
|
56
56
|
version: z.enum(["v4", "v3"]).optional().describe("Tailwind CSS major version (default: v4)"),
|
|
57
57
|
force: z
|
|
58
58
|
.boolean()
|
|
@@ -68,12 +68,12 @@ export async function createServer(deps, transport) {
|
|
|
68
68
|
}
|
|
69
69
|
});
|
|
70
70
|
// Register search_docs
|
|
71
|
-
server.tool(TOOL_NAMES.SEARCH_DOCS, "Search Tailwind CSS documentation using natural language.
|
|
71
|
+
server.tool(TOOL_NAMES.SEARCH_DOCS, "Search Tailwind CSS documentation using natural language. Use this when the user asks a specific question about Tailwind utilities, classes, configuration, or concepts (e.g., 'how do I center a div', 'dark mode setup', 'responsive padding'). Returns ranked documentation sections with headings, content, code examples, and links to tailwindcss.com. Do NOT use this for browsing or discovering what utility categories exist — use list_utilities instead. Present the returned markdown documentation directly to the user without reformatting into tables or summaries.", {
|
|
72
72
|
query: z
|
|
73
73
|
.string()
|
|
74
74
|
.describe("Natural language search query (e.g., 'how to add responsive padding', 'dark mode configuration', 'grid layout with gaps')"),
|
|
75
75
|
version: z
|
|
76
|
-
.enum(["
|
|
76
|
+
.enum(["v4", "v3"])
|
|
77
77
|
.optional()
|
|
78
78
|
.describe("Tailwind CSS major version to search (default: v4)"),
|
|
79
79
|
limit: z
|
|
@@ -93,7 +93,7 @@ export async function createServer(deps, transport) {
|
|
|
93
93
|
}
|
|
94
94
|
});
|
|
95
95
|
// Register list_utilities (does not require embedder)
|
|
96
|
-
server.tool(TOOL_NAMES.LIST_UTILITIES, "List
|
|
96
|
+
server.tool(TOOL_NAMES.LIST_UTILITIES, "List Tailwind CSS utility categories and their documentation pages. Use this when the user wants to browse, discover, or explore what utilities are available (e.g., 'what layout utilities exist', 'show me the effects category', 'list all spacing utilities'). Returns category names with descriptions and links to each utility's documentation page on tailwindcss.com. This is a browsing tool — it shows what categories and pages exist, not detailed usage. Do NOT follow up with search_docs unless the user explicitly asks a specific question. Present the returned list directly to the user.", {
|
|
97
97
|
category: z
|
|
98
98
|
.string()
|
|
99
99
|
.optional()
|
|
@@ -110,11 +110,11 @@ export async function createServer(deps, transport) {
|
|
|
110
110
|
}
|
|
111
111
|
});
|
|
112
112
|
// Register check_status (does not require embedder)
|
|
113
|
-
server.tool(TOOL_NAMES.CHECK_STATUS, "Check the current
|
|
113
|
+
server.tool(TOOL_NAMES.CHECK_STATUS, "Check the current state of the Tailwind CSS documentation index. Returns which versions are indexed, document and chunk counts, embedding model status, and when each version was last indexed. Use this to verify the index is ready or to diagnose why search_docs returns no results.", {
|
|
114
114
|
version: z
|
|
115
|
-
.enum(["
|
|
115
|
+
.enum(["v4", "v3"])
|
|
116
116
|
.optional()
|
|
117
|
-
.describe("Check specific version (
|
|
117
|
+
.describe("Check specific version (v4 or v3). Omit to check all."),
|
|
118
118
|
}, (params) => {
|
|
119
119
|
try {
|
|
120
120
|
const result = handleCheckStatus(params, db, embedderStatus, indexingStatus);
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG/E,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,KAAK,CAC5C,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAC5C,CAAC;AAEzB;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,UAAU,EAAE,YAAY;IACxB,WAAW,EAAE,aAAa;IAC1B,cAAc,EAAE,gBAAgB;IAChC,YAAY,EAAE,cAAc;CACpB,CAAC;AAsCX,MAAM,CAAC,MAAM,wBAAwB,GAAmC;IACtE,OAAO,EAAE,sEAAsE;IAC/E,WAAW,EAAE,qEAAqE;IAClF,KAAK,EAAE,2BAA2B;IAClC,MAAM,EAAE,gEAAgE;CACzE,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAgB,EAAE,SAAqB;IACxE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;IAC5B,IAAI,QAAQ,GAAoB,IAAI,CAAC,QAAQ,CAAC;IAC9C,IAAI,cAAc,GAAmB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,IAAI,cAAc,GAAmB,MAAM,CAAC;IAE5C,SAAS,eAAe;QACtB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,cAAc,CAAC,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,SAAS,SAAS,CAAC,KAAc;QAC/B,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;YAC/D,OAAO,EAAE,IAAa;SACvB,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,cAAc;KACxB,CAAC,CAAC;IAEH,sBAAsB;IACtB,MAAM,CAAC,IAAI,CACT,UAAU,CAAC,UAAU,EACrB,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|