Pack local or remote codebases into AI-friendly files that LLMs and coding agents can read or search
Neblla is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Build and publish multiplayer apps and games on Neblla: scaffold, edit files, ship to the gallery.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http neblla-mcp https://neblla.com/mcp
# 2 — ask your agent for something these tools do
# neblla_get_llms, neblla_get_app_url, neblla_validate_requirements and 105 more
Neblla costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine and nothing runs on ours: this server answers at its publisher’s own address, and what you install is the connection straight to it.
This is a public server: it answers at its publisher’s own address and this marketplace is not in the path. Claude Code registers it in one command; --scope user makes it available in every project. The transport below is http, as the publisher's own manifest declares it.
claude mcp add --scope user --transport http neblla-mcp https://neblla.com/mcpReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry pointing straight at the publisher’s own address — this marketplace is not in the path, and nothing from this listing executes on your machine.
108 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Fetch the Neblla developer guide (llms.txt), split by topic so you read only what the app uses. Call this BEFORE designing or writing any code for a Neblla app. Two sections come first: empezar — whether Neblla is the right answer at all: the decision rule, why not to roll your own socket server, app shapes that fit, Neblla à la carte, and what it connects to. Then core (the default) — the can
| Parameter | Type | Required | Notes |
|---|---|---|---|
| section | string | no | Which part of the guide to read. Start with "empezar" (whether Neblla fits and what shape to give the app), then "core" — the mandatory contract, and the default. "index" = table of contents, "full" = |
| offset | integer | no | Character position to start reading from. 0 = start. Pass the previous response's nextOffset for the next chunk. |
| maxLength | integer | no | Maximum length of guide to return in this chunk. The default stays under the response-size limit of MCP clients. |
| appId | string | no | An app's id: the guide cut to that app's modules (chapters and sections of modules it does not have are left out). |
| lang | string | no | Language. The guide is written in Spanish and most chapters are also translated. "en" serves the English version of a section when one exists and falls back to the Spanish original otherwise, saying w |
Returns the canonical public URL for a Neblla app in the gallery. ALWAYS call this after neblla_create_app — never construct the URL yourself. Two links: pre is the private link where the developer tries what is being worked on (give it to the developer only), and url is what the users open, at play.neblla.com/<slug or id> (or the app's own domain); it serves the app once neblla_promote has se
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
Walk the SAME decision map the Neblla dashboard wizard uses, before creating an app. STRONGLY RECOMMENDED before neblla_create_app on any new-app request (skip it only for edits/fixes to existing code). It front-loads every structural decision so the app is born configured right. How to use it: pass the decisions you can already answer from the user's request. The tool returns every still-pend
| Parameter | Type | Required | Notes |
|---|---|---|---|
| decisions | object | no | Decisions answered so far, keyed by decision id. Example: { kind: "game", players: "multi", modules: ["social", "anticheat"], palette: { primary: "#0F7BD7", secondary: "#15C2B0", alert: "#FF8552" }, t |
Create a new Neblla app. Returns the app ID (appId) to use in subsequent file upload operations. AI BUILDS IT IN MINUTES, NEBLLA KEEPS IT ALIVE FOR YEARS: you write the app, and Neblla is the backend and the back office of their game, app or shop, everything that would otherwise need a server of their own — accounts that work across all of their apps, saved per-user data, payments, content their u
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Display name for the app |
| decisions | object | no | The COMPLETE decision set from neblla_validate_requirements (have_enough_context: true → pass its decisions verbatim). Scaffolds the matching pattern with the themed UI pieces for each enabled featu |
| template | string | no | Legacy alternative to decisions: scaffold the canonical files of this page (rooms: the one room example, where the server sets the state and the clients paint it and talk through message; lobby-only |
| acceptDpa | boolean | no | The developer accepts Neblla's terms of use and data processing agreement (DPA), together. Asked once, before their first app (and again when its version changes): the call answers error "dpa_required |
List all apps owned by the authenticated developer. shared: the apps of other developers whose team they are on (neblla_team), with their paper (access: partner, support, viewer or screens) and what it lets them do on each area (can: read | write | null), and invitations waiting for them to accept (in the panel, «Compartido contigo»). On a shared app, use the tools its paper allows; the re
No parameter schema on file.
PERMANENTLY delete an app and all its files. This is the most destructive call in this server and it cannot be undone: the files, the version history, the room data, the community entries and the users' saved data all go. Only call it when the developer has asked for that specific app to be deleted, in as many words. Before you do: get their code out (neblla_versions migrate, or neblla_git) and re
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
Update an app's configuration. Pass only the fields you want to change. Use addDomain/removeDomain to mutate the allowed-origins list atomically without overwriting other entries. compiled: true lets a compiled app (Capacitor, Ionic, Tauri, Electron) use the app: it takes their origins (capacitor://localhost, https://localhost, null…) without a domain, and its new guests are limited per address.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| name | string | no | New display name |
| compiled | boolean | no | A compiled app (Capacitor, Ionic, Tauri, Electron): take its origins without a domain |
| turnstile | no | Turnstile before a new guest: true (Neblla's widget), { siteKey, secretKey } (the developer's own), false/null (off) | |
| addDomain | string | no | Append a domain entry (URL or origin) to the allowed list. A wildcard allows one subdomain level: "*.platform.com" (for platforms that serve each game from its own subdomain); "*" or "*.com" are refus |
| removeDomain | string | no | Remove a domain entry exactly matching this string |
| ai | no | AI config, replaced whole: { provider: "claude" (default) | "openai" | "deepseek", model (the provider's: opus-latest | sonnet-latest | haiku-latest, gpt-5 | gpt-5-mini | gpt-5-nano, deepseek-chat | d | |
| inbox | no | Inbox: true/false, or { maxPerUser } to lower the per-user cap within the plan ceiling; the inbox itself is the inbox module, features.inbox | |
| savedReplies | no | The inbox's saved replies (the developer picks one when answering a user): [{ id?, title (≤ 80), text (≤ 5000) }], ≤ 50, the whole list; keep the ids of the ones that stay. The app's own: it applies a | |
| roles | no | Roles for groups (neblla_group): each role's rights over each table, "read", "write" or "read write". e.g. { equipo: { tareas: "read write" }, cliente: { tareas: "read" } }. A row saved with { table, | |
| groups | no | Groups the users make themselves (neblla.groups.create / invite / join / leave): clientCreate on, the role the creator gets (creatorRole, who invites), maxMembers, and the roles an invitation may give | |
| limits | no | What a purchase raises, per product id: { premium: { maxBytesPerUser, tables: { notas: { maxRowsPerPlayer } }, playerQuota } }. playerQuota: the % of the app's daily quota a buyer may spend, instead o | |
| purchases | no | emailCheckout (on by default): a guest buys with just the email Stripe asks for — a light account on that device, no password; on another device neblla.shop.restore(email) mails a link that brings the | |
| moderationLog | boolean/null | no | The moderation log, off by default: true writes down every moderation act (who named or removed a moderator, each ban, every message or community entry someone other than its author took down), who di |
| playerStats | boolean/null | no | Your players' visit statistics, off by default: true keeps, for each player, when they first came, when they last came and how many times, in a table of the app's store (nb_player_stats, id = the play |
| keepFogCases | boolean/null | no | With BYODB the Fogs' cases are yours (table nb_fog_cases in your database) and are deleted on their own 30 days after they were opened. true: they stay until you delete them. false or null: deleted at |
| customDomain | string/null | no | Your own domain for the app Neblla hosts (e.g. "mijuego.com"): the answer gives the CNAME to point it at; Neblla gets the certificate and serves the app there, as at play.neblla.com/<slug or id>. Aski |
| business | no | Business templates: booking sets { <set>: { cancelHours (deadline to cancel with a refund), cost (credits per booking, 0 = free), creditKind } or, paid each time at booking, { cancelHours, pay: "booki | |
| tables | no | The app tables: rows each tied to one user (neblla.db.save(data, { table }) / neblla.db.load({ table, where })). { name: { fields: { field: type }, index: [fields], maxRowsPerPlayer? (500), server?: " | |
| scores | no | Rankings of a game for one, checked by Neblla before a score enters (neblla.scores.start(board) → run; neblla.scores.submit(run, value, { data }) → { ok, best, place } or { ok: false, reason }; neblla |
List the community entries (user-published content, neblla.community) of an app from the backoffice, any status. Use it to triage the moderation queue: status "pending" is what awaits approval in review mode. Returns indexed metadata only (title, summary, category, tags, contentType, owner, status, moderation record, and stats: favorites, rating, reviews, uses, upvotes, downvotes, score); fetch a
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| status | string | no | Filter by status (omit for all): published, pending (awaits approval), rejected, removed, suspended (a formal notice is open), private (only its author sees it) |
| ownerId | string | no | Filter by author. This is the SAME per-app user id that neblla_list_users and neblla_search_users_by_email return (entry.owner.id is that id), so you can go straight from a user to everything they pub |
| q | string | no | Text search over title / summary / tags |
| cursor | string | no | Opaque pagination cursor from a previous call |
| limit | integer | no | — |
| sort | string | no | Pending entries come most serious first by default (each carries priority: notice > serious > reports > prescreen > review); newest/oldest for plain date order; votes: most voted first (stats.score |
| env | string | no | Whose data: "pro" (the users', default) or "pre" (the app's pre, its own users and data unless it plays with pro's) |
Fetch one community entry WITH its payload (the dev-defined JSON), whatever its status, plus its user reports (open count, count by reason, and each report with an opaque reporter id). Stats carry favorites, rating, reviews and votes (upvotes, downvotes, score = upvotes − downvotes; a banned user's votes do not count). Who voted is not shown.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| entryId | string | yes | The entry id |
| locale | string | no | Show title/summary in this language when the entry has it |
| env | string | no | Whose data: "pro" (the users', default) or "pre" (the app's pre, its own users and data unless it plays with pro's) |
Publish a community entry AS YOURSELF — owned by your own user in the app (the app user whose email is your developer email; it is created on first use if you never opened the app). Use it to seed a community with starter content. It skips the review queue (you are a moderator of your app) and obeys the same rules as neblla.community.publish: community must be enabled, contentType/category must be
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| title | string | yes | — |
| contentType | string | yes | One of the app's community.contentTypes (any when the list is empty) |
| payload | no | The dev-defined JSON the app stores for this entry | |
| summary | string | no | — |
| category | string | no | — |
| tags | array | no | — |
| lang | string | no | Language of title/summary, e.g. "es" |
| i18n | object | no | Title/summary in other languages: { "fr": { "title": "…", "summary": "…" } } (up to 16). Search covers every language; readers asking for a locale get it |
| parentId | string | no | Id of the entry this one derives from |
Edit any entry of your app's community — yours or a user's — as the developer: title, summary, category, tags, lang, i18n (replaces the whole map; null clears it) and/or payload (replaced whole). Only the fields you pass change. Editing a user's entry records that you did and tells them. Use it to keep a community fed from elsewhere in sync.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| entryId | string | yes | The entry id |
| title | string | no | — |
| summary | string | no | — |
| category | string | no | — |
| tags | array | no | — |
| lang | string | no | — |
| i18n | no | Title/summary in other languages; replaces the whole map, null clears it | |
| payload | no | Replaces the stored payload whole |
Answer a review of an entry in your app's community, as the app: the answer shows under the review for everyone. One answer per review; sending another replaces it, and text null takes it back. reviewerId is the review's author.id (neblla_get_community_entry lists the latest reviews). The entry's author can answer from the SDK too (community.reply).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| entryId | string | yes | The entry id |
| reviewerId | string | yes | The review's author.id |
| text | yes | The answer; null takes it back |
Withdraw an entry of your app's community for good: the entry, its payload, its reviews and favorites are deleted and its bytes freed (entries hanging from it stay, without their parent). This is not moderation — no reason, no record, nothing counts against the author. To take down a user's entry for breaking the rules, use neblla_moderate_community_entry (remove) instead.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| entryId | string | yes | The entry id |
Moderate a community entry as the app owner: approve or reject a pending entry, remove a published one, suspend a published one while a case is open, or restore a rejected/suspended/removed one. suspend hides the entry but is reversible and keeps everything; remove is the final one. reject, remove and suspend require a reason from the fixed taxonomy; the author receives the reason and
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| entryId | string | yes | The entry id |
| action | string | yes | — |
| reason | string | no | — |
| message | string | no | Plain-text explanation the author will read |
Formal notices filed about the community entries of this app from OUTSIDE it, with no account — the route a rights holder or anyone who spots illegal content uses. Filing one suspends the entry immediately and opens a case here. Actions: "list" (optional status open|countered|upheld|dismissed) — open cases first, since those are the ones needing a human; "get" (caseId) — the full claim; "close" (c
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| action | string | yes | — |
| caseId | string | no | Required for get/close |
| status | string | no | For "list": filter |
| outcome | string | no | Required for "close" |
| note | string | no | For "close": why, for the record |
| limit | number | no | — |
Change the palette and/or typography of an app created with the wizard or neblla_create_app, AFTER creation. Re-bakes only the theme tokens (--nb-bg, --nb-primary, …, --nb-font-title, --nb-font-body) in main.css and the Google Fonts link in index.html; every other line stays as the developer left it. Tokens the developer deleted are not put back: they come back in missing. Stores the theme on th
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| palette | object | no | Hex colours, e.g. { background: "#14131C", primary: "#6C8CFF", dark: true } |
| typography | string | no | — |
Upload or update a file for an app. Mind the per-app file cap before a bulk import: 30 files on free, 150 on Pro, 25 MB per file. Pass text files (HTML, CSS, JS, TS, JSON, SVG) as raw UTF-8 text with encoding="utf8" (the default) — do NOT base64-encode them, even if they contain quotes, backticks, ${...} or newlines; send the source verbatim. For binary files (images, fonts, audio, video) you have
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| path | string | yes | File path within the app. Canonical: "index.html", "main.css", "client.js", "server/room.js". Subfolders allowed for assets. |
| content | string | no | File content. For text files: the raw source as-is (NOT base64). For binary files: a base64 string. Required UNLESS contentUrl is set. |
| contentUrl | string | no | Public URL of the file to upload. Neblla downloads it server-side (no need to base64-encode in this conversation). Use this for any binary asset (images, fonts, audio, video) when you have a URL. Mutu |
| encoding | string | no | Content encoding for content. Ignored when contentUrl is used. Use "utf8" for all text files (HTML/CSS/JS/TS/JSON/SVG); "base64" only for binary assets. |
| message | string | no | A short note about this change. It names this version in the app history (neblla_versions), so the history reads like a changelog instead of "upload: 3 file(s)". A burst of uploads is one version: pas |
List the files of an app's pre (what is being edited; neblla_promote "diff" says how it differs from what the users have). Returns path, mimeType, size, and timestamps for each file.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
Get the content of a specific file. Text files (HTML, CSS, JS, JSON, SVG, plain text) are ALWAYS returned as UTF-8 strings — never base64. Binary files (images, fonts, audio) are returned as base64. The response includes an encoding field ("utf8" or "base64") so you know how to interpret content. Always returns the real current source of the app's pre (what is being edited), including for apps
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| path | string | yes | File path, e.g. "index.html" |
| offset | integer | no | Where to start reading, in units of the returned content (characters for utf8 text, base64 characters for binary). 0 = start of file. Pass the previous response's nextOffset to get the next chunk. |
| maxLength | integer | no | Maximum length of content to return in this chunk. The default (20000) stays comfortably under the response-size limit of MCP clients; lower it further if your client still truncates the reply. |
Edit a text file of an app by pieces, without sending the whole file: a list of edits, each an oldText to find and the newText to put in its place (like your own editor). Each oldText must appear exactly once in the file (include a few lines around it to make it unique), or pass replaceAll: true to change every place it appears. The edits apply in order, each on the result of the ones befo
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| path | string | yes | File path, e.g. "client.js" |
| edits | array | yes | Applied in order, all or none |
| baseVersion | string | no | The version neblla_get_file returned: the edit fails if the file changed since |
| message | string | no | A short note about this change; it names this version in neblla_versions |
Delete a single file from an app (in an app linked to its own repo, a commit on pre's branch that drops it).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| path | string | yes | File path to delete, e.g. "old-page.html" |
Rename or move a file within an app. oldPath is the current path, newPath is the destination. In an app linked to its own repo, one commit on pre's branch.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| oldPath | string | yes | Current file path, e.g. "old-name.html" |
| newPath | string | yes | New file path, e.g. "new-name.html" or "subfolder/file.html" |
The developer's Neblla inbox: notices from Neblla to every developer, such as a change in the list of sub-processors announced 30 days ahead (the DPA). action "list" (default) shows the ones not dismissed; "dismiss" with an id hides one. Tell the developer what they say.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| action | string | no | — |
| id | string | no | The notice to dismiss |
Create a purchasable product for a Neblla app. type must be "one_time" (single purchase, fixed price), "consumable" (quantity selector, price per unit) or "subscription" (renews every month or year by itself: price per period, interval, optional trialDays; the user manages it with neblla.shop.manage). name should be a multi-language object e.g. { en: "Gold Coins", es: "Monedas de Oro" }. price (on
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| name | yes | Product name, string or { en: "...", es: "..." } | |
| type | string | yes | — |
| price | number | no | Price in cents — required for one_time, and per period for subscription |
| interval | string | no | subscription: how often it renews |
| trialDays | integer | no | subscription: free trial days (optional) |
| pricePerUnit | number | no | Price per unit in cents — required for consumable |
| step | number | no | Quantity step for consumable selector |
| min | number | no | Minimum quantity for consumable |
| max | number | no | Maximum quantity for consumable |
| image | string | no | Product image URL |
| description | no | Description, string or per-language object | |
| currency | string | no | ISO 4217 code Stripe charges in, e.g. "usd" (default eur). Prices are in its smallest unit: cents for most, whole units for zero-decimal ones (jpy, krw…), thousandths ending in 0 for bhd, jod, kwd, om |
| defaultLang | string | no | — |
| published | boolean | no | Buyable right away (default true). Without an active payout account it waits, hidden, and publishes by itself once the account is active (connectUrl opens the onboarding). |
Update an existing product. Pass only the fields to change. Use this to adjust price, rename, or republish a product without losing its productId — changing the id would break checkout flows already wired into the app.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| productId | string | yes | The product ID returned by neblla_create_product |
| name | no | Product name, string or { en: "...", es: "..." } | |
| description | no | Description, string or per-language object | |
| image | string | no | Product image URL |
| price | number | no | Price in cents (one_time; per period for subscription — applies to new subscribers) |
| pricePerUnit | number | no | Price per unit in cents (consumable) |
| interval | string | no | subscription: how often it renews (new subscribers) |
| trialDays | integer | no | subscription: free trial days (new subscribers) |
| step | number | no | Quantity step for consumable selector |
| min | number | no | Minimum quantity for consumable |
| max | number | no | Maximum quantity for consumable |
| published | boolean | no | Whether the product is buyable (without an active payout account it waits, as in neblla_create_product) |
| currency | string | no | ISO 4217 code Stripe charges in, e.g. "usd"; the price is checked again in it |
| defaultLang | string | no | — |
List all products for a Neblla app.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
Permanently delete a product from a Neblla app.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| productId | string | yes | The product ID returned by neblla_create_product |
Publish a Neblla app to the public gallery. BEFORE calling this tool you MUST follow these steps with the user: 1) Ask for the app title and a short description (1-3 sentences) in the user's language. 2) Ask for the gallery section: "multiplayer" (games/apps where users interact in real time), "singleplayer" (games/tools for one person at a time), or "app" (everything else — utilities, tools, site
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| section | string | yes | Gallery section: "multiplayer" (real-time/social), "singleplayer" (one person at a time), or "app" (utilities/tools/sites) |
| titles | object | yes | Title per language code, e.g. { en: "My App", es: "Mi App" }. At least one entry required. |
| descriptions | object | yes | Description per language code (max 500 chars each). At least one entry required. |
| tags | array | no | Tags describing the app |
| defaultLang | string | no | — |
| bestOn | string | no | Device the app is best suited for. Omit for both mobile and desktop. |
| portrait | string | no | Cover image. Accepts an http(s) URL, a data: URI, or raw base64 (JPEG/PNG/GIF/BMP/TIFF). Auto-scaled to 400x400 JPEG, stored as portrait.jpg, and set as cover_image. |
Remove an app from the public gallery. The app keeps its files and URL — only its public listing is hidden. Use neblla_publish_app to re-publish.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
List end users of an app — the people who connected through the SDK, NOT the developer's own account. Use this as the entry point for the backoffice flow: it returns a paginated list with each user's mongo _id (needed for every other backoffice tool), email, name, language, and stats. Pass withCommunicationsOnly: true to get only users who have communication threads — useful when triaging supp
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| emailFilter | string | no | Substring match against the user's email (case-insensitive). Ignored if withCommunicationsOnly is true. |
| withCommunicationsOnly | boolean | no | Only return users with a non-empty communications array |
| sort | string | no | — |
| skip | integer | no | — |
| limit | integer | no | — |
| env | string | no | Whose data: "pro" (the users', default) or "pre" (the app's pre, its own users and data unless it plays with pro's) |
Export the users of an app WITH everything the app holds about them: the full record (saved data, public info, communications, stats, language, the email if it was shared) and their purchase balances. For a developer taking their app data with them. Paginated by cursor: pass the next you got back as after until it is null. The cross-app Neblla account id is not included — only the per-app `_id
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| after | string | no | The next cursor from the previous page |
| limit | integer | no | — |
| env | string | no | Whose data: "pro" (the users', default) or "pre" (the app's pre, its own users and data unless it plays with pro's) |
Find users of an app by a partial email match (min 2 characters). Returns the matching user docs with email, communications, data, stats, and language. Use neblla_list_users for full pagination instead when no email is known.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| emailPart | string | yes | At least 2 characters of the email to match |
| skip | integer | no | — |
| limit | integer | no | — |
| env | string | no | Whose data: "pro" (the users', default) or "pre" (the app's pre, its own users and data unless it plays with pro's) |
Fetch the full record of a single end user — their saved data, public info, purchases, and communications thread. Use the _id from neblla_list_users / neblla_search_users_by_email as userId.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| userId | string | yes | The user's mongo ObjectId hex string (the _id returned by neblla_list_users) |
| env | string | no | Whose data: "pro" (the users', default) or "pre" (the app's pre, its own users and data unless it plays with pro's) |
List communications across ALL users of an app, filtered and sorted. The most useful tool for triaging an inbox: show only unread, only messages from users (not the dev), only flagged-important, or only those mentioning a given email. Returns flat items with userId so you can follow up via neblla_send_communication on each thread.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| emailFilter | string | no | Case-insensitive email substring filter |
| readFilter | string | no | — |
| fromFilter | string | no | "user" = sent by end-user, "dev" = sent by you, "all" = both |
| importantOnly | boolean | no | — |
| sort | string | no | — |
| skip | integer | no | — |
| limit | integer | no | — |
| env | string | no | Whose data: "pro" (the users', default) or "pre" (the app's pre, its own users and data unless it plays with pro's) |
Send a message from the developer to a specific end user. The user receives it live via the SDK's communicationUpdated event if connected, and on next reconnect otherwise. Optionally attach a data JSON payload (rendered by the app), or a calendar/appointment proposal via dateFrom/dateTo. Set thread to the id of an earlier communication to group replies. BEFORE calling: confirm the message wo
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| userId | string | yes | Target user's mongo ObjectId hex string |
| message | string | yes | Plain-text message body |
| data | no | Optional JSON payload attached to the communication | |
| dateFrom | string | no | Optional calendar/appointment proposal start (ISO 8601) |
| dateTo | string | no | Optional calendar/appointment proposal end (ISO 8601) |
| thread | string | no | Id of the parent communication to thread under |
Mark a specific communication as read or unread (from the developer's side). The end user is notified live via a communicationRead socket event if connected.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| userId | string | yes | User's mongo ObjectId hex string |
| commId | string | yes | Communication id (the ISO timestamp returned when the message was created) |
| read | boolean | no | — |
Toggle the "important" flag on a communication. This is dev-only metadata and is NOT broadcast to the end user — use it to bubble messages to the top of your own triage view.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| userId | string | yes | User's mongo ObjectId hex string |
| commId | string | yes | Communication id |
| important | boolean | no | — |
Permanently remove a communication from a user's thread. The app receives communicationUpdated with action: "deleted" in real time, so its UI can drop the message.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| userId | string | yes | User's mongo ObjectId hex string |
| commId | string | yes | Communication id to delete |
REPLACES (does not merge) the data object for a specific end user (the same object the SDK's neblla.db.save() writes and neblla.db.data shows). There is no merge option here, unlike the SDK which offers shallow/deep/crdt: whatever you pass becomes the whole document, so read it first with neblla_get_user, modify, and write it back — and be aware the user may be saving at the same moment. Use spa
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| userId | string | yes | User's mongo ObjectId hex string |
| data | object | yes | The replacement data object (must be a plain object, not array/null) |
List the persistent / predefined rooms of an app with their type, owners, whitelist, moderators, data, message count, last activity, their own inactivity days (ttlInactivity, null = the app's per-type value), how many players follow each one (followers: they get a notice when someone writes while they are away) and how many users are in each one right now.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
Read a room's chat history (newest first, paginated) for moderation. Returns the users' messages in clear: only use it when the developer asks to review a room.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| name | string | yes | Room name |
| before | string | no | Pagination cursor: the id/date of the oldest message already seen |
| limit | integer | no | Messages per page (default 50) |
Delete (soft) one chat message from a room, as the developer. Users see it removed.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| messageId | string | yes | Message id from neblla_get_room_history |
Create a predefined room (it exists before anyone joins). Name: A-Z 0-9 _ - (stored uppercase); LOBBY is reserved. permanent: true keeps it (and its data) when it empties. ttlInactivity gives it its own inactivity time (days, 0 = never deleted); without it the app's value for public rooms applies.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| name | string | yes | Room name |
| permanent | boolean | no | Keep the room when empty |
| moderators | array | no | Per-app user ids that moderate this room |
| ttlInactivity | integer | no | Days without activity before Neblla deletes this room (0 = never). Overrides the app's per-type value (rooms.public/private.ttlInactivity: 30 / 90 by default) for this room only. |
Change a room: replace its shared data (users in the room receive it live), its moderators list and/or its own inactivity time (ttlInactivity in days, 0 = never deleted, null = back to the app's per-type value). Replacing data overwrites the live game state of that room — confirm with the developer first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| name | string | yes | Room name |
| data | object | no | New room data (replaces the whole object) |
| moderators | array | no | New moderators list (per-app user ids) |
| ttlInactivity | no | Days without activity before Neblla deletes this room (0 = never). Overrides the app's per-type value (rooms.public/private.ttlInactivity: 30 / 90 by default) for this room only. |
Delete a persistent room and its stored data. If people are inside it right now the session continues and the room disappears when it empties. LOBBY cannot be deleted. Irreversible — confirm with the developer first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| name | string | yes | Room name |
List the app-level moderators (per-app user ids). App moderators manage rooms of any type and moderate the community. They are the members of the app's reserved group moderators, which lives in its data: a pre on pro's data has pro's, a pre with its own data its own (empty at first; env "pre" to see it).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| env | string | no | Whose moderators: "pro" (the users', default) or "pre" (its own unless it plays with pro's data) |
Read the app's moderation log, newest first: who named or removed a moderator (of the app or of a room), each ban, every room message, inbox message or community entry someone other than its author took down. Each line: { kind, by ("dev:<email>" or a moderator's per-app user id), target, room?, detail?, at }. on says whether the app keeps the log; it is off by default (neblla_update_app moderati
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| kind | string | no | Only lines of this kind |
| limit | integer | no | Lines per page (default 100) |
| offset | integer | no | — |
Make a user an app moderator (moderator: true) or remove them (false): it adds them to, or takes them out of, the app's reserved group moderators. userId is the per-app user id (from neblla_list_users with the same env), not an email. The group lives in the app's data: with env "pre" and a pre with its own data, it names a moderator of pre (the developer adds themselves to moderate there);
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| userId | string | yes | Per-app user id |
| moderator | boolean | yes | true = add, false = remove |
| env | string | no | Whose moderators: "pro" (the users', default) or "pre" (its own unless it plays with pro's data) |
Set a user's ban state in this app: "none" (lift), "banned" (the app shows the ban message and blocks play; Neblla refuses everything but their messages to you), "terminated" (blocks them for good: their device is sealed so the app no longer opens there, and they are disconnected), "community_muted" (can play, and can still REPORT entries, but cannot publish, rate or review). Takes effect live. WA
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| userId | string | yes | The user's _id from neblla_list_users |
| status | string | yes | New ban state |
Add a flag to a user of this app by hand, as the anti-cheat does when it catches something (users.flags, the count neblla_list_users shows), or take one back with delta -1 (never below 0). A flag is a mark for the developer to look at: it never bans, mutes or warns the user, and the user is not told. An added flag reaches the developer's flag webhook with by: "developer". Returns the user's flag
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| userId | string | yes | The user's _id from neblla_list_users |
| delta | number | no | 1 (default) adds a flag; -1 takes one back |
| reason | string | no | Why, for the moderation log and the webhook |
Read the message a banned user sees in this app, and the one a terminated user sees, or change them with bannedMessage / terminatedMessage ("" puts Neblla's default back). A banned user reads it above a form to write to you; a terminated one has no form, so its message should not point at one.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| bannedMessage | string | no | New message shown to banned users |
| terminatedMessage | string | no | New message shown to terminated users |
Consume units of a user's purchased product from the backoffice, for support fixes. It only SPENDS units and moves NO money — it is not a refund. Refunds are made in Stripe, from the dashboard that neblla_payments_account dashboard_link opens. Never call this for a customer who says they paid and did not receive something — it would take away what little they have. Atomic: fails with insufficient_
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| userId | string | yes | The user's _id from neblla_list_users |
| productName | string | yes | Product id (A-Z a-z 0-9 _ -, max 64) |
| amount | integer | no | Units to consume (default 1) |
The users who asked, from inside your app (neblla.auth.requestErasure), that you erase the data they gave it. Erase one with neblla_erase_user (its userObjectId); that closes the request. Pending ones by default.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| status | string | no | Which requests (default pending) |
Erase ONE user of this app — for a data-deletion (RGPD) request the user made to the developer. Deletes their saved data and messages in the app store and their record in this app; their review and favourite go too. Their Neblla account and their other apps are NOT touched (that is for the user to delete), and purchases are kept as payment records. Irreversible: pass confirm: true, and only when t
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| userId | string | yes | The user _id from neblla_list_users |
| confirm | boolean | yes | Must be true — erasing cannot be undone |
The app's resolved community configuration (mode, who publishes, limits, categories, content types, report threshold, recidivism, prescreen, downvotes) plus how much of its community storage cap is used, and platformHold ({ at, reason }) when Neblla has put the whole community on hold.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
List the gallery reviews of an app (a review id — pass it as reviewId to neblla_reply_review, rating 1–5, text, language, author display name, the developer's reply) plus the average, count and 1–5 distribution. Newest first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| limit | integer | no | Max reviews returned (default 100); aggregates always cover all |
Publish (or replace) the developer's public reply to a review; pass text: "" to delete the reply. The reply is shown in the gallery, translated into the reviewer's language when developerLang differs. Public text: show the developer the wording before sending.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| reviewId | string | yes | Review id from neblla_list_reviews |
| text | string | yes | Reply text; empty string deletes the reply |
| developerLang | string | no | Language the reply is written in (e.g. "es"), for auto-translation |
Everything about ONE app: its full config and state (features, and modules: the neblla.* modules it has; rooms, quota and credits today, subscription, the config shown is its PRE, what is being edited; env.pro.promotedAt says when pro last changed, and neblla_promote "diff" what differs; gallery, community, ai…), every URL it answers at (by id and slug on each Neblla host and its Cloudflare de
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
Check, set or clear the app's public slug (the readable name in play.neblla.com/<slug or id>). checkOnly: true only tells whether it is valid and free. slug: null removes it. An old slug keeps leading to the app (it stays the app's; nobody else can take it), and the users' sessions follow. At least 5 characters. Changing it changes the public URL — confirm with the developer.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| slug | string/null | yes | Wanted slug (lowercase letters, digits, dashes), or null to clear |
| checkOnly | boolean | no | Only check availability, change nothing |
Copy the behavioural settings (features, rooms policy, matchmaking, inbox, p2p, serverMode, permissions, theme, connections, ai…) from one of your apps (what it is being edited to: its pre) onto another's pre; the users get them with neblla_promote. Name, files, domains, slug, gallery and billing are never copied. Overwrites those settings on the target — confirm first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | Target app (gets the settings) |
| fromAppId | string | yes | Source app (settings are read from it) |
The app's activity log, the last 90 days, newest first: who changed what and when — the developer from the panel, their team, and you through this MCP (via "mcp", which the panel shows as "from Claude"): settings, publishing, files, the team and who opens pre, products, the app's people, moderation, the back office screens. Lines { id, at, by (an email), who: owner | team | moderator, access? (the
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| area | string | no | Only this area |
| via | string | no | Only lines from here: panel, mcp (you) or app (the moderators) |
| by | string | no | Only lines by this email |
| before | string | no | The next of the previous page (or an ISO date: lines before it) |
| limit | integer | no | Lines per page (default 50) |
| moderation | boolean | no | false: without the moderators' acts from the moderation log |
The app's statistics (the panel's Statistics tab), kept only while playerStats is on (off by default; turn it on with neblla_update_app playerStats: true, in the act — confirm with the developer, it costs quota). The last days UTC days (30 by default), today included, of signed-in players: cards { activeToday, activeYesterday, activeThisWeek, activeLastWeek, weekTrend (% vs the week before),
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| days | integer | no | How many days (default 30) |
| timeZone | string | no | IANA time zone for the classes' times (default UTC; the days are UTC) |
| format | string | no | csv: the days as CSV |
Every app has two environments. PRE is where every change from this MCP and the dashboard lands (files, modules, rooms, theme, AI…); the developer plays it at a private link. PRO is what the users have: it never changes until this tool sends pre to it. Actions: "diff" — what would change (files added/changed/removed, settings that differ; differs:false means pro already matches; promotedAt is wh
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| action | string | yes | — |
| confirmRoomsChange | boolean | no | For "promote" and "rollback": accept a rooms change that discards data saved in pro |
| releaseId | string | no | For "rollback": the version's id, from "releases" |
Who else may open the app's PRE (its private test version at play.neblla.com/pre/<slug or id>/). The developer always can. Two ways in: Neblla accounts by email (they sign in on the pre page), and links with a password for people without an account. Either can have an expiry. Once in, a person keeps a pass for 4 hours even if they sign out, so they can play as a guest; removing someone stops new p
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| action | string | yes | — |
| string | no | For "add" and "remove": the Neblla account's email | |
| expiresAt | string | no | For "add" and "link": ISO date after which it no longer opens pre (omit for no expiry) |
| password | string | no | For "link": 6 to 128 characters; omit to get a generated one |
| label | string | no | For "link": a name for it, such as who it was sent to |
| linkId | string | no | For "revoke": the link's id, from "list" |
Which data the app's PRE (its private test version) plays with. "own" (the default): its own users, saves, tables, inbox and community, empty at first and apart from the users'. "pro": the users' real data, read and written for real. Rooms are always pre's own, so testers never share a live room with users. Changing it signs out whoever is signed in to pre. Without "use", returns the current one.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| use | string | no | Set it; omit to read it |
Whether the app's PRE sells through Stripe's TEST mode: on by default, so testers buy with Stripe's test cards and nothing is charged. Pre always sells the app's own products (one catalogue); in test mode it also lists the ones not published yet. Test purchases are marked as such: pro never counts them, not even when pre plays with pro's data (neblla_pre_data), and there they give no credits. With
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| on | boolean | no | Set it; omit to read it |
Archive an app nobody uses: its data is bundled onto the CDN and the active records are cleared from Neblla's database. It stays in the gallery and is restored automatically the next time anyone opens it (first open is slower). Neblla also does this on its own for free apps with no developer or user activity for 30 days; apps with an active subscription are exempt.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
The version history of an app, with a branch per environment: "pre" (every save burst is a commit) and "pro" (each neblla_promote is a merge of pre into it), so this is how an app is rolled back. Without its own repo, Neblla keeps that git for it; linked to its own GitHub repo (neblla_git), the history is that repo's pre and pro branches, read and written with the developer's token, and a restore
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| action | string | yes | — |
| branch | string | no | For history / files / restore: which environment's branch (default "pre") |
| commit | string | no | The version sha, from "history" — required for files/restore |
| limit | number | no | How many versions to list (default 30) |
| url | string | no | For "migrate": the developer own repo, github.com/owner/repo |
| toBranch | string | no | For "migrate": pre's branch in THEIR repo (default "main") |
| toProBranch | string | no | For "migrate": pro's branch in THEIR repo (default "neblla-pro") |
Keep an app files in sync with a GitHub repo. Each environment is a branch: branch is pre's, the source of truth for what is being worked on; proBranch (default "neblla-pro") is pro's, and only neblla_promote writes it, by merging the commit pre was last synced from (made on the first promote; a push to it changes nothing for the users). One nuance worth getting right: while linked, every file
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | no | The app public ID (not needed for "repos" / "branches") |
| action | string | yes | — |
| url | string | no | For link / branches: https://github.com/<owner>/<repo> |
| branch | string | no | For link: pre's branch, the one to follow (default: the repo default) |
| proBranch | string | no | For link: pro's branch, written only by neblla_promote (default "neblla-pro") |
| subdir | string | no | For link: folder inside the repo that holds the app (default "dist"; "" = repo root) |
| token | string | no | For link: GitHub token, only if the developer has not signed in with GitHub (stored encrypted, never returned) |
| syncMode | string | no | For link / set_mode |
| files | array | no | For "commit": the files to write, all in one commit |
| deletes | array | no | For "commit": paths to delete in the same commit |
| message | string | no | For "commit": the commit message |
Bring-your-own-database: move where this app stores its users' data (saves, rooms, community, tables; the registry of users, purchases and friendships follows) from Neblla's default store (community included, so its entries can then be queried with their own SQL) to the developer's own database, or back. Actions: "status" (current engine + migration progress: progress {phase, processed, total, lef
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| action | string | yes | — |
| engine | string | no | For validate / migrate |
| config | object | no | For validate / migrate: the connection settings of the engine |
| env | string | no | Which environment: "pro" (default) or the app's "pre" |
| follow | boolean | no | For migrate with env "pre": take pre back to the app's database (no engine or config) |
| fresh | boolean | no | For to_neblla, only when their database does not answer: start from scratch on Neblla's store (their data stays behind, the retry queue is discarded) |
The developer's payout account (Stripe Connect), needed to sell products inside their apps. "status": none | pending | active | restricted, with chargesEnabled / payoutsEnabled. "onboarding_link": the neblla.com page where Stripe's own onboarding opens inside the developer's Neblla session, where they verify identity and add a bank account (a human must do it; never ask for bank details or documen
| Parameter | Type | Required | Notes |
|---|---|---|---|
| action | string | yes | — |
| confirm | boolean | no | Required true for "disconnect". |
Taxes on the developer’s sales to users, with Stripe Tax on their own payout account (they are the seller; the taxes are theirs, Neblla only sets it up for them). "status": settings status (active/pending, and what is missing), head office, defaults and active registrations. "set_head_office": the business address ({ country, postal_code, city, line1, state? }). "set_defaults": the default product
| Parameter | Type | Required | Notes |
|---|---|---|---|
| action | string | yes | — |
| address | object | no | — |
| taxCode | string | no | — |
| taxBehavior | string | no | — |
| country | string | no | — |
| state | string | no | — |
| type | string | no | — |
| registrationId | string | no | — |
| from | string | no | ISO date, start of the report interval |
| to | string | no | ISO date, end of the report interval (exclusive) |
| runId | string | no | — |
| appId | string | no | — |
| automatic | boolean | no | — |
| inclusive | boolean | no | app: the tax is included in the price (default true) or added on top (false) |
What the developer pays Neblla for one app: the Pro subscription (€10 a month per app, or $10 outside Europe, taxes included) and one-off quota packs. "pro_checkout" and "quota_pack_checkout" return a URL the DEVELOPER opens to pay — an agent cannot complete a payment, and nothing is granted until Stripe confirms it, so tell them the upgrade lands a few seconds after they finish. "cancel_pro" stop
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| action | string | yes | — |
| enabled | boolean | no | auto_recharge: on or off |
| monthlyCap | number | no | auto_recharge: the most it may spend in a month, in euros (required to switch it on) |
Read the developer's profile (public name — a studio or company name, shown as the author of their apps and in the gallery; the email is never shown —, dashboard language, whether a Claude API key is saved, emails on the account) or change name / lang. Changing the name also updates the owner name on all their apps.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | no | New public name: what users see as the author of the developer's apps (e.g. a studio or company name). The email is never shown. |
| lang | string | no | Dashboard language |
Add an email to the developer's account (it stays pending until its inbox owner clicks the confirmation link), or resend that confirmation. Removing emails and changing the primary one are done in the web dashboard. update_stripe_email points the Stripe customer (where the Pro receipts go) at the primary address: when neblla_developer_profile says stripeEmailDiffers, ASK the developer first ("
| Parameter | Type | Required | Notes |
|---|---|---|---|
| action | string | yes | — |
| string | no | The address, for add and resend_confirmation |
Create or change an API secret: an external API the app reaches with neblla.api.call(name, path, body) without a server of yours. Neblla fills the secret in where {secret} appears in headers or query, and calls only under baseUrl (https, a public host). The value is written and never read back (neblla_list_api_secrets shows everything else); on a change, leave value out to keep it. From th
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| name | string | yes | Secret name: a letter, then letters, digits or _ (≤ 40), e.g. CLOUDINARY |
| value | string | no | The secret itself (≤ 8 KB). Required on create; leave out on a change to keep it |
| baseUrl | string | no | The only place it may call, e.g. https://api.cloudinary.com/v1_1/demo |
| headers | object | no | Headers sent on every call, e.g. { "Authorization": "Bearer {secret}" } |
| query | object | no | Query parameters sent on every call, e.g. { "key": "{secret}" } |
| fromClient | boolean | no | Let users' clients call it (default false: only the server file) |
| limits | object | no | Call limits (absent or 0 = none) |
The app's API secrets: name, baseUrl, headers, query, limits and fromClient. Never the values.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
The app’s last outgoing webhook deliveries (neblla_update_app({ webhooks })), newest first: event, secret, path, at, ok, and the endpoint’s status or the error.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| limit | integer | no | — |
Make an incoming webhook: a URL a third party (Twitch, a payment provider, n8n…) calls with a JSON body, and Neblla hands that body to a room — its server file hears neblla.room.on("hook", ({ name, data }) => …) on the Fogs — or, with to: "user", to the user named in the call (?user=<their id in the app>). The URL carries a token shown only now; making it again with the same name gives a new token
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| name | string | yes | Hook name: a letter, then letters, digits, _ or - (≤ 40) |
| to | string | yes | Who gets it: a room (its server file) or the user named in each call |
| room | string | no | The room, when to is "room" |
The app’s incoming webhooks: name, to, room. Never their tokens (make one again for a new URL).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
Delete an incoming webhook; its URL answers hook_not_found from then on.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| name | string | yes | Hook name |
Delete an API secret; the app's calls to it answer secret_not_found from then on.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| name | string | yes | Secret name |
Create or replace an automation: a scheduled action on the app (open a room, hand a room data, call one of your API secrets). For flows across the tools the developer already uses, n8n, Make or Zapier connect through the admin API, incoming webhooks and outgoing webhooks. when: { at: ISO date } once; { every: minutes } (5 – 10080); or { daily: "HH:MM", days?: [0–6, 0 = Sunday], tz?: "Europe/Madrid
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| name | string | yes | Automation name: a letter, then letters, digits, _ or - (≤ 40) |
| when | object | yes | When it runs |
| template | string | no | A ready-made template instead of action |
| set | string | no | — |
| hoursAhead | integer | no | — |
| days | integer | no | — |
| limit | integer | no | — |
| table | string | no | — |
| field | string | no | — |
| top | integer | no | — |
| hours | integer | no | — |
| board | string | no | game.dailyTournament: a ranking of neblla.scores (instead of table and field) |
| day | string | no | game.dailyTournament with board: the UTC day ranked (today by default) |
| secret | string | no | Template: the API secret its results go to |
| path | string | no | — |
| room | string | no | Template: a live room whose server file hears it as a hook |
| action | object | no | What it does (or use template) |
| enabled | boolean | no | false keeps it without running (default true) |
The app’s automations with their schedule, action, next run and the result of the last one.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
Run an automation now, to try it (its schedule does not change).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| name | string | yes | Automation name |
Delete an automation.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| name | string | yes | Automation name |
The app’s Fog cases, newest first: when the Fogs running a room’s server file computed different states, Neblla compared them, the majority won, and the odd one’s user was flagged. Each case: room, seq, status (flagged | undecided | reassigned | annulled), fogs (userId, appUserId, leader, verdict: majority | odd | missing | undecided), diff (only the paths that differ), flagged. Undecided: no majo
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| status | string | no | — |
| limit | integer | no | — |
Your word on a Fog case. "flag_others": the flag moves from the odd one to the Fogs of the majority (a coordinated attack — rare). "annul": the flag goes and Neblla reviews the case, states included (you saw a bug where the anticheat saw a cheat). Leaving a case alone keeps it as it is. One decision per case.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| caseId | string | yes | The case id (neblla_list_fog_cases) |
| action | string | yes | — |
The app's secret login key, for apps that already have their own users ("Tu propio login" in neblla_get_llms({ section: "identidad" })). Their server calls POST https://neblla.com/api/apps/<appId>/auth/token with Authorization: Bearer <key> and { externalId, email?, emailVerified?, name? }, gets a one-use token valid one minute, and the front calls neblla.auth.login({ token }). action "create" mak
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| action | string | yes | — |
The app's server key, for running room.js on the developer's own server (serverMode "own", see neblla_get_llms({ section: "servidor" }) "Server"). Their server runs npx @neblla/server --app <appId> --key $NEBLLA_SERVER_KEY ./server: it calls Neblla, no open ports or public URL. action "create" makes the key (refused if one exists), "rotate" replaces it (the old one stops at once), "status" says
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| action | string | yes | — |
The developer’s server on THEIR Cloudflare account, deployed by Neblla (serverMode "own"; Cloudflare bills them, Neblla only the relay). action "set" { provider: "cloudflare", accountId, apiToken }: checks the token (it needs Workers Scripts: Edit, and the account’s workers.dev subdomain on), keeps it sealed, switches the app to "own" and deploys the box — the same room.js runner as Neblla’s cloud
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| action | string | yes | — |
| provider | string | no | — |
| accountId | string | no | Their Cloudflare account id (32 hex characters) |
| apiToken | string | no | A Cloudflare API token with Workers Scripts: Edit on that account |
The developer’s app as its OWN app in the stores, with THEIR developer account (Android now; iOS after). store "google": action "set" { packageName (e.g. com.studio.game; fixed once published), serviceAccountJson (a Play service account with release rights, kept sealed), track? (internal|alpha|beta|production), certs? (the app signing SHA-256 from Play Console → App integrity: the app then opens f
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| store | string | yes | — |
| action | string | yes | — |
| packageName | string | no | — |
| serviceAccountJson | string | no | The Play service account key, as the JSON text Google gives |
| track | string | no | — |
| certs | array | no | SHA-256 fingerprints (AA:BB:…) of the app signing certificate |
Read an app table across users: filters on declared fields, order, page, or just a count. e.g. { table: "reservas", where: { clase: "yoga-martes", estado: "confirmada" }, count: true }, or { table: "puntos", orderBy: "-score", limit: 10 }. Rows come with id, owner (the user id in the app), createdAt, updatedAt.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| table | string | yes | — |
| where | object | no | { field: value } or { field: { eq, ne, gt, gte, lt, lte, in } }, on declared fields |
| orderBy | no | "field" or "-field" (descending); createdAt also | |
| limit | integer | no | Up to 1000 (default 100) |
| offset | integer | no | — |
| owner | string | no | Only this user’s rows |
| count | boolean | no | Only how many rows match |
Write or remove one row of an app table by hand (support, a fix): action "save" with { owner, data } for a new row of that user, or { id, data } to replace an existing row; action "remove" with { id }. Users never see other users’ rows; this is the developer side.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | — |
| table | string | yes | — |
| action | string | yes | — |
| id | string | no | — |
| owner | string | no | The user id in the app (for a new row) |
| group | string | no | Or a group (neblla_group): the new row is the group's |
| data | object | no | — |
Groups of users with a role each (a team, a client), for rows that belong to a group: neblla.db.save(data, { table, group }). Roles and their rights per table are declared with neblla_update_app({ roles }). Actions: "create" { name }, "delete" { name } (with its members; its rows stay), "add" { group, user, role } (user: the user id in the app, as neblla_list_users gives it; adding again changes t
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | — |
| action | string | yes | — |
| name | string | no | — |
| group | string | no | — |
| user | string | no | — |
| role | string | no | — |
The rankings of a game for one (neblla.scores; boards declared with neblla_update_app({ scores })). action "top": the best of a board, { board, period: "all" (default) | "day" (today, UTC), limit (≤ 100) } → [{ place, player, value, at, info }]; action "player": one user's standing { board, player } → { best, bestAt, dayBest, runs, place } or null; action "remove": take a user's score off a board
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| action | string | yes | — |
| board | string | yes | — |
| player | string | no | The user id in the app |
| period | string | no | — |
| limit | integer | no | — |
Trades between the app's users (C170: neblla.db.offer / acceptOffer; what is tradable is neblla_update_app({ trade })). Action "list": the log, newest first, with { user? (their id in the app), status? (pending | done | declined | cancelled | expired | failed | all, the default), limit?, offset? } → { trades, total }; each trade has from, to, give, get (items { table, id } or { product, amount }),
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | — |
| action | string | yes | — |
| id | string | no | The trade (cancel) |
| user | string | no | Only this user's trades (list) |
| status | string | no | — |
| limit | integer | no | Up to 200 (default 50) |
| offset | integer | no | — |
Bookings (business template), the administration side: action "createSlot" { set, start, end?, capacity, title?, repeat? } — repeat is a calendar rule (the usual RFC 5545 RRULE): { freq: "daily"|"weekly"|"monthly"|"yearly", interval?, byDay? (["MO","WE"]; monthly "2TU" = second Tuesday, "-1FR" = last Friday), byMonthDay? (15, -1 = last day), byMonth?, until? (a date: that whole day) or count?, exc
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | — |
| action | string | yes | — |
| set | string | yes | — |
| slot | string | no | — |
| booking | string | no | — |
| toSlot | string | no | — |
| series | string | no | — |
| scope | string | no | — |
| start | string | no | — |
| end | string | no | — |
| capacity | integer | no | — |
| title | string | no | — |
| repeat | no | — | |
| from | string | no | — |
| to | string | no | — |
| refund | boolean | no | — |
Credits (business template), the administration side: action "balance" { owner, kind? } or "adjust" { owner, kind?, delta } (a refund by hand, a gift; never below 0). Credit kinds and the products that top them up: neblla_update_app({ business: { credits: { <kind>: { products: { <productId>: n } } } } }).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | — |
| action | string | yes | — |
| owner | string | yes | The user id in the app |
| kind | string | no | — |
| delta | integer | no | — |
Create, replace or (panel: null) remove a back office panel: a screen for the developer and their team. panel: { title, source: { table } | { booking: set } | { credits: kind }, columns: ["field" | { field, label }] (player.name, start, title… too), where: { field: value | { gte: "$today", lt: "$tomorrow" } } (dates: $now, $today, $tomorrow, $weekStart, $monthStart, $nextMonthStart), filters: [{ f
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | — |
| name | string | yes | Panel name: letters, digits, _ or - (≤ 40) |
| panel | no | The panel, or null to remove it |
See a panel as the back office shows it: { appId, name, inputs? } → { title, columns, filters, actions, rows }.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | — |
| name | string | yes | — |
| inputs | object | no | — |
The developer’s team for an app (Gente › Tu equipo in the panel): people who sign in to developers.neblla.com with their own email, and use this MCP with their own account, each with a paper (access) that the server applies on every route of the panel and every tool here: "partner" (Socio: everything but money, the plan and deleting the app), "support" (Comunidad y soporte: the people of the app
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | — |
| action | string | yes | — |
| string | no | — | |
| access | string | no | The paper: partner, support, viewer or screens (the default for someone new) |
| panels | no | — | |
| role | string | no | — |
| expiresInDays | integer | no | Days the invitation can be accepted in (7 by default) |
The app's alerts, as its panel shows them: what needs the developer now (store full with its 7-day countdown, their own database not answering, payments waiting for it, a data migration paused for the quota, quota out or in its 10 % margin, users saving in a loop, formal legal notices on community entries, the community put on hold by Neblla, data erasure requests, reviews without an answer, a "Pa
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| action | string | yes | — |
| lang | string | no | list: language of the texts (en, es, fr, de, it, pt, ja, ko, zh, ar); English by default |
| topic | string | no | list: only one page's (data, database, plan, moderation, community, inbox, gallery, publish) |
| history | boolean | no | list: false leaves the old ones out |
| id | string | no | dismiss: the alert id |
| all | boolean | no | dismiss: every open one |
| types | object | no | set_settings: { store_full: { to: ["owner", "ana@studio.com"], via: ["email", "slack"] }, review_unanswered: null } |
| slack | string/null | no | set_settings: a Slack incoming webhook URL (https://hooks.slack.com/services/…), null forgets it |
| discord | string/null | no | set_settings: a Discord webhook URL (https://discord.com/api/webhooks/…), null forgets it |
| via | string | no | test: the channel to try |
| to | string | no | test with email: "owner" or a team member's email |
The backups of the data Neblla keeps for an app: the copies of the last 7 days (30 with Pro; keepDays says which), taken from Neblla's daily encrypted copy of its databases, and restoring one whole. Actions: "list" (enabled: whether Neblla keeps copies at all; envs.pro / envs.pre: byodb, usesProData, the last restore; days: [{ date, createdAt, pro, pre }] with how many rows of each kind the copy
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| action | string | yes | — |
| date | string | no | For restore: the day of the copy, YYYY-MM-DD, one of list's days |
| env | string | no | For restore and status: "pro" (default, the published app) or its "pre" |
Write to ALL the users of an app, or to the members of one group (optionally only one role in it): the message lands in each one's inbox as a message from the developer (neblla.inbox; a connected user gets it live, inbox.on('updated') with action "created"). It is paid per recipient from the app's daily quota, like any message (msgFixedOut + the bytes of message and data, kind newCommunication). a
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| action | string | yes | — |
| message | string | no | Plain-text message (estimate, send) |
| data | no | Optional JSON payload, as neblla_send_communication | |
| group | string | no | Only the members of this group (neblla_group); omit for every user |
| role | string | no | With group: only the members with this role |
| id | string | no | The send (status, resume) |
| env | string | no | "pro" (the app's users, default) or "pre" (its draft's) |
The app's sales (Dinero › Ventas in the dashboard): action "list" { status?, productId?, from?, to?, skip?, limit? } — newest first, each with product, units, paid (minor units) and currency when known, status (completed | refunded | charged_back | ended), refund and dispute, the buyer's userId, email and buyerName, canRefund. "documents" { saleId } — the links Stripe keeps for the buyer: a paymen
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| action | string | yes | — |
| saleId | string | no | The sale's id from "list" (documents, refund) |
| status | string | no | — |
| productId | string | no | — |
| from | string | no | ISO date |
| to | string | no | ISO date |
| skip | integer | no | — |
| limit | integer | no | — |
| env | string | no | "pro" (the app's users, default) or "pre" (its draft's) |
The app's log while it runs, the last 7 days (30 with Pro; keepDays says which), the latest first, per environment (env "pro", the published app, by default; "pre", the draft): what to read first when something fails. Kinds: "error" — what the app's own code threw and nobody caught: on a page (source "client": client.js or another of its files; an uncaught promise too) or in a server file's hand
| Parameter | Type | Required | Notes |
|---|---|---|---|
| appId | string | yes | The app public ID |
| env | string | no | pro (the published app, default) or pre (the draft) |
| kind | string | no | Only this kind |
| area | string | no | Only the refusals of this area |
| room | string | no | Only what happened in this room |
| after | string | no | The now of an earlier answer (or an ISO date): only what happened since |
| before | string | no | The next of the previous page (or an ISO date) |
| limit | integer | no | Lines per page (default 50) |
This is the DEVELOPER own Neblla account, not an end user of their app — to sanction a user use neblla_set_ban_status instead. For safety the MCP never deletes accounts directly. Returns a URL for the user to visit and confirm deletion from the Neblla dashboard. Deleting it deletes every app of theirs as neblla_delete_app does (users, saves, purchases, subscriptions, domains) and their Neblla bill
No parameter schema on file.
- Every tool — any call limit is its publisher’s, not ours
- No card, and mcprush charges nothing for it
- Runs at its publisher’s own address — this marketplace is not in the path
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Neblla or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
This listing is an address its publisher runs, and you connect to it directly — this marketplace is not in the path. The scanner reads packages and public source, and an address is neither. So there is no grade — not a withheld one, an unmeasured one.
Release history
This is an address its publisher runs: which release it serves is theirs to choose, so there is nothing here to pin. The history below is for reading; the current release on file is 1.0.0.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Neblla can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.