Skip the install. Get this working in under 2 minutes.
Start a free trial on cloud.anythingmcp.com, add the Microsoft Dynamics 365 Sales (Dataverse) in one click, then point your AI client (Claude, ChatGPT, Copilot or Cursor) at the generated MCP endpoint. No Docker, no git clone, zero engineering experience required.
Summary
Let your AI work in Dynamics 365 Sales: find and update accounts, contacts, leads and opportunities, log tasks, calls and notes, qualify leads and close deals, and query any Dataverse table with OData or FetchXML. Signed in with your Microsoft account through the Dataverse Web API.
Try asking
Example prompts for Microsoft Dynamics 365 Sales (Dataverse)
Click any prompt to copy it. Paste into Claude, ChatGPT, Cursor, Gemini, Copilot or OpenClaw to run it against this connector.
Claude is AI and can make mistakes. Please double-check responses.
💡 No install? Use cloud.anythingmcp.com directly. Sign in, click Connectors → Microsoft Dynamics 365 Sales (Dataverse), paste your credentials, mint an MCP API key and you're done. No Docker, no
git clone, no local server.
Dynamics 365 Sales
Let your AI work in Dynamics 365 Sales: find and update accounts, contacts, leads and opportunities, log tasks, calls and notes, qualify leads and close deals, and query any Dataverse table with OData or FetchXML. Signed in with your Microsoft account through the Dataverse Web API.
Setup
- Find your environment's address: in Dynamics open Settings (the gear) → Advanced settings, or in the Power Platform admin center open Environments → your environment → Environment URL. It looks like
contoso.crm4.dynamics.com. Enter the host name, withouthttps://and without a path, inDYNAMICS_ORG_HOST. - Open the Microsoft Entra admin center at
https://entra.microsoft.com→ Applications → App registrations → New registration, or reuse the app you created for the Outlook, OneDrive or SharePoint connector. Accounts in this organizational directory only is the usual choice. - Add a redirect URI with the platform Web:
https://cloud.anythingmcp.com/api/mcp-oauth/callback(if you host AnythingMCP yourself:<your AnythingMCP URL>/api/mcp-oauth/callback). It has to match exactly, or Microsoft answersAADSTS50011. - Under API permissions → Add a permission → Dynamics CRM → Delegated permissions, tick
user_impersonation. Click Grant admin consent if your organisation does not let users consent themselves. - Under Certificates & secrets → New client secret, copy the secret Value. It is shown once.
- Fill in
MICROSOFT_CLIENT_ID,MICROSOFT_CLIENT_SECRET,MICROSOFT_TENANT_ID(your Directory (tenant) ID or domain, ororganizationsfor a multi-tenant app) andDYNAMICS_ORG_HOST, then install the connector. - Click Authorize with Provider and sign in with a user of that environment, then run
d365_who_am_ias a quick check.
The region is in the host name: the number after crm is the datacenter region, for example crm for North America, crm4 for Europe, the Middle East and Africa, crm11 for the United Kingdom or crm16 for Germany. Copy it from the environment URL rather than guessing. Changing DYNAMICS_ORG_HOST later needs a new sign-in, because the authorization belongs to one environment.
Same permissions as the user: the user who signs in needs a Dynamics 365 or Power Apps licence in that environment and a security role such as Salesperson or Sales Manager. The AI sees and changes exactly what that role allows.
What it does: find, create and update accounts, contacts, leads and opportunities, log tasks, phone calls and notes on their timeline, qualify or disqualify leads, and close opportunities as won or lost. For everything else, such as quotes, orders, products or your own custom tables, d365_query runs OData queries and d365_fetchxml_query handles joins and totals. d365_list_tables and d365_describe_table show which tables and columns exist.
Confirm first: the AI confirms every create and update with you. Qualifying a lead and winning or losing an opportunity change your pipeline and can only be undone by hand in Dynamics, so it asks before each one.
Switched off at install: the delete tools d365_delete_account, d365_delete_contact, d365_delete_lead, d365_delete_opportunity and d365_delete_record. A deletion can remove related rows too, so switch them on per tool only if you need them.
Limits: Dataverse allows 6,000 requests per user in 5 minutes; beyond that it asks the connector to wait.
Common errors: 401 means the authorization was revoked, the client secret expired, or DYNAMICS_ORG_HOST changed since you signed in, so authorize again. 403 with "principal user is missing privilege": the user's security role lacks that permission. 401 or 403 on every call right after signing in: the user is not a member of this environment or has no licence there. 412: the row changed since it was read, so the AI reads it again.
The connector also works with other Dataverse environments, such as Customer Service or Power Apps with your own tables.
Prerequisites: MICROSOFT_CLIENT_ID, MICROSOFT_CLIENT_SECRET, MICROSOFT_TENANT_ID, DYNAMICS_ORG_HOST
Install the connector locally
curl -fsSL https://raw.githubusercontent.com/HelpCode-ai/anythingmcp/main/docker-compose.quickstart.yml -o docker-compose.yml
printf 'JWT_SECRET=%s\nENCRYPTION_KEY=%s\n' "$(openssl rand -hex 32)" "$(openssl rand -hex 32)" > .env
docker compose up -d
Open http://localhost:3000/connectors/store, pick Microsoft Dynamics 365 Sales (Dataverse) and paste in the env vars listed under Prerequisites.
Available tools
| Tool | What it does |
|---|---|
d365_who_am_i | Return the signed-in user's id (UserId), business unit and organization id |
d365_list_accounts | List or search accounts (companies): name, number, phone, email, website, city, country, primary contact, owner, status |
d365_get_account | Read one account with every column (or the selected ones), with labels for choice and lookup columns and its @odata.etag |
d365_create_account | Create an account |
d365_update_account | Change columns of one account; columns left out keep their values |
d365_delete_account | Delete one account |
d365_list_contacts | List or search contacts (people): full name, job title, email, phones, company (parentcustomerid), city, owner, status |
d365_get_contact | Read one contact with every column (or the selected ones), with labels for choice and lookup columns and its @odata.etag |
d365_create_contact | Create a contact, optionally linked to its account |
d365_update_contact | Change columns of one contact; columns left out keep their values |
d365_delete_contact | Delete one contact |
d365_list_leads | List or search leads: topic, name, company, email, phone, source, rating, estimated value, owner, status (open, qualified, disqualified) |
d365_get_lead | Read one lead with every column (or the selected ones), with labels for choice and lookup columns and its @odata.etag |
d365_create_lead | Create a lead |
d365_update_lead | Change columns of one open lead; columns left out keep their values |
d365_qualify_lead | Qualify an open lead: Dynamics closes it as qualified and creates the chosen records (account, contact, opportunity) from it, linked to the… |
d365_disqualify_lead | Close an open lead as disqualified with a reason: 4 Lost, 5 Cannot Contact, 6 No Longer Interested (default), 7 Canceled |
d365_delete_lead | Delete one lead |
d365_list_opportunities | List or search opportunities: topic, customer (account or contact), estimated value and close date, probability, pipeline phase, owner… |
d365_get_opportunity | Read one opportunity with every column (or the selected ones), with labels for choice and lookup columns and its @odata.etag |
d365_create_opportunity | Create an opportunity for an account or a contact |
d365_update_opportunity | Change columns of one open opportunity (value, close date, probability, description); columns left out keep their values |
d365_win_opportunity | Close an open opportunity as won, with the actual revenue and close date |
d365_lose_opportunity | Close an open opportunity as lost (canceled or out-sold), with an optional comment |
d365_delete_opportunity | Delete one opportunity |
d365_list_activities | List activities of every type (tasks, phone calls, emails, appointments) with subject, type, dates, status and the row they are about |
d365_get_email | Read one email activity: subject, body (HTML in description), sender, recipients, direction, sent date, status and the row it is about |
d365_create_task | Create a task for the signed-in user, about an account, contact, lead or opportunity |
d365_create_phone_call | Log a phone call activity about an account, contact, lead or opportunity, with notes |
d365_create_note | Add a note to the timeline of an account, contact, lead or opportunity |
d365_complete_task | Mark an open task as completed |
d365_query | Query any table by its entity set name with OData: quotes, salesorders, invoices, products, pricelevels, campaigns, competitors… |
d365_next_page | Read the next page of any list, query or FetchXML answer that carried @odata.nextLink |
d365_fetchxml_query | Run a FetchXML query: joins across tables (link-entity), aggregates (count, sum, avg with groupby) and filters the OData syntax cannot… |
d365_get_record | Read one row of any table by entity set and id, with labels for choice and lookup columns and its @odata.etag |
d365_create_record | Create a row in any table that has no dedicated tool (a quote, a product, a custom table) |
d365_update_record | Change columns of one row in any table; columns left out keep their values |
d365_delete_record | Delete one row of any table |
d365_list_tables | List tables with their logical name, entity set name (what the query tools take) and primary name column |
d365_describe_table | Describe one table: entity set name, primary id and name columns, and every column with its type, whether it is required and whether it can… |
d365_list_lookups | List the lookup columns of a table with the table each points to and the navigation property name a write needs ("<navigation… |
d365_get_choice_options | List the values and labels of a choice column (option set), e.g. industrycode of account or statuscode of opportunity, so filters and… |
Example prompts
- "Show my open opportunities closing this quarter, sorted by estimated value."
- "Find Anna Meyer at Contoso and log a call: she wants a quote by Friday."
- "Which leads from the last 30 days are still open and have no activity yet?"
- "Mark the Fabrikam renewal as won at 48,000 and create a follow-up task for next Monday."
Next steps
Was this guide helpful?