This skill provides guidance on querying data from Microsoft Dataverse. Use when users ask about "Dataverse query", "OData filter", "Dataverse SQL", "FetchXML", "query Dataverse records", "Dataverse filter syntax", "search Dataverse", or need help constructing queries.
Provides guidance on querying Microsoft Dataverse using OData and SQL syntax.
/plugin marketplace add Sahib-Sawhney-WH/sahibs-claude-plugin-marketplace/plugin install dataverse@sahib-claude-marketplaceThis skill inherits all available tools. When active, it can use any tool Claude has access to.
references/odata-syntax.mdreferences/sql-queries.mdThis skill provides guidance on querying data from Microsoft Dataverse. Use when users ask about "Dataverse query", "OData filter", "Dataverse SQL", "FetchXML", "query Dataverse records", "Dataverse filter syntax", "search Dataverse", or need help constructing queries.
The Dataverse SDK supports two query methods:
# Basic query - returns all records (paged)
pages = client.get("account")
# With parameters
pages = client.get(
"account",
select=["name", "telephone1"], # Columns to return
filter="statecode eq 0", # Filter expression
orderby=["name asc"], # Sort order
top=100, # Max records
expand=["primarycontactid"] # Related records
)
# Process results
for page in pages:
for record in page:
print(record["name"])
| Operator | Description | Example |
|---|---|---|
eq | Equal | statecode eq 0 |
ne | Not equal | name ne null |
gt | Greater than | revenue gt 1000000 |
ge | Greater or equal | createdon ge 2024-01-01 |
lt | Less than | quantity lt 10 |
le | Less or equal | amount le 500 |
# AND
filter="statecode eq 0 and revenue gt 1000000"
# OR
filter="name eq 'Contoso' or name eq 'Fabrikam'"
# NOT
filter="not contains(name, 'test')"
# Combined
filter="(statecode eq 0) and (revenue gt 1000000 or numberofemployees gt 100)"
# Contains
filter="contains(name, 'Contoso')"
# Starts with
filter="startswith(name, 'A')"
# Ends with
filter="endswith(emailaddress1, '@contoso.com')"
# Specific date
filter="createdon ge 2024-01-01"
# Date range
filter="createdon ge 2024-01-01 and createdon lt 2024-02-01"
# Today (use ISO format)
from datetime import datetime
today = datetime.now().strftime("%Y-%m-%d")
filter=f"createdon ge {today}"
# Is null
filter="telephone1 eq null"
# Is not null
filter="telephone1 ne null"
SQL queries are read-only and support a subset of T-SQL.
# Basic SELECT
results = client.query_sql(
"SELECT name, telephone1 FROM account WHERE statecode = 0"
)
# With TOP
results = client.query_sql(
"SELECT TOP 10 name FROM account ORDER BY createdon DESC"
)
# With aggregates
results = client.query_sql(
"SELECT industrycode, COUNT(*) as count "
"FROM account "
"GROUP BY industrycode"
)
# Automatic paging (iterator)
all_records = []
pages = client.get("account", top=5000)
for page in pages:
all_records.extend(page)
# Control page size
pages = client.get("account", page_size=500)
# Break early
pages = client.get("account", top=1000)
count = 0
for page in pages:
for record in page:
count += 1
if count >= 100:
break
if count >= 100:
break
Always specify columns to reduce payload:
# Good - only needed columns
pages = client.get(
"account",
select=["accountid", "name", "telephone1"]
)
# Bad - returns all columns (slower)
pages = client.get("account")
# Expand single relationship
pages = client.get(
"account",
select=["name"],
expand=["primarycontactid"]
)
# Access expanded data
for page in pages:
for account in page:
contact = account.get("primarycontactid", {})
print(f"{account['name']}: {contact.get('fullname')}")
# Single column ascending
orderby=["name"]
# Single column descending
orderby=["createdon desc"]
# Multiple columns
orderby=["statecode", "name asc", "createdon desc"]
pages = client.get("account", filter="statecode eq 0")
pages = client.get(
"account",
filter="createdon ge 2024-01-01",
orderby=["createdon desc"]
)
pages = client.get(
"account",
filter="contains(name, 'Contoso')"
)
pages = client.get(
"account",
filter=f"_ownerid_value eq {user_id}"
)
pages = client.get("account", filter="statecode eq 0")
count = sum(len(page) for page in pages)
references/odata-syntax.md for complete OData referencereferences/sql-queries.md for SQL query examplesThis skill should be used when the user asks to "create a slash command", "add a command", "write a custom command", "define command arguments", "use command frontmatter", "organize commands", "create command with file references", "interactive command", "use AskUserQuestion in command", or needs guidance on slash command structure, YAML frontmatter fields, dynamic arguments, bash execution in commands, user interaction patterns, or command development best practices for Claude Code.
This skill should be used when the user asks to "create an agent", "add an agent", "write a subagent", "agent frontmatter", "when to use description", "agent examples", "agent tools", "agent colors", "autonomous agent", or needs guidance on agent structure, system prompts, triggering conditions, or agent development best practices for Claude Code plugins.
This skill should be used when the user asks to "create a hook", "add a PreToolUse/PostToolUse/Stop hook", "validate tool use", "implement prompt-based hooks", "use ${CLAUDE_PLUGIN_ROOT}", "set up event-driven automation", "block dangerous commands", or mentions hook events (PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification). Provides comprehensive guidance for creating and implementing Claude Code plugin hooks with focus on advanced prompt-based hooks API.