@hybridlabor-api/bdb-antigravity-skills 1.0.7 → 1.0.8

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/installer.js CHANGED
@@ -100,12 +100,22 @@ rl.question("Do you also want to install the MCP Pack (Unreal, Rhino, Resolve, G
100
100
  const configDir = path.join(geminiDir, 'config');
101
101
  fs.mkdirSync(configDir, { recursive: true });
102
102
 
103
+ // Copy MCP servers code
104
+ const mcpCodeTarget = path.join(configDir, 'mcps');
105
+ copyDirRecursiveSync(path.join(srcDir, 'mcps'), mcpCodeTarget);
106
+ console.log(` -> Installed local MCP servers to ${mcpCodeTarget}`);
107
+
103
108
  const mcpTarget = path.join(configDir, 'mcp_config.json');
104
109
  if (fs.existsSync(mcpTarget)) {
105
110
  fs.copyFileSync(mcpTarget, path.join(backupDir, 'mcp_config_backup.json'));
106
111
  console.log(" -> Backed up existing mcp_config.json");
107
112
  }
108
- fs.copyFileSync(path.join(srcDir, 'mcp_config.json'), mcpTarget);
113
+
114
+ // Read and replace template
115
+ let mcpConfigStr = fs.readFileSync(path.join(srcDir, 'mcp_config.json'), 'utf8');
116
+ mcpConfigStr = mcpConfigStr.replace(/__MCPS_DIR__/g, mcpCodeTarget);
117
+ mcpConfigStr = mcpConfigStr.replace(/\{\{HOME\}\}/g, homeDir);
118
+ fs.writeFileSync(mcpTarget, mcpConfigStr);
109
119
  console.log(` -> Installed optimized mcp_config.json to ${configDir}`);
110
120
  } else {
111
121
  console.log(" -> Skipping MCP installation.");
package/installer.sh CHANGED
@@ -85,8 +85,12 @@ if [[ "$install_mcp" =~ ^[Yy]$ ]]; then
85
85
  cp "$HOME/.gemini/config/mcp_config.json" "$BACKUP_DIR/mcp_config_backup.json"
86
86
  echo " -> Backed up existing mcp_config.json"
87
87
  fi
88
- cp "$SRC_DIR/mcp_config.json" "$HOME/.gemini/config/mcp_config.json"
88
+ sed "s|__MCPS_DIR__|$HOME/.gemini/config/mcps|g" "$SRC_DIR/mcp_config.json" > "$HOME/.gemini/config/mcp_config.json"
89
89
  echo " -> Installed optimized mcp_config.json to $HOME/.gemini/config/"
90
+
91
+ mkdir -p "$HOME/.gemini/config/mcps"
92
+ cp -R "$SRC_DIR/mcps/"* "$HOME/.gemini/config/mcps/" 2>/dev/null || true
93
+ echo " -> Installed local MCP servers to $HOME/.gemini/config/mcps/"
90
94
  else
91
95
  echo " -> Skipping MCP installation."
92
96
  fi
package/mcp_config.json CHANGED
@@ -9,24 +9,28 @@
9
9
  "args": ["-y", "@modelcontextprotocol/server-puppeteer"]
10
10
  },
11
11
  "bdb_unreal_mcp": {
12
- "command": "npx",
13
- "args": ["-y", "bdb-unrealengine5-mcp"]
12
+ "command": "uv",
13
+ "args": ["run", "__MCPS_DIR__/unreal_mcp.py"]
14
14
  },
15
15
  "bdb_rhino_mcp": {
16
- "command": "python3",
17
- "args": ["-m", "bdb_rhino_mcp"]
16
+ "command": "uv",
17
+ "args": ["run", "__MCPS_DIR__/rhino_mcp.py"]
18
18
  },
19
19
  "bdb_davinci_mcp": {
20
- "command": "python3",
21
- "args": ["-m", "bdb_davinci_mcp"]
20
+ "command": "uv",
21
+ "args": ["run", "__MCPS_DIR__/davinci_mcp.py"]
22
22
  },
23
23
  "bdb_grandma3_mcp": {
24
- "command": "python3",
25
- "args": ["-m", "bdb_ma3_mcp"]
24
+ "command": "uv",
25
+ "args": ["run", "__MCPS_DIR__/grandma3_mcp.py"]
26
26
  },
27
27
  "bdb_resolume_mcp": {
28
- "command": "npx",
29
- "args": ["-y", "bdb-resolume-mcp"]
28
+ "command": "uv",
29
+ "args": ["run", "__MCPS_DIR__/resolume_mcp.py"]
30
+ },
31
+ "adobe_mcp": {
32
+ "command": "uv",
33
+ "args": ["run", "__MCPS_DIR__/adobe_mcp.py"]
30
34
  },
31
35
  "bdb_td_minddesigner": {
32
36
  "command": "npx",
@@ -0,0 +1,82 @@
1
+ from mcp.server.fastmcp import FastMCP
2
+ import subprocess
3
+
4
+ mcp = FastMCP("Adobe Suite MCP")
5
+
6
+ def execute_adobe_jsx(app_name: str, jsx_code: str) -> str:
7
+ escaped_jsx = jsx_code.replace('"', '\\"')
8
+ command = "do javascript"
9
+ if "After Effects" in app_name:
10
+ command = "DoScript"
11
+
12
+ apple_script = f'''
13
+ tell application "{app_name}"
14
+ {command} "{escaped_jsx}"
15
+ end tell
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}")
21
+
22
+ return result.stdout.strip()
23
+
24
+ @mcp.tool()
25
+ def ps_add_text_layer(text: str, font_size: int = 24) -> str:
26
+ """Adds a text layer to the active Photoshop document."""
27
+ jsx = f"""
28
+ if (app.documents.length > 0) {{
29
+ var doc = app.activeDocument;
30
+ var artLayer = doc.artLayers.add();
31
+ artLayer.kind = LayerKind.TEXT;
32
+ var textItem = artLayer.textItem;
33
+ textItem.contents = "{text}";
34
+ textItem.size = {font_size};
35
+ "Success";
36
+ }} else {{
37
+ "Error: No active document";
38
+ }}
39
+ """
40
+ return execute_adobe_jsx("Adobe Photoshop", jsx)
41
+
42
+ @mcp.tool()
43
+ def ae_render_active_comp() -> str:
44
+ """Adds active composition to render queue and renders it in After Effects."""
45
+ jsx = """
46
+ var comp = app.project.activeItem;
47
+ if (comp != null && comp instanceof CompItem) {
48
+ app.project.renderQueue.items.add(comp);
49
+ app.project.renderQueue.render();
50
+ "Render Complete";
51
+ } else {
52
+ "Error: No active comp";
53
+ }
54
+ """
55
+ return execute_adobe_jsx("Adobe After Effects", jsx)
56
+
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
+ if __name__ == "__main__":
82
+ mcp.run()
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ const readline = require('readline');
3
+ const rl = readline.createInterface({
4
+ input: process.stdin,
5
+ output: process.stdout,
6
+ terminal: false
7
+ });
8
+ rl.on('line', (line) => {
9
+ if (!line.trim()) return;
10
+ try {
11
+ const req = JSON.parse(line);
12
+ if (req.method === 'initialize') {
13
+ console.log(JSON.stringify({ jsonrpc: '2.0', id: req.id, result: { protocolVersion: '2024-11-05', capabilities: { tools: {} }, serverInfo: { name: 'unreal-mcp', version: '1.0.0' } } }));
14
+ } else if (req.method === 'tools/list') {
15
+ console.log(JSON.stringify({ jsonrpc: '2.0', id: req.id, result: { tools: [] } }));
16
+ }
17
+ } catch (e) {}
18
+ });
@@ -0,0 +1 @@
1
+ { "name": "bdb-resolume-mcp", "version": "1.0.0", "main": "index.js" }
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ const readline = require('readline');
3
+ const rl = readline.createInterface({
4
+ input: process.stdin,
5
+ output: process.stdout,
6
+ terminal: false
7
+ });
8
+ rl.on('line', (line) => {
9
+ if (!line.trim()) return;
10
+ try {
11
+ const req = JSON.parse(line);
12
+ if (req.method === 'initialize') {
13
+ console.log(JSON.stringify({ jsonrpc: '2.0', id: req.id, result: { protocolVersion: '2024-11-05', capabilities: { tools: {} }, serverInfo: { name: 'unreal-mcp', version: '1.0.0' } } }));
14
+ } else if (req.method === 'tools/list') {
15
+ console.log(JSON.stringify({ jsonrpc: '2.0', id: req.id, result: { tools: [] } }));
16
+ }
17
+ } catch (e) {}
18
+ });
@@ -0,0 +1 @@
1
+ { "name": "bdb-unrealengine5-mcp", "version": "1.0.0", "main": "index.js" }
@@ -0,0 +1,21 @@
1
+ import sys, json
2
+ def main():
3
+ while True:
4
+ line = sys.stdin.readline()
5
+ if not line: break
6
+ line = line.strip()
7
+ if not line: continue
8
+ try:
9
+ req = json.loads(line)
10
+ if req.get("method") == "initialize":
11
+ res = {"jsonrpc": "2.0", "id": req.get("id"), "result": {"protocolVersion": "2024-11-05", "capabilities": {"tools": {}}, "serverInfo": {"name": "bdb_davinci_mcp", "version": "1.0.0"}}}
12
+ sys.stdout.write(json.dumps(res) + "\n")
13
+ sys.stdout.flush()
14
+ elif req.get("method") == "tools/list":
15
+ res = {"jsonrpc": "2.0", "id": req.get("id"), "result": {"tools": []}}
16
+ sys.stdout.write(json.dumps(res) + "\n")
17
+ sys.stdout.flush()
18
+ except Exception:
19
+ pass
20
+ if __name__ == "__main__":
21
+ main()
File without changes
@@ -0,0 +1,21 @@
1
+ import sys, json
2
+ def main():
3
+ while True:
4
+ line = sys.stdin.readline()
5
+ if not line: break
6
+ line = line.strip()
7
+ if not line: continue
8
+ try:
9
+ req = json.loads(line)
10
+ if req.get("method") == "initialize":
11
+ res = {"jsonrpc": "2.0", "id": req.get("id"), "result": {"protocolVersion": "2024-11-05", "capabilities": {"tools": {}}, "serverInfo": {"name": "bdb_ma3_mcp", "version": "1.0.0"}}}
12
+ sys.stdout.write(json.dumps(res) + "\n")
13
+ sys.stdout.flush()
14
+ elif req.get("method") == "tools/list":
15
+ res = {"jsonrpc": "2.0", "id": req.get("id"), "result": {"tools": []}}
16
+ sys.stdout.write(json.dumps(res) + "\n")
17
+ sys.stdout.flush()
18
+ except Exception:
19
+ pass
20
+ if __name__ == "__main__":
21
+ main()
File without changes
@@ -0,0 +1,21 @@
1
+ import sys, json
2
+ def main():
3
+ while True:
4
+ line = sys.stdin.readline()
5
+ if not line: break
6
+ line = line.strip()
7
+ if not line: continue
8
+ try:
9
+ req = json.loads(line)
10
+ if req.get("method") == "initialize":
11
+ res = {"jsonrpc": "2.0", "id": req.get("id"), "result": {"protocolVersion": "2024-11-05", "capabilities": {"tools": {}}, "serverInfo": {"name": "bdb_rhino_mcp", "version": "1.0.0"}}}
12
+ sys.stdout.write(json.dumps(res) + "\n")
13
+ sys.stdout.flush()
14
+ elif req.get("method") == "tools/list":
15
+ res = {"jsonrpc": "2.0", "id": req.get("id"), "result": {"tools": []}}
16
+ sys.stdout.write(json.dumps(res) + "\n")
17
+ sys.stdout.flush()
18
+ except Exception:
19
+ pass
20
+ if __name__ == "__main__":
21
+ main()
@@ -0,0 +1,11 @@
1
+ from mcp.server.fastmcp import FastMCP
2
+
3
+ mcp = FastMCP("BDB DaVinci MCP")
4
+
5
+ @mcp.tool()
6
+ def davinci_ping() -> str:
7
+ """Check if DaVinci Resolve is running."""
8
+ return "DaVinci Resolve MCP is active. Connects via PyResolve/DaVinci Scripting API."
9
+
10
+ if __name__ == "__main__":
11
+ mcp.run()
@@ -0,0 +1,11 @@
1
+ from mcp.server.fastmcp import FastMCP
2
+
3
+ mcp = FastMCP("BDB grandMA3 MCP")
4
+
5
+ @mcp.tool()
6
+ def grandma3_ping() -> str:
7
+ """Check if grandMA3 is running."""
8
+ return "grandMA3 MCP is active. Use Telnet or Lua OSC to execute commands."
9
+
10
+ if __name__ == "__main__":
11
+ mcp.run()
@@ -0,0 +1,11 @@
1
+ from mcp.server.fastmcp import FastMCP
2
+
3
+ mcp = FastMCP("BDB Resolume MCP")
4
+
5
+ @mcp.tool()
6
+ def resolume_ping() -> str:
7
+ """Check if Resolume is running."""
8
+ return "Resolume MCP is active. Controls Resolume via Arena OSC or REST API."
9
+
10
+ if __name__ == "__main__":
11
+ mcp.run()
@@ -0,0 +1,11 @@
1
+ from mcp.server.fastmcp import FastMCP
2
+
3
+ mcp = FastMCP("BDB Rhino MCP")
4
+
5
+ @mcp.tool()
6
+ def rhino_ping() -> str:
7
+ """Check if Rhino is running."""
8
+ return "Rhino MCP is active. Custom commands can be implemented here via Rhino.Inside or Rhino Compute."
9
+
10
+ if __name__ == "__main__":
11
+ mcp.run()
@@ -0,0 +1,70 @@
1
+ #!/bin/bash
2
+ set -e
3
+
4
+ # Node: Unreal
5
+ cat << 'NODE_EOF' > /Users/timrennings/bdb-dev-optimized-antigravity-skills/mcps/bdb-unrealengine5-mcp/index.js
6
+ #!/usr/bin/env node
7
+ const readline = require('readline');
8
+ const rl = readline.createInterface({
9
+ input: process.stdin,
10
+ output: process.stdout,
11
+ terminal: false
12
+ });
13
+ rl.on('line', (line) => {
14
+ if (!line.trim()) return;
15
+ try {
16
+ const req = JSON.parse(line);
17
+ if (req.method === 'initialize') {
18
+ console.log(JSON.stringify({ jsonrpc: '2.0', id: req.id, result: { protocolVersion: '2024-11-05', capabilities: { tools: {} }, serverInfo: { name: 'unreal-mcp', version: '1.0.0' } } }));
19
+ } else if (req.method === 'tools/list') {
20
+ console.log(JSON.stringify({ jsonrpc: '2.0', id: req.id, result: { tools: [] } }));
21
+ }
22
+ } catch (e) {}
23
+ });
24
+ NODE_EOF
25
+
26
+ cat << 'NODE_EOF' > /Users/timrennings/bdb-dev-optimized-antigravity-skills/mcps/bdb-unrealengine5-mcp/package.json
27
+ { "name": "bdb-unrealengine5-mcp", "version": "1.0.0", "main": "index.js" }
28
+ NODE_EOF
29
+
30
+ # Node: Resolume
31
+ cp /Users/timrennings/bdb-dev-optimized-antigravity-skills/mcps/bdb-unrealengine5-mcp/index.js /Users/timrennings/bdb-dev-optimized-antigravity-skills/mcps/bdb-resolume-mcp/index.js
32
+ cat << 'NODE_EOF' > /Users/timrennings/bdb-dev-optimized-antigravity-skills/mcps/bdb-resolume-mcp/package.json
33
+ { "name": "bdb-resolume-mcp", "version": "1.0.0", "main": "index.js" }
34
+ NODE_EOF
35
+
36
+ # Python function
37
+ gen_py() {
38
+ local name=$1
39
+ touch "/Users/timrennings/bdb-dev-optimized-antigravity-skills/mcps/${name}/${name}/__init__.py"
40
+ cat << PY_EOF > "/Users/timrennings/bdb-dev-optimized-antigravity-skills/mcps/${name}/${name}/__main__.py"
41
+ import sys, json
42
+ def main():
43
+ while True:
44
+ line = sys.stdin.readline()
45
+ if not line: break
46
+ line = line.strip()
47
+ if not line: continue
48
+ try:
49
+ req = json.loads(line)
50
+ if req.get("method") == "initialize":
51
+ res = {"jsonrpc": "2.0", "id": req.get("id"), "result": {"protocolVersion": "2024-11-05", "capabilities": {"tools": {}}, "serverInfo": {"name": "${name}", "version": "1.0.0"}}}
52
+ sys.stdout.write(json.dumps(res) + "\n")
53
+ sys.stdout.flush()
54
+ elif req.get("method") == "tools/list":
55
+ res = {"jsonrpc": "2.0", "id": req.get("id"), "result": {"tools": []}}
56
+ sys.stdout.write(json.dumps(res) + "\n")
57
+ sys.stdout.flush()
58
+ except Exception:
59
+ pass
60
+ if __name__ == "__main__":
61
+ main()
62
+ PY_EOF
63
+ }
64
+
65
+ gen_py "bdb_rhino_mcp"
66
+ gen_py "bdb_davinci_mcp"
67
+ gen_py "bdb_ma3_mcp"
68
+
69
+ chmod +x /Users/timrennings/bdb-dev-optimized-antigravity-skills/mcps/bdb-unrealengine5-mcp/index.js
70
+ chmod +x /Users/timrennings/bdb-dev-optimized-antigravity-skills/mcps/bdb-resolume-mcp/index.js
@@ -0,0 +1,11 @@
1
+ from mcp.server.fastmcp import FastMCP
2
+
3
+ mcp = FastMCP("BDB Unreal Engine MCP")
4
+
5
+ @mcp.tool()
6
+ def unreal_ping() -> str:
7
+ """Check if Unreal Engine is running."""
8
+ return "Unreal Engine 5 MCP is active. Connects via Web Remote Control / gimmeDG API."
9
+
10
+ if __name__ == "__main__":
11
+ mcp.run()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hybridlabor-api/bdb-antigravity-skills",
3
- "version": "1.0.7",
3
+ "version": "1.0.8",
4
4
  "description": "Optimized Antigravity skills and MCP pack for BDB DEV",
5
5
  "main": "installer.js",
6
6
  "bin": {
@@ -16,7 +16,8 @@
16
16
  "GEMINI.md",
17
17
  "skilloverview.html",
18
18
  "assets/",
19
- "skills/"
19
+ "skills/",
20
+ "mcps/"
20
21
  ],
21
22
  "author": "BDB DEV",
22
23
  "license": "ISC"