openowl 0.3.20 → 0.3.22
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 -0
- package/bin/owl +1 -2
- package/install.js +8 -61
- package/package.json +8 -6
- package/bin/owl.cmd +0 -2
package/README.md
CHANGED
|
@@ -55,8 +55,30 @@ Works with Claude Code, Codex CLI, Cursor, and any MCP-compatible AI.
|
|
|
55
55
|
|
|
56
56
|
50 tool calls/day, no credit card required. Upgrade at [openowl.dev/pricing](https://openowl.dev/pricing).
|
|
57
57
|
|
|
58
|
+
## How it works
|
|
59
|
+
|
|
60
|
+
OpenOwl is a compiled Python MCP server distributed as a native binary. The npm `postinstall` script downloads the prebuilt binary for your platform from [GitHub Releases](https://github.com/mihir-kanzariya/openowl-releases/releases) (public repo). The source code is at [github.com/mihir-kanzariya/OpenOwl](https://github.com/mihir-kanzariya/OpenOwl).
|
|
61
|
+
|
|
62
|
+
**What the binary does:**
|
|
63
|
+
- Captures screenshots via macOS native APIs (mss, Quartz)
|
|
64
|
+
- Sends keyboard/mouse input via PyAutoGUI
|
|
65
|
+
- Reads UI elements via the macOS Accessibility API
|
|
66
|
+
- Runs OCR via macOS Vision framework
|
|
67
|
+
- All processing happens locally on your machine
|
|
68
|
+
|
|
69
|
+
**Data collected (for usage metering only):**
|
|
70
|
+
- A hashed machine ID (SHA-256 of MAC address + hostname) to enforce per-device license limits
|
|
71
|
+
- Tool call counts sent to `openowl.dev/api/v1/usage/check` to enforce free-tier daily limits (50 calls/day)
|
|
72
|
+
- No screenshots, screen content, keystrokes, or personal data are ever sent to our servers
|
|
73
|
+
|
|
74
|
+
**Permissions required on macOS:**
|
|
75
|
+
- Accessibility (System Settings > Privacy & Security) — for keyboard/mouse control
|
|
76
|
+
- Screen Recording (System Settings > Privacy & Security) — for screenshots
|
|
77
|
+
|
|
58
78
|
## Links
|
|
59
79
|
|
|
60
80
|
- [Quick Setup Guide](https://openowl.dev/quick-setup)
|
|
61
81
|
- [Pricing](https://openowl.dev/pricing)
|
|
62
82
|
- [Dashboard](https://openowl.dev/dashboard)
|
|
83
|
+
- [Source Code](https://github.com/mihir-kanzariya/OpenOwl)
|
|
84
|
+
- [Binary Releases](https://github.com/mihir-kanzariya/openowl-releases/releases)
|
package/bin/owl
CHANGED
|
@@ -18,7 +18,7 @@ const crypto = require("crypto");
|
|
|
18
18
|
const { spawn } = require("child_process");
|
|
19
19
|
|
|
20
20
|
// ── Version check ──────────────────────────────────────────────
|
|
21
|
-
const VERSION = "0.3.
|
|
21
|
+
const VERSION = "0.3.22";
|
|
22
22
|
if (process.argv[2] === "--version" || process.argv[2] === "-v") {
|
|
23
23
|
console.log(`OpenOwl v${VERSION}`);
|
|
24
24
|
process.exit(0);
|
|
@@ -28,7 +28,6 @@ if (process.argv[2] === "--version" || process.argv[2] === "-v") {
|
|
|
28
28
|
const BINARIES = {
|
|
29
29
|
"darwin-arm64": "owl-darwin-arm64",
|
|
30
30
|
"darwin-x64": "owl-darwin-x86_64",
|
|
31
|
-
"win32-x64": "owl-windows-x86_64.exe",
|
|
32
31
|
};
|
|
33
32
|
|
|
34
33
|
const platformKey = `${os.platform()}-${os.arch()}`;
|
package/install.js
CHANGED
|
@@ -7,9 +7,8 @@ const path = require("path");
|
|
|
7
7
|
const https = require("https");
|
|
8
8
|
const http = require("http");
|
|
9
9
|
const { execSync } = require("child_process");
|
|
10
|
-
const zlib = require("zlib");
|
|
11
10
|
|
|
12
|
-
const VERSION = "0.3.
|
|
11
|
+
const VERSION = "0.3.22";
|
|
13
12
|
const BASE_URL =
|
|
14
13
|
`https://github.com/mihir-kanzariya/openowl-releases/releases/download/v${VERSION}`;
|
|
15
14
|
|
|
@@ -22,11 +21,6 @@ const PLATFORMS = {
|
|
|
22
21
|
url: `${BASE_URL}/owl-darwin-x64.tar.gz`,
|
|
23
22
|
binary: "owl-darwin-x86_64",
|
|
24
23
|
},
|
|
25
|
-
"win32-x64": {
|
|
26
|
-
url: `${BASE_URL}/owl-win32-x64.zip`,
|
|
27
|
-
binary: "owl-windows-x86_64.exe",
|
|
28
|
-
isZip: true,
|
|
29
|
-
},
|
|
30
24
|
};
|
|
31
25
|
|
|
32
26
|
function getPlatformKey() {
|
|
@@ -54,43 +48,6 @@ function download(url) {
|
|
|
54
48
|
});
|
|
55
49
|
}
|
|
56
50
|
|
|
57
|
-
/**
|
|
58
|
-
* Extract a zip file using pure Node.js (no PowerShell dependency).
|
|
59
|
-
*/
|
|
60
|
-
function extractZip(zipBuffer, destDir) {
|
|
61
|
-
let offset = 0;
|
|
62
|
-
while (offset < zipBuffer.length - 4) {
|
|
63
|
-
const sig = zipBuffer.readUInt32LE(offset);
|
|
64
|
-
if (sig !== 0x04034b50) break;
|
|
65
|
-
|
|
66
|
-
const compressionMethod = zipBuffer.readUInt16LE(offset + 8);
|
|
67
|
-
const compressedSize = zipBuffer.readUInt32LE(offset + 18);
|
|
68
|
-
const nameLen = zipBuffer.readUInt16LE(offset + 26);
|
|
69
|
-
const extraLen = zipBuffer.readUInt16LE(offset + 28);
|
|
70
|
-
const nameStart = offset + 30;
|
|
71
|
-
const fileName = zipBuffer.toString("utf8", nameStart, nameStart + nameLen);
|
|
72
|
-
const dataStart = nameStart + nameLen + extraLen;
|
|
73
|
-
|
|
74
|
-
const destPath = path.join(destDir, fileName);
|
|
75
|
-
|
|
76
|
-
if (fileName.endsWith("/")) {
|
|
77
|
-
fs.mkdirSync(destPath, { recursive: true });
|
|
78
|
-
} else {
|
|
79
|
-
fs.mkdirSync(path.dirname(destPath), { recursive: true });
|
|
80
|
-
const rawData = zipBuffer.slice(dataStart, dataStart + compressedSize);
|
|
81
|
-
|
|
82
|
-
if (compressionMethod === 0) {
|
|
83
|
-
fs.writeFileSync(destPath, rawData);
|
|
84
|
-
} else if (compressionMethod === 8) {
|
|
85
|
-
const inflated = zlib.inflateRawSync(rawData);
|
|
86
|
-
fs.writeFileSync(destPath, inflated);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
offset = dataStart + compressedSize;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
51
|
async function install() {
|
|
95
52
|
const platformKey = getPlatformKey();
|
|
96
53
|
const info = PLATFORMS[platformKey];
|
|
@@ -122,19 +79,13 @@ async function install() {
|
|
|
122
79
|
|
|
123
80
|
fs.mkdirSync(installDir, { recursive: true });
|
|
124
81
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
// macOS/Linux: use tar
|
|
130
|
-
const tmpFile = path.join(os.tmpdir(), `owl-${VERSION}.tar.gz`);
|
|
131
|
-
fs.writeFileSync(tmpFile, archive);
|
|
132
|
-
execSync(`tar -xzf "${tmpFile}" -C "${installDir}"`, { stdio: "pipe" });
|
|
133
|
-
fs.unlinkSync(tmpFile);
|
|
134
|
-
}
|
|
82
|
+
const tmpFile = path.join(os.tmpdir(), `owl-${VERSION}.tar.gz`);
|
|
83
|
+
fs.writeFileSync(tmpFile, archive);
|
|
84
|
+
execSync(`tar -xzf "${tmpFile}" -C "${installDir}"`, { stdio: "pipe" });
|
|
85
|
+
fs.unlinkSync(tmpFile);
|
|
135
86
|
|
|
136
|
-
// Make binary executable
|
|
137
|
-
if (fs.existsSync(binaryPath)
|
|
87
|
+
// Make binary executable
|
|
88
|
+
if (fs.existsSync(binaryPath)) {
|
|
138
89
|
fs.chmodSync(binaryPath, 0o755);
|
|
139
90
|
}
|
|
140
91
|
|
|
@@ -144,11 +95,7 @@ async function install() {
|
|
|
144
95
|
console.log(`[OpenOwl] Installed v${VERSION} successfully (${(archive.length / 1024 / 1024).toFixed(1)} MB)`);
|
|
145
96
|
} catch (err) {
|
|
146
97
|
console.error(`[OpenOwl] Installation failed: ${err.message}`);
|
|
147
|
-
|
|
148
|
-
console.error("[OpenOwl] Try downloading manually from: https://openowl.dev/quick-setup");
|
|
149
|
-
} else {
|
|
150
|
-
console.error("[OpenOwl] Try: brew install owl");
|
|
151
|
-
}
|
|
98
|
+
console.error("[OpenOwl] Try: brew install mihir-kanzariya/owl/owl");
|
|
152
99
|
process.exit(1);
|
|
153
100
|
}
|
|
154
101
|
}
|
package/package.json
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openowl",
|
|
3
|
-
"version": "0.3.
|
|
4
|
-
"description": "AI desktop automation MCP server — give your AI eyes and hands",
|
|
3
|
+
"version": "0.3.22",
|
|
4
|
+
"description": "AI desktop automation MCP server — give your AI eyes and hands. Screen capture, clicking, typing, OCR, window management via MCP protocol.",
|
|
5
5
|
"homepage": "https://openowl.dev",
|
|
6
|
+
"author": "Mihir Kanzariya <kanzariyamihir@gmail.com> (https://openowl.dev)",
|
|
6
7
|
"repository": {
|
|
7
8
|
"type": "git",
|
|
8
9
|
"url": "https://github.com/mihir-kanzariya/OpenOwl"
|
|
9
10
|
},
|
|
10
|
-
"
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/mihir-kanzariya/OpenOwl/issues"
|
|
13
|
+
},
|
|
14
|
+
"license": "BUSL-1.1",
|
|
11
15
|
"bin": {
|
|
12
16
|
"owl": "bin/owl"
|
|
13
17
|
},
|
|
@@ -26,8 +30,7 @@
|
|
|
26
30
|
"openowl"
|
|
27
31
|
],
|
|
28
32
|
"os": [
|
|
29
|
-
"darwin"
|
|
30
|
-
"win32"
|
|
33
|
+
"darwin"
|
|
31
34
|
],
|
|
32
35
|
"engines": {
|
|
33
36
|
"node": ">=16"
|
|
@@ -35,7 +38,6 @@
|
|
|
35
38
|
"files": [
|
|
36
39
|
"install.js",
|
|
37
40
|
"bin/owl",
|
|
38
|
-
"bin/owl.cmd",
|
|
39
41
|
"README.md"
|
|
40
42
|
]
|
|
41
43
|
}
|
package/bin/owl.cmd
DELETED