MVR
Click on "Install 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., "@MVRresolve prompt '@hero lifts @sword'"
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.
MVR — Marketing Workflow & Visual Reference Vault
MVR is a self-hosted, local-first workspace and MCP server for keeping AI-assisted marketing work consistent with reusable brand context, visual references, evaluation rules, and human approval.
MVR is not a video or image generation provider. It stores and governs the context around creative work. Generation can be delegated to an external provider through a future or custom provider adapter.
What MVR provides
Reusable creative Elements referenced with
@tags.Versioned PNG reference assets organized into named slots.
Prompt resolution with missing-Element and incomplete-slot warnings.
A typed marketing workflow powered by LangGraphJS.
Deterministic evaluation with explainable issues and recommendations.
Human-review routing with persisted decisions and feedback.
Workflow checkpoints and event history in SQLite.
Draft-provider abstraction with a safe local deterministic provider.
MCP tools over stdio and authenticated Streamable HTTP.
REST endpoints and a local dashboard for operating the workflow.
Local filesystem or S3-compatible asset storage.
Encrypted provider credentials with masked API-key responses.
Related MCP server: LemGen AI Design MCP
Product flow
Creative references + marketing brief
↓
Resolve @Element context
↓
Create a draft
↓
Evaluate issues and risks
↓
Complete or request human reviewCurrent workflow
The runnable vertical slice is:
Marketing brief
→ normalizeBrief
→ loadBrandContext
→ createDraft
→ evaluateDraft
→ decideNextStep
→ completed / waiting_for_human / failedThe graph is implemented in src/workflows/marketing-graph.ts with LangGraphJS StateGraph. Each business node follows this application-owned contract:
(state, context) → partial state updateNode responsibilities
Node | Responsibility |
| Trim and validate objective, audience, channel, and request. |
| Resolve |
| Call the injected |
| Check unknown Elements and missing required slots. |
| Complete clean runs or create a pending |
Every node checkpoint is persisted. The latest workflow state and the ordered event history can be inspected after a restart.
Architecture
MVR is a modular monolith. HTTP and MCP are adapters; application behavior is kept behind domain and application modules.
flowchart TD
User[Marketing team]
Web[Local dashboard]
Client[MCP-compatible AI client]
REST[REST adapter]
MCP[MCP adapter]
Service[MarketingWorkflowService]
Graph[LangGraphJS StateGraph]
Vault[(SQLite Vault)]
Assets[(Local or S3 assets)]
Provider[Injected DraftProvider]
User --> Web
User --> Client
Web --> REST
Client --> MCP
REST --> Service
MCP --> Service
Service --> Graph
Graph --> Vault
Graph --> Provider
Vault --> AssetsMain modules
Module | Role |
| HTTP server, dashboard route, REST routes, and stdio entry point. |
| MCP tool definitions and MCP adapter. |
| Self-contained local HTML dashboard. |
| SQLite facade, migrations, persistence, asset coordination, and event history. |
| Local and S3-compatible |
| AES-GCM provider-secret encryption and masking. |
| Typed workflow state, nodes, graph assembly, and runner. |
| Shared application boundary for REST, MCP, and web clients. |
| Draft provider contract and deterministic local implementation. |
Boundary rules
REST and MCP handlers call
MarketingWorkflowService, not graph internals.Business logic is not duplicated between adapters.
Vaultowns SQLite-backed persistence coordination.AssetStoragehides local filesystem and S3 implementation details.Provider secrets are encrypted at rest and never returned in plaintext.
Evaluation returns explainable issues, not only a score.
Missing creative context is surfaced as a warning and can route to review.
External generation providers must be accessed through an adapter.
Do not add queues, microservices, PostgreSQL, or vector infrastructure without measured operational requirements.
Core concepts
Elements
An Element is a reusable creative reference:
characterproplocationstyleaudioother
Example:
Create a product video featuring @hero and @headphones.An Element can have versioned assets in slots:
@hero
├── face_closeup
├── body_front
└── body_backKind templates define required and optional slots. A character, for example, requires face_closeup, body_front, and body_back. Missing required slots produce completeness warnings.
Prompt resolution
resolve_prompt and Vault.resolvePrompt() replace known @tags with reusable context and expose:
resolvedTextelementsUsedattached reference assets
missingunknown tagscompletenessWarnings
Unknown or incomplete context is not silently discarded.
Workflow state
A workflow run is persisted under a caller-provided or generated runId.
The state contains:
marketing brief
resolved prompt context
draft
draft provenance (
provider,model,generatedAt)evaluation result
human-review requirement
structured
ReviewTaskcurrent node
status and errors
Statuses are:
running
completed
waiting_for_human
failedThe workflow_events table stores ordered node snapshots such as:
start
normalizeBrief
loadBrandContext
createDraft
evaluateDraft
decideNextStepDraft providers
The graph depends on the DraftProvider interface rather than a specific model vendor:
interface DraftProvider {
createDraft(request: DraftRequest): Promise<DraftResult>;
}The default DeterministicDraftProvider is intentionally local and predictable. It does not call an external model. A real provider can be injected through MarketingWorkflowService without changing the graph or adapters.
Evaluation
The current evaluator is deterministic and checks:
unknown
@Elementsincomplete required Element slots
A clean context receives score 1 and completes. Incomplete context receives score 0.5 and waits for human review. Future evaluators can add brand voice, channel fit, factuality, compliance, and model-based judging while retaining the deterministic gate.
Dashboard
The local dashboard is served from / and supports:
create and delete Elements
inspect required and optional slots
upload versioned PNG assets
lock an asset slot after approval
save encrypted provider credentials
configure task-specific models
submit a marketing brief
inspect workflow status, draft, evaluation, errors, and provenance
inspect checkpoint history
approve or reject pending human review with feedback
Open it after starting the server:
http://localhost:8080MCP tools
The server supports MCP over stdio and authenticated Streamable HTTP.
Creative library
Tool | Purpose |
| List reusable Elements. |
| Get an Element and version history. |
| Create a character, prop, location, style, audio, or other Element. |
| Update Element metadata or summary. |
| Delete an Element and its records. |
| Upload a PNG to a named Element slot. |
| List the current asset in each filled slot. |
| Check required slots against the kind template. |
| Get slot recipes and best practices. |
| Get a provider/model prompt format template. |
| Resolve |
Workflow
Tool | Purpose |
| Run and persist the marketing graph. |
| Read one persisted workflow run. |
| List runs ordered by recent update. |
| Read ordered node checkpoint history. |
| Approve or reject a pending human review. |
Provider and model configuration
Tool | Purpose |
| List task-specific model configurations. |
| Save a provider/model configuration. |
| Get the active model for a task. |
| Delete a model configuration. |
| List providers with masked API keys. |
Example workflow input:
{
"objective": "Introduce the campaign hero",
"audience": "Existing customers",
"channel": "social",
"request": "Create a short post featuring @hero."
}REST API
All REST routes are under /api. If MVR_AUTH_TOKEN is configured, they require a Bearer token.
Method | Endpoint | Purpose |
|
| List or create Elements. |
|
| Delete an Element. |
|
| List or upload Element assets. |
|
| Check required slots. |
|
| Get an Element kind template. |
|
| Get a prompt format. |
|
| List or save encrypted provider credentials. |
|
| Delete a provider. |
|
| List or save model configurations. |
|
| Delete a model configuration. |
|
| Start a workflow run. |
|
| List workflow runs. |
|
| Read a workflow run. |
|
| Read checkpoint/event history. |
|
| Approve or reject human review. |
Example:
curl -X POST http://localhost:8080/api/workflows/marketing \
-H 'Content-Type: application/json' \
-d '{
"objective": "Launch the hero",
"audience": "Existing customers",
"channel": "social",
"request": "Create a post featuring @hero."
}'Quickstart
Local
cp .env.example .env
# Set MVR_ENCRYPTION_KEY and MVR_AUTH_TOKEN in .env.
npm ci
npm run build
npm startThe server listens on 0.0.0.0:8080 by default.
Development mode:
npm run devRun tests and build:
npm test
npm run buildRun the stdio MCP server:
npm run stdioDocker
cp .env.example .env
# Set MVR_ENCRYPTION_KEY and MVR_AUTH_TOKEN.
docker compose up --buildDocker Compose persists SQLite data in the mvr-data volume and binds local assets through ./data/assets.
MCP client configuration
For a stdio-compatible client:
{
"mcpServers": {
"mvr": {
"command": "node",
"args": ["/absolute/path/to/MVR/dist/index.js", "--stdio"],
"env": {
"MVR_DB_PATH": "/absolute/path/to/MVR/data/mvr.db",
"MVR_ASSET_PATH": "/absolute/path/to/MVR/data/assets",
"MVR_ENCRYPTION_KEY": "your-long-random-secret"
}
}
}
}For Streamable HTTP:
http://localhost:8080/mcp
Authorization: Bearer your-long-random-token
Accept: application/json, text/event-streamConfiguration
Variable | Purpose | Default |
| HTTP port. |
|
| Bearer token for HTTP and MCP. | unset |
| Key for encrypted provider credentials. | development fallback; set in production |
| SQLite database path. |
|
|
|
|
| Local asset root. |
|
| Trusted local PNG import directory. |
|
| S3-compatible bucket. | unset |
| S3-compatible region. |
|
| S3-compatible access key. | unset |
| S3-compatible secret. | unset |
| Optional S3-compatible endpoint. | unset |
| Reserved threshold for future automatic recipe updates. |
|
Security and operational notes
Set
MVR_AUTH_TOKENbefore exposing the server beyond localhost.Set a high-entropy
MVR_ENCRYPTION_KEYin production and back it up securely.Changing the encryption key makes existing encrypted credentials unreadable.
Provider keys are encrypted at rest and masked in responses.
Only valid PNG assets up to 10 MB are accepted.
File references are constrained to
MVR_ASSET_IMPORT_PATH.Asset versions are preserved; locked slots cannot be overwritten.
Use the human-review route before publishing or taking irreversible actions.
The current local dashboard is intended for a trusted local workspace; multi-user authorization is not implemented by default.
Tests
The test suite covers:
Element versioning and prompt resolution.
Provider encryption and masking.
Model configuration.
Asset versioning, PNG validation, and locking.
Kind templates and completeness warnings.
Successful, failed, and human-review workflow paths.
LangGraph execution and node checkpoints.
Draft-provider injection and provenance.
Workflow event history.
Idempotent run IDs and brief-conflict protection.
SQLite persistence across vault reopen.
Run:
npm test
npm run buildRoadmap
Next
Replace the deterministic provider with external LLM/video provider adapters.
Add prompt/model version hashes and richer generation provenance.
Use LangGraph interrupt/checkpointer resume semantics for a true durable human-in-the-loop pause.
Add optimistic locking and stronger concurrency controls.
Add brand, campaign, and brief entities.
Add brand voice, compliance, factuality, and channel-fit evaluators.
Later
Bounded revise loops after human feedback.
Multiple AI provider adapters.
Integrations for Slack, Notion, Drive, Figma, HubSpot, and analytics.
Golden examples and regression evaluation datasets.
Brand drift detection and campaign-performance feedback.
Multi-user roles and approval policies.
Scope boundary
MVR currently does not:
generate videos or images by itself
replace external AI generation providers
automatically publish marketing content
automatically modify brand rules from model output
provide multi-user authorization by default
License
See the repository license for usage terms.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA self-hosted MCP server that provides a personal semantic memory layer for AI tools. It enables storing, searching, and managing memories using hybrid vector and keyword search, allowing AI assistants to recall information by meaning.MIT
- AlicenseAqualityCmaintenanceOpen-source MCP server for AI image and video creation, enabling prompt library search, prompt enhancement, and media generation from Claude Code, Cursor, and other MCP hosts.8MIT
- AlicenseNot gradedqualityBmaintenanceSelf-hosted MCP server for storing and serving structured team knowledge, enabling AI sessions to load relevant team context without re-prompting.Apache 2.0
- AlicenseBqualityCmaintenanceA brand-neutral, self-hostable MCP server for generating and editing images using natural language, with support for reference images and multiple providers.1MIT
Related MCP Connectors
MCP server for Wan AI video generation
MCP server for Clipkit — gives AI agents a video toolbox via the Clipkit schema.
MCP server for Google Veo AI video generation
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/dannyhoang249-hub/Self-host-MCP-server-for-AI-video-reference-library'
If you have feedback or need assistance with the MCP directory API, please join our Discord server