|
6 | 6 | as a self-contained marketplace (its marketplace.json points at "./"): |
7 | 7 |
|
8 | 8 | skills/ claude/ rules/ snippets/ templates/ LICENSE files |
9 | | - .claude-plugin/ and .cursor-plugin/ manifests, the Cursor logo, and a short README |
| 9 | + .claude-plugin/ and .cursor-plugin/ manifests, the Cursor logo, mcp.json, |
| 10 | + and a short README |
10 | 11 |
|
11 | 12 | python scripts/build_plugin_dist.py --out DIR # build (DIR must be absent or empty) |
12 | 13 | python scripts/build_plugin_dist.py --out DIR --force # replace a previous build in DIR |
|
32 | 33 | DIRS = ("skills", "claude", "rules", "snippets", "templates") |
33 | 34 | # The Cursor manifest ships too, so Cursor users can install the same slim |
34 | 35 | # tree as a local plugin (~/.cursor/plugins/local/) instead of the full repo. |
35 | | -# assets/favicon.svg is the Cursor manifest's "logo". |
| 36 | +# assets/favicon.svg is the Cursor manifest's "logo". mcp.json is both |
| 37 | +# manifests' "mcpServers": the Blender Lab MCP server, launched with uvx from |
| 38 | +# a pinned upstream commit (GPL, so it is referenced, never vendored). |
36 | 39 | FILES = ("LICENSE", ".claude-plugin/plugin.json", |
37 | 40 | ".cursor-plugin/plugin.json", ".cursor-plugin/marketplace.json", |
38 | | - "assets/favicon.svg") |
| 41 | + "assets/favicon.svg", "mcp.json") |
39 | 42 | MAX_BYTES = 2_000_000 |
40 | 43 | IGNORE = shutil.ignore_patterns("__pycache__", "*.pyc") |
41 | 44 |
|
|
44 | 47 | Generated from https://github.com/TMHSDigital/Blender-Developer-Tools by |
45 | 48 | `scripts/build_plugin_dist.py` on every release. Do not edit this branch; it |
46 | 49 | is force-pushed. It carries only what the plugin loads: skills, the |
47 | | -`blender-rules` skill generated from `rules/`, snippets, templates and licenses. |
| 50 | +`blender-rules` skill generated from `rules/`, snippets, templates, licenses, |
| 51 | +and `mcp.json`, which registers the official Blender Lab MCP server (needs `uv`, |
| 52 | +and the MCP add-on enabled in a running Blender 5.1+). |
48 | 53 | Examples, the showcase and the gallery live on `main`. |
49 | 54 |
|
50 | 55 | ```text |
@@ -153,6 +158,10 @@ def verify(out: Path, size: int) -> list[str]: |
153 | 158 | if not (out / "claude" / "skills" / "blender-rules" / "SKILL.md").is_file(): |
154 | 159 | errors.append("blender-rules skill missing") |
155 | 160 | cursor = json.loads((out / ".cursor-plugin" / "plugin.json").read_text(encoding="utf-8")) |
| 161 | + for name, manifest in (("Claude", plugin), ("Cursor", cursor)): |
| 162 | + mcp = manifest.get("mcpServers") |
| 163 | + if isinstance(mcp, str) and not (out / mcp).is_file(): |
| 164 | + errors.append(f"{name} manifest mcpServers path {mcp} missing from the dist") |
156 | 165 | for key in ("skills", "rules"): |
157 | 166 | for rel in cursor.get(key, []): |
158 | 167 | if not (out / rel).is_file(): |
|
0 commit comments