Query Dynamics 365 records using natural language, translating to OData queries with metadata-driven field selection and picklist handling.
npx claudepluginhub nickmeron/dataverse-mcp-serverThis skill is limited to using the following tools:
The user wants to query data from Dynamics 365. Your job is to translate their natural language request into an effective OData query — using actual metadata from their environment to get the field names right.
Automates Dynamics 365 CRM operations: create, update, retrieve, list leads, accounts, contacts, opportunities, sales orders, invoices, cases via Web API tools.
Query, create, update, delete, and bulk-import Dataverse records using official Python SDK. Supports CSV import, data profiling, and Jupyter notebook patterns.
Automates Salesforce CRM tasks: create/update/search leads, contacts, accounts, opportunities, and run SOQL queries via Composio tools over Rube MCP. For CRM workflows with active connections.
Share bugs, ideas, or general feedback.
The user wants to query data from Dynamics 365. Your job is to translate their natural language request into an effective OData query — using actual metadata from their environment to get the field names right.
Argument provided: $ARGUMENTS
Select environment — call list_environments, ask the user, call select_environment.
Identify the entity — if the name is ambiguous, call list_entities to find the correct one. Remember: query_records needs the EntitySetName (plural, e.g. accounts), not the LogicalName.
Discover the schema — call get_entity_attributes on the entity to see the actual field names, types, and which are required. This is critical — don't guess field names.
For picklist filters — if the user says something like "active accounts" or "open opportunities", call get_picklist_options for the relevant status field (e.g. statecode, statuscode) to get the correct integer values for filtering.
Build the OData query using the real field names:
$select — only the fields you need (use LogicalName from metadata)$filter — conditions using correct field names and types$orderby — sorting$top — limit (default 20 unless user specifies)$expand — for lookups, use the navigation property name from relationshipsCall query_records and present results in a clean, readable table — NOT raw JSON.
| User says | EntitySetName | LogicalName |
|---|---|---|
| accounts / companies | accounts | account |
| contacts / people | contacts | contact |
| leads | leads | lead |
| opportunities / deals | opportunities | opportunity |
| cases / tickets | incidents | incident |
| orders | salesorders | salesorder |
| invoices | invoices | invoice |
| products | products | product |
| activities / tasks | activitypointers | activitypointer |
| emails | emails | email |
statecode eq 0contains(name,'Contoso') or name eq 'Contoso'createdon ge 2024-01-01T00:00:00Zemailaddress1 ne null_parentaccountid_value eq {guid}get_picklist_optionsname eq 'Contoso'$filter use the _fieldname_value format$expand use the navigation property name (from relationships)