omnidraw 0.1.0__tar.gz
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.
- omnidraw-0.1.0/MANIFEST.in +3 -0
- omnidraw-0.1.0/PKG-INFO +119 -0
- omnidraw-0.1.0/README.md +87 -0
- omnidraw-0.1.0/pyproject.toml +53 -0
- omnidraw-0.1.0/setup.cfg +4 -0
- omnidraw-0.1.0/setup.py +99 -0
- omnidraw-0.1.0/src/omnidraw.egg-info/PKG-INFO +119 -0
- omnidraw-0.1.0/src/omnidraw.egg-info/SOURCES.txt +13 -0
- omnidraw-0.1.0/src/omnidraw.egg-info/dependency_links.txt +1 -0
- omnidraw-0.1.0/src/omnidraw.egg-info/entry_points.txt +2 -0
- omnidraw-0.1.0/src/omnidraw.egg-info/requires.txt +4 -0
- omnidraw-0.1.0/src/omnidraw.egg-info/top_level.txt +1 -0
- omnidraw-0.1.0/src/omnidraw_launcher/__init__.py +3 -0
- omnidraw-0.1.0/src/omnidraw_launcher/__main__.py +5 -0
- omnidraw-0.1.0/src/omnidraw_launcher/cli.py +62 -0
omnidraw-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: omnidraw
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: MCP-native AI drawing engine — lets your AI assistant create, edit, and export images
|
|
5
|
+
Author: Priceless Youth
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://omnidraw.vercel.app
|
|
8
|
+
Project-URL: Repository, https://github.com/timtiger/omnidraw
|
|
9
|
+
Project-URL: Issues, https://github.com/timtiger/omnidraw/issues
|
|
10
|
+
Project-URL: Documentation, https://omnidraw.vercel.app/docs/install
|
|
11
|
+
Keywords: mcp,ai,drawing,graphics,omnidraw,image-generation
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
17
|
+
Classifier: Operating System :: MacOS
|
|
18
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
25
|
+
Classifier: Topic :: Multimedia :: Graphics
|
|
26
|
+
Classifier: Topic :: Artistic Software
|
|
27
|
+
Requires-Python: >=3.10
|
|
28
|
+
Description-Content-Type: text/markdown
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: build>=1.2; extra == "dev"
|
|
31
|
+
Requires-Dist: twine>=5; extra == "dev"
|
|
32
|
+
|
|
33
|
+
# OmniDraw
|
|
34
|
+
|
|
35
|
+
**The drawing engine built for AI.** OmniDraw lets your AI assistant create, edit, and export images — right from the chat.
|
|
36
|
+
|
|
37
|
+
[](https://pypi.org/project/omnidraw/)
|
|
38
|
+
[](https://github.com/timtiger/omnidraw/blob/main/LICENSE)
|
|
39
|
+
|
|
40
|
+
## Install
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
pip install omnidraw
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Supported platforms:** Windows (x64), macOS (Apple Silicon), Linux (x64).
|
|
47
|
+
|
|
48
|
+
## Quick start
|
|
49
|
+
|
|
50
|
+
1. Install OmniDraw:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
pip install omnidraw
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
2. Add to your MCP client config (Cursor, Claude Desktop, etc.):
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"mcpServers": {
|
|
61
|
+
"omnidraw": {
|
|
62
|
+
"command": "omnidraw"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
3. Reload your MCP client — done! Ask your AI to draw something.
|
|
69
|
+
|
|
70
|
+
## What it does
|
|
71
|
+
|
|
72
|
+
OmniDraw is an MCP (Model Context Protocol) server that gives AI assistants a full drawing toolkit:
|
|
73
|
+
|
|
74
|
+
- **Shapes & text** — rectangles, ellipses, lines, arrows, polygons, text boxes
|
|
75
|
+
- **Brush engine** — strokes, fills, erasing, scatter, smudge, wet brush mixing
|
|
76
|
+
- **Effects** — gradients, shadows, blur, clipping masks, ink diffusion, paper grain
|
|
77
|
+
- **Layers** — create, select, set opacity, toggle visibility
|
|
78
|
+
- **Projects** — save/load `.omnidraw` project files with full undo history
|
|
79
|
+
- **Assets** — import images once, reuse across compositions (Pro)
|
|
80
|
+
- **Export** — PNG, JPEG, WebP with optional supersampling (Pro)
|
|
81
|
+
|
|
82
|
+
## Free vs Pro
|
|
83
|
+
|
|
84
|
+
The free tier covers the core drawing workflow. [Upgrade to Pro](https://omnidraw.vercel.app/pricing) for:
|
|
85
|
+
|
|
86
|
+
- Unlimited compositions (free: 2)
|
|
87
|
+
- Reusable image assets
|
|
88
|
+
- Project save/open
|
|
89
|
+
- High-resolution supersampling export
|
|
90
|
+
|
|
91
|
+
## Links
|
|
92
|
+
|
|
93
|
+
- **Website:** [omnidraw.vercel.app](https://omnidraw.vercel.app)
|
|
94
|
+
- **Pricing:** [omnidraw.vercel.app/pricing](https://omnidraw.vercel.app/pricing)
|
|
95
|
+
- **Install guide:** [omnidraw.vercel.app/docs/install](https://omnidraw.vercel.app/docs/install)
|
|
96
|
+
- **Examples:** [omnidraw.vercel.app/examples](https://omnidraw.vercel.app/examples)
|
|
97
|
+
- **Source:** [github.com/timtiger/omnidraw](https://github.com/timtiger/omnidraw)
|
|
98
|
+
|
|
99
|
+
## How it works
|
|
100
|
+
|
|
101
|
+
This Python package is a thin launcher that bundles a prebuilt Rust binary. When you run `omnidraw`, it starts the Rust MCP server which communicates with your AI client over stdio.
|
|
102
|
+
|
|
103
|
+
### Diagnostics
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
omnidraw --print-binary-path
|
|
107
|
+
omnidraw --launcher-diagnostics
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Environment variables
|
|
111
|
+
|
|
112
|
+
| Variable | Description |
|
|
113
|
+
|----------|-------------|
|
|
114
|
+
| `OMNIDRAW_BIN` | Override the bundled binary path at runtime |
|
|
115
|
+
| `OMNIDRAW_LICENSE_KEY` | Pro license key (from [omnidraw.vercel.app/pricing](https://omnidraw.vercel.app/pricing)) |
|
|
116
|
+
|
|
117
|
+
## License
|
|
118
|
+
|
|
119
|
+
MIT
|
omnidraw-0.1.0/README.md
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# OmniDraw
|
|
2
|
+
|
|
3
|
+
**The drawing engine built for AI.** OmniDraw lets your AI assistant create, edit, and export images — right from the chat.
|
|
4
|
+
|
|
5
|
+
[](https://pypi.org/project/omnidraw/)
|
|
6
|
+
[](https://github.com/timtiger/omnidraw/blob/main/LICENSE)
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
pip install omnidraw
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
**Supported platforms:** Windows (x64), macOS (Apple Silicon), Linux (x64).
|
|
15
|
+
|
|
16
|
+
## Quick start
|
|
17
|
+
|
|
18
|
+
1. Install OmniDraw:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
pip install omnidraw
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
2. Add to your MCP client config (Cursor, Claude Desktop, etc.):
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{
|
|
28
|
+
"mcpServers": {
|
|
29
|
+
"omnidraw": {
|
|
30
|
+
"command": "omnidraw"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
3. Reload your MCP client — done! Ask your AI to draw something.
|
|
37
|
+
|
|
38
|
+
## What it does
|
|
39
|
+
|
|
40
|
+
OmniDraw is an MCP (Model Context Protocol) server that gives AI assistants a full drawing toolkit:
|
|
41
|
+
|
|
42
|
+
- **Shapes & text** — rectangles, ellipses, lines, arrows, polygons, text boxes
|
|
43
|
+
- **Brush engine** — strokes, fills, erasing, scatter, smudge, wet brush mixing
|
|
44
|
+
- **Effects** — gradients, shadows, blur, clipping masks, ink diffusion, paper grain
|
|
45
|
+
- **Layers** — create, select, set opacity, toggle visibility
|
|
46
|
+
- **Projects** — save/load `.omnidraw` project files with full undo history
|
|
47
|
+
- **Assets** — import images once, reuse across compositions (Pro)
|
|
48
|
+
- **Export** — PNG, JPEG, WebP with optional supersampling (Pro)
|
|
49
|
+
|
|
50
|
+
## Free vs Pro
|
|
51
|
+
|
|
52
|
+
The free tier covers the core drawing workflow. [Upgrade to Pro](https://omnidraw.vercel.app/pricing) for:
|
|
53
|
+
|
|
54
|
+
- Unlimited compositions (free: 2)
|
|
55
|
+
- Reusable image assets
|
|
56
|
+
- Project save/open
|
|
57
|
+
- High-resolution supersampling export
|
|
58
|
+
|
|
59
|
+
## Links
|
|
60
|
+
|
|
61
|
+
- **Website:** [omnidraw.vercel.app](https://omnidraw.vercel.app)
|
|
62
|
+
- **Pricing:** [omnidraw.vercel.app/pricing](https://omnidraw.vercel.app/pricing)
|
|
63
|
+
- **Install guide:** [omnidraw.vercel.app/docs/install](https://omnidraw.vercel.app/docs/install)
|
|
64
|
+
- **Examples:** [omnidraw.vercel.app/examples](https://omnidraw.vercel.app/examples)
|
|
65
|
+
- **Source:** [github.com/timtiger/omnidraw](https://github.com/timtiger/omnidraw)
|
|
66
|
+
|
|
67
|
+
## How it works
|
|
68
|
+
|
|
69
|
+
This Python package is a thin launcher that bundles a prebuilt Rust binary. When you run `omnidraw`, it starts the Rust MCP server which communicates with your AI client over stdio.
|
|
70
|
+
|
|
71
|
+
### Diagnostics
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
omnidraw --print-binary-path
|
|
75
|
+
omnidraw --launcher-diagnostics
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Environment variables
|
|
79
|
+
|
|
80
|
+
| Variable | Description |
|
|
81
|
+
|----------|-------------|
|
|
82
|
+
| `OMNIDRAW_BIN` | Override the bundled binary path at runtime |
|
|
83
|
+
| `OMNIDRAW_LICENSE_KEY` | Pro license key (from [omnidraw.vercel.app/pricing](https://omnidraw.vercel.app/pricing)) |
|
|
84
|
+
|
|
85
|
+
## License
|
|
86
|
+
|
|
87
|
+
MIT
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=69", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "omnidraw"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "MCP-native AI drawing engine — lets your AI assistant create, edit, and export images"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
license = { text = "MIT" }
|
|
12
|
+
authors = [
|
|
13
|
+
{ name = "Priceless Youth" }
|
|
14
|
+
]
|
|
15
|
+
keywords = ["mcp", "ai", "drawing", "graphics", "omnidraw", "image-generation"]
|
|
16
|
+
classifiers = [
|
|
17
|
+
"Development Status :: 3 - Alpha",
|
|
18
|
+
"Environment :: Console",
|
|
19
|
+
"Intended Audience :: Developers",
|
|
20
|
+
"License :: OSI Approved :: MIT License",
|
|
21
|
+
"Operating System :: Microsoft :: Windows",
|
|
22
|
+
"Operating System :: MacOS",
|
|
23
|
+
"Operating System :: POSIX :: Linux",
|
|
24
|
+
"Programming Language :: Python :: 3",
|
|
25
|
+
"Programming Language :: Python :: 3 :: Only",
|
|
26
|
+
"Programming Language :: Python :: 3.10",
|
|
27
|
+
"Programming Language :: Python :: 3.11",
|
|
28
|
+
"Programming Language :: Python :: 3.12",
|
|
29
|
+
"Programming Language :: Python :: 3.13",
|
|
30
|
+
"Topic :: Multimedia :: Graphics",
|
|
31
|
+
"Topic :: Artistic Software",
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
[project.urls]
|
|
35
|
+
Homepage = "https://omnidraw.vercel.app"
|
|
36
|
+
Repository = "https://github.com/timtiger/omnidraw"
|
|
37
|
+
Issues = "https://github.com/timtiger/omnidraw/issues"
|
|
38
|
+
Documentation = "https://omnidraw.vercel.app/docs/install"
|
|
39
|
+
|
|
40
|
+
[project.scripts]
|
|
41
|
+
omnidraw = "omnidraw_launcher.cli:main"
|
|
42
|
+
|
|
43
|
+
[project.optional-dependencies]
|
|
44
|
+
dev = ["build>=1.2", "twine>=5"]
|
|
45
|
+
|
|
46
|
+
[tool.setuptools]
|
|
47
|
+
include-package-data = true
|
|
48
|
+
|
|
49
|
+
[tool.setuptools.package-dir]
|
|
50
|
+
"" = "src"
|
|
51
|
+
|
|
52
|
+
[tool.setuptools.packages.find]
|
|
53
|
+
where = ["src"]
|
omnidraw-0.1.0/setup.cfg
ADDED
omnidraw-0.1.0/setup.py
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import platform
|
|
5
|
+
import shutil
|
|
6
|
+
import struct
|
|
7
|
+
import sys
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
from setuptools import setup
|
|
11
|
+
from setuptools.command.build_py import build_py as _build_py
|
|
12
|
+
|
|
13
|
+
try:
|
|
14
|
+
from wheel.bdist_wheel import bdist_wheel as _bdist_wheel
|
|
15
|
+
except ImportError:
|
|
16
|
+
_bdist_wheel = None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
PACKAGE_ROOT = Path(__file__).resolve().parent
|
|
20
|
+
REPO_ROOT = PACKAGE_ROOT.parent.parent
|
|
21
|
+
PACKAGE_NAME = "omnidraw_launcher"
|
|
22
|
+
ENV_BUILD_BINARY = "OMNIDRAW_PACKAGE_BINARY"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _default_binary_candidates() -> list[Path]:
|
|
26
|
+
names = ["omnidraw.exe", "omnidraw"]
|
|
27
|
+
parents = [
|
|
28
|
+
REPO_ROOT / "zzbuild-live" / "release",
|
|
29
|
+
REPO_ROOT / "zzbuild-live2" / "release",
|
|
30
|
+
REPO_ROOT / "zzbuild" / "release",
|
|
31
|
+
REPO_ROOT / "target" / "release",
|
|
32
|
+
]
|
|
33
|
+
return [parent / name for parent in parents for name in names]
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _resolve_binary_path() -> Path:
|
|
37
|
+
override = os.environ.get(ENV_BUILD_BINARY)
|
|
38
|
+
candidates = [Path(override)] if override else []
|
|
39
|
+
candidates.extend(_default_binary_candidates())
|
|
40
|
+
for candidate in candidates:
|
|
41
|
+
if candidate.exists() and candidate.is_file():
|
|
42
|
+
return candidate.resolve()
|
|
43
|
+
checked = "\n".join(f"- {path}" for path in candidates) or "- <none>"
|
|
44
|
+
raise RuntimeError(
|
|
45
|
+
"Cannot package OmniDraw because no Rust binary was found.\n"
|
|
46
|
+
f"Set {ENV_BUILD_BINARY} to a built omnidraw binary, or build one into one of:\n{checked}"
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _plat_name() -> str:
|
|
51
|
+
"""Return a PEP 425 platform tag matching the bundled Rust binary."""
|
|
52
|
+
override = os.environ.get("OMNIDRAW_PLAT_NAME")
|
|
53
|
+
if override:
|
|
54
|
+
return override
|
|
55
|
+
if sys.platform == "win32":
|
|
56
|
+
bits = struct.calcsize("P") * 8
|
|
57
|
+
return "win_amd64" if bits == 64 else "win32"
|
|
58
|
+
if sys.platform == "darwin":
|
|
59
|
+
machine = platform.machine()
|
|
60
|
+
if machine == "arm64":
|
|
61
|
+
return "macosx_11_0_arm64"
|
|
62
|
+
return "macosx_10_9_x86_64"
|
|
63
|
+
machine = platform.machine()
|
|
64
|
+
if machine == "x86_64":
|
|
65
|
+
return "manylinux_2_17_x86_64"
|
|
66
|
+
if machine == "aarch64":
|
|
67
|
+
return "manylinux_2_17_aarch64"
|
|
68
|
+
return f"linux_{machine}"
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class build_py(_build_py):
|
|
72
|
+
def run(self) -> None:
|
|
73
|
+
super().run()
|
|
74
|
+
binary_path = _resolve_binary_path()
|
|
75
|
+
binary_name = "omnidraw.exe" if binary_path.suffix.lower() == ".exe" else "omnidraw"
|
|
76
|
+
dest_dir = Path(self.build_lib) / PACKAGE_NAME / "bin"
|
|
77
|
+
dest_dir.mkdir(parents=True, exist_ok=True)
|
|
78
|
+
shutil.copy2(binary_path, dest_dir / binary_name)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
cmdclass: dict = {"build_py": build_py}
|
|
82
|
+
|
|
83
|
+
if _bdist_wheel is not None:
|
|
84
|
+
class bdist_wheel(_bdist_wheel): # type: ignore[misc]
|
|
85
|
+
def finalize_options(self) -> None:
|
|
86
|
+
super().finalize_options()
|
|
87
|
+
self.root_is_pure = False
|
|
88
|
+
self.plat_name_supplied = True
|
|
89
|
+
self.plat_name = _plat_name()
|
|
90
|
+
|
|
91
|
+
def get_tag(self) -> tuple[str, str, str]:
|
|
92
|
+
return "py3", "none", _plat_name().replace("-", "_").replace(".", "_")
|
|
93
|
+
|
|
94
|
+
cmdclass["bdist_wheel"] = bdist_wheel
|
|
95
|
+
|
|
96
|
+
setup(
|
|
97
|
+
cmdclass=cmdclass,
|
|
98
|
+
package_data={PACKAGE_NAME: ["bin/*"]},
|
|
99
|
+
)
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: omnidraw
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: MCP-native AI drawing engine — lets your AI assistant create, edit, and export images
|
|
5
|
+
Author: Priceless Youth
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://omnidraw.vercel.app
|
|
8
|
+
Project-URL: Repository, https://github.com/timtiger/omnidraw
|
|
9
|
+
Project-URL: Issues, https://github.com/timtiger/omnidraw/issues
|
|
10
|
+
Project-URL: Documentation, https://omnidraw.vercel.app/docs/install
|
|
11
|
+
Keywords: mcp,ai,drawing,graphics,omnidraw,image-generation
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
17
|
+
Classifier: Operating System :: MacOS
|
|
18
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
25
|
+
Classifier: Topic :: Multimedia :: Graphics
|
|
26
|
+
Classifier: Topic :: Artistic Software
|
|
27
|
+
Requires-Python: >=3.10
|
|
28
|
+
Description-Content-Type: text/markdown
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: build>=1.2; extra == "dev"
|
|
31
|
+
Requires-Dist: twine>=5; extra == "dev"
|
|
32
|
+
|
|
33
|
+
# OmniDraw
|
|
34
|
+
|
|
35
|
+
**The drawing engine built for AI.** OmniDraw lets your AI assistant create, edit, and export images — right from the chat.
|
|
36
|
+
|
|
37
|
+
[](https://pypi.org/project/omnidraw/)
|
|
38
|
+
[](https://github.com/timtiger/omnidraw/blob/main/LICENSE)
|
|
39
|
+
|
|
40
|
+
## Install
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
pip install omnidraw
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Supported platforms:** Windows (x64), macOS (Apple Silicon), Linux (x64).
|
|
47
|
+
|
|
48
|
+
## Quick start
|
|
49
|
+
|
|
50
|
+
1. Install OmniDraw:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
pip install omnidraw
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
2. Add to your MCP client config (Cursor, Claude Desktop, etc.):
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"mcpServers": {
|
|
61
|
+
"omnidraw": {
|
|
62
|
+
"command": "omnidraw"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
3. Reload your MCP client — done! Ask your AI to draw something.
|
|
69
|
+
|
|
70
|
+
## What it does
|
|
71
|
+
|
|
72
|
+
OmniDraw is an MCP (Model Context Protocol) server that gives AI assistants a full drawing toolkit:
|
|
73
|
+
|
|
74
|
+
- **Shapes & text** — rectangles, ellipses, lines, arrows, polygons, text boxes
|
|
75
|
+
- **Brush engine** — strokes, fills, erasing, scatter, smudge, wet brush mixing
|
|
76
|
+
- **Effects** — gradients, shadows, blur, clipping masks, ink diffusion, paper grain
|
|
77
|
+
- **Layers** — create, select, set opacity, toggle visibility
|
|
78
|
+
- **Projects** — save/load `.omnidraw` project files with full undo history
|
|
79
|
+
- **Assets** — import images once, reuse across compositions (Pro)
|
|
80
|
+
- **Export** — PNG, JPEG, WebP with optional supersampling (Pro)
|
|
81
|
+
|
|
82
|
+
## Free vs Pro
|
|
83
|
+
|
|
84
|
+
The free tier covers the core drawing workflow. [Upgrade to Pro](https://omnidraw.vercel.app/pricing) for:
|
|
85
|
+
|
|
86
|
+
- Unlimited compositions (free: 2)
|
|
87
|
+
- Reusable image assets
|
|
88
|
+
- Project save/open
|
|
89
|
+
- High-resolution supersampling export
|
|
90
|
+
|
|
91
|
+
## Links
|
|
92
|
+
|
|
93
|
+
- **Website:** [omnidraw.vercel.app](https://omnidraw.vercel.app)
|
|
94
|
+
- **Pricing:** [omnidraw.vercel.app/pricing](https://omnidraw.vercel.app/pricing)
|
|
95
|
+
- **Install guide:** [omnidraw.vercel.app/docs/install](https://omnidraw.vercel.app/docs/install)
|
|
96
|
+
- **Examples:** [omnidraw.vercel.app/examples](https://omnidraw.vercel.app/examples)
|
|
97
|
+
- **Source:** [github.com/timtiger/omnidraw](https://github.com/timtiger/omnidraw)
|
|
98
|
+
|
|
99
|
+
## How it works
|
|
100
|
+
|
|
101
|
+
This Python package is a thin launcher that bundles a prebuilt Rust binary. When you run `omnidraw`, it starts the Rust MCP server which communicates with your AI client over stdio.
|
|
102
|
+
|
|
103
|
+
### Diagnostics
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
omnidraw --print-binary-path
|
|
107
|
+
omnidraw --launcher-diagnostics
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Environment variables
|
|
111
|
+
|
|
112
|
+
| Variable | Description |
|
|
113
|
+
|----------|-------------|
|
|
114
|
+
| `OMNIDRAW_BIN` | Override the bundled binary path at runtime |
|
|
115
|
+
| `OMNIDRAW_LICENSE_KEY` | Pro license key (from [omnidraw.vercel.app/pricing](https://omnidraw.vercel.app/pricing)) |
|
|
116
|
+
|
|
117
|
+
## License
|
|
118
|
+
|
|
119
|
+
MIT
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
MANIFEST.in
|
|
2
|
+
README.md
|
|
3
|
+
pyproject.toml
|
|
4
|
+
setup.py
|
|
5
|
+
src/omnidraw.egg-info/PKG-INFO
|
|
6
|
+
src/omnidraw.egg-info/SOURCES.txt
|
|
7
|
+
src/omnidraw.egg-info/dependency_links.txt
|
|
8
|
+
src/omnidraw.egg-info/entry_points.txt
|
|
9
|
+
src/omnidraw.egg-info/requires.txt
|
|
10
|
+
src/omnidraw.egg-info/top_level.txt
|
|
11
|
+
src/omnidraw_launcher/__init__.py
|
|
12
|
+
src/omnidraw_launcher/__main__.py
|
|
13
|
+
src/omnidraw_launcher/cli.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
omnidraw_launcher
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import json
|
|
5
|
+
import subprocess
|
|
6
|
+
import sys
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
from . import __version__
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
ENV_RUNTIME_BINARY = "OMNIDRAW_BIN"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _packaged_binary_path() -> Path:
|
|
16
|
+
binary_name = "omnidraw.exe" if os.name == "nt" else "omnidraw"
|
|
17
|
+
return Path(__file__).resolve().parent / "bin" / binary_name
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def resolve_binary() -> Path:
|
|
21
|
+
override = os.environ.get(ENV_RUNTIME_BINARY)
|
|
22
|
+
candidates = [Path(override)] if override else []
|
|
23
|
+
candidates.append(_packaged_binary_path())
|
|
24
|
+
for candidate in candidates:
|
|
25
|
+
if candidate.exists() and candidate.is_file():
|
|
26
|
+
return candidate
|
|
27
|
+
checked = "\n".join(f"- {path}" for path in candidates)
|
|
28
|
+
raise SystemExit(
|
|
29
|
+
"OmniDraw binary not found.\n"
|
|
30
|
+
f"Set {ENV_RUNTIME_BINARY} to a valid omnidraw binary, or reinstall the package.\n"
|
|
31
|
+
f"Checked:\n{checked}"
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _diagnostics() -> dict[str, object]:
|
|
36
|
+
override = os.environ.get(ENV_RUNTIME_BINARY)
|
|
37
|
+
binary = resolve_binary()
|
|
38
|
+
return {
|
|
39
|
+
"launcher_version": __version__,
|
|
40
|
+
"binary_path": str(binary),
|
|
41
|
+
"binary_exists": binary.exists(),
|
|
42
|
+
"runtime_override": override,
|
|
43
|
+
"platform": sys.platform,
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def main() -> int:
|
|
48
|
+
if len(sys.argv) >= 2 and sys.argv[1] == "--print-binary-path":
|
|
49
|
+
print(resolve_binary())
|
|
50
|
+
return 0
|
|
51
|
+
|
|
52
|
+
if len(sys.argv) >= 2 and sys.argv[1] == "--launcher-diagnostics":
|
|
53
|
+
print(json.dumps(_diagnostics(), indent=2))
|
|
54
|
+
return 0
|
|
55
|
+
|
|
56
|
+
binary = resolve_binary()
|
|
57
|
+
completed = subprocess.run([str(binary), *sys.argv[1:]], check=False)
|
|
58
|
+
return int(completed.returncode)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
if __name__ == "__main__":
|
|
62
|
+
raise SystemExit(main())
|