Today we’re going to build a Copilot Studio agent for (in-house) trainings from scratch. We’ll see how using Generative AI car help reduce the time you spend configuring every single area of a conversational agent by providing clear instructions, connectors, and more!
What’s involved?
We’re going to build an agent for users to interact with, and check internal trainings. Users will be able to request information about available trainings, and the agent will even register on their behalf.
We’ll use Dataverse as our backend, connectors for the agent to retrieve the data and perform the registrations, custom entities because users love abbreviations, as well as sending Outlook invites to the users (or placeholder for in-person training) with an Agent Flow.
Dataverse (data sources)
We’ll create a solution, and then 2 tables inside:
- Training Catalogue
- Registrations
The Training Catalogue table will contain all our trainings (active or cancelled). See that as a catalogue for the users.
The Registrations table will contain all the users registrations. When a user interacts with the Agent and ask to register, this is where it’ll be booked in.
📌 The custom fields are as follows:


Note: You’ll see a 3rd table in your solution –> Microsoft EntraID due to our “Attendee” lookup.
💡 Model-driven app (Optional)
Then, you can populate the Training Catalogue table with data and the Registration table (screenshot below of the finished output). I’ve also created a Model-driven app for ease of use, but this is totally optional.


Copilot Studio Agent
Let’s create the agent that’s going to hold it all together. Users will be able to interact with this agent to get information about the trainings, and book a slot for a specific one.
For now, we’ll just create the agent, add our Dataverse tables as Knowledge sources (we’ll come back for the Instructions later!), and create some suggested prompts.
Here I’m using the GPT-4.1 model, but I’ll encourage you to test the models you’ve got available, and which one is the most relevant for the task(s).



Agent Settings
When it comes to the agent settings, make sure to use generative AI orchestration, and that “allow ungrounded responses” AND “use information from the web” are turned off. We only need the agent to get the data from our tables.


Agent Entities
Let’s add a few entities to the agent to work with users’ ways of writing things 😅
Under Settings, click on Entities (left navigation), then + Add an entity button at the top. I’ve called my entity Technology, and added a few synonyms (and yes, users write those!)

Agent Tools
For the tools, we’re going to have Dataverse connectors and flows (or Worfklows depending on when you’re reading this!). The connectors we’ll be using are below:

It will make more sense when we configure our Agent instructions, but here’s a quick summary of the flows:
- Number of Trainings Available (flow): AI is not good at doing maths. So in order to the exact number of trainings available, a small flow will do the trick for a predictable and correct number!
- Create training placeholder (flow): Will create a Teams meeting or an Outlook event (placeholder) in the user’s calendar for the length of the requested training.
Note: For the connectors, you may also want to have a look at the Dataverse MCP Server. Also, the connectors are using maker provided credentials to read/write in Dataverse.
In Part 2, we’ll look at the flows, add Agent instructions, and then do some testing. See you there! 🙂