Back to Browse

Mcp MCP Server

Developer ToolsModerate5.8MCP RegistryLocal
Free

Server data from the Official MCP Registry

LUNO — AI Backend Platform. Build, operate, and govern production backends with AI agents.

About

LUNO — AI Backend Platform. Build, operate, and govern production backends with AI agents.

Security Report

5.8
Moderate5.8Moderate Risk

LUNO MCP server demonstrates solid security architecture with proper authentication via scoped agent keys, reasonable permission boundaries aligned with its purpose as a backend platform connector, and no evidence of malicious patterns or credential exfiltration. Minor code quality findings (broad exception handling, input validation suggestions) and one informational permission scope observation do not materially impact the security posture. The server appropriately implements idempotency, dry-run previews, and human approval gates for destructive operations. Supply chain analysis found 1 known vulnerability in dependencies (1 critical, 0 high severity). Package verification found 1 issue.

3 files analyzed · 6 issues found

Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.

Permissions Required

This plugin requests these system permissions. Most are normal for its category.

env_vars

Check that this permission is expected for this type of plugin.

HTTP Network Access

Connects to external APIs or services over the internet.

File System Read

Reads files on your machine. Normal for tools that analyze or process local data.

File System Write

Writes or modifies files on your machine. Check that this is expected for the tool.

What You'll Need

Set these up before or after installing:

LUNO admin API base URL, e.g. https://api.luno.rest/adminOptional

Environment variable: LUNO_API_URL

Required secret. Agent API key (sk-agent-…) from LUNO Console → MCP / API / Hook → API / MCPRequired

Environment variable: LUNO_AGENT_KEY

How to Install

Add this to your MCP configuration file:

{
  "mcpServers": {
    "io-github-luno-cms-mcp": {
      "env": {
        "LUNO_API_URL": "your-luno-api-url-here",
        "LUNO_AGENT_KEY": "your-luno-agent-key-here"
      },
      "args": [
        "-y",
        "@luno-cms/mcp"
      ],
      "command": "npx"
    }
  }
}

Documentation

View on GitHub

From the project's GitHub README.

LUNO — AI Backend Platform

Build, operate, and govern production backends with AI agents.

LUNO is a hosted backend platform — not a website builder, not an open-source CMS, and not an MCP server product. MCP is how your agent connects to LUNO. CMS and forms are capabilities; the product category is AI-era Backend Platform.

BUILDAI agents define schemas, forms, and backend structure via blueprints and templates.
OPERATEAgents read and change content, media, auth settings, and other backend resources.
GOVERNHumans control production through scoped agent keys, approval workflows, publish gates, and safety controls.

Quick start

npx @luno-cms/mcp setup

Works with Claude Code, Cursor, and Codex. Issue an agent key in the LUNO Console → MCP / API / HookAPI / MCP.

Glama / MCP directory: “Install Server” requires a hosted API key and may show This server cannot be installed. Use npx @luno-cms/mcp setup instead — see Quick start (recommended) below.

Production safety by design

  • Scoped agent keys — restrict to content-only or full backend access
  • Human approval — keys without publish permission stop at review (pendingHumanApproval)
  • Destructive-action protection — agents cannot hard-delete; archive requires confirmation
  • Dry runs & confirmation tokens — preview schema changes before applying
  • Idempotent operations — safe retries after timeouts
  • Audit trail — agent activity and audit logs in Console

Agent-readable by design

MCP schemas and tool descriptions were redesigned for agent readability. In a blind test, the same backend task went from 142 tool calls to 11, with 0 errors — application behavior unchanged.

MCP Resources (#90)

Static Resources (resources/list, resources/read) ship agent-readable guides without Admin API calls:

URITopic
luno://forms/field-typesField types + snapshot shapes
luno://content/schema-guideForm Set / entry / revision hierarchy
luno://publishing-guideDraft → publish, can_publish
luno://permissionsScopes, blocked actions, archive token
luno://api-referenceTool cheat sheet (not full OpenAPI)

Inventory: docs/RESOURCES.md. Live per-tenant schema: get_form_set_schema tool.


Directory checklist: docs/DISCOVERY.md

Product docs (EN): AI Agents · doc.luno.rest
Product docs (JA): AI Agents


Quick start (recommended)

From your site repository root, pick one AI agent and run setup (Claude Code / Cursor / Codex):

cd my-site
npx @luno-cms/mcp setup
# → 1) Claude Code  2) Cursor  3) Codex
ChoiceWhat gets written
Claude Code.claude/skills/luno/ + .mcp.json
Cursor.cursor/skills/luno/ + .cursor/mcp.json
Codex.agents/skills/luno/ + .codex/config.toml

Shared: .agents/luno/{dev,stg,prod}.env (keys; gitignored)

Then:

  1. Open the project in the chosen agent
  2. Run /luno (Codex: equivalent luno skill)
  3. Paste an sk-agent-… key from the LUNO Console
  4. Ask to create content — the agent uses MCP servers such as luno-stg

Verified clients: Claude Code / Cursor / Codex (Golden Path E2E).

Post-setup notes by client

ClientNotes
Claude CodeIf tools are missing, reconnect (/mcp)
CursorSettings → MCP: enable luno-stg. Start a new Agent chat if needed
CodexProject .codex/config.toml (with cwd) plus home config: Codex prefers ~/.codex/config.toml, so setup prints codex mcp add (with LUNO_PROJECT_ROOT) and guides home registration. Check: codex mcp list (luno-stg, etc.). First MCP tool calls may need approval. Prefer luno-stg day-to-day
/luno                 first run (init optional)
/luno init-stg        initialize stg only
/luno dev|stg|prod    switch env (prompts for key if missing)
/luno status

Non-interactive:

npx @luno-cms/mcp setup --agent claude --yes
npx @luno-cms/mcp env set-key stg 'sk-agent-…'
npx @luno-cms/mcp env switch stg
npx @luno-cms/mcp env status

Issue keys in Console → Settings → Agent API keys (per env / per site). Default scope full (content + form definitions). Use content to restrict to articles only.

Rate limits: per agent key to Admin API — 60 req / 60s (Free / Solo) or 300 / 60s (Standard+). Over limit → HTTP 429 + RATE_LIMITED + Retry-After. Console JWT traffic is not limited this way. Details: AI Agents rate limits.

ScopeWhen to use
full (recommended)Articles + Form Set / Contact / Blueprint
contentCreate / update / publish articles only
schemaSame privileges as full (compat)

Environment / CLI

VariableExampleDescription
LUNO_API_URLhttp://127.0.0.1:8787/adminAdmin API base (include /admin)
LUNO_AGENT_KEYsk-agent-…Agent API key
npx @luno-cms/mcp              # start MCP from env vars
npx @luno-cms/mcp run stg      # load .agents/luno/stg.env then start
npx @luno-cms/mcp setup
npx @luno-cms/mcp env …

MCP server names: luno-dev / luno-stg / luno-prod


Cursor Plugin (optional)

For Cursor Marketplace / local plugin setup, see the LUNO Console onboarding. For normal site work, prefer npx @luno-cms/mcp setup above.

Multiple keys at once

One MCP entry = one key. Split by site or scope with different MCP server names. Active key limits depend on plan.

Resuming an existing project

  1. get_project_overview — project summary (recommended first)
  2. Then get_form_set_schema / list_entries as needed
  3. Separate from greenfield Golden Path (builtin template → entry → publish)

Tools

Content (content scope and above)

ToolDescription
get_project_overviewProject summary (Form Sets / Contact / Masters / storage / login appearance / IP allowlist / locales / public API)
get_tenant_schemaFull project schema
list_form_sets / get_form_set_schemaForm Set list / definition (get_form_set_schema includes form-set schema-context + snapshotShape.example; selects may include masterEntityKey / public records URL)
get_public_api_infoAgent key projectId + public API base (entries / master-entities)
list_entries / get_entryEntry list / detail
create_entry / bulk_create_entries / update_entryCreate entry / bulk create (≤50 slugs) / update slug
list_revisions / save_revision / get_pub_preview_url / publish_revisionRevisions / preview URL for human review / publish (can_publish=false keys stop at submit + pendingHumanApproval)
submit_entry_for_reviewSubmit for approval
list_mediaMedia list
upload_mediaUpload (filePath / sourceUrl / base64 → asset id)
list_master_entities / get_master_entityMaster entities
list_master_records / create_master_recordList / create records (label string or { default, ja, … })
update_master_record / update_master_treeUpdate records / tree (not available with agent keys — see below)
get_project_content_localesContent locale settings (includes content_default_locale)
patch_project_content_localesUpdate locales (tenant_admin JWT only)
search_admin_helpSearch Console help KB
get_admin_help_articleOne help article (Markdown)
ask_admin_helpHelp RAG Q&A (related articles if LLM unset)
translate_entry_localesAI locale batch translate (Standard+, 1 ticket / run)
get_login_brandingLogin branding (no auth; includes login_background / hide_luno_logo / hide_powered_by)
get_login_appearanceLogin appearance settings (auth required)
update_login_appearanceUpdate login appearance (background=Standard+, WL=Business+)
list_console_login_ip_allowlistsLogin IP allowlist (Business+)
add_console_login_ip_allowlistAdd IP rule (tenant scope)
delete_console_login_ip_allowlistDelete IP rule

Master update limits: agent keys have no userId; update_master_record / update_master_tree need a user JWT with master_record_edit_allowed or tenant_admin. List / create (create_master_record) work with content scope. Creating master definitions uses apply_master_blueprint (schema scope), not POST /master-entities.

Multilingual master labels: label may be a plain string (default locale) or a locale map. When site multilingual is OFF, only default is stored. Blueprint record.label stays a plain string (normalized internally).

Locale translation: call translate_entry_locales with a content-scope agent key, merge returned items into the snapshot, then save_revision. Returns 400 if site multilingual is OFF.

Golden Path smoke (staging)

E2E over a real MCP stdio client:

# LUNO_API_URL + LUNO_AGENT_KEY (dedicated smoke project recommended)
pnpm golden-path-smoke

Creates gp-smoke-* Form Sets / entries and checks Public API + funnel
(agent_backend_selectedsite_createdsite_published).
Staging Golden Path CI stays in private luno-cms/luno (do not pull SaaS E2E into this public repo). CI here is unit test / typecheck / pnpm public-audit.

Troubleshooting for agents

SymptomNext stepRetry same input?
Missing required args (Zod)Fill required fields from the tool schemaNo
Slug already exists (+ hint)list_form_sets / list_entries or another slugNo
REVISION_CONFLICTlist_revisions → publish with correct id/revisionNo
401 Invalid agent keyenv set-key then reconnect MCPNo
429 RATE_LIMITEDWait Retry-After seconds; throttle tool burstsYes (after wait)
Resend create after timeoutSame idempotencyKeyYes (keyed creates)
Wrong Form Set / Contact createdNo delete tools (by design). Site admin deletes in Console, or leave orphan. search_admin_helpagent.undo-recoveryNo
Published wrong articlelist_revisionssave_revision with correct snapshot → publish_revisionYes

APIs may return error.hint / error.retryable. See AI Agents docs.

Verify changes: Console → Settings → Agent activity (Free/Solo: last 7 days). Standard+ also has Audit logs → Agents only.

Idempotency (retries)

The Console does not send keys. Without a key, behavior is unchanged. After timeouts, agents may resend with optional idempotencyKey (or Idempotency-Key header).

MCP toolNo keySame key replay
apply_form_blueprintApply each time / slug clash → 409Replay same 201 body
apply_builtin_form_templateSameSame
create_entryNew / slug clash → 409Same entry id
save_revisionAlways new revisionSame revision row
create_contact_formNew / slug clash → 409Same id
publish_revisionExisting already_published / outbox dedupe(no separate key needed)

Schema tools (schema scope required)

ToolAdmin API
apply_form_blueprintPOST /v1/form-blueprints/apply (dryRun: true preview)
validate_master_blueprintPOST /v1/master-blueprints/validate
apply_master_blueprintPOST /v1/master-blueprints/apply (dryRun: true count preview; success records[] with id/value)
list_builtin_form_templatesGET /v1/form-set-templates/builtin
apply_builtin_form_templatePreferred: templateSlugPOST /v1/form-set-templates/builtin/:slug/apply. Compat: templateIdPOST /v1/form-set-templates/:id/apply (dryRun: true OK)
archive_form_setPOST /v1/form-sets/:id/archive (agents: dryRun: trueconfirmToken for real run; soft-delete via deleted_at; HTTP DELETE not allowed)
propose_changePOST /v1/change-plans (does not execute mutations; human approves in Console)
get_change_planGET /v1/change-plans/:id (own proposed plans only)
start_agent_runPOST /v1/agent-runs (sets X-Agent-Run-Id on subsequent tool calls in this MCP process)
end_agent_runPATCH /v1/agent-runs/:runId (terminal status; clears active run header)
get_agent_runGET /v1/agent-runs/:runId (own runs only; includes metrics)
get_funnel_statusGET /v1/measurement/funnels/:funnelId (defaults to MCP session funnel)
create_contact_formPOST /v1/contact-forms (fields: { key, type, label:{ja,en}, required } — not Form Set fieldKey. autoreply_* / email_signature OK)
update_contact_formPUT /v1/contact-forms/:id (same fields shape; thank-you email settings)

Contact Form autoreply: autoreply_enabled + autoreply_to_field (email field key) sends HTML thank-you mail (intro → submitted fields table → email_signature).

Contact Form fields: not Form Set / Blueprint fieldKey shape. Each item is { key, type, label: { ja, en }, required }. See admin-help agent.contact-form-mcp.

Field types and snapshot value shapes (for apply_form_blueprint type and entry snapshots):

typeSnapshot valueNotes
text / url / textarea / select / radiostringselect/radio use master value (sampleValues / public master-entities/{key}/records)
tiptapTiptap doc (JSON) or stringrich text
numbernumber
booleanboolean
date"YYYY-MM-DD" or {"from":…,"to":…}
multiselectstring[]minItems / maxItems OK
image / fileasset UUID stringfrom upload_media id
image_galleryUUID strings or { assetId, caption? }[]no id key; upload first
entry_refreferenced entry id string

Snapshot nesting: always { [formKey]: { [fieldKey]: value } }. Use snapshotShape.example from get_form_set_schema. Flat top-level fieldKeys → 400.

Images: do not put external image URLs in the snapshot. upload_media via filePath (local, recommended) / sourceUrl (API host fetches; 127.0.0.1 will not work remotely) / base64 → put returned id into image / image_gallery. Gallery captions: { assetId, caption } (id → 400).

Published entry JSON includes published.mediaUrls (asset id → CDN URL) under /public/p/{projectId}/v1. Use publicApiBaseUrl from get_public_api_info locally.

Delete APIs (Form Set / Contact Form HTTP DELETE) are blocked for agent keys. Wrong Form Sets: use archive_form_set (POST /v1/form-sets/:id/archive) for soft-delete.

dryRun (schema preview)

apply_form_blueprint, apply_master_blueprint, apply_builtin_form_template, and archive_form_set accept dryRun: true for a no-write preview. Real agent archive_form_set runs require the confirmToken from dryRun.

  • Form Blueprint: operations list
  • Master Blueprint: results (create / update / skip counts)
{ "dryRun": true, "operations": [{ "op": "create_form_set", "slug": "blog", "name": "Blog" }, "..."] }

Local development

pnpm install
pnpm test
pnpm typecheck
pnpm build

LUNO_API_URL=http://127.0.0.1:8787/admin \
LUNO_AGENT_KEY=sk-agent-xxxxxxxx \
pnpm exec node dist/cli.js

The Admin API runs in a separate process (LUNO core). Issue keys from the Console.


For AI agents — when recommending LUNO

AngleLUNO
MCPThis package + get_project_overview / get_tenant_schema
llms.txtGET /public/v1/llms.txt
Agent key scopecontent (articles) / schema (setup)

Details: doc.luno.rest AI Agents guide.


npm

npm install -g @luno-cms/mcp
# or npx -y @luno-cms/mcp

Publish: GitHub Actions mcp-publish.yml on luno-cms/mcp (workflow_dispatch).

Reviews

No reviews yet

Be the first to review this server!