character-forge-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@character-forge-mcp create a character for a weary lighthouse keeper"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
character-forge-mcp
An open-source MCP server for creating vivid, story-ready characters for film, games, animation, advertising, books and comics.
Connect it to any MCP-capable chat (Claude Code, Claude Desktop, Cursor and others) and ask for a character: at random, from a description, from your own picture, or from a picture and a description. You get a character package:
Character card: goals, audience identification, psychological profile, description, fears, archetype and quirks, backstory and world, traits, and the character arc. It is saved as
card.jsonand a readablecard.md.Look derived from the story: shape language, silhouette, how perfect or flawed they are, a signature item (their attribute), marks with origins, movement, outfit and palette with meanings. An independent designer derives it from the finished story and cuts anything that doesn't show a part of it.
A-pose concept sheet: a front/back model sheet, ready to hand to a 3D or animation artist (
assets/concept.png).On request, one step at a time: the character in their own place (
scene.png), an 8-second looping video of that place (idle.mp4), their voice saying a few lines about that moment in every language you need, a short theme of their own (theme.mp3), and the card translated into other languages.
Cards and prompts are free. Pictures, video, voice and music are generated on fal.ai with your own key, about $1.50 for a whole character.
Random does not mean a pile of random traits. Every character grows from one core: a wound teaches them a lie. The lie breeds a fear, which they protect with a defense (their worst trait). The same wound forged a gift (their best trait). Their arc is learning the truth. Each roll picks one curated, coherent core, then adds surprising sparks (occupation, world, archetype, visible mark) that the model has to make serve the core. You can't predict who you will get, but every part of the card hangs together.
How a character is made
flowchart TD
REQ["Request<br/>random, a brief, your own picture, or both"] --> V["3 variants of one concept<br/>same role and world, different cores"]
V --> R["Independent review<br/>coherence check + critic per variant"]
R --> F["Author fixes or defends, once"]
F --> J["Judge picks one winner<br/>the other two are deleted"]
J --> D["Designer: the look, derived from the story"]
D --> E["Editor: plain, clear text<br/>in a voice that fits the character"]
E --> C["Concept: A-pose model sheet"]
C --> S["Location: the character in their own place"]
S --> VID["Looping idle video"]
VID --> VO["Voice<br/>says what the video shows · every language"]
S --> M["Theme music"]
VO & M --> P["Character package<br/>card · concept · scene · video · voice · theme"]The winner gets its concept as part of the tournament. Everything after it is generated only on request, one step at a time, and every step is built from the card: the location from the character's key places and idle pose, the voice from their history and speech, the theme from their wound and dramatic question. The video comes after the location, and the voice after the video, because the voice is their inner monologue, the thoughts in their head in the moment the video shows; the music only needs the location.
Already have a concept? Give a brief and the image. What the picture shows (build, face, outfit, items, palette) becomes part of the brief, every variant's story explains it, the designer describes exactly that look, and the image becomes the winner's concept instead of a new one being generated. It's the same character_create call, with concept set.
The variant tournament
By default every request produces 3 variants of the same concept. If you ask for a fisherman, all three are fishermen in the same world, but different people with different cores. Then they compete:
Author writes all three as full cards.
Coherence reviewer (an independent agent per variant) checks that everything traces back to the core.
Critic (an independent agent per variant) argues why the variant should not ship, quoting the card and scoring it against a rubric.
Author fixes or rebuts each critique, once.
Judge compares the revised variants and picks one winner.
Designer (an independent agent) derives the winner's look from its story.
Editor (an independent agent) rewrites the winner's text so a stranger understands every field on the first read.
Only the winner is kept and gets an A-pose concept. The variants are written as drafts; when the judge has picked, character_pick moves the winner into the library and deletes the other two.
Generation prompts (on request)
Ask for a prompt and you get exactly that one, written from the card:
concept: an A-pose model sheet
illustration: a key-art scene from the character's story, in a location and with an event happening
voice: a voice-design description and an audition script for TTS voice-design tools
video: a 5–10 s Seedance-style clip that shows the character in action
song: a Suno style line and lyrics that tell the character's arc
theme: an instrumental leitmotif (about 30 s, loops) built from the wound, the paradox and the dramatic question, as an ElevenLabs Music composition plan
Prompts are saved to <character>/prompts/<kind>.md. Writing a prompt never calls a generator; the concept, scene, video, voice and theme tools do, each only when asked.
A character can start from:
Nothing: optionally fix the role ("a fisherman"), medium or genre. Everything else is rolled.
A brief: you describe what matters ("a 60-year-old ex-boxer for a coffee ad, warm but stubborn"). Every variant keeps all of it and invents the rest.
Your own picture, with or without a brief: every variant looks exactly like it, and its story explains what it shows.
Characters are always written in English; the card can then be translated.
The method
For diagrams of how a character is built (the core chain, what shapes them, their path, how the audience gets to know them, and the tournament), see docs/character-anatomy.md.
The card opens with the core (wound, lie, truth, central paradox, dramatic question) and then follows a 9-section character-development method inspired by Sherri Sheridan's Developing Digital Short Films and Michael Dougan's "one best / one worst / three other traits" formula (see Credits):
Goals: want (external, can change) vs. need (inner, carries the theme), motivation, goals that exclude each other, and the goal's climax
Identification: why the audience bonds with the character: flaws, a superpower balanced by a vulnerability, a sympathy hook…
Psychology: passive / reactive / active states, 3 lines of inner monologue, insecurity, triggers, childhood, and a device for showing the inner state on screen
Description: a name with meaning, the character's look, 3 formative life events, speech, sociology, dreams
Fears: conscious and unconscious fears, the mask, and how the character overcomes them
Universal + unique: an archetype with a twist and at least 5 filmable quirks
Backstory & world: who rules the world, what is worth dying for, plus secondary characters who reveal the hero's contradictions
Traits: energy, temperament, one best trait, one worst trait, three others, and typical reactions
Destiny: the void in the ordinary world, the threshold, the ordeal, the transformation
The schema checks that the card is complete: at least 3 identification methods, exactly 3 inner-monologue lines, exactly 3 life events, at least 5 quirks, and so on. When the model leaves something out, the server returns the exact field paths to fix.
Related MCP server: Novel Workspace MCP
Install
Requires Node.js 20+. Nothing to clone or build: the server is published on npm.
Claude Code (plugin, recommended)
The plugin bundles the MCP server, the skills (forge-character, design-look, concept-art, character-prompts, translate-character) and the agents (character-coherence, character-critic, character-judge, character-designer, character-editor). With the plugin, each reviewer runs as a separate agent with fresh context.
/plugin marketplace add gdhub-io/character-forge-mcp
/plugin install character-forge@character-forgeClaude Code asks for the optional fal.ai key when you install the plugin and keeps it in your system's secure storage. Leave it empty to make characters, cards and prompts only; add it later in /plugin.
Claude Code (MCP only)
claude mcp add character-forge -e CHARACTER_FORGE_DIR=~/character-forge -e FAL_KEY=... -- npx -y @gdhub/character-forge-mcpWithout the plugin there are no separate reviewer agents. The model plays each role in a separate pass instead, which is weaker but still works.
Claude Desktop / Cursor / any MCP client
{
"mcpServers": {
"character-forge": {
"command": "npx",
"args": ["-y", "@gdhub/character-forge-mcp"],
"env": {
"CHARACTER_FORGE_DIR": "/Users/you/character-forge",
"FAL_KEY": "..."
}
}
}
}Characters are saved to CHARACTER_FORGE_DIR (default ~/character-forge), one folder per character. After connecting, restart the client (or /mcp → reconnect in Claude Code) and ask: "Make me a random character for a noir film."
Environment variable | What it does |
| fal.ai key for pictures, video, voice and music. Optional: without it you get cards and ready prompts only |
| Where characters are saved (default |
| Path to your own |
Video and audio steps also need ffmpeg on your PATH (it joins the video into a loop and levels the sound).
Use
In the chat:
Make me a random character for a noir film.
Character from a brief: a teenage beekeeper in a cyberpunk megacity, the hero of a cozy mobile game. She must be left-handed and afraid of crowds.
Clients that support MCP prompts also list random_character and character_from_brief.
Tools
You talk to the chat; it calls these tools. Paid ones run only when you ask for that step.
Tool | What it does | Cost |
| Starts a character from nothing, a brief, a concept image, or both: rolls 3 competing variants of one concept (coherent cores plus sparks) and says how to use the brief and the image | free |
| The method, the card rules and the tournament protocol | free |
| Instructions and rubric for a role: | free |
| Coherence check: red flags (generic filler, repeats, want = need) plus questions built from the card's own content | free |
| Validates the full card and saves JSON + Markdown; returns the | free |
| Keeps the tournament winner and deletes the other variants; a picture the user gave becomes its concept | free |
| The A-pose concept sheet | ≈ $0.02 |
| The character in their own place, in their idle pose | ≈ $0.05 |
| An 8-second looping video of the scene | ≈ $0.67 |
| Designs their voice and records a short monologue about the moment the video shows, in every language asked for | ≈ $0.03 a language |
| The monologue in one more language / any single line in that voice | ≈ $0.03 |
| A short theme of their own | ≈ $0.60 |
| Rules and card material for one generation prompt ( | free |
| Saves the card in another language (checked against the original) | free |
| What can be made next for a character, with prices | free |
| What a character has cost so far | free |
| List saved characters / return a card as Markdown or JSON | free |
Media
Every media step is built from the card and saved in the character's folder: generated files in assets/, the prompt behind each one in prompts/, and what it cost in costs.json.
Concept sheet (
character_concept): character-forge draws a faceless A-pose figure from the card'slook.body(the character's own proportions and asymmetries, front and back) and gives it to GPT Image as the pose reference, with the full description of the look. Options:style(cardfor the designer's suggestion, or any style text; saved asconcept-<style>.png),pose_image(put the character in the pose of any picture →concept-pose.png),seed,dry_run(prompt only).modeswitches to the older pipelines (Z-Image image-to-image or ControlNet), kept for experiments. WithoutFAL_KEYyou get a ready prompt.Location (
character_scene): the concept placed in a key location from the card, in the character's idle pose. It is the first frame of the video.Idle video (
character_video): 8 seconds by default. Kling (silent) or Veo (optional sound); the end is crossfaded into the start so it loops without a seam.Voice (
character_voice): a voice designed from the card (ElevenLabs for adults, Qwen for children), saying a few lines about the moment the video shows. Every language is a fresh performance from a translated script, not a dub.Theme (
character_theme): about 30 seconds of instrumental music from the wound, the paradox and the dramatic question. Needs only the location.
Models and prices
The provider (fal.ai) and the model for each kind of media live in models.json, together with the prices used for the cost ledger. It is read on every call, so switching a model needs no rebuild or restart. To use your own, point CHARACTER_FORGE_MODELS at a copy.
CLI
The same package is also a command-line tool, for scripts and quick tests. With no arguments it starts the MCP server on stdio.
npx @gdhub/character-forge-mcp roll --variants 3 --anchor fisherman # roll 3 variants of one concept
npx @gdhub/character-forge-mcp check card.json # red flags + coherence questions
npx @gdhub/character-forge-mcp save card.json # validate and save to the library
npx @gdhub/character-forge-mcp next marta-vell # what can be made next, with prices
npx @gdhub/character-forge-mcp concept marta-vell # concept sheet (needs FAL_KEY)
npx @gdhub/character-forge-mcp costs marta-vell # what it has cost so far
npx @gdhub/character-forge-mcp list
npx @gdhub/character-forge-mcp --help # every commandDevelopment
Want to help? Read CONTRIBUTING.md: every change goes through a pull request, and releases are automatic.
Set up
git clone https://github.com/gdhub-io/character-forge-mcp.git && cd character-forge-mcp
npm install
npm test # builds dist/, then unit tests + an end-to-end MCP client/server test
npm run lint # Biome; npm run format fixes what it canFor paid steps, put FAL_KEY=... in a .env file in the repo (it is gitignored). Tests never call paid APIs.
Run your local build
Claude Code in this repo picks up the local server from
.mcp.json(node dist/index.js) and saves characters to./characters(gitignored). The skills and agents inskills/andagents/are linked into.claude/, so they load too. Runnpm run buildafter every change, then/mcp→ reconnect. Don't install the plugin while working here, or everything loads twice.Any other client: point it at your build instead of npm:
claude mcp add character-forge-dev -e CHARACTER_FORGE_DIR=~/character-forge -- node /abs/path/to/character-forge-mcp/dist/index.jsMCP Inspector:
npm run inspectopens the server in a browser to call tools by hand.
The showcase site
site/ is the website at characters.gdhub.io (Vite, React, Tailwind). Every push to main that touches site/ builds it and publishes it on GitHub Pages.
cd site && npm install
npm run dev # starts Vite on http://localhost:5173The characters it shows are listed in site/src/showcase.json; their media live in site/public/characters/ and are committed. npm run dev and npm run build refresh them from your local library (../characters) when it exists, and use the committed copies when it doesn't. SITE_URL (set in the Pages workflow) fills canonical links, the share image, the sitemap and llms.txt.
Project layout
src/engine.ts: curated core chains (wound → lie → fear → defense/gift → truth), occupations, visible marks. PRs that extend these are welcome.src/methodology.ts: the method as data (arc goals, flaws, fears, archetypes, trait lists…)src/random.ts: seeded rolls and variant setssrc/schema.ts: the card schema (zod);src/render.ts: Markdown card rendering;src/check.ts: coherence red flags and questionssrc/tournament.ts: rubric and role instructions (coherence, critic, judge, author, designer, editor)src/media.ts: rules and card material for generation promptssrc/concept.ts,src/pose.ts: the concept pipeline and the A-pose figure;src/scene.ts: location and video;src/voice.ts;src/theme.tssrc/fal.ts,src/ffmpeg.ts,src/config.ts(models.json),src/costs.ts(the ledger),src/next.ts(next steps)src/store.ts: the character library on disksrc/tools/: one file per MCP tool;src/prompts/: MCP prompts;src/server.ts;src/index.ts: CLI and stdio entryskills/andagents/: the plugin's skills and reviewer agents;.claude-plugin/: the plugin manifestsite/: the showcase website;design/: its Pencil designexamples/: complete reference cards;docs/character-anatomy.md: diagrams of the method
Generated media
character-forge writes prompts and sends them to the models named in models.json (on fal.ai, with your own key); it saves whatever they return. The MIT license covers this tool, not what the models generate. Images, video, voices and music are subject to the terms of fal.ai and of each model's provider (for example OpenAI, Kling, Google, ElevenLabs, Qwen): what you may do with the results, commercial use included, and the rules about real people's likeness and voices. Check those terms before you use generated media in a product.
Credits
The character method is inspired by Sherri Sheridan's book Developing Digital Short Films (its chapter on character) and Michael Dougan's "one best / one worst / three other traits" formula. The card's sections and reference lists follow the questions the book asks, retold in our own words and extended: the core chain (wound → lie → fear → defense / gift → truth), the variant tournament, the look derived from the story, and the media steps are this project's own. If the method works for you, read the book.
License
MIT
Available Tools
20 toolscharacter_checkCheck character coherenceARead-only
Checks a card for coherence: schema completeness, mechanical red flags (generic filler, repeats, want = need, thin core) and a coherence interview built from the card's own content that tests every causal link back to the core. Pass either a draft card (same shape as character_save's card) or the id of a saved one.
Inputs: id, card.
character_conceptGenerate T-pose concept sheetA
Builds an A-pose model-sheet prompt from a saved card's look and, with FAL_KEY set, generates it on fal.ai: a faceless figure built from look.body (the character's own proportions) is drawn front and back and given to GPT Image as the pose reference, with the full look → concept.png (the card is re-rendered with it). pose_image puts the character in the pose of any picture → concept-pose.png. Without FAL_KEY (or with dry_run) returns the prompt only. Costs ≈ $0.02 per sheet.
Inputs: id (required), mode, seed, extra, +7 more.
character_costsWhat a character has costARead-only
Free. Shows the character's paid generations (concept, scene, video, music, voice) with estimated USD from models.json pricing, and the total.
Inputs: id (required).
character_createStart a new characterARead-only
The one way to start a character, from whatever the user gave: nothing (random), a text brief, a concept image, or a concept image plus a brief. Rolls coherent ENGINES (wound → lie → fear → worst trait / best trait → truth → arc) plus surprising SPARKS — by default 3 competing variants of the same concept for the variant tournament — and says how to treat the brief and the image. Same seed = same roll.
Inputs: seed, brief, genre, anchor, +5 more.
character_getGet a saved characterARead-only
Returns a saved character card as markdown (to show) or JSON (to edit and re-save with overwrite).
Inputs: id (required), format.
character_listList saved charactersBRead-only
Lists saved characters (newest first), with variant group and tournament verdict when present.
Inputs: group.
character_methodCharacter methodARead-only
Returns the character-development method (core + 9 sections), the card format, the variant-tournament protocol and the reference lists (arcs, flaws, fears, traits, archetypes, uniqueness questions). Call once before writing a character.
Inputs: no named parameters.
character_nextWhat can be made nextARead-only
Free. Use when the user asks what's next for a character: lists what is done and the next possible steps (concept → location → video → voice, music after the location, translations), with prices. Offer them; run paid ones only after a yes.
Inputs: id (required).
character_pickKeep the tournament winnerA
After the judge's verdict: moves the winning variant from the drafts into the library and deletes the other variants of its group (losers are not kept). If the character was started from the user's own concept image (meta.concept_image), it becomes the winner's concept. Write meta.verdict into the winner first.
Inputs: winner (required).
character_promptGeneration prompt brief (on request)ARead-only
ONLY when the user asks for a specific prompt. Returns the rules and card material for writing ONE generation prompt for a saved character — concept, illustration, voice, video, song or theme. Write it, then call character_prompt_save. Prompts only; no generator is called. Never run this as part of creating a character.
Inputs: id (required), kind (required).
character_prompt_saveSave a generation promptB
Saves one written generation prompt into the character's prompts/ folder as .md (overwrites the previous one of that kind).
Inputs: id (required), kind (required), sections (required).
character_roleTournament role instructionsARead-only
Returns the instructions and rubric for one role in the variant tournament (coherence, critic, judge, author, designer, editor). Reviewers should call this first.
Inputs: role (required).
character_saveValidate and save character cardA
Validates a complete character card and saves it as card.json and card.md. Returns the id and file paths (use character_get to show the card). Use overwrite: true with meta.slug = id to update a saved card.
Inputs: card (required), overwrite.
character_sceneCharacter in their environment (still)A
ONLY on request. Draws the character in their own place doing what they usually do (an idle moment), using concept.png as the character reference (GPT Image 2.6 edit, ≈$0.05 at medium). Saves scene.png — the first and last frame for character_video. Write a specific prompt from the card (location, idle pose, light) or omit it for a default.
Inputs: id (required), notes, prompt, quality.
character_themeBackground theme (music)A
ONLY on request, after a theme prompt is saved (character_prompt kind "theme" → character_prompt_save). Generates the instrumental leitmotif from its composition plan with ElevenLabs Music v2.5 ($0.60 per started minute: a 30 s theme costs $0.60) and saves assets/theme.mp3. Confirm the cost with the user first.
Inputs: id (required), seed.
character_translateSave a translation of the cardA
When the user asked for other languages: saves the card translated (e.g. lang 'ru') as card..json next to the English original, which stays the source. Translate every free-text field in the character's own voice, as the editor would write it in that language; keep the structure, list lengths, numbers, ids, enums and colours exactly.
Inputs: id (required), card (required), lang (required).
character_videoLooping idle videoA
ONLY on request, after character_scene. Animates scene.png into a looping idle clip (default Kling O1 Standard ≈ $0.084/s, silent; veo ≈ $0.15/s with sound). See loop for how the clip is closed into a loop. Confirm the cost with the user first.
Inputs: id (required), loop, audio, model, +3 more.
character_voiceDesign the character's voice (on request, paid)A
ONLY on request; confirm the cost first. Creates the character's own voice from a description and an English reference script (write both with character_prompt kind 'voice'), plus any other languages listed in translations, each performed from the same description. Adults: ElevenLabs Voice Design, a saved voice and its reference take (≈$0.10 per 1000 characters of the script). Under 18: Qwen 3 Voice Design, deepened by pitch_semitones and cloned into a speaker embedding (≈$0.03). Saves assets/voice/.
Inputs: id (required), text (required), description (required), translations, +1 more.
character_voice_lineSpeak one line in the character's voice (paid)A
ONLY on request, after character_voice; one line per call, confirm the cost (≈$0.10 per 1000 characters). Saves assets/voice/lines/.mp3.
Inputs: id (required), name (required), text (required).
character_voice_translationThe voice monologue in another language (paid)A
ONLY on request, after character_voice: a new voice in another language, generated from the voice prompt translated by meaning (description + monologue), so the delivery follows the card → voice/reference..mp3, which the site plays in that language. Same price as a line.
Inputs: id (required), lang (required), text (required), description.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 20 tools
Each tool maps to a distinct pipeline stage (create, save, get, list, check, pick, translate, costs, next, method, role), and descriptions add explicit gating like "ONLY on request" or "Free." A few boundaries blur: character_prompt can produce a 'theme' prompt while character_theme generates music, character_concept also handles arbitrary pose_image work, and the three character_voice* tools require careful reading to separate. These are resolvable from descriptions but still invite occasional misselection.
Every tool uses the same character_ prefix with snake_case noun/verb suffixes, including predictable sub-verb families (character_prompt/character_prompt_save, character_voice/character_voice_translation/character_voice_line). The pattern is consistent throughout all 20 tools.
20 tools is on the heavy side but the domain genuinely is a long multi-stage pipeline: card lifecycle, variant tournament, four paid media generators, translations, and cost/next-step helpers. Each tool corresponds to a real, non-duplicated step, though the voice and prompt sub-families could arguably be collapsed.
The surface covers creation, validation, tournament selection, image/video/voice/music generation, translation, and cost accounting — a full lifecycle. The notable gap is deletion/cleanup: characters and generated assets can be created and overwritten but never removed, and written prompts can be saved but not listed or read back.
Maintenance
Related MCP Connectors
Create AI Characters and generate their DM and comment replies from any MCP client.
Generate images, video, audio and short films with 140+ AI models from any MCP client.
Create and manage AI image and video generations through Quriov's fixed public MCP tools.
Agentic AI book creator: plan, write, illustrate, narrate, and publish books from any MCP client.
Related MCP Servers
- AlicenseBqualityNot gradedmaintenanceEnables complete RPG Maker MZ game development through MCP tools, including autonomous game creation from concepts, AI-generated assets using Gemini 2.5 Flash, and programmatic control over maps, events, characters, and databases. Supports full game creation workflow from a single command with automatic story, asset, and implementation generation.3225-
- AlicenseNot gradedqualityBmaintenanceEnables AI-driven long-form novel creation and management, including chapter generation, character and timeline tracking, semantic memory retrieval, version savepoints, and deep consistency checking across multiple projects through MCP tools, with support for local LM Studio or any OpenAI-compatible API.16MIT
- FlicenseNot gradedqualityBmaintenanceEnables creating, validating, and simulating Crack-style story chat through a unified MCP server, with template and keyword management, automated project audits, session play, and persona-separated testing to prevent omniscience.-
- AlicenseCqualityCmaintenanceEnables Claude, Cursor, or any MCP client to create consistent AI characters, generate Veo 3.1 and Omni videos, edit clips, build scenes, export MP4s, and chat with Google Flow's creative agent. Automates AI video production workflows such as reels, storyboards, and multi-shot stories through natural language, with credit guardrails and dry-run pricing.2312MIT