@hybridlabor-api/bdb-antigravity-skills 1.0.8 → 1.0.9
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 +4 -4
- package/mcps/adobe_mcp.py +55 -39
- package/mcps/rhino_mcp.py +51 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -30,7 +30,7 @@ BDBrainstorm combines multi-agent brainstorming, the `/grill-me` slash command,
|
|
|
30
30
|
|
|
31
31
|
## 🔌 Custom MCP Integrations
|
|
32
32
|
|
|
33
|
-
The true game-changer of this repository lies in our **Custom MCP (Model Context Protocol) Integrations**. These bridges allow our Antigravity agents to natively read, write, and execute commands within the industry's leading creative software.
|
|
33
|
+
The true game-changer of this repository lies in our **Custom MCP (Model Context Protocol) Integrations**. Rather than leaving you to piece together disconnected third-party packages, this repository bundles **custom, local MCP wrappers** (in the `mcps/` directory). These bridges are installed automatically and allow our Antigravity agents to natively read, write, and execute commands within the industry's leading creative software.
|
|
34
34
|
|
|
35
35
|
### 🎛️ TouchDesigner
|
|
36
36
|
Integrated directly into TouchDesigner via the **Pantani/tdmcp** (MindDesigner) bridge and utilizing **8beeeaaat/touchdesigner-mcp** as a fallback, agents can construct real TouchDesigner node networks via natural language. They can manipulate operators, patch CHOPs/TOPs, and automate complex node routing inside the visual programming environment.
|
|
@@ -39,7 +39,7 @@ Integrated directly into TouchDesigner via the **Pantani/tdmcp** (MindDesigner)
|
|
|
39
39
|
Built on a hybrid foundation of **Unreal Engine 5.8 native APIs** and the **gimmeDG** toolset, this MCP allows agents to interact directly with UE5 projects. From scene generation and asset configuration to complex Blueprint logic mapping, this integration turns agents into bona fide Technical Artists.
|
|
40
40
|
|
|
41
41
|
### 📐 Rhino 3D & Grasshopper
|
|
42
|
-
Using **mcneel/RhinoMCP** and **
|
|
42
|
+
Using a custom local `rhino_mcp.py` inspired by **mcneel/RhinoMCP** and **GOLEM-3DMCP-Rhino**, agents can connect directly to Rhino Compute (via REST on port 6500) to manipulate 3D geometry in Rhino 8. This extends to controlling Grasshopper definitions, tweaking parameters, and generating complex parametric 3D models directly from prompt instructions.
|
|
43
43
|
|
|
44
44
|
### 🎬 DaVinci Resolve
|
|
45
45
|
Powered by **samuelgursky/davinci-resolve-mcp** and **hoyt-harness/davinci-mcp-professional**, this integration gives agents the ability to manipulate timelines, organize media pools, and execute complex Fusion composites via external scripting in Resolve Studio.
|
|
@@ -47,8 +47,8 @@ Powered by **samuelgursky/davinci-resolve-mcp** and **hoyt-harness/davinci-mcp-p
|
|
|
47
47
|
### 🧊 Blender
|
|
48
48
|
Using community servers like **ahujasid/blender-mcp**, agents can script Blender Python (`bpy`) operations directly. This covers everything from mesh generation and material manipulation to camera automation and rendering pipelines.
|
|
49
49
|
|
|
50
|
-
### ✨ After Effects
|
|
51
|
-
|
|
50
|
+
### ✨ Adobe Creative Cloud (Photoshop, Illustrator, Premiere, After Effects)
|
|
51
|
+
Instead of forcing you to install complex UXP plugins for every Adobe app, our unified **`adobe_mcp.py`** executes cross-platform. On **macOS**, it drives Adobe apps directly via zero-install `osascript` AppleEvents. On **Windows**, it natively hooks into Adobe's `win32com` interfaces via PowerShell COM objects. This allows agents to seamlessly generate layers, adjust paths, render compositions, and write custom ExtendScript expressions across the entire Adobe Suite natively.
|
|
52
52
|
|
|
53
53
|
### 🏗️ Vectorworks
|
|
54
54
|
Through early implementations like **vectorworks-mcp** connecting via the C++ SDK plugin, agents are paving the way for automated drafting, BIM parameter adjustments, and CAD automation within Vectorworks 2025.
|
package/mcps/adobe_mcp.py
CHANGED
|
@@ -1,25 +1,65 @@
|
|
|
1
1
|
from mcp.server.fastmcp import FastMCP
|
|
2
2
|
import subprocess
|
|
3
|
+
import platform
|
|
4
|
+
import tempfile
|
|
5
|
+
import os
|
|
3
6
|
|
|
4
|
-
mcp = FastMCP("Adobe Suite MCP")
|
|
7
|
+
mcp = FastMCP("BDB Adobe Suite MCP")
|
|
5
8
|
|
|
6
9
|
def execute_adobe_jsx(app_name: str, jsx_code: str) -> str:
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
command = "
|
|
10
|
+
"""Executes JSX code natively on macOS (osascript) or Windows (PowerShell COM)."""
|
|
11
|
+
if platform.system() == "Darwin":
|
|
12
|
+
escaped_jsx = jsx_code.replace('"', '\\"')
|
|
13
|
+
command = "do javascript"
|
|
14
|
+
if "After Effects" in app_name:
|
|
15
|
+
command = "DoScript"
|
|
16
|
+
|
|
17
|
+
apple_script = f'''
|
|
18
|
+
tell application "{app_name}"
|
|
19
|
+
{command} "{escaped_jsx}"
|
|
20
|
+
end tell
|
|
21
|
+
'''
|
|
11
22
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
result = subprocess.run(["osascript", "-e", apple_script], capture_output=True, text=True)
|
|
19
|
-
if result.returncode != 0:
|
|
20
|
-
raise Exception(f"Adobe Script Error: {result.stderr}")
|
|
23
|
+
result = subprocess.run(["osascript", "-e", apple_script], capture_output=True, text=True)
|
|
24
|
+
if result.returncode != 0:
|
|
25
|
+
raise Exception(f"Adobe Script Error: {result.stderr}")
|
|
26
|
+
|
|
27
|
+
return result.stdout.strip()
|
|
21
28
|
|
|
22
|
-
|
|
29
|
+
elif platform.system() == "Windows":
|
|
30
|
+
# Resolve COM Object ProgID
|
|
31
|
+
prog_id = None
|
|
32
|
+
if "Photoshop" in app_name:
|
|
33
|
+
prog_id = "Photoshop.Application"
|
|
34
|
+
elif "Illustrator" in app_name:
|
|
35
|
+
prog_id = "Illustrator.Application"
|
|
36
|
+
elif "After Effects" in app_name:
|
|
37
|
+
# AE Windows COM
|
|
38
|
+
prog_id = "AfterFX.Application"
|
|
39
|
+
else:
|
|
40
|
+
raise Exception(f"Windows COM execution not yet supported for {app_name}")
|
|
41
|
+
|
|
42
|
+
# Write JSX to temp file
|
|
43
|
+
fd, temp_path = tempfile.mkstemp(suffix=".jsx")
|
|
44
|
+
with os.fdopen(fd, 'w', encoding='utf-8') as f:
|
|
45
|
+
f.write(jsx_code)
|
|
46
|
+
|
|
47
|
+
# Execute via PowerShell COM object
|
|
48
|
+
ps_script = f'''
|
|
49
|
+
$ErrorActionPreference = "Stop"
|
|
50
|
+
$app = New-Object -ComObject "{prog_id}"
|
|
51
|
+
# Execute the JSX
|
|
52
|
+
$app.DoJavaScriptFile("{temp_path}")
|
|
53
|
+
'''
|
|
54
|
+
result = subprocess.run(["powershell", "-Command", ps_script], capture_output=True, text=True)
|
|
55
|
+
os.remove(temp_path)
|
|
56
|
+
|
|
57
|
+
if result.returncode != 0:
|
|
58
|
+
raise Exception(f"Adobe Script Error (Windows): {result.stderr}")
|
|
59
|
+
|
|
60
|
+
return result.stdout.strip()
|
|
61
|
+
else:
|
|
62
|
+
raise Exception(f"Unsupported OS: {platform.system()}")
|
|
23
63
|
|
|
24
64
|
@mcp.tool()
|
|
25
65
|
def ps_add_text_layer(text: str, font_size: int = 24) -> str:
|
|
@@ -54,29 +94,5 @@ def ae_render_active_comp() -> str:
|
|
|
54
94
|
"""
|
|
55
95
|
return execute_adobe_jsx("Adobe After Effects", jsx)
|
|
56
96
|
|
|
57
|
-
@mcp.tool()
|
|
58
|
-
def pr_get_sequences() -> str:
|
|
59
|
-
"""Gets the names of all sequences in Premiere Pro."""
|
|
60
|
-
jsx = """
|
|
61
|
-
var seqs = app.project.sequences;
|
|
62
|
-
var names = [];
|
|
63
|
-
if (seqs) {
|
|
64
|
-
for (var i = 0; i < seqs.numSequences; i++) {
|
|
65
|
-
names.push(seqs[i].name);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
names.join(", ");
|
|
69
|
-
"""
|
|
70
|
-
return execute_adobe_jsx("Adobe Premiere Pro", jsx)
|
|
71
|
-
|
|
72
|
-
@mcp.tool()
|
|
73
|
-
def ai_create_document() -> str:
|
|
74
|
-
"""Creates a new default document in Illustrator."""
|
|
75
|
-
jsx = """
|
|
76
|
-
var doc = app.documents.add();
|
|
77
|
-
"Created new Illustrator document";
|
|
78
|
-
"""
|
|
79
|
-
return execute_adobe_jsx("Adobe Illustrator", jsx)
|
|
80
|
-
|
|
81
97
|
if __name__ == "__main__":
|
|
82
98
|
mcp.run()
|
package/mcps/rhino_mcp.py
CHANGED
|
@@ -1,11 +1,60 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import urllib.request
|
|
3
|
+
import urllib.error
|
|
1
4
|
from mcp.server.fastmcp import FastMCP
|
|
2
5
|
|
|
3
6
|
mcp = FastMCP("BDB Rhino MCP")
|
|
4
7
|
|
|
8
|
+
RHINO_COMPUTE_URL = "http://localhost:6500/"
|
|
9
|
+
|
|
10
|
+
def compute_request(endpoint: str, payload: dict = None) -> str:
|
|
11
|
+
"""Helper to send requests to local Rhino Compute server."""
|
|
12
|
+
url = f"{RHINO_COMPUTE_URL}{endpoint}"
|
|
13
|
+
req = urllib.request.Request(url, method="POST" if payload else "GET")
|
|
14
|
+
req.add_header('Content-Type', 'application/json')
|
|
15
|
+
|
|
16
|
+
data = None
|
|
17
|
+
if payload:
|
|
18
|
+
data = json.dumps(payload).encode('utf-8')
|
|
19
|
+
|
|
20
|
+
try:
|
|
21
|
+
with urllib.request.urlopen(req, data=data) as response:
|
|
22
|
+
return response.read().decode('utf-8')
|
|
23
|
+
except urllib.error.URLError as e:
|
|
24
|
+
raise Exception(f"Rhino Compute Connection Error: Is Rhino Compute running on port 6500? ({e})")
|
|
25
|
+
|
|
5
26
|
@mcp.tool()
|
|
6
27
|
def rhino_ping() -> str:
|
|
7
|
-
"""
|
|
8
|
-
return "
|
|
28
|
+
"""Checks if Rhino Compute is active and returns server version."""
|
|
29
|
+
return compute_request("version")
|
|
30
|
+
|
|
31
|
+
@mcp.tool()
|
|
32
|
+
def rhino_evaluate_grasshopper(ghx_path: str, parameters: dict) -> str:
|
|
33
|
+
"""
|
|
34
|
+
Evaluates a Grasshopper definition via Rhino Compute.
|
|
35
|
+
Inspired by GOLEM-3DMCP and mcneel/RhinoMCP architectures.
|
|
36
|
+
"""
|
|
37
|
+
payload = {
|
|
38
|
+
"algo": ghx_path,
|
|
39
|
+
"pointer": None,
|
|
40
|
+
"values": []
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
for key, value in parameters.items():
|
|
44
|
+
payload["values"].append({
|
|
45
|
+
"ParamName": key,
|
|
46
|
+
"InnerTree": {
|
|
47
|
+
"{ 0; }": [
|
|
48
|
+
{
|
|
49
|
+
"type": "System.String",
|
|
50
|
+
"data": str(value)
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
result = compute_request("grasshopper", payload)
|
|
57
|
+
return result
|
|
9
58
|
|
|
10
59
|
if __name__ == "__main__":
|
|
11
60
|
mcp.run()
|