> ## Documentation Index
> Fetch the complete documentation index at: https://docs.atako.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Microsoft Dynamics 365

> Connect Microsoft Dynamics 365 to your Atako agents — 9 read and 6 write actions.

Let your agents read and write your Dynamics 365 / Dataverse data — query any table with OData, look up accounts, contacts, leads and opportunities, create and update records and add notes.

## Connection

* **Authentication**: OAuth 2.0 — you authorize Atako via Microsoft Dynamics 365's consent screen; no key to copy.
* **Required settings**:
  * **Environment host** — The host of your Dynamics 365 / Power Platform environment, without https\:// — e.g. orgabc.crm4.dynamics.com.
* **Scopes requested**:
  * `https://{environment}/.default`
  * `offline_access`

<Note>
  Nothing to paste: enter your environment host, click Connect and sign in with your Microsoft 365 work account that has a Dynamics 365 / Power Apps license and a security role in that environment. Your environment host is in Power Platform admin center → Environments → your environment → Environment URL (e.g. orgabc.crm4.dynamics.com), or Power Apps → Settings → Developer resources. Prerequisite on the Atako side — an administrator adds the delegated permission Entra → App registrations → Atako → API permissions → Add a permission → Dynamics CRM → user\_impersonation ("Access Dynamics 365 as organization users"), and sets INTEGRATION\_OAUTH\_DYNAMICS\_365\_CLIENT\_ID / \_CLIENT\_SECRET (the Outlook Entra app can be reused once it has that permission).

  See [Microsoft Dynamics 365's documentation](https://learn.microsoft.com/en-us/power-apps/developer/data-platform/webapi/overview).
</Note>

## Read actions (9)

| Action | Description |
| - | - |
| `get_record` | Read one row by id, optionally limited with select and joined with expand. |
| `list_accounts` | List accounts (default columns: accountid,name,telephone1,emailaddress1,websiteurl,address1\_city,address1\_country,\_primarycontactid\_value,modifiedon). Optional OData filter, e.g. "contains(name,'contoso')" or "address1\_city eq 'Paris'"; orderby; top 1–500 (default 50). Use query\_records for other columns or tables. |
| `list_columns` | List the columns of one table: LogicalName (the key to use in select/filter/attributes), AttributeType (Lookup, Picklist, String, Money…), DisplayName, RequiredLevel, IsValidForCreate, IsValidForUpdate. Use it before creating or updating records. |
| `list_contacts` | List contacts (default columns: contactid,fullname,firstname,lastname,emailaddress1,telephone1,jobtitle,\_parentcustomerid\_value,modifiedon). Optional OData filter, e.g. "emailaddress1 eq '[jane@contoso.com](mailto:jane@contoso.com)'" or "\_parentcustomerid\_value eq \<account guid>"; orderby; top 1–500 (default 50). Use query\_records for other columns or tables. |
| `list_leads` | List leads (Dynamics 365 Sales) (default columns: leadid,fullname,subject,companyname,emailaddress1,telephone1,statecode,statuscode,leadsourcecode,createdon). Optional OData filter, e.g. "statecode eq 0" (open) or "companyname eq 'Contoso'"; orderby; top 1–500 (default 50). Use query\_records for other columns or tables. |
| `list_opportunities` | List opportunities (Dynamics 365 Sales) (default columns: opportunityid,name,estimatedvalue,estimatedclosedate,closeprobability,statecode,statuscode,\_customerid\_value,\_parentaccountid\_value,modifiedon). Optional OData filter, e.g. "statecode eq 0" (open) or "estimatedclosedate le 2026-12-31"; orderby; top 1–500 (default 50). Use query\_records for other columns or tables. |
| `list_tables` | List the tables of the environment with LogicalName, EntitySetName (the name every record action takes), DisplayName, PrimaryIdAttribute, PrimaryNameAttribute and IsCustomEntity. Start here to find a table. Optional OData filter on primitive properties only — e.g. "IsCustomEntity eq true", "LogicalName eq 'account'" (DisplayName cannot be filtered). No paging: everything matching is returned. |
| `query_records` | Query rows of any table with OData: select, filter (e.g. "statecode eq 0 and contains(name,'contoso')"), orderby, top (1–500, default 50) and expand. Lookup values come back as \_\<column>\_value; choice columns also carry their label (…@OData.Community.Display.V1.FormattedValue). For more rows than top, narrow the filter (e.g. by createdon range). |
| `who_am_i` | Return the connected user's ids in this environment: UserId (systemuser), BusinessUnitId and OrganizationId. |

## Write actions (6)

| Action | Description |
| - | - |
| `create_account` | Create an account (company) and return it with its accountid. |
| `create_contact` | Create a contact, optionally linked to its company (account\_id → parentcustomerid\_account), and return it with its contactid. |
| `create_lead` | Create a lead (Dynamics 365 Sales) and return it with its leadid. |
| `create_note` | Add a text note (annotation) to an account, contact, lead, opportunity or task, and return it. |
| `create_record` | Create a row in any table and return it. attributes: column values by logical name; lookups via "\<navigation property>@odata.bind": "/\<entityset>(\<guid>)". Optional select limits the returned columns. |
| `update_record` | Update an existing row (never creates one: sent with If-Match: \*) and return it. Send only the columns you change; lookups via "\<navigation property>@odata.bind". When changing statecode, also set statuscode. |

## Permissions

Every action above must be explicitly granted to an agent before it can be used. See [Permissions](/integrations/permissions) for the grant model and [Security](/integrations/security) for how credentials are protected.

***

*Last reviewed against the provider API: September 2026.*


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.