@hotwired-sh/hotwired-mcp 1.0.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/LICENSE +21 -0
- package/README.md +147 -0
- package/bin/hotwired-mcp +72 -0
- package/npm/darwin-arm64/bin/hotwired-mcp +0 -0
- package/npm/darwin-arm64/package.json +19 -0
- package/npm/darwin-x64/bin/hotwired-mcp +0 -0
- package/npm/darwin-x64/package.json +19 -0
- package/npm/linux-arm64/bin/hotwired-mcp +0 -0
- package/npm/linux-arm64/package.json +19 -0
- package/npm/linux-x64/bin/hotwired-mcp +0 -0
- package/npm/linux-x64/package.json +19 -0
- package/package.json +55 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 hotwired-sh
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# hotwired-mcp
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
MCP (Model Context Protocol) server for [Hotwired](https://hotwired.sh) multi-agent workflow orchestration.
|
|
6
|
+
|
|
7
|
+
## Why Open Source?
|
|
8
|
+
|
|
9
|
+
This MCP server runs on your machine. We open source it so you can:
|
|
10
|
+
|
|
11
|
+
- **Audit** exactly what code runs on your machine
|
|
12
|
+
- **Verify** there are no external network calls
|
|
13
|
+
- **Trust** that there's no hidden behavior
|
|
14
|
+
- **Build from source** if you prefer
|
|
15
|
+
|
|
16
|
+
## Hotwired.sh Architecture
|
|
17
|
+
|
|
18
|
+
**Everything runs locally on your machine.** There are no external service dependencies.
|
|
19
|
+
|
|
20
|
+
```mermaid
|
|
21
|
+
flowchart TB
|
|
22
|
+
subgraph agents["AI Coding Agents"]
|
|
23
|
+
claude["Claude Code"] ~~~ gemini["Gemini CLI"] ~~~ other["Other Agents"]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
subgraph mcp["hotwired-mcp"]
|
|
27
|
+
tools["MCP Tools"] --> ipc["IPC Client"]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
subgraph desktop["Hotwired Desktop App"]
|
|
31
|
+
socket["Unix Socket<br/>~/.hotwired/hotwired.sock"] <--> core["Hotwired Core"]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
agents -->|"spawns"| mcp
|
|
35
|
+
ipc <-->|"local only"| socket
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### How it works
|
|
39
|
+
|
|
40
|
+
1. **Hotwired Desktop App** runs locally and creates a Unix socket at `~/.hotwired/hotwired.sock`
|
|
41
|
+
2. **AI agents** (Claude Code, Gemini, etc.) run `hotwired-mcp` as their MCP server
|
|
42
|
+
3. **hotwired-mcp** communicates with the desktop app via the local Unix socket
|
|
43
|
+
4. **No external network calls** - all communication stays on your machine
|
|
44
|
+
|
|
45
|
+
The only external connection the Hotwired Desktop App makes is for **authentication**. All workflow orchestration, message passing, and coordination happens entirely locally.
|
|
46
|
+
|
|
47
|
+
## Installation
|
|
48
|
+
|
|
49
|
+
### For Claude Code Users
|
|
50
|
+
|
|
51
|
+
**Just install the [Hotwired Claude Plugin](https://github.com/hotwired-sh/claude-plugin)** - it handles everything automatically:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
claude plugin install hotwired
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
The plugin runs `npx @hotwired-sh/hotwired-mcp@latest` under the hood, so you'll always have the latest version. No manual installation needed.
|
|
58
|
+
|
|
59
|
+
### For Other MCP-Compatible Agents
|
|
60
|
+
|
|
61
|
+
Add to your MCP configuration:
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"mcpServers": {
|
|
66
|
+
"hotwired": {
|
|
67
|
+
"command": "npx",
|
|
68
|
+
"args": ["@hotwired-sh/hotwired-mcp@latest"]
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Building from Source
|
|
75
|
+
|
|
76
|
+
If you prefer to audit and build the code yourself:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
cargo install --git https://github.com/hotwired-sh/hotwired-mcp
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Prerequisites
|
|
83
|
+
|
|
84
|
+
- [Hotwired Desktop App](https://hotwired.sh) - Must be running
|
|
85
|
+
- [Zellij](https://zellij.dev) - Terminal multiplexer for session management
|
|
86
|
+
|
|
87
|
+
## Available Tools
|
|
88
|
+
|
|
89
|
+
| Tool | Description |
|
|
90
|
+
|------|-------------|
|
|
91
|
+
| `get_protocol` | Fetch workflow protocol and role instructions |
|
|
92
|
+
| `get_run_status` | Check current run status |
|
|
93
|
+
| `report_status` | Update your working state |
|
|
94
|
+
| `send_message` | Send message to other participants |
|
|
95
|
+
| `request_input` | Ask human for input |
|
|
96
|
+
| `report_impediment` | Signal you're blocked |
|
|
97
|
+
| `handoff` | Hand work to another agent |
|
|
98
|
+
| `task_complete` | Mark a task as complete |
|
|
99
|
+
|
|
100
|
+
## Security
|
|
101
|
+
|
|
102
|
+
### Why Unix Sockets (Not HTTP/localhost)
|
|
103
|
+
|
|
104
|
+
We deliberately use **Unix sockets** instead of HTTP on localhost. This is a critical security design choice.
|
|
105
|
+
|
|
106
|
+
Many MCP tools have been vulnerable to **DNS rebinding attacks** and **0.0.0.0 bypass exploits** because they expose HTTP servers on localhost. These vulnerabilities allow malicious websites to:
|
|
107
|
+
|
|
108
|
+
- Send requests to localhost services via DNS rebinding
|
|
109
|
+
- Bypass browser same-origin policy through the 0.0.0.0 loophole
|
|
110
|
+
- Achieve remote code execution with no user interaction
|
|
111
|
+
|
|
112
|
+
**Unix sockets are immune to these attacks:**
|
|
113
|
+
|
|
114
|
+
- ❌ No TCP/HTTP listener - browsers cannot connect
|
|
115
|
+
- ❌ No DNS rebinding possible - not a network protocol
|
|
116
|
+
- ❌ No 0.0.0.0 bypass - sockets are filesystem-based
|
|
117
|
+
- ✅ Protected by filesystem permissions
|
|
118
|
+
- ✅ Only local processes can connect
|
|
119
|
+
|
|
120
|
+
### What This MCP Server Does NOT Do
|
|
121
|
+
|
|
122
|
+
- **Does NOT open any network ports** - no HTTP, no TCP, no localhost
|
|
123
|
+
- **Does NOT make any external network requests**
|
|
124
|
+
- **Does NOT read or modify files** outside its scope
|
|
125
|
+
- Connects **only** to the local Unix socket (`~/.hotwired/hotwired.sock`)
|
|
126
|
+
- Source code is fully auditable
|
|
127
|
+
|
|
128
|
+
## Development
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
# Build
|
|
132
|
+
cargo build --release
|
|
133
|
+
|
|
134
|
+
# Test
|
|
135
|
+
cargo test
|
|
136
|
+
|
|
137
|
+
# Run locally
|
|
138
|
+
cargo run
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## License
|
|
142
|
+
|
|
143
|
+
MIT - See [LICENSE](LICENSE)
|
|
144
|
+
|
|
145
|
+
## Learn More
|
|
146
|
+
|
|
147
|
+
Visit [hotwired.sh](https://hotwired.sh) for documentation, tutorials, and more information about multi-agent workflow orchestration.
|
package/bin/hotwired-mcp
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const { execFileSync } = require("child_process");
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const fs = require("fs");
|
|
6
|
+
|
|
7
|
+
const PLATFORMS = {
|
|
8
|
+
"darwin-arm64": "@hotwired-sh/mcp-darwin-arm64",
|
|
9
|
+
"darwin-x64": "@hotwired-sh/mcp-darwin-x64",
|
|
10
|
+
"linux-x64": "@hotwired-sh/mcp-linux-x64",
|
|
11
|
+
"linux-arm64": "@hotwired-sh/mcp-linux-arm64",
|
|
12
|
+
"win32-x64": "@hotwired-sh/mcp-win32-x64",
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
function getBinaryPath() {
|
|
16
|
+
const platformKey = `${process.platform}-${process.arch}`;
|
|
17
|
+
const packageName = PLATFORMS[platformKey];
|
|
18
|
+
|
|
19
|
+
if (!packageName) {
|
|
20
|
+
console.error(`Unsupported platform: ${platformKey}`);
|
|
21
|
+
console.error(`Supported platforms: ${Object.keys(PLATFORMS).join(", ")}`);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Try to find the binary in node_modules
|
|
26
|
+
const binaryName = process.platform === "win32" ? "hotwired-mcp.exe" : "hotwired-mcp";
|
|
27
|
+
|
|
28
|
+
// Check in the platform package
|
|
29
|
+
const paths = [
|
|
30
|
+
// When installed as a dependency
|
|
31
|
+
path.join(__dirname, "..", "node_modules", packageName, "bin", binaryName),
|
|
32
|
+
// When installed globally or via npx
|
|
33
|
+
path.join(__dirname, "..", "node_modules", packageName, "bin", binaryName),
|
|
34
|
+
// Relative to this package
|
|
35
|
+
require.resolve(`${packageName}/bin/${binaryName}`),
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
for (const binPath of paths) {
|
|
39
|
+
try {
|
|
40
|
+
if (fs.existsSync(binPath)) {
|
|
41
|
+
return binPath;
|
|
42
|
+
}
|
|
43
|
+
} catch {}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Try require.resolve as last resort
|
|
47
|
+
try {
|
|
48
|
+
const pkgPath = require.resolve(`${packageName}/package.json`);
|
|
49
|
+
const pkgDir = path.dirname(pkgPath);
|
|
50
|
+
const binPath = path.join(pkgDir, "bin", binaryName);
|
|
51
|
+
if (fs.existsSync(binPath)) {
|
|
52
|
+
return binPath;
|
|
53
|
+
}
|
|
54
|
+
} catch {}
|
|
55
|
+
|
|
56
|
+
console.error(`Could not find binary for platform: ${platformKey}`);
|
|
57
|
+
console.error(`Expected package: ${packageName}`);
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const binaryPath = getBinaryPath();
|
|
62
|
+
|
|
63
|
+
try {
|
|
64
|
+
execFileSync(binaryPath, process.argv.slice(2), {
|
|
65
|
+
stdio: "inherit",
|
|
66
|
+
});
|
|
67
|
+
} catch (error) {
|
|
68
|
+
if (error.status !== null) {
|
|
69
|
+
process.exit(error.status);
|
|
70
|
+
}
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hotwired-sh/mcp-darwin-arm64",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "hotwired-mcp binary for macOS ARM64",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/hotwired-sh/hotwired-mcp.git"
|
|
9
|
+
},
|
|
10
|
+
"os": [
|
|
11
|
+
"darwin"
|
|
12
|
+
],
|
|
13
|
+
"cpu": [
|
|
14
|
+
"arm64"
|
|
15
|
+
],
|
|
16
|
+
"files": [
|
|
17
|
+
"bin/hotwired-mcp"
|
|
18
|
+
]
|
|
19
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hotwired-sh/mcp-darwin-x64",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "hotwired-mcp binary for macOS x64",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/hotwired-sh/hotwired-mcp.git"
|
|
9
|
+
},
|
|
10
|
+
"os": [
|
|
11
|
+
"darwin"
|
|
12
|
+
],
|
|
13
|
+
"cpu": [
|
|
14
|
+
"x64"
|
|
15
|
+
],
|
|
16
|
+
"files": [
|
|
17
|
+
"bin/hotwired-mcp"
|
|
18
|
+
]
|
|
19
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hotwired-sh/mcp-linux-arm64",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "hotwired-mcp binary for Linux ARM64",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/hotwired-sh/hotwired-mcp.git"
|
|
9
|
+
},
|
|
10
|
+
"os": [
|
|
11
|
+
"linux"
|
|
12
|
+
],
|
|
13
|
+
"cpu": [
|
|
14
|
+
"arm64"
|
|
15
|
+
],
|
|
16
|
+
"files": [
|
|
17
|
+
"bin/hotwired-mcp"
|
|
18
|
+
]
|
|
19
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hotwired-sh/mcp-linux-x64",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "hotwired-mcp binary for Linux x64",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/hotwired-sh/hotwired-mcp.git"
|
|
9
|
+
},
|
|
10
|
+
"os": [
|
|
11
|
+
"linux"
|
|
12
|
+
],
|
|
13
|
+
"cpu": [
|
|
14
|
+
"x64"
|
|
15
|
+
],
|
|
16
|
+
"files": [
|
|
17
|
+
"bin/hotwired-mcp"
|
|
18
|
+
]
|
|
19
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hotwired-sh/hotwired-mcp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for Hotwired multi-agent workflow orchestration",
|
|
5
|
+
"author": "Hotwired <hello@hotwired.sh>",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/hotwired-sh/hotwired-mcp.git"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://hotwired.sh",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/hotwired-sh/hotwired-mcp/issues"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"mcp",
|
|
17
|
+
"model-context-protocol",
|
|
18
|
+
"ai",
|
|
19
|
+
"claude",
|
|
20
|
+
"hotwired",
|
|
21
|
+
"multi-agent",
|
|
22
|
+
"workflow"
|
|
23
|
+
],
|
|
24
|
+
"bin": {
|
|
25
|
+
"hotwired-mcp": "bin/hotwired-mcp"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"bin",
|
|
29
|
+
"npm"
|
|
30
|
+
],
|
|
31
|
+
"scripts": {
|
|
32
|
+
"postinstall": "node scripts/postinstall.js",
|
|
33
|
+
"test": "cargo test",
|
|
34
|
+
"prepare": "husky"
|
|
35
|
+
},
|
|
36
|
+
"optionalDependencies": {
|
|
37
|
+
"@hotwired-sh/mcp-darwin-arm64": "1.0.0",
|
|
38
|
+
"@hotwired-sh/mcp-darwin-x64": "1.0.0",
|
|
39
|
+
"@hotwired-sh/mcp-linux-x64": "1.0.0",
|
|
40
|
+
"@hotwired-sh/mcp-linux-arm64": "1.0.0"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@commitlint/cli": "^19.0.0",
|
|
44
|
+
"@commitlint/config-conventional": "^19.0.0",
|
|
45
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
46
|
+
"@semantic-release/exec": "^6.0.3",
|
|
47
|
+
"@semantic-release/git": "^10.0.1",
|
|
48
|
+
"conventional-changelog-conventionalcommits": "^7.0.2",
|
|
49
|
+
"husky": "^9.0.0",
|
|
50
|
+
"semantic-release": "^24.0.0"
|
|
51
|
+
},
|
|
52
|
+
"engines": {
|
|
53
|
+
"node": ">=18"
|
|
54
|
+
}
|
|
55
|
+
}
|