data360-schema-get — Claude Code skill for Data Cloud schemas
Pulls the list of Data Lake and Data Model objects from Salesforce Data Cloud, plus field-level schema for one object. Handy before you write a query.
npx skills add forcedotcom/sf-skills --skill data360-schema-get -a claude-codeWhat data360-schema-get does
The skill talks to the Data Cloud SSOT REST API and returns either every DLO or DMO in an org, or the detailed schema of a single object: field names, data types, primary key flag, nullable status. The DLO list also carries category, status and record count, so you can tell which objects actually hold data.
Two Python scripts ship inside the scripts/ subdirectory: get_dlo_schema.py and get_dmo_schema.py. The first argument is the SF CLI org alias, the second is an optional developer name such as Employee__dll or Individual__dlm. Before calling them, the skill runs sf org list and sf org display --target-org <org_alias> --json to confirm the org is connected.
You need sf CLI 2.0.0 or newer, python3 3.10.0 or newer and pip 23.0.0 or newer, with Data Cloud enabled and permissions granted in the target org. A 403 means the user lacks Data Cloud access, and no schema will come back until that is fixed. If an object is not found, list everything first and check the developer name.
What it helps with
- list every DLO in a Data Cloud org
- read field types for one DMO
- spot primary keys and nullable fields
- separate custom fields from system ones like
cdp_sys_* - check which DLOs hold records and which are empty
Example prompts for the agent
- Show me all DLOs in the myorg org
- Get the schema for Employee__dll in afvibe
- What DMOs exist in myorg and what fields does Individual__dlm have
How to install data360-schema-get
1Skills CLI (Vercel)
npx skills add forcedotcom/sf-skills --skill data360-schema-get -a claude-code2Manually: put the files in place
~/.claude/skills/data360-schema-get/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/data360-schema-get/
1Skills CLI (Vercel)
npx skills add forcedotcom/sf-skills --skill data360-schema-get -a codex2Manually: put the files in place
.agents/skills/data360-schema-get/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add forcedotcom/sf-skills --skill data360-schema-get -a cursor2Manually: put the files in place
.cursor/skills/data360-schema-get/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install forcedotcom/sf-skills data360-schema-get2Manually: put the files in place
.github/skills/data360-schema-get/SKILL.md1Skills CLI (Vercel)
npx skills add forcedotcom/sf-skills --skill data360-schema-get -a gemini-cli2Platform CLI
gemini skills install https://github.com/forcedotcom/sf-skills --path skills/data360-schema-getManually: put the files in place
.devin/skills/data360-schema-get/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add forcedotcom/sf-skills --skill data360-schema-get -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about data360-schema-get
How do I install data360-schema-get in Claude?
Run npx skills add forcedotcom/sf-skills --skill data360-schema-get -a claude-code. The skill lands in ~/.claude/skills/data360-schema-get/SKILL.md.
What does data360-schema-get do?
It queries the Data Cloud SSOT REST API for the list of DLOs or DMOs and for one object's field schema: type, primary key, nullable, record count.
What do I need before running it?
An installed and authenticated sf CLI, python3 3.10.0 or newer, pip 23.0.0 or newer, Data Cloud enabled and permissions on it. Without an authenticated org the scripts will not run.
Source text
SKILL.md · Apache-2.0
---
name: data360-schema-get
description: "Retrieve Data Lake Object (DLO) and Data Model Object (DMO) schema information from Salesforce Data Cloud using REST APIs. Use this skill when you need to inspect DLO or DMO field definitions, data types, or metadata. Takes org alias and optional DLO/DMO name as parameters."
metadata:
version: "1.0"
domains: ["Data 360"]
cliTools:
- tool: ["pip"]
semver: ">=23.0.0"
- tool: ["python3"]
semver: ">=3.10.0"
- tool: ["sf"]
semver: ">=2.0.0"
---
# data360-schema-get Skill
## Overview
This skill retrieves Data Lake Object (DLO) and Data Model Object (DMO) schema information from Salesforce Data Cloud using the SSOT REST API. It can list all DLOs or DMOs in an org, or retrieve detailed schema for a specific DLO or DMO.
## When to Use
- User wants to see all DLOs or DMOs in a Data Cloud org
- User needs field schema for a specific DLO or DMO
- User is exploring Data Cloud data structures
- User needs to understand DLO or DMO field types and metadata
## Prerequisites
- SF CLI installed and authenticated to target org
- Org has Data Cloud enabled
- User has appropriate Data Cloud permissions
## Skill Execution
### Parameters
1. **org_alias** (required): The SF CLI org alias (e.g., 'afvibe', 'myorg')
2. **dlo_name** (optional): Specific DLO developer name (e.g., 'Employee__dll')
3. **dmo_name** (optional): Specific DMO developer name (e.g., 'Individual__dlm')
### Step 1: Discover Connected Org
First, run `sf org list` to find out which org is connected and extract the alias to use for all subsequent calls:
```bash
sf org list
```
Example output:
```text
┌────┬───────┬──────────────────────────┬────────────────────┬───────────┐
│ │ Alias │ Username │ Org Id │ Status │
├────┼───────┼──────────────────────────┼────────────────────┼───────────┤
│ │ myorg │ [email protected] │ 00DKZ00000b80NT2AY │ Connected │
└────┴───────┴──────────────────────────┴────────────────────┴───────────┘
```
Extract the **Alias** value (e.g., `myorg`) from the output and use it as the `<org_alias>` for all subsequent calls. Use `--all` to see expired and deleted scratch orgs as well.
### Step 2: Validate SF CLI Authentication
Before making API calls, verify the org is connected:
```bash
sf org display --target-org <org_alias> --json
```
If not connected, inform user to run:
```bash
sf org login web --alias <org_alias>
```
### Step 3a: Execute DLO Schema Script
The Python scripts are bundled with this skill in the `scripts/` subdirectory.
**To list all DLOs:**
```bash
python3 ./scripts/get_dlo_schema.py <org_alias>
```
**To get specific DLO schema:**
```bash
python3 ./scripts/get_dlo_schema.py <org_alias> <dlo_name>
```
### Step 3b: Execute DMO Schema Script
**To list all DMOs:**
```bash
python3 ./scripts/get_dmo_schema.py <org_alias>
```
**To get specific DMO schema:**
```bash
python3 ./scripts/get_dmo_schema.py <org_alias> <dmo_name>
```
### Step 4: Present Results
Parse and present the results in a user-friendly format:
**For DLO List:**
- Show DLO name, label, category, and ID
- Indicate total count
- Highlight DLOs with data (totalRecords > 0)
**For DLO Schema:**
- Show basic info (name, label, category, status)
- List all fields with:
- Field name
- Data type
- Primary key indicator
- Nullable status
- Highlight custom fields (exclude system fields like DataSource__c, cdp_sys_*)
- Show record count if available
**For DMO List:**
- Show DMO name, label, category, and ID
- Indicate total count
**For DMO Schema:**
- Show basic info (name, label, category, description)
- List all fields with:
- Field name
- Data type
- Primary key indicator
- Nullable status
- Show dataspace information if available
### Step 5: Offer Next Steps
After displaying results, suggest relevant follow-up actions:
- Query data from the DLO
- Create calculated insights
- Build segments
- Set up data streams
- Create DMO mappings
## API Endpoints Used
### List All DLOs
```text
GET /services/data/v64.0/ssot/data-lake-objects
```
Response structure:
```json
{
"dataLakeObjects": [
{
"name": "Employee__dll",
"label": "Employee",
"category": "Profile",
"id": "1dlXXXXXXXXXXXXXXX",
"status": "ACTIVE",
"totalRecords": 12,
"fields": [...]
}
],
"totalSize": 5
}
```
### Get DLO Schema
```text
GET /services/data/v64.0/ssot/data-lake-objects/{dlo_name}
```
Response structure (same as individual object in list response, but wrapped in paginated format).
### List All DMOs
```text
GET /services/data/v64.0/ssot/data-model-objects
```
Response structure:
```json
{
"dataModelObjects": [
{
"name": "Individual__dlm",
"label": "Individual",
"category": "Profile",
"id": "0dmXXXXXXXXXXXXXXX",
"fields": [...]
}
],
"totalSize": 10
}
```
### Get DMO Schema
```text
GET /services/data/v64.0/ssot/data-model-objects/{dmo_name}
```
Response structure (same as individual object in list response, but wrapped in paginated format).
## Error Handling
**Common Issues:**
1. **Org not connected**
- Message: "Org not connected"
- Solution: Ask user to authenticate via SF CLI
2. **DLO not found**
- Message: "DLO 'XYZ__dll' not found"
- Solution: List all DLOs first to verify name
5. **DMO not found**
- Message: "DMO 'XYZ__dlm' not found"
- Solution: List all DMOs first to verify name
3. **Permission issues**
- Message: HTTP 403 errors
- Solution: Verify user has Data Cloud permissions
4. **API version mismatch**
- Current: v64.0
- Solution: Script can be updated for newer API versions
## Example Usage
**Example 1: List all DLOs**
```text
User: "Show me all DLOs in afvibe org"
Response:
1. Run sf org list to discover connected org alias
2. Authenticate to afvibe
3. Run: python3 ./scripts/get_dlo_schema.py afvibe
4. Display formatted list of DLOs
```
**Example 2: Get specific DLO schema**
```text
User: "Get the schema for Employee__dll in afvibe"
Response:
1. Run sf org list to discover connected org alias
2. Authenticate to afvibe
3. Run: python3 ./scripts/get_dlo_schema.py afvibe Employee__dll
4. Display field schema with types and metadata
```
**Example 3: Explore DLOs then get schema**
```text
User: "What DLOs exist in myorg and show me the schema for the Employee one"
Response:
1. Run sf org list to discover connected org alias
2. List all DLOs in myorg
3. Identify Employee__dll
4. Get detailed schema for Employee__dll
5. Present both results
```
**Example 4: List all DMOs**
```text
User: "Show me all DMOs in afvibe org"
Response:
1. Run sf org list to discover connected org alias
2. Authenticate to afvibe
3. Run: python3 ./scripts/get_dmo_schema.py afvibe
4. Display formatted list of DMOs
```
**Example 5: Get specific DMO schema**
```text
User: "Get the schema for Individual__dlm in afvibe"
Response:
1. Run sf org list to discover connected org alias
2. Authenticate to afvibe
3. Run: python3 ./scripts/get_dmo_schema.py afvibe Individual__dlm
4. Display field schema with types and metadata
```
**Example 6: Explore DMOs then get schema**
```text
User: "What DMOs exist in myorg and show me the schema for the Individual one"
Response:
1. Run sf org list to discover connected org alias
2. List all DMOs in myorg
3. Identify Individual__dlm
4. Get detailed schema for Individual__dlm
5. Present both results
```
## Output Format
### DLO List Output
```text
Found 5 DLOs in org 'afvibe':
1. DataCustomCodeLogs__dll
Label: DataCustomCodeLogs
Category: Engagement
Records: 233
2. Employee__dll
Label: Employee
Category: Profile
Records: 12
[...]
```
### DLO Schema Output
```yaml
DLO: Employee__dll
Label: Employee
Category: Profile
Status: ACTIVE
Records: 12
Custom Fields:
• id__c (Text) - Primary Key
• name__c (Text)
• position__c (Text)
• manager_id__c (Number)
System Fields:
• DataSource__c (Text)
• InternalOrganization__c (Text)
• cdp_sys_SourceVersion__c (Text)
Next steps:
- Query data: SELECT * FROM Employee__dll LIMIT 10
- Create segment based on position field
- Set up data stream for real-time updates
```
### DMO List Output
```text
Found 10 DMOs in org 'afvibe':
1. Individual__dlm
Label: Individual
Category: Profile
2. ContactPointEmail__dlm
Label: Contact Point Email
Category: Profile
[...]
```
### DMO Schema Output
```yaml
DMO: Individual__dlm
Label: Individual
Category: Profile
Description: Represents an individual person
Fields:
• Id__c (Text) - Primary Key
• FirstName__c (Text)
• LastName__c (Text)
• BirthDate__c (DateTime)
Next steps:
- Query data: SELECT * FROM Individual__dlm LIMIT 10
- View DLO mappings to this DMO
- Create calculated insights
```
## Notes
- DLO names always end with `__dll` suffix
- DMO names always end with `__dlm` suffix
- Field names always end with `__c` suffix
- System fields (DataSource__c, KQ_*, cdp_sys_*) are automatically added
- Primary key fields are required for DLO and DMO queries
- API supports pagination (limit/offset) for large result sets
## Related Skills
- **datakit_workflow**: For DMO mapping operations
- **datakit_validation**: For validating datakit configurations
- Use this skill before creating DMO mappings to understand source DLO structure
© forcedotcom · Apache-2.0 · forcedotcom/sf-skills