Generators API and MCP
One source of truth
The post maker, the email signature generator, the logo finder and the diagram renderer on this hub run on the same code as a public API and an MCP server. Whatever an agent or a script generates looks exactly like what a person makes on these pages, and a fix in one place fixes both.
- Read-only and public. Nothing is stored; every request builds the artwork and returns it.
- Rate limited per client, to keep the service fair and stop abuse.
- Validated. The same limits as the web tools (headline length, allowed brands and colourways). Invalid input gets a clear error, never broken artwork.
- Guidance included. Agents read the rules at /AGENTS (or the
get_brand_guidancetool) before they generate.
Endpoints
| Endpoint | Method | Returns | Same as |
|---|---|---|---|
/api/v1/social-post | GET, POST | SVG post: 1080×1350, 1080×1080 or 1080×1920 | Post maker |
/api/v1/email-signature | GET, POST | JSON { html, text }; ?format=html or text | Signature generator |
/api/v1/logo | GET | JSON with SVG and PNG URLs for a brand, colourway and layout | Lockup builder |
/api/v1/diagram | POST | SVG diagram from a JSON spec, light or dark | Diagrams |
/api/v1/guidance/<topic> | GET | Markdown guidance | /AGENTS |
/api/v1/openapi.json | GET | OpenAPI 3.1 description with every parameter | |
/mcp | POST | MCP server (Streamable HTTP, JSON responses) |
Examples
# A night post for NorthStar
curl -X POST https://identity.north.ae/api/v1/social-post \
-H 'content-type: application/json' \
-d '{"brand":"northstar","layout":"night","kicker":"New in NorthStar Desktop","headline":"Mai now asks before it acts."}' \
-o post.svg
# An email signature as HTML
curl "https://identity.north.ae/api/v1/email-signature?format=html&name=Layla%20Haddad&title=Head%20of%20delivery&email=layla@north.ae&brand=northstar"
# The NorthStar Admiral lockup for a dark slide
curl "https://identity.north.ae/api/v1/logo?group=northstar-admiral&colourway=snow"
# A diagram
curl -X POST https://identity.north.ae/api/v1/diagram -H 'content-type: application/json' -d '{
"theme": "light",
"spec": { "w": 720, "h": 200, "title": "Gateway",
"nodes": [
{ "id": "u", "type": "actor", "x": 40, "y": 72, "w": 140, "label": "Analyst", "icon": "user" },
{ "id": "g", "type": "service", "x": 260, "y": 72, "w": 180, "label": "Admiral Server", "sub": "Gateway", "icon": "server" },
{ "id": "c", "type": "external", "x": 500, "y": 72, "w": 180, "label": "Anthropic", "img": "anthropic" } ],
"edges": [ { "from": "u", "to": "g", "label": "Prompt" }, { "from": "g", "to": "c", "kind": "dashed", "label": "Cleared only" } ] } }' -o diagram.svgThe post maker has a Copy API request button that copies the request for the post on screen.
MCP for AI agents
Add the hub as a remote MCP server at https://identity.north.ae/mcp. It offers five tools: get_brand_guidance, create_social_post, create_email_signature, find_logo and render_diagram. SVG results come back as embedded resources.
# Claude Code
claude mcp add --transport http north-brand https://identity.north.ae/mcp
# Clients with a JSON config (Claude Desktop, Cursor, VS Code)
{ "mcpServers": { "north-brand": { "type": "http", "url": "https://identity.north.ae/mcp" } } }Rate limits and abuse protection
| Rule | Value |
|---|---|
| Requests per client | 30 a minute sustained, bursts of 20 (token bucket). A diagram costs 3. |
| Client | IP address as seen by our ingress; IPv6 addresses grouped by /64 |
| Headers | RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset; on 429 also Retry-After (seconds) |
| Request size | 64 KB body; diagrams up to 120 nodes, 240 edges, 4000 × 4000 px |
| Input | Brands, layouts, colourways, node types and edge kinds are fixed lists; text fields have length limits; diagram logos come only from the technology logo set |
| Output safety | User text is escaped; generated SVG and HTML are served with a Content-Security-Policy that blocks scripts and remote loads |
Fonts in generated SVG
fonts=link(default): the SVG links Helvetica Now from this hub. It renders correctly in a browser on the hub; elsewhere text falls back to Helvetica or Arial.fonts=embed: the fonts are inlined, so the SVG renders the same anywhere. Use it to make a PNG, then delete the SVG: don't publish SVGs with embedded fonts, because that redistributes the font files.fonts=none: system fonts only.- For a PNG, render the SVG at its own size in a browser engine (Playwright, Chrome headless) or use the post maker on this hub.
Errors
| Status | Meaning |
|---|---|
| 400 | Invalid input. The JSON body lists every problem in errors. |
| 404 | Unknown endpoint or topic |
| 405 | Wrong method |
| 413 | Body too large |
| 415 | POST without content-type: application/json |
| 429 | Rate limited: wait Retry-After seconds |
Last updated on 14 October 2026