AI visual generation agent: multi-pipeline rendering, prompt crafting, and image composition.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.

A Harnessed Image-generation Agent: Claude reasons, Cloudflare executes, D1 remembers, OAuth is the only way in.
Limner is an Agent Harness and Model Context Protocol (MCP) server for orchestrating image generation across multiple pipelines, with durable memory for project context. This repository is rasa, the foundation variant of the Limner family. You deploy rasa as your own instance: free as in beer, no strings or data pipelines attached.
Limner is explicitly built as a composable harness with clean seams:
/mcp. There is no private
side channel.The same tool surface ships three ways from one codebase: the OAuth-gated
Workers endpoint, a local stdio server, and a .mcpb one-click bundle for
Claude Desktop. The stdio server identifies itself as limner-mcp (preview):
stdio is the preview transport at v1, pending a refresh against the next MCP
spec revision. The Workers and .mcpb surfaces carry no preview tag.
The design did not arrive fully formed. The full record lives in docs/Limner_Cloudflare_CMA_Architecture.md: 22 dated decision records, a cost model, and five named off-ramp triggers that state in advance what would make us walk away from the approach.
Several of those records are reversals. The FastAPI shim that fronted the first design was killed. The Sharp/libvips composition path was abandoned for a hybrid WASM stack that runs inside the isolate. Recraft began as a composed first-party MCP and was later amended to a direct REST call, with the transport seam kept as a reusable adapter. One record is a correction: a request timed out at 30s during integration testing and was first blamed on an upstream API, until the API's own docs turned up an async mode and the fault turned out to be ours.
The "Deploy to Cloudflare" button is the cleanest dead-end (currently). We ran the spike on
2026-06-12. The button's monorepo mode extracts a single package into a standalone
repo, which severs the @limner/core workspace dependency and breaks the build.
Provisioning and secrets worked; the repo shape did not. The full note, and the
script that does the same job plus migrations and a smoke test, is under
Where is the Deploy to Cloudflare button?.
@limner/core (pipelines, composition, state),
@limner/mcp (the server, all three transports), @limner/cma-tools
(the same tool contract packaged for CMA custom-tool consumption)The architecture document with decision records lives at docs/Limner_Cloudflare_CMA_Architecture.md.
All tools are namespaced limner_*. Full schemas in
packages/limner-mcp/README.md.
| Tool | What it does | Needs |
|---|---|---|
limner_generate_dalle | OpenAI Images API (gpt-image-1 default) | OPENAI_API_KEY, your OpenAI credit |
limner_generate_recraft | Recraft, via their REST API (external.api.recraft.ai) | RECRAFT_API_KEY, your Recraft credit |
limner_generate_midjourney | Composes a Midjourney prompt string; a human carries it the rest of the way | Nothing |
limner_upscale / limner_vectorize | Recraft crisp upscale, and raster-to-SVG vectorize | RECRAFT_API_KEY, your Recraft credit |
limner_compose | 16 image ops behind one discriminated union: resize, crop, brightness, contrast, blur, sharpen, watermark, encode, decode, convert, renderText run in-isolate; cfTransform, cfOverlay, cfBlur, cfSmartCrop, cfBackgroundFill use Cloudflare Images | Images binding for the five cf* ops only |
limner_record / limner_recall / limner_forget / limner_list_categories | Durable memory with categories and idempotent upserts | D1 (or local SQLite) |
limner_create_project / limner_list_projects / limner_get_project_context / limner_record_project_note | Project briefs and running notes | D1 (or local SQLite) |
limner_health / limner_version / limner_list_pipelines / limner_pipeline_capabilities | Discovery and diagnostics | Nothing |
Most image tools start every session from zero. Limner records what a project
is and what you decided, then reads it back on the next run. Two stores back
this, both in D1 (or local SQLite for the stdio and .mcpb flavors):
limner_record writes a fact under a category with
an idempotent upsert, so re-recording the same key updates in place instead
of piling up duplicates. limner_recall reads a category back,
limner_forget removes an entry, and limner_list_categories enumerates
what exists. Use it for durable preferences: a house palette, a default
aspect ratio, a model that works for a given look.limner_create_project opens a project,
limner_record_project_note appends running notes (briefs, style decisions,
progress), limner_get_project_context returns the brief and notes for a
project, and limner_list_projects lists them. This is the "what were we
doing last week" layer.Nothing here is a vector database or an embedding model. It is plain structured state with explicit keys, which is the point: the agent recalls what it actually recorded, not the nearest fuzzy match.
Limner runs as a Claude Managed Agent: Anthropic's model does the reasoning (the brain), Cloudflare's Worker does the executing (the hands), and the two meet at the OAuth-gated MCP surface described above. The agent definition itself is narrow by design.
claude-sonnet-4-6, an A4-framed system
prompt (the framing is code-enforced: assertA4() refuses to build the
agent plan if the verbatim disclaimer is missing), and 16 Agent Skills
uploaded through the Skills API. That's it.Stand up your own agent:
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/limner)<a href="https://allmcps.com/mcp/limner"><img src="https://allmcps.com/api/badge/limner?style=directory" alt="Limner on AllMCPs" /></a>