ToolJet app builder
SkillDev toolsBuild only what ToolJet's real components, connected datasources, and MCP tools support. Never invent a property, action, integration, or successful result. User requirements override the adaptable quality defaults in the references.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the ToolJet app builder skill
About this capability
Build ToolJet apps end-to-end via tooljet-mcp: plan pages, create or reuse data/query/component resources, wire behavior, and verify the result. Use for ToolJet apps, dashboards, internal tools, or changes to existing ToolJet apps.
What this skill tells your AI
The instructions your AI receives, as published by tooljet/tooljet-mcp in skills/tooljet-app-builder/SKILL.md and read by ahel’s review.
Build only what ToolJet's real components, connected datasources, and MCP tools support. Never invent a property, action, integration, or successful result. User requirements override the adaptable quality defaults in the references.
Existing app or website migrations
For migration/clone/replacement requests, first read references/migration.md. Discover expanded states, relationships and read-only journeys—not just screenshots. Map source coverage to ToolJet and report gaps. Skip this workflow for ordinary builds or visual-only inspiration.
Core workflow
- Call
list_workspaces; if several exist, confirm and switch before creating anything. Decide the page architecture before components. A simple single-job app can stay on one page; separate substantial jobs into focused pages; add an overview only when cross-workflow orientation or decisions need it. - Treat 3+ substantive pages, 2+ complex workflows, a multi-table model, or multiple integrations as a large build. Before mutations, show the page/phase plan and rough time ranges, then ask for phased checkpoints (recommended) or the whole app in one run. Do not re-ask if the user already chose.
- State the short design brief with the page plan before create_app (references/ui-layout.md): the user's job, dominant surface, relevant emphasis, and theme. Resolve the theme using
references/themes.md: honor explicit design requirements and selected/existing themes before deriving a brand or industry palette; use ToolJet Modern only as the fallback. Pass the resolvedthemetocreate_app, preserve its ids and links, then calllist_datasources. Report anytheme.warning. Fetch only the component, event-action, and datasource contracts needed for the current phase, using one selective batch per contract class, and reuse them. Typed component catalog reads are compact by default; request exactsectionsandproperty_keys/style_keysinstead of broad full contracts. Confirm a new data model before creating it; ToolJet DB table names are at most 31 characters. - Implement that brief as a complete useful phase with stable
client_refvalues. Root components omitparentandslot_name; page ids are not component parents. Awaitlint_app_specas a standalone barrier, fix its errors and review warnings, then pass its one-timeplan_tokentoapply_app_phase. Never run the linter alongside a write. Put planned persisted component definition patches incomponent_updates; use targeted update tools for ad-hoc repairs, never duplicate resources or rebuild the app. After an error, inspect it and change the repair—never replay an identical mutation. - Verify each completed page/primary flow using
references/qa.md. For detailed requests, reconcile a compact requirement-to-implementation ledger at these checkpoints (references/workflows.md); page count is not feature coverage. Static validation does not prove runtime query behavior, rendering, or event delivery. - Share
editor_urlwhile authoring. After the first meaningful page works, openviewer_urlin the built-in browser when available and reuse that tab. The final handoff is at most 120 words: both links, what works, one line of limitations.
Design quality — required outcomes, flexible composition
Build a polished, contemporary 2026 product UI even from a short prompt: legible hierarchy, coherent theme surfaces, intentional density, clear actions and complete states. "Modern" is a quality bar, not a demand for gradients, glass, oversized cards or a fixed template. Do not claim production readiness from appearance.
- Resolve the design source: explicit requirements/design system → existing or selected theme → recognizable brand → use case/industry/audience → ToolJet Modern. Preserve chosen themes, even on empty shells. For brand-led designs, map identity to visible component treatments—not just saved tokens (references/themes.md).
- Design the job, not a generic dashboard. Identify the user's main decision and next action, then choose the dominant surface: agenda, review split-view, queue, map, board, analytics or form. Infer supporting views from the task and available data; a dashboard can need trends without the user naming charts. Do not invent metrics, records, capabilities or unrelated workflows.
- Freedom with purpose. Derive headers, region proportions, typography, accents and density from the work; do not select a palette or composition merely because it appears in an example. ToolJet themes store the resulting design tokens, not a menu of allowed designs. Zero KPIs is valid. No fixed KPI count, root-component budget, mandatory overview, all-white-card rule or universal header position applies. Familiar patterns are welcome when justified; industry identity must affect information hierarchy, not just colour.
- HTML where it helps. Use small theme-aware Html blocks for composed read-only summaries, context, timelines and display panels when native components do not express them well. Headers and KPIs need not be HTML. Keep controls, charts, tables and interactions native; preserve visual editability when required. Read references/ui-layout.md for background and escaping safeguards.
- Finish the workflow. Format values for the user's locale, give states readable labels, and provide loading, empty, error and disabled states with useful recovery. Size content to fit; use intentional spacing and accessible contrast. Before handoff, check relevance, hierarchy, interaction and actual rendering—not merely whether lint passed.
Render safety
Detail: references/qa.md.
- One line per binding. A line break anywhere inside
{{ }}makes the whole binding render empty. Multi-line logic goes in a JavaScript query; never a literal backslash-n or code outside its braces. - Modal and form children are parented to the modal or form, never placed at root at its coordinates.
add_componentsrefuses overlaps. - Navigation is the page menu (
navigation_position), never anHtmlsidebar with buttons on it. - Items are authored, never defaulted:
Tabs(tabItems),StepsandKanbanwithout items render placeholders. - Text fits its box: size labels, values, captions and table columns for their rendered content; keep titles readable and let longer detail wrap within a deliberately sized region. Bind only fields the query returns.
- Toolbar buttons align with the field box: a top-labelled input renders its label in its first 20px, so the row's button sits at the inputs' top + 20, height 40.
- Audit every page as rendered before the handoff with
verify_page_render(or thereferences/qa.mdchecks when it is unavailable) and fix everything it names; an unaudited page is not finished.
Datasource repair handoff
If an expected source is absent or a query returns a connection failure, explain the problem and use the returned datasources_url, settings_url, or recovery.url. Open it in the built-in browser when available; otherwise send the clickable link. Do not enter credentials, authorize OAuth, test, or save the connection for the user. Wait for them to confirm the repair, refresh datasource discovery, and retry at most one selected safe read. Read references/datasources.md for the full contract and large/billable-read safeguards.
Load only the references the phase needs
references/workflows.md— tool selection, plan/apply behavior, repair, reuse, deletion, and silent-failure guardrails.references/ui-layout.md— page design, canvas geometry, nested layouts, charts, and visual defaults.references/tables.md— Table binding, row actions, sizing, and datasource-neutral server-side pagination.references/forms.md— generated-vs-standalone forms, validation, uploads, and modal geometry.references/events.md— component/query/page events, mutation lifecycles, loading, empty, error, and success states.references/datasources.md— connection recovery, exact query shapes, schema introspection, ToolJet DB, SQL, large reads, and billable reads.references/security.md— authorization boundaries, current-user variables, permissions, and sensitive/destructive operations.references/qa.md— static checks, safe runtime checks, the browser audit, triage, and confirmation.references/components.md— selective component palette and exact binding/rendering rules not covered by Table/Form references.references/themes.md— workspace theme creation and management, the exact theme definition structure, app assignment, and token-backed component styling.
Tool schemas, catalog responses, and returned warnings are authoritative. Do not preload every reference. Keep inspection results bounded: use get_app_summary's structural default or exact field projections, and request detail:"full" only after narrowing the target. Reuse earlier catalog, schema, and summary results instead of repeating the same read.
Non-negotiable safety
- Never author or execute
SELECT *against an unfamiliar table. Count first when size is unknown; above 1,000 rows prefer server-side pagination. Large and billable reads require separate explicit approvals. - Never run mutations, AI, email, OAuth, or other side effects merely to validate a build.
- Seed writes are insert-only; omit generated serial keys. A duplicate-key failure is never permission to update existing rows.
- Page/query/component/table/column deletion requires exact-target approval plus
confirm:true, except for resources this build created itself (a diagnostic query, a scratch page, a probe component): delete those before finishing rather than renaming or hiding them. Visibility is not authorization. - Keep app chrome controls distinct:
hide_headerhides the app header/banner;navigation_positionplaces the separate generated navigation menu on the side or top;navigation_hiddenhides that whole menu in either position; andupdate_pages.hiddenhides only one non-Home page. Home cannot be hidden. - Batch/phase writes can partially persist. Read reported completed resources and repair in place; never auto-delete or replay the whole batch blindly.
Signals
- GitHub stars
- 30
- Forks
- 1
- Last commit
- Sep 2026
ahel recommends instead
Advanced
- Catalog kind
- skill
- Gateway key
tooljet-app-builder-tooljet- Source
- github.com/tooljet/tooljet-mcp