Professional next-generation AI-first vector graphics tool
"Illustmaker"
One line of code, vector designs come alive.
A simple HTTP JSON API (102 methods total) you can call from AI agents, server-side code, or cron — anywhere.
Realize whatever you envision.
| Endpoint | POST https://asi.co.jp/illustmaker/api/mcp.php |
|---|---|
| Content-Type | application/json |
| Format | { "method": "...", "params": {...}, "session": "..." } |
| Response | { "ok": true, ... } or { "ok": false, "error": "..." } |
| Version | 1.0.0 |
| llms.txt | /illustmaker/llms.txt |
Quick Start
1. Create a session
curl -X POST https://asi.co.jp/illustmaker/api/mcp.php \
-H 'Content-Type: application/json' \
-d '{"method":"illust.create_session","params":{"width":800,"height":600,"bg":"#ffffff"}}'
{
"ok": true,
"session": "abc123def456",
"state": {"docW":800,"docH":600,"docBg":"#ffffff","objects":[]},
"open_url": "https://asi.co.jp/illustmaker/?s=abc123def456"
}
2. Add an object
curl -X POST https://asi.co.jp/illustmaker/api/mcp.php \
-H 'Content-Type: application/json' \
-d '{
"method": "illust.add_object",
"session": "abc123def456",
"params": {"type":"ellipse","x":200,"y":150,"w":400,"h":300,"fill":"#4a9eff"}
}'
3. Export SVG
curl -X POST https://asi.co.jp/illustmaker/api/mcp.php \
-H 'Content-Type: application/json' \
-d '{"method":"illust.export_svg","session":"abc123def456"}'
4. Open in the browser (let the user edit)
Open open_url in a browser and the user can continue editing by hand.
Authentication / API key
The API can be used anonymously, but the rate limit is strict (30 req/min). For continued use we recommend issuing an API key.
Issuing an API key
curl -X POST https://asi.co.jp/illustmaker/api/keys.php \
-H 'Content-Type: application/json' \
-d '{"action":"issue","email":"you@example.com","purpose":"my_project"}'
{
"ok": true,
"api_key": "im_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"tier": "free",
"rate_limit_per_min": 100
}
The issued API key is shown only once. Store it somewhere safe.
Usage
curl -X POST https://asi.co.jp/illustmaker/api/mcp.php \
-H 'Content-Type: application/json' \
-H 'X-API-Key: im_xxxxxxxxxx' \
-d '{"method":"illust.health"}'
Rate limit tiers
| tier | Limit | How to obtain |
|---|---|---|
| anon | 30 req/min | No API key required |
| free | 100 req/min | The issue endpoint above |
| pro | 600 req/min | Contact us |
Status check & revocation
# info
curl -X POST https://asi.co.jp/illustmaker/api/keys.php -H 'Content-Type: application/json' \
-d '{"action":"info","key":"im_xxx"}'
# revoke
curl -X POST https://asi.co.jp/illustmaker/api/keys.php -H 'Content-Type: application/json' \
-d '{"action":"revoke","key":"im_xxx"}'
Limits
| Request body | Max 1MB |
|---|---|
| Objects per session | Max 5,000 |
| Session file size | Max 5MB |
| batch_render rows | Max 1,000 |
| Rate limit | anon 30 / free 100 / pro 600 req/min |
| Session retention | 7 days from last update (auto-deleted via cron) |
| import_from_url | Public IPs and ports 80/443 only. No redirect following. 5MB max |
Use cases
Have AI design a logo
Prompt Claude/Cursor etc. → AI generates SVG code → hand it to MCP and open it in the browser. The first draft is in your hands in seconds.
- Prompt the AI with "Sushi restaurant logo, Japanese modern, red and black"
- The AI calls
illust.create_session→illust.add_svgor individualadd_ellipse/add_text - An
open_urlis returned, open it in the browser - Human fine-tunes → export SVG/PNG/PDF
Mass-produce 100 food labels
One template + CSV/JSON generates labels for 100 products in 2 seconds. Variable Data Printing for food factories, restaurants, and craft breweries.
- Create template:
create_session→ border/logo/color bar viaadd_object - Add variable text:
{{name}}{{net}}{{expiry}} - Extract array from product DB/CSV
batch_renderwithoutput:"pdf-imposition"to generate an A4 imposed PDF in one shot- Submit directly to a print shop
Bulk export price POPs as PDF
Supermarket sale POPs, restaurant price tags, retail show cards. Generate 30 PDFs at once from a CSV of prices and product names.
- Create a POP template (red "Sale" ribbon + product image + price)
- Build an array of product name, regular price, and sale price from POS or CSV data
batch_rendertakes you all the way to a print-ready PDF
Generate per-article OGP images
Generate SNS thumbnails for 100 blog posts at once with consistent design. Just swap title and author name.
- Create a 1200x630 template (background + brand logo + variable title)
- Extract a
{title, author}array from your blog DB batch_renderwithoutput:"png-zip"to get PNGs in bulk- Auto-place on each article page
Generate 10 logo variants for A/B testing
Generate 10 variants with different palettes/fonts for the same company name → compare side by side → pick the best one and refine.
- Create a template (company name + logo mark)
- Combine
suggest_palette12 themes xsuggest_font8 purposes batch_renderbulk-generates 10 color variants- Compare side by side in client / Slack / Notion
Data → auto-diagrammed graph SVG
Hand a sales CSV/JSON to the AI and it draws bar/pie/line charts directly as SVG. Embed straight into presentation slides.
- Pass the data array to the AI and prompt "turn this into a bar chart SVG"
- The AI computes properties → places chart elements via
add_object(rect) andadd_text export_pdffor a presentation-ready PDF
Mass-produce numbered business cards & tickets
Mass production of event tickets, reception slips with QR codes, business cards — anything with sequential numbers and individualized info.
- Create a template (QR position + serial number field + personal info fields)
- Add variable text
{{name}}{{qr_url}}{{seat_no}} - Extract array from attendee DB
batch_renderwithimpositionplaces 10 tickets per A4 sheet → print
Product catalog printing
Auto-typeset EC / wholesale product catalogs from your product DB. All four elements — image + SKU + price + features — for every product.
- Create a template for one catalog page
- Use
illust.import_from_urlto fetch product images by URL - Loop the whole product DB →
batch_render - Lay out 2x4=8 products per A4 portrait and print
Method reference
Linked to the side-nav categories. The full method list is also available in llms.txt.
illust.health no-session
Server reachability check.
{"method": "illust.health"}
{"ok": true, "version": "1.0.0", "methods": 10}
illust.create_session no-session
Creates a new session. Returns share_id and a URL for opening it.
params
width | number | 16-16384, default 800 |
height | number | 16-16384, default 600 |
bg | string | Background color (HEX/none), default "#ffffff" |
{
"method": "illust.create_session",
"params": {"width": 1200, "height": 630, "bg": "#000"}
}
{"ok":true, "session":"...", "state":{...}, "open_url":"..."}
illust.set_document
Change document size and background.
{"method":"illust.set_document","session":"...","params":{"width":1080,"height":1080}}
illust.add_object
Add an object. type is one of rect/ellipse/text/path/line/poly/star/image/raw.
Common params
type | string | Required |
x, y, w, h | number | Position and size |
fill | string | Color value (HEX/rgb/named/none) |
stroke | string | Stroke color |
strokeWidth | number | Stroke width |
rotation | number | Degrees |
name | string | Layer name |
Per-type additional properties
text | text, fontSize, fontFamily, fontWeight, letterSpacing, lineHeight | |
path/poly/star | nodes: [{x,y,hIn,hOut}], closed: bool | |
line | x1, y1, x2, y2 | |
image | href: "data:image/png;base64,..." or URL | |
raw | rawSvg: "<path d=\"...\"/>" (sanitized) | |
illust.add_svg
Parses an SVG string into objects and inserts them.
{"method":"illust.add_svg","session":"...","params":{"svg":"<svg><circle cx='50' cy='50' r='30' fill='red'/></svg>"}}
illust.list_objects
List current objects (id/type/position/size/color).
illust.update_object
Partially update properties of a specific object.
{"method":"illust.update_object","session":"...","params":{"id":"o1","patch":{"fill":"#ef4444","rotation":15}}}
illust.delete_objects
Delete objects by ID.
{"method":"illust.delete_objects","session":"...","params":{"ids":["o1","o3"]}}
illust.export_svg
Generates the SVG string server-side and returns it.
{"ok":true, "svg":"<svg xmlns=...>...</svg>"}
illust.batch_render 5 batch modes
Embed {{var_name}} variables in your template and expand them with a data array. Generate SVG / PNG / PDF imposition in a single command. For mass-producing food labels, price POPs, product tags, and OGP images.
output modes
svg | default | Returns an array of SVG strings (no filename, for compatibility) |
svg-zip | ZIP | Bundles all SVGs into a single ZIP, returned base64-encoded |
png | PNG array | Rasterized via ImageMagick, each PNG returned base64 in an array. dpi can be set 72-600 |
png-zip | ZIP | All PNGs bundled into a single ZIP |
pdf-imposition | Print-ready PDF imposed cols x rows onto A4 etc. True vector embedding (TCPDF) |
Parameters
data | array | Required. Each element is a variable object, e.g. {"name":"Dark soy sauce","net":"500ml"} |
output | string | One of the 5 modes above. Default "svg" |
filename_template | string | Filename template inside the ZIP, e.g. "{{name}}" → Dark soy sauce.svg. {{i}} is a serial number |
dpi | number | For png/png-zip. 72 (web) - 600 (print), default 96 |
imposition | object | For pdf-imposition. {paper:"A4"|"A3"|"letter", cols:N, rows:M, margin_mm:5, gap_mm:3} |
Setup (common)
// 1. Create template — include {{var}} in your text
{"method":"illust.add_object","session":"...","params":{
"type":"text","text":"Product: {{name}}","x":50,"y":80,"fontSize":36
}}
Usage examples
A) SVG-ZIP — get individual SVGs bundled in a ZIP
{"method":"illust.batch_render","session":"...","params":{
"output": "svg-zip",
"filename_template": "{{name}}",
"data":[
{"name":"Dark soy sauce","net":"500ml"},
{"name":"Light soy sauce","net":"500ml"}
]
}}
{"ok":true, "count":2, "output":"svg-zip",
"filename":"illustmaker-batch-20260525-115500.zip",
"zip_base64":"UEsDBBQAAAA...", "size":1352}
B) PNG (high-DPI for print)
{"method":"illust.batch_render","session":"...","params":{
"output":"png-zip", "dpi":300,
"filename_template":"label-{{i}}",
"data":[{"name":"Product A"}, {"name":"Product B"}, ...]
}}
C) A4 imposed PDF — submit directly to a print shop
{"method":"illust.batch_render","session":"...","params":{
"output": "pdf-imposition",
"imposition": {
"paper": "A4",
"cols": 2,
"rows": 4,
"margin_mm": 10,
"gap_mm": 5
},
"data": [/* 100 rows */]
}}
{"ok":true, "count":100, "output":"pdf-imposition",
"paper":"A4", "cols":2, "rows":4, "pages":13,
"filename":"illustmaker-imposed-20260525-115500.pdf",
"pdf_base64":"JVBERi0xLjcK...", "size":54320}
Client side (browser)
Helpers IM.batchRender() + IM.batchSave() trigger an automatic ZIP/PDF download:
IM.batchRender("session-id",
[{name:"Dark soy sauce"}, {name:"Light soy sauce"}, ...],
{output:"pdf-imposition", imposition:{cols:2, rows:4}}
).then(IM.batchSave);
// → browser download fires automatically
Additional methods (v2.0+)
v2.0 onward expanded the API from 10 to 64 methods. Covers session management, alignment, mass production, palette suggestions, external fetch, gallery integration, masks / symbols / blends / pathfinder, print-ready PDFs (trim marks, bleed), parts/template library, and BYOK image generation / AI Vision critique.
Session management
illust.list_sessions | List all sessions (max 100, newest first) → {count, sessions:[{session, docW, docH, objectCount, updated_at, size}]} |
|---|---|
illust.session_info | Session metadata (size, updated_at, object count) |
illust.clone_session | Clone a session (template reuse). Object IDs are reassigned |
illust.delete_session | Delete a session |
illust.copy_to_session | {target, ids} Copy objects to another session |
Object operations
illust.get_object | {id} → full data for a single object |
|---|---|
illust.clear_objects | Delete all objects |
illust.add_image | {url} server-side fetch → embed as data URI / {href} direct |
illust.duplicate_objects | {ids, dx, dy} Duplicate with offset |
illust.group_objects | {ids, name?} Group into a folder |
illust.align_objects | {ids, kind} Align. kind: left/right/center-h/top/bottom/center-v/dist-h/dist-v |
illust.set_layer_order | {ids, action} Z-order. action: front/back/forward/backward |
Save & load
illust.save_project | Serializes the whole state to JSON → {project_base64, filename}. Can be saved as .json |
|---|---|
illust.load_project | {project_base64 | project_json} Replace state entirely |
Single export (for one-offs, not batch_render)
illust.export_png | {dpi?} 72-600 → PNG base64 |
|---|---|
illust.export_jpeg | {dpi?, quality?} 50-100 → JPEG base64 |
illust.export_pdf | True vector PDF (SVG embedded via TCPDF) |
illust.export_optimized_svg | SVGO-equivalent minification. Also returns {original_size, optimized_size, reduction_pct} |
Text
illust.measure_text | {text, fontSize, fontFamily?, letterSpacing?} → {width, height, baseline} (approximate, with full-width/half-width detection) |
|---|---|
illust.replace_text | {find, replace} Bulk replace across all text |
illust.set_text_style | {ids?, style:{fontSize, fontFamily, fill, ...}} Bulk style change |
illust.text_to_path | Freeze text as raw SVG (true outlining requires client-side getBBox / opentype.js) |
illust.list_fonts | List of system fonts + popular Google Fonts |
illust.set_font | {name} Register a Google Font to the session (actual load happens client-side) |
Palette & font suggestions
illust.extract_palette | Extract colors from existing objects → {palette:[{color, count}], unique_count} |
|---|---|
illust.suggest_palette | {theme} → 5-color palette. themes: warm/cool/pastel/mono/vivid/japanese/summer/autumn/winter/spring/natural/tech |
illust.suggest_font | {purpose} → 5 recommended fonts. purposes: logo/heading/body/japanese-logo/japanese-body/casual/serious/tech |
External resources
illust.import_from_url | {url, x?, y?, w?, h?} Fetch SVG/image from an HTTP(S) URL and place it (5MB max) |
|---|
Gallery (community)
After finishing a session, submit, browse, remix, and comment on the public gallery directly from AI.
gallery.submit | {session, title, description?, category?, tags?, author_name?, parent_id?} Publish the session. SVG/PNG/projectJSON are generated server-side.→ {id, slug, url, png_url} |
|---|---|
gallery.list | {sort?, category?, tag?, q?, limit?} List public works. sort:"new"|"popular", category:"icon|logo|illustration|character|ui|pattern|other" |
gallery.get | {slug} Work details (title/author/tags/PNG/SVG/projectURL etc.) |
gallery.remix | {slug} Create a new session loaded with the parent work → {session, open_url, parent_id, object_count}. Modify with illust.update_object etc. |
gallery.list_comments | {slug} List comments (single-level threading via parent_id) |
gallery.comment | {slug, body, author_name?, parent_id?} Post a comment. Replies via parent_id |
Masks (clip & opacity)
Any rect/ellipse/path shape can be used as a mask (rect/ellipse support added in v3.0).
illust.clip_mask | {session, mask_id, content_ids} Clip content to the shape of the topmost object. The mask source is removed |
|---|---|
illust.release_clip | {session, ids} Release clip |
illust.opacity_mask | {session, mask_id, content_ids} Opacity mask (white=opaque, black=transparent, gradients OK) |
illust.release_opacity_mask | {session, ids} Release opacity mask |
Text on path
illust.text_on_path | {session, text_id, path_id, offset?} Place text along a path curve. startOffset accepted ("50%" or px) |
|---|---|
illust.release_text_on_path | {session, text_id} Return to normal text |
Symbols (master & instances)
illust.save_symbol | {session, ids, name} Save selected objects as a symbol |
|---|---|
illust.list_symbols | {session} List symbols |
illust.create_symbol_instance | {session, symbol_id, x, y} Place an instance at coordinates |
Pathfinder & blend
illust.pathfinder | {session, ids[2+], op: union|intersect|subtract|exclude} Boolean operations. High-precision server-side processing via marching squares |
|---|---|
illust.blend | {session, id_a, id_b, steps} Generate N intermediate objects between two objects. Interpolates shape and color |
Print submission (pro)
Output PDFs you can submit directly to a print shop. Supports trim marks, bleed, and registration marks.
illust.export_print_pdf | {session, bleed_mm?, trim_marks?, registration_marks?, color_space?} Print-ready PDF output.- bleed_mm: bleed (default 3mm) - trim_marks: auto-add trim marks - registration_marks: 4-color registration marks |
|---|---|
illust.preflight_check | {session, bleed_mm?} Preflight diagnostic → {score: 0-10, issues, warnings, recommended_actions}. Detects missing bleed, un-outlined text, RGB→CMYK warnings |
Live trace (image → vector)
illust.live_trace | {session, image_id, threshold?, turd_size?, opt_tolerance?, fill?, replace_image?} Vectorize raster image objects via potrace. For turning hand-drawn sketches into logos, etc. |
|---|
Parts & template library
Server-hosted high-quality parts (icons, frames, decorations) and templates (business cards, flyers, logos, etc.). Searchable and usable from AI.
illust.library_search | {q?, category?, limit?} Search parts. category: icon|frame|decoration |
|---|---|
illust.library_use | {session, slug, x, y, w?, h?} Place a selected part into the session |
illust.template_list | {category?, limit?} List templates. category: business-card|flyer|logo|banner|card|coupon |
illust.template_render | {slug, vars} Generate a new session from a template. Variables like {{name}} {{title}} are auto-substituted |
BYOK image generation & AI Vision critique
Run image generation and AI critique using your own API keys. ASI servers never store your keys (transparent proxy).
illust.generate_image | {session, prompt, api_key, provider: openai|recraft, model?, size?, x, y, w, h} Insert an image from an image-generation AI |
|---|---|
illust.critique | {session, api_key, provider: anthropic|openai, model?, criteria?} Rasterize the current session to PNG → critique via Vision LLM → {score, summary, issues, strengths} |
Gradient mesh (v4.0)
Smooth 2D color gradients via bilinear interpolation. Specify 4 corner colors or every color in an N x M grid.
illust.add_mesh_gradient | {session, x, y, w, h, cols?, rows?, detail?, corners?, colors?} Smooth 2D color gradient. detail (8-60) adjusts smoothness. Rendered with 576-3600 polygons |
|---|
Brand kit storage (v4.0)
Save palette, fonts, and asset URLs together as brand assets. Anonymous owner_fp (ip+ua hash) based.
illust.brand_save | {name, palette[], fonts[], assets[], kit_id?} Save a brand kit. Specify kit_id to overwrite |
|---|---|
illust.brand_list | List your brand kits |
illust.brand_delete | {kit_id} Delete a brand kit |
Live share (v4.0)
Share a session you're editing via URL. Viewers see it at /illustmaker/live/{token} with 3-second polling. Valid for 30 days. Issue with mode='comment' and viewers can post coordinate-anchored comments.
illust.share_create | {session, mode: view|comment, label?} Issue a share link. Returns {token, url} |
|---|---|
illust.share_list | List share links you've issued |
illust.share_delete | {token} Invalidate a share link |
illust.share_view | {token} Public endpoint (no auth). Returns current SVG from token |
Live share comments (v4.1)
Issue a share link with mode='comment' and viewers can post coordinate-anchored comments on the live viewer. For internal reviews, client feedback, and Q&A boards in education.
illust.share_comment_post | {token, body, author_name?, x?, y?} Viewer-side comment posting (public endpoint, no auth). Max 2000 chars. Omitting x/y means "comment on the whole work." Rate limit: 20/hour per viewer |
|---|---|
illust.share_comment_list | {token, include_resolved?} List comments (public endpoint) |
illust.share_comment_resolve | {comment_id, resolved} Owner of the share link only. Toggle resolved status |
illust.share_comment_delete | {comment_id} Owner of the share link only. Soft delete |
Real-time collaborative editing (v5.0)
Issue a share link with mode='edit' and multiple people can simultaneously draw, move, and delete shapes from /illustmaker/live/{token} in a full collaborative editing mode. HTTP long-polling + LWW (Last-Write-Wins) conflict resolution. Displays participant cursors, selections, and edit locks.
illust.collab_join | {token, actor_name?, actor_color?, actor_id?} Join collaborative editing. Returns issued actor_id + initial state + last_seq |
|---|---|
illust.collab_leave | {token, actor_id} Leave |
illust.collab_op_submit | {token, actor_id, op_type, payload} Submit an operation. op_type = add_object / update_object / delete_objects / set_document / reorder_objects / cursor / selection / lock_object / unlock_object |
illust.collab_poll | {token, actor_id, since} Long-poll (up to 25 seconds). Returns ops after since, participants, and lock list |
illust.collab_status | {token} Lightweight status (participant count, op count, last seq) |
AI tool integration
Claude Desktop / Cursor / Cline (npm version)
Published: @illustmaker/mcp
{
"mcpServers": {
"illustmaker": {
"command": "npx",
"args": ["-y", "@illustmaker/mcp"]
}
}
}
If you get `failed to connect` on macOS / Homebrew: Claude Code and similar tools launch subprocesses with a minimal PATH, so npx may not be found. Specify the absolute path as shown below (check with which npx).
{
"mcpServers": {
"illustmaker": {
"command": "/usr/local/bin/npx",
"args": ["-y", "@illustmaker/mcp"]
}
}
}
You can also call the HTTP API directly.
From the browser console (window.IM)
With the editor open, access all features from the browser DevTools console via window.IllustMaker (shorthand: IM).
IM.api() // list all methods
IM.newDocument({width:800,height:600})
IM.addRect({x:100,y:100,w:200,h:120,fill:"#4a9eff"})
IM.addText("Hello",{x:160,y:300,fontSize:48})
IM.exportSVG() // → string
IM.downloadSVG("logo.svg")
Schema
Object type
{
"id": "o1", // required, alphanumeric
"type": "rect"|"ellipse"|"text"|"path"|"line"|"poly"|"star"|"image"|"raw",
"name": "label", // display name
"x": 0, "y": 0, "w": 100, "h": 100,
"rotation": 0, // degrees
"fill": "#000", // color or {"stops":[...]}
"stroke": "none",
"strokeWidth": 0,
"visible": true,
"locked": false,
// per-type:
// text: text, fontSize, fontFamily, fontWeight, letterSpacing, lineHeight
// path/poly/star: nodes:[{x,y,hIn,hOut}], closed
// line: x1, y1, x2, y2
// image: href
// raw: rawSvg (sanitized)
}
Accepted color formats
- HEX:
#000,#ffffff,#00000080(8 digits = alpha) - RGB/RGBA:
rgba(255, 0, 0, 0.5) - HSL:
hsl(120, 50%, 50%) - Named:
red,blue,currentColor - Special:
none,transparent - Gradient:
{"stops":[{"offset":0,"color":"#f00"},{"offset":1,"color":"#00f"}], "angle":0}