From Luzmo Agent Skills
Getting data into Luzmo from any source. Use whenever connecting a database, pushing files, or modeling data. Triggers on: "connect data source", "upload CSV", "import data", "sync from database", "push data via API", "data not loading", createDataprovider. Provides ready-to-use scripts. Covers data modeling, Warp acceleration, and custom connectors. Use eagerly for any data-source or schema question. Essential before charts can display anything. Not for chart rendering (use data-visualization) or per-tenant access control (use multitenancy).
How this skill is triggered — by the user, by Claude, or both
Slash command
/luzmo-agent-skills:data-integrationThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Entry-point for all data-side work: connecting sources, pushing data, modeling schemas, and extending Luzmo with plugins or custom charts.
Entry-point for all data-side work: connecting sources, pushing data, modeling schemas, and extending Luzmo with plugins or custom charts.
developer.luzmo.com/*.md page(s) before coding.https://developer.luzmo.com/llms.txt / https://developer.luzmo.com/llms-full.txt only to discover pages, not as the final source.BEFORE writing any data-integration code, verify:
LUZMO_API_KEY, LUZMO_API_TOKEN) live server-side ONLY (env vars, secrets manager)createData) and connect-datasource scripts run on a backend, not in client codesecurable access is scoped to only the datasets they may write toIf ANY checkbox is unchecked, STOP and fix before proceeding. Leaked DB credentials are as severe as leaked API keys — they expose all of the underlying source, not just Luzmo.
For full auth/embed-token guidance, see core.
What data do you need to integrate?
├─ External database or SaaS platform (e.g., PostgreSQL, MySQL, Snowflake, Salesforce)
│ └─ Use "Connect a Data Source" → scripts/connect-datasource.js
│
├─ CSV, Excel, or JSON files / arrays
│ └─ Use "Push Data" → scripts/push-data.js
│
├─ Data is already loaded, need to configure columns or add calculations
│ └─ See "Data Modeling" → references/data-modeling.md
│
├─ Data source not supported natively
│ └─ Build "Plugin Connector" → references/connection-types.md
│
└─ Need custom chart type
└─ Build "Custom Chart" → references/connection-types.md
| Goal | Path |
|---|---|
| Connect a database / SaaS / native source | Connect a data source (below) |
| Push data via API (CSV, XLSX, array) | Push data (below) |
| Model columns, formulas, Warp | See references/data-modeling.md |
| Plugin connector for unsupported source | See references/connection-types.md |
| Custom chart type | See references/connection-types.md (custom charts section) |
The standard flow for connecting an external database or SaaS source involves:
getDataprovider — list available tables/views in the connection.createDataprovider — register selected tables as Luzmo datasets.Always run the ready-made script rather than writing this from scratch:
# Run from the skills/data-integration directory, or use full relative paths:
node skills/data-integration/scripts/connect-datasource.js --help
Before creating a new account, check whether a suitable one already exists. Reusing is faster and avoids duplicate credentials.
List all existing accounts (optionally filter by provider):
node skills/data-integration/scripts/connect-datasource.js --list-accounts
node skills/data-integration/scripts/connect-datasource.js --list-accounts --provider postgresql
node skills/data-integration/scripts/connect-datasource.js --list-accounts --provider snowflake
The output shows each account's id, provider, name, host, and scope. Use this to let the user (or agent) pick the right account.
If the user's prompt names a specific data source, provider, or host, check the list first and match against it. If a match is found, use --account-id; if none fits, proceed with creation.
Note on API terminology: The script uses --list-accounts but under the hood calls the Luzmo API with "action": "get" (not "action": "search"). Documentation URLs like https://developer.luzmo.com/api/searchAccount.md describe the "get" action.
Reuse an existing account:
node skills/data-integration/scripts/connect-datasource.js --account-id <uuid> [--provider <p>] [--tables t1,t2]
--provider is optional when reusing — the script infers it from the account. Specify it explicitly only if the inferred value needs to be overridden.
Create a new account (all connection flags required):
node skills/data-integration/scripts/connect-datasource.js \
--provider postgresql --host db.example.com \
--port 5432 --database mydb --user readonly --password secret \
--tables orders,customers
createAccount: Set up the connectionFetch: https://developer.luzmo.com/api/createAccount.md
Examples (per provider/language): https://developer.luzmo.com/api/createAccount/examples/{slug}/{js|python|java|dotnet|curl|php} — e.g. create-a-plugin-connection/python. Call forms: https://developer.luzmo.com/api/createAccount/call/{lang}.
An Account stores the connection credentials (host, port, username, password/token, database name). The exact properties shape varies by provider — always check the doc.
To search/list existing accounts programmatically: https://developer.luzmo.com/api/searchAccount.md
Use action: "get" with a find object. Filter by provider, name, host, or id. Example:
{ "action": "get", "find": { "where": { "provider": "postgresql" }, "attributes": ["id", "name", "host", "scope"] } }
getDataprovider: List available tables and viewsFetch: https://developer.luzmo.com/api/getDataprovider.md
Requires the Account id and the provider name. Returns all tables/views available in the connection.
createDataprovider: Register selected tables as Luzmo datasetsFetch: https://developer.luzmo.com/api/createDataprovider.md
Call once per table/view to import. Returns a dataset_id for each. Do not use createDataset for database connections — use createDataprovider.
Use createData to push rows directly into Luzmo (no external database needed).
Limit: 10,000 rows per API call. Use the ready-made script to handle batching automatically:
node skills/data-integration/scripts/push-data.js --help
Script usage:
# Push a CSV file (creates dataset if --dataset-id omitted)
node skills/data-integration/scripts/push-data.js --file data.csv --format csv --mode replace
# Push into an existing dataset, append rows
node skills/data-integration/scripts/push-data.js --dataset-id "<uuid>" --file data.xlsx --format xlsx --mode append
# Replace rows in an existing dataset (destructive; requires confirmation)
node skills/data-integration/scripts/push-data.js --dataset-id "<uuid>" --file data.json --format json --mode replace --confirm-replace yes
Fetch: https://developer.luzmo.com/api/createData.md — call forms: https://developer.luzmo.com/api/createData/call/{lang}.
Key facts:
createData can create a new dataset automatically (omit securable_id and use type: "create").securable_id plus type: "append" or type: "replace".--mode only matters when --dataset-id is provided; new datasets always use type: "create" for the first batch.options.header; do not include the header row in data.createData also works with embed tokens (token context is applied).Fetch: https://developer.luzmo.com/api/getData.md — call forms: https://developer.luzmo.com/api/getData/call/{lang}.
Guide: https://developer.luzmo.com/guide/guides--querying-data.md
Query shape uses queries with dimensions, measures, where, having, order, limit.
For column types, subtypes, derived columns, aggregation formulas, hierarchy levels, and Warp acceleration → read references/data-modeling.md.
For Plugin API connectors (unsupported data sources) and custom chart types → read references/connection-types.md.
For deeper guidance on specific data integration topics:
references/data-modeling.md — Column types, subtypes, derived columns, aggregation formulas, hierarchy levels, Warp acceleration, and IQ quality optimization through proper data naming and structure.references/connection-types.md — Building plugin connectors for unsupported data sources and custom chart types.scripts/connect-datasource.js — Ready-made script for connecting databases and SaaS platforms with automatic account management and table listing.scripts/push-data.js — Ready-made script for pushing CSV/XLSX/JSON data with automatic batching and dataset creation.createDataset docs advise: use createData for data-push datasets and createDataprovider for database/plugin connections. Do not default to createDataset.searchDataset supports include for related resources: Column, Account, Acceleration, and linked dashboards./data with client.get('data', { queries: [...] }); use options.rollup_data: false, order, and limit/offset to batch rows, then write CSV/XLSX in the app. Fetch https://developer.luzmo.com/api/getData.md first./export service (createExport) instead: sync file response, async email, or scheduled email. Fetch https://developer.luzmo.com/api/createExport.md.Each pitfall below includes a frequency marker, the symptom you'll see, why it fails, and the fix.
❌ Using createDataset directly instead of appropriate method (⚠️ COMMON):
// Wrong - bypasses proper data integration flow
await client.create('dataset', { name: "My Data", ... })
✅ Use createData for data-push or createDataprovider for connections:
// Correct for data-push
await client.create('data', {
type: 'create',
data: rows,
options: { update_metadata: true, header: columnNames, name: { en: 'My Data' } }
})
// Correct for database connections
await client.create('dataprovider', { account_id: "...", ... })
❌ Creating new accounts without checking for existing ones:
# Wrong - creates duplicate connections
node skills/data-integration/scripts/connect-datasource.js --provider postgresql --host db.example.com ...
✅ List and reuse existing accounts:
# Correct - check first
node skills/data-integration/scripts/connect-datasource.js --list-accounts --provider postgresql
# Then reuse if exists:
node skills/data-integration/scripts/connect-datasource.js --account-id <uuid> --tables orders
❌ Exceeding 10,000 row limit in single createData call (⚠️ VERY COMMON for bulk loads):
// Wrong - will fail with large datasets
await client.create('data', { type: 'append', securable_id: datasetId, data: hugeArray }) // 50,000 rows
You'll see: Rows exceed 10,000 error, or partial loads.
Why this fails: Luzmo caps createData at 10k rows per call to keep the ingest path bounded. Bulk loads must be batched.
✅ Use scripts that handle batching automatically:
# Correct - scripts handle batching
node skills/data-integration/scripts/push-data.js --file large-file.csv # Any size
❌ Expecting /export or another export task to page arbitrary rows:
// Wrong - dashboard/chart export service, not a row pagination API
await client.create('export', { securable_id, chart_id, type: 'csv' })
✅ Page row-level data through /data, then write the file yourself:
const page = await client.get('data', {
queries: [{
dimensions: [{ dataset_id, column_id }],
where: [],
order: [{ dataset_id, column_id, order: 'asc' }],
limit: { by: 10000, offset: 0 },
options: { rollup_data: false, locale_id: 'en', timezone_id: 'Etc/UTC' }
}]
})
// Repeat with offset += 10000 until page.data is empty; stream rows to CSV/XLSX.
For connectors that support it (typical warehouse/database connectors — not flat-file or simple SaaS push targets), you can expose data via a SQL view instead of pushing rows into Luzmo's OLAP store.
| Approach | Prefer when |
|---|---|
| SQL view | Data stays in your warehouse; you need live queries, joins, or RLS at the source |
Push (createData) | No warehouse connector, prototypes, or small/static datasets |
developer.luzmo.com.Fetch before implementing:
https://developer.luzmo.com/api/createDataprovider.mdhttps://developer.luzmo.com/api/getDataprovider.mdFor single-tenant setups where each tenant has its own schema/database, views often pair with connection overrides — see multitenancy skill for more details.
createData call (API limit; batch instead).When to escalate to other skills:
coredata-visualizationmultitenancy (SECURITY CRITICAL)analytics-studioai-analyticsresource-managementtroubleshooting FIRSTThis skill does NOT cover:
core for saved dashboards, data-visualization for Flex)core)multitenancy for Patterns 1 and 2)https://developer.luzmo.com/llms.txt, https://developer.luzmo.com/llms-full.txthttps://developer.luzmo.com/api/{action}{Resource}.mdhttps://developer.luzmo.com/guide/*.mdhttps://developer.luzmo.com/flex/charts/{type}.mdIf content exists on developer.luzmo.com, link — do not duplicate specs here.
npx claudepluginhub luzmo-official/agent-skills --plugin luzmo-agent-skillsProvides CDSS development patterns for drug interaction checking, dose validation, clinical scoring (NEWS2, qSOFA), and alert classification integrated into EMR workflows.