{"slug": "pairing-up-scaffolding-otakushelf-with-an-agent", "title": "Pairing up: scaffolding OtakuShelf with an agent", "summary": "Sam, a developer with extensive JHipster experience, built OtakuShelf, a manga and anime cataloging app, using an AI agent instead of manually writing code. The agent was paired with JHipster through the JHipster MCP, a server that exposes JHipster as safe, non-interactive actions, allowing the agent to generate the entire application from a single JDL document without Sam writing a line of code. The project successfully created a monolith with JWT auth, PostgreSQL, Vue, and Maven, though the MCP strictly handles scaffolding and editing, leaving build and run commands to the developer's shell.", "body_md": "Sam has shipped a dozen JHipster apps the old-fashioned way: open an editor, write the JDL, run the CLI, answer its questions, repeat. This time Sam wants to try something different — keep the JHipster expertise, but hand the typing to an AI agent. The guinea pig is a personal project that's been on the back burner forever: **OtakuShelf**, an app to catalog manga and anime, grouped by franchise. *Naruto* is one franchise — it has a manga side and an anime side, and Sam wants both under one roof.\n\nAn AI agent is great at turning \"a franchise has many book series\" into correct JDL. What it *can't* do on its own is run your `jhipster`\n\nbinary. That's the gap the **JHipster MCP** fills: it's a small server that exposes JHipster to the agent as a set of safe actions. Three flavors, and that's the whole mental model:\n\nCrucially, it doesn't bundle JHipster — it drives the **same global jhipster** Sam already has (version 9.0.0 here). So nothing about the generator changes; the agent just operates it, non-interactively.\n\nWiring it into Sam's editor is one line:\n\n```\nclaude mcp add jhipster -- npx -y jhipster-mcp\n```\n\nRestart, confirm the tools show up, done. (Other hosts and options live in the [install guide](https://github.com/avdev4j/jhipster-mcp/blob/main/docs/02-installation.md).)\n\nSam decides to start with just the **manga side** — get the shape right before piling on anime. So:\n\nCreate a JHipster monolith in\n\n`/Users/sam/projects/otakushelf`\n\ncalled`otakushelf`\n\n: JWT auth, PostgreSQL in prod with H2 in dev, Vue, Maven, package`com.otakushelf`\n\n. Add a`Franchise`\n\n(title, synopsis, a status that's ONGOING/COMPLETED/HIATUS, start year), a`BookSeries`\n\n(title, total volumes), and a`Book`\n\n(title, volume number, release date). A franchise has many book series; a book series has many books. Paginate everything.\n\nThe agent first glances at the `jhipster://docs/jdl-grammar`\n\nresource so it doesn't fumble syntax, then builds one JDL document and calls the `create_app_from_jdl`\n\ntool with roughly:\n\n```\napplication {\n  config {\n    baseName otakushelf\n    applicationType monolith\n    authenticationType jwt\n    databaseType sql\n    prodDatabaseType postgresql\n    devDatabaseType h2Disk\n    clientFramework vue\n    buildTool maven\n    packageName com.otakushelf\n  }\n  entities *\n}\n\nenum FranchiseStatus { ONGOING, COMPLETED, HIATUS }\n\nentity Franchise { title String required, synopsis TextBlob, status FranchiseStatus, startYear Integer }\nentity BookSeries { title String required, totalVolumes Integer min(0) }\nentity Book { title String, volumeNumber Integer required min(1), releaseDate LocalDate }\n\nrelationship OneToMany {\n  Franchise{bookSeries} to BookSeries{franchise}\n  BookSeries{books} to Book{bookSeries}\n}\n\npaginate * with pagination\n```\n\nA minute later (PostgreSQL, a Vue front-end, and an `npm install`\n\naren't instant), OtakuShelf exists. Sam didn't write a line of JDL — but, being Sam, read every line the agent did.\n\nOne habit to build immediately: the MCP has **no current directory**. Every tool wants an absolute `workingDirectory`\n\n, and `create_app_from_jdl`\n\nflatly refuses to scribble into a folder that isn't empty. \"Make me an app here\" goes nowhere; \"make me an app in `/Users/sam/projects/otakushelf`\n\n\" works. Say *where*, every time. (It's also a nice guardrail — the agent can't wander off and generate in some surprising place.)\n\nThe files exist, but the MCP draws a hard line: it scaffolds and edits, it does **not** build, run, start, or git-commit your app. That's your shell's job, on purpose. So Sam asks the obvious follow-up:\n\nWhat are the build and run commands for\n\n`/Users/sam/projects/otakushelf`\n\n?\n\nThe `project_commands`\n\ntool reads the project and answers from *facts* — it sees Maven with the wrapper present and a Vue `package.json`\n\n, so it reports `./mvnw`\n\nto start the backend, `npm install`\n\nthen `npm start`\n\nfor the Vue dev server, `./mvnw verify`\n\nfor tests, and so on — and reminds Sam it's reporting these, not running them. Two terminals later, OtakuShelf is live at `localhost:8080`\n\n, empty and waiting for its first franchise.\n\nIn one sitting Sam went from empty folder to a running, paginated CRUD app for the manga side — by describing it, not typing it. But a catalog of manga without anime is only half a shelf. Next, Sam comes back to a *live* project to add the anime side — and that's where a careful developer reaches for previews before touching anything.\n\n*Next in the series: \"Adding the anime side without holding my breath\" — coming back to a live project to add the anime entities, previewing every change first.*", "url": "https://wpnews.pro/news/pairing-up-scaffolding-otakushelf-with-an-agent", "canonical_source": "https://dev.to/avdev4j/14-pairing-up-scaffolding-otakushelf-with-an-agent-4j4h", "published_at": "2026-05-27 21:41:51+00:00", "updated_at": "2026-05-27 22:11:05.435295+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "artificial-intelligence"], "entities": ["Sam", "JHipster", "OtakuShelf", "JHipster MCP", "Naruto", "Claude"], "alternates": {"html": "https://wpnews.pro/news/pairing-up-scaffolding-otakushelf-with-an-agent", "markdown": "https://wpnews.pro/news/pairing-up-scaffolding-otakushelf-with-an-agent.md", "text": "https://wpnews.pro/news/pairing-up-scaffolding-otakushelf-with-an-agent.txt", "jsonld": "https://wpnews.pro/news/pairing-up-scaffolding-otakushelf-with-an-agent.jsonld"}}