17 KiB
Metadata API Skill — Usage Guide
Supplementary reference material for the platform-metadata-api-context-get skill. Load this file only when you need the deeper background below; the core decision tree, section-loading rules, generation requirements, and troubleshooting live in SKILL.md.
Why Token Optimization Matters
Context Window Constraints
Claude has a finite context window (200K tokens). Loading the full metadata-type corpus would consume:
- ~15MB of JSON data
- ~75,000 tokens (approximately 40% of available context)
- Reduced space for your actual code and conversation
This leaves less room for:
- Your project's code files
- Conversation history
- Generated responses
- Multi-turn problem solving
Cost Implications
Token usage directly impacts costs:
- Input tokens: Every loaded file counts toward input cost
- Repeated requests: Loading files multiple times multiplies costs
- Cache misses: Large contexts may not fit in prompt cache
Performance Trade-offs
Loading all files affects performance:
- Slower response times: More tokens to process
- Reduced relevance: LLM must search through more irrelevant data
- Context dilution: Important information gets buried in noise
Best Practices
✅ DO:
- Use programmatic JSON parsing to extract only needed sections (Python json.load(), Node.js JSON.parse(), etc.)
- Load only specific sections from each JSON file (fields, description) not the entire file
- Load 1-5 specific metadata types relevant to your task
- Check the
sectionsarray first to see what's available - Use the index table to find related types
- Skip WSDL segments and sample definitions unless explicitly needed
- Cache frequently used sections (fields for CustomObject, Flow, Profile)
❌ DON'T:
- NEVER use the
read_filetool or other whole-file readers on the metadata-type JSON files (loads entire file into context) - Load entire JSON files when you only need 1-2 sections
- Load every metadata type at once
- Load files "just in case" you might need them
- Repeatedly load the same files in a conversation
- Include WSDL segments unless you need schema validation
- Load declarative_metadata_sample_definition unless examples are required
Example: Good vs. Bad
Bad (wastes ~75,000 tokens):
"Load all metadata types so I can reference them"
Better (uses ~500 tokens):
"Show me the CustomObject and CustomField metadata types"
Best (uses ~150 tokens):
"Show me only the 'fields' section from CustomObject.json"
The section-specific approach uses 500x fewer tokens while providing exactly what you need.
Token Size Reference
Approximate token counts for different loading strategies:
| What You Load | Approx. Tokens | Use Case |
|---|---|---|
| Single section (fields only) | 50-200 | ✅ BEST - Quick field reference |
| Single section (description) | 20-100 | ✅ Overview/understanding |
| 2-3 sections from one type | 150-500 | Most common use case |
| Entire single type (small) | 100-500 | Small types without WSDL |
| Entire single type (large) | 500-2,000 | ❌ Wasteful - includes unused WSDL |
| 5 related types (entire files) | 2,000-5,000 | ❌ Use section-specific loading instead |
| 20 types (entire files) | 10,000-15,000 | ❌ Avoid - major waste |
| 50 types (entire files) | 25,000-35,000 | ❌ Never do this |
| The full metadata-type corpus | ~75,000 | ❌ Catastrophic waste |
Note: Loading only specific sections (fields, description) typically reduces token usage by 60-80% per file compared to loading entire files with WSDL segments and examples.
Usage Examples
Example 1: Creating a CustomObject (Section-Specific)
User: "I need to create a custom object metadata file for a Student object"
Response approach (Token-efficient):
- Load ONLY the
fieldssection fromassets/metadata_api/CustomObject.json - Review required fields:
label,nameField,deploymentStatus,sharingModel - If needed, also load the
declarative_metadata_sample_definitionsection for XML structure example - Generate XML with correct namespace
- Include file naming convention:
Student__c.object-meta.xml
Token savings: ~70% (loading only 'fields' + 'declarative_metadata_sample_definition' instead of entire file with WSDL)
Example 2: Understanding Flow Metadata (Section-Specific)
User: "What fields are available in a Flow metadata type?"
Response approach (Token-efficient):
- Load ONLY the
fieldssection fromassets/metadata_api/Flow.json - List field names, types, and descriptions
- Highlight required fields and common patterns
- Skip
wsdl_segment,description, and other sections
Token savings: ~80% (fields section is ~200 tokens vs ~1000 for entire file)
Example 3: Modifying a Profile (Section-Specific)
User: "How do I add object permissions to a Profile?"
Response approach (Token-efficient):
- Load ONLY the
fieldssection fromassets/metadata_api/Profile.json - Find
objectPermissionsfield definition within that section - Show structure and required sub-fields
- If XML example needed, separately load
declarative_metadata_sample_definition
Token savings: ~75% (avoiding massive WSDL segment in Profile.json)
Example 4: Working with ApexClass Metadata (Section-Specific)
User: "What's the metadata file structure for an Apex class?"
Response approach (Token-efficient):
- Load the
fieldsanddescriptionsections fromassets/metadata_api/ApexClass.json - Show the simple structure (apiVersion, status)
- Explain the relationship between
.clsand.cls-meta.xmlfiles - Load
file_informationsection only if directory structure details needed
Token savings: ~60% (ApexClass is simpler but still benefits from section filtering)
Common Workflows
Workflow 1: Creating New Metadata
- Identify the metadata type you need
- Load the corresponding JSON file
- Review required fields and their types
- Check sample XML in
declarative_metadata_sample_definition - Generate XML with correct namespace and structure
- Save to appropriate directory in SFDX project
- Validate with Salesforce CLI
Workflow 2: Understanding Existing Metadata
- Identify the metadata type from file extension
- Load the JSON documentation
- Review field descriptions to understand purpose
- Check WSDL segment for complex type definitions
- Cross-reference with your XML file
Workflow 3: Modifying Metadata
- Load JSON for the metadata type
- Identify the field you want to modify
- Verify it's not a required field or understand implications
- Check field type and valid values
- Update XML maintaining proper structure
- Validate before deploying
Workflow 4: Planning a Migration
- List all metadata types involved
- Load JSON for each type (5-10 at a time to optimize tokens)
- Identify dependencies between types
- Plan deployment order based on dependencies
- Validate required fields for each type
Understanding Sections
Different metadata types have different available sections. Here's what each section typically contains:
Core Sections (Most Types)
- title: The metadata type name and page header
- description: Overview of what the metadata type represents and its purpose
- fields: Detailed field definitions with types, descriptions, and requirements
- file_information: File naming conventions and extensions
- directory_location: Where files are stored in Salesforce DX projects
Schema Sections
- wsdl_segment: XML schema definition from the Metadata API WSDL
- Contains complexType and simpleType definitions
- Shows complete structure and type relationships
- Useful for validation and understanding complex nested structures
Example Sections
- declarative_metadata_sample_definition: Sample XML code
- Usually includes 1-3 complete examples
- Shows real-world usage patterns
- Demonstrates proper XML structure
Type-Specific Sections
Some metadata types have additional sections:
- child_metadata_types: Nested or related types (e.g., CustomObject has CustomField)
- fields_for_customfield: Special field definitions for CustomField type
- countriesandstates: Country and state data (AddressSettings)
- action_override_types: Available override types (ActionOverride)
fields vs sub_types — composite types
Every authored metadata type exposes its OWN fields under a fields key.
Composite types (Flow, Workflow, Layout, …) also reference distinct sub-types
(their own complexTypes); those are grouped under a sub_types object keyed
by the sub-type's CamelCase name — they are NOT mixed into the parent's fields.
| Pattern | Where the fields live | Examples |
|---|---|---|
| Simple type | fields |
ApexTrigger, ApexPage, StaticResource, RemoteSiteSetting |
| Composite type | fields (the type's own fields) + sub_types: { <CamelCaseName>: {…fields…} } |
Flow → fields + sub_types.FlowActionCall, sub_types.FlowAssignment, …; Workflow → fields + sub_types.WorkflowAlert, … |
| SOAP result / response wrapper | properties (no fields) |
SaveResult, UpsertResult, DeleteResult, Error |
So for Flow.json: load fields for Flow's own fields (e.g. actionCalls,
which is typed FlowActionCall[]), and load sub_types.FlowActionCall for
that referenced type's fields (e.g. actionName). A sub-type's fields are NOT in
the parent's fields. Feature-gated settings (e.g. IndustriesSettings'
"Fields for Health Cloud" groups) are merged into the single fields section.
See the Index Table for a complete breakdown of which types have which sections.
Metadata File Generation — Detailed Reference
Field Type Validation
Match field types exactly:
| Field Type | XML Format | Example |
|---|---|---|
string |
<fieldName>value</fieldName> |
<label>My Object</label> |
boolean |
<fieldName>true or false</fieldName> |
<deploymentStatus>Deployed</deploymentStatus> |
int |
<fieldName>123</fieldName> |
<externalSharingModel>Private</externalSharingModel> |
CustomField[] |
Multiple <fields> tags |
<fields>...</fields><fields>...</fields> |
enumeration |
Use exact enum value | <sharingModel>ReadWrite</sharingModel> |
Common Patterns and Conventions
File Naming
- Custom objects:
MyObject__c.object-meta.xml - Custom fields:
MyObject__c.MyField__c.field-meta.xml - Flows:
My_Flow.flow-meta.xml - Apex classes:
MyClass.cls-meta.xml - Profiles:
Admin.profile-meta.xml
Two-File ("source + meta") Types
Several metadata types are authored as a pair of files in SFDX source format: a source file with the actual content, and a sibling <base>.<ext>-meta.xml carrying deployment metadata. The JSON's content field (when present, base64-encoded) corresponds to the source file on disk:
| Type | Source file | Meta sidecar |
|---|---|---|
| ApexClass | MyClass.cls (Apex code) |
MyClass.cls-meta.xml |
| ApexTrigger | MyTrigger.trigger (Apex code) |
MyTrigger.trigger-meta.xml |
| ApexComponent | MyComp.component (markup) |
MyComp.component-meta.xml |
| ApexPage | MyPage.page (Visualforce markup) |
MyPage.page-meta.xml |
| StaticResource | MyResource.<ext> (any payload) |
MyResource.resource-meta.xml |
| AuraDefinitionBundle | bundle dir with .cmp/.app/.evt + .js + .css etc. |
bundle-meta.xml inside the dir |
| LightningComponentBundle | bundle dir with .html/.js/.css |
bundle.js-meta.xml inside the dir |
When a JSON file contains a content field of type base64, that's the SOAP-API artifact equivalent of the disk source file. Authors write the source file directly; the -meta.xml sidecar carries fields like apiVersion and status.
Child Metadata Types (legacy MDAPI vs SFDX source format)
Some metadata types appear in the index but are child elements of a parent type, not standalone files. Examples: ValidationRule, WebLink, RecordType, CompactLayout, ListView, BusinessProcess, FieldSet, SharingReason, Index — all nested under CustomObject. Their JSON files lack file_information and directory_location because the legacy MDAPI form serializes them inline inside the parent .object file.
In modern SFDX source format, these child types are decomposed into their own files under the parent object directory:
force-app/main/default/objects/MyObject__c/
├── MyObject__c.object-meta.xml
├── fields/
│ └── MyField__c.field-meta.xml
├── validationRules/
│ └── My_Rule.validationRule-meta.xml
├── recordTypes/
│ └── My_RT.recordType-meta.xml
├── webLinks/
│ └── My_Link.webLink-meta.xml
├── compactLayouts/
│ └── My_Layout.compactLayout-meta.xml
└── listViews/
└── My_View.listView-meta.xml
The JSON's declarative_metadata_sample_definition shows the legacy inline form (e.g., <validationRules> inside <CustomObject>). When authoring in SFDX source format, take the inner element of that sample, drop it into its own file under the appropriate sub-directory, and add the standard <?xml ...?> + namespace wrapper using the type name as the root (e.g., <ValidationRule xmlns=...>).
Directory Structure (Salesforce DX)
force-app/main/default/
├── objects/
│ └── MyObject__c/
│ ├── MyObject__c.object-meta.xml
│ └── fields/
│ └── MyField__c.field-meta.xml
├── flows/
│ └── My_Flow.flow-meta.xml
├── classes/
│ ├── MyClass.cls
│ └── MyClass.cls-meta.xml
└── profiles/
└── Admin.profile-meta.xml
Examples of Well-Formed Files
CustomObject Example:
<?xml version="1.0" encoding="UTF-8"?>
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
<label>My Custom Object</label>
<pluralLabel>My Custom Objects</pluralLabel>
<nameField>
<label>Name</label>
<type>Text</type>
</nameField>
<deploymentStatus>Deployed</deploymentStatus>
<sharingModel>ReadWrite</sharingModel>
<enableActivities>true</enableActivities>
<enableHistory>true</enableHistory>
</CustomObject>
Flow Example:
<?xml version="1.0" encoding="UTF-8"?>
<Flow xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>61.0</apiVersion>
<status>Active</status>
<processType>AutoLaunchedFlow</processType>
<start>
<locationX>50</locationX>
<locationY>50</locationY>
</start>
</Flow>
Updates & Versioning
Current Version
- API Version: 67.0
- Release: Summer 26
- Generated: 2026-06-10 11:21:11
Version Compatibility
This skill documentation is generated from Salesforce Metadata API version 67.0. When working with different API versions:
- Newer versions: May have additional fields or metadata types not documented here
- Older versions: Some fields or types may not be available
- Check your org: Use
sf project retrieveto see what's available in your org
Updating the Skill
This skill is automatically generated from source JSON files. To update:
- Regenerate source JSON files from latest Salesforce WSDL
- Run the skill generator script
- Review changes in generation log
- Deploy updated skill
Additional Resources
Official Salesforce Documentation
Salesforce CLI Commands
sf project deploy validate: Validate metadata before deployingsf project deploy start: Deploy metadata to orgsf project retrieve start: Retrieve metadata from orgsf project convert: Convert between source and metadata formats
Related Skills
- Enterprise API: For SOQL queries and DML operations
- Tooling API: For development tools and metadata queries
- SFDX: For project structure and deployment
Support
Getting Help
If you encounter issues or have questions:
- Check the Index:
metadata_index_table.md(in thisreferences/folder) lists all available types - Review Examples: See usage examples above for common patterns
- Consult WSDL: Check
wsdl_segmentin JSON files for schema details - Salesforce Documentation: Official docs have additional context
Reporting Issues
For issues with this skill:
- Check that the metadata type exists in your Salesforce org version
- Verify file paths are correct
- Review generation log for warnings or errors
- Contact the skill maintainer with specific error details
Contributing
This skill is automatically generated. To contribute:
- Report incorrect or missing information
- Suggest improvements to documentation structure
- Provide feedback on token optimization strategies