MCP for Microsoft Copilot Studio Module Included
Before you start
This page only covers the Copilot Studio-specific wiring. The parts common to every assistant live in the hub:
- Enable the connector for your organization — Enable and scope it. If it is off, consent is refused and nothing here will connect.
- Understand the permissions model — an assistant's rights are the user's rights, intersected with the admin toggles. Read-only until you turn writes on.
Test with a normal account, not a Global Admin
A user with a standard Microsoft 365 Copilot licence can connect — there is no extra premium Power Platform licence to buy for the connection itself. The one real pitfall is the account you test with:
prvReadConnector privilege error even though the account looks all-powerful. Always test with a normal, licensed user account. See troubleshooting.
Licence & credits — who pays for usage
Connecting to Vaks costs nothing extra, but every interaction your users have with the agent consumes Copilot Credits on the Microsoft side. Who covers them depends on the user's licence:
- With a Microsoft 365 Copilot licence — a large part of agent usage in Microsoft 365 surfaces (Teams, Copilot Chat) is included: the licence covers those credits. Caveat: some actions, notably via custom connectors like Vaks's, may still draw on credit capacity — check your consumption model rather than assuming everything is free.
- Without a Copilot licence (or for usage that is not included) — you must provision capacity, otherwise usage is blocked. Two ways: a prepaid Copilot Credit pack, or a pay-as-you-go billing policy (an Azure subscription linked to the environment, billed monthly for actual consumption).
Step 1 — Create the Vaks credentials
Copilot Studio does not register itself, so you create the OAuth client up front in Vaks. Open Admin → Integrations → AI connector (MCP) → Pre-registered OAuth clients:
- Give the client a Name (e.g. “Copilot Studio”).
- The Callback URL is optional. Leave it empty and Vaks registers the standard Power Platform callback for you (
https://global.consent.azure-apim.net/redirect) — so you can create the client and get its ID and secret before Copilot Studio ever reveals its redirect URL. If your tenant is on a sovereign/regional cloud with a different consent host, either paste that value here or edit it later (the Edit callback button on the client, no new secret). You can register several callbacks on one client. - Press Create client. The Client ID (
vaks_mcpc_…) and Client secret (vaks_cs_…) are shown once — copy them into a vault immediately, the secret is never shown again.
Note the three OAuth URLs shown in the same section — you will paste them into the connector next:
| Field | Value |
|---|---|
| Authorization URL | https://<your-domain>/api/v1/auth/oauth/authorize |
| Token URL | https://<your-domain>/api/v1/auth/oauth/token |
| Refresh URL | the same as the Token URL |
| Scope | mcp:access |
Step 2 — Create the agent in Copilot Studio
- Sign in to https://copilotstudio.microsoft.com (with a normal account, not a Global Admin).
- Pick or create a Power Platform environment if prompted.
- Choose Create → New agent, give it a name and a short description, and create it. You now land on the agent's overview.
Step 3 — Add the MCP tool
- Open the agent's Tools tab and choose Add a tool (or “Add tool”).
- In the dialog, pick Add new MCP (the Model Context Protocol option, top-right of the tool types).
- Enter a name and description, and the MCP server URL:
https://<your-domain>/mcp(or your public MCP URL — see reaching it from outside). - For Authentication, choose OAuth 2.0 — this is where the Vaks credentials from step 1 go, configured next.
Step 4 — Configure OAuth authentication
In the authentication step (OAuth 2.0), set:
- Identity Provider = Generic Oauth 2, per-user authentication (not “connector owner's credentials” — that would share one identity for everyone and defeat the whole per-user model).
- Client ID / Client secret = the values from step 1.
- Authorization URL =
https://<your-domain>/api/v1/auth/oauth/authorize - Token URL and Refresh URL =
https://<your-domain>/api/v1/auth/oauth/token - Scope =
mcp:access
/ or http vs https makes the authorize step fail with an unhelpful error.
Step 5 — Set per-user identity on the agent
This is where per-user identity is actually decided — not on the connector's Security tab. In your agent, open Settings → Security → Authentication and choose Authenticate with Microsoft (Entra ID). That lets Copilot Studio identify each user and keep a separate Vaks connection per person.
Step 6 — Connect and test
When you finish adding the tool, Copilot Studio asks you, the maker, to connect so it can validate the tool — a “Not connected” prompt appears. Click it, sign in to Vaks and approve the consent screen. This author connection is only for building and testing; connecting here does not mean your identity is what gets distributed — that is governed by the per-user setting in step 5.
Step 7 — Publish and share
Publishing an agent does not, on its own, put it in front of users. Three things:
- Publish the agent.
- Under Channels, add Teams + Microsoft 365 Copilot. Submitting it to the org store puts it in a waiting-for-Teams-admin-approval state — approve it in the Teams admin center (
admin.teams.microsoft.com→ Manage apps → Allow). - Share the agent with the users or security group who should use it.
Step 8 — Verify per-user identity
The only proof that identities are not shared is a real second user:
- Have a colleague open the published agent (in Teams or via the Demo website) and trigger a Vaks request such as “list my projects”.
- They should be prompted to sign in to Vaks with their own account (login + consent), then get their own data.
- In Vaks, Admin → Integrations → MCP → Active AI connections should list their email — one connection per real user, not everything under yours.
Recreate the pre-built workflows
Vaks ships 11 pre-built workflows as MCP prompts (the full library is in the hub). Claude surfaces them automatically; Copilot Studio does not consume that MCP primitive, so you recreate them yourself.
The 11 workflows (read ones work as-is; write ones need Allow AI write actions on):
| Workflow | What it does |
|---|---|
| Portfolio · Risk radar | Reviews every project, prioritised risk list. |
| Portfolio · Deliverables awaiting review | Prioritises what is waiting for my review. |
| Project · Status report | Shareable progress update for a project. |
| Team · Find work for someone | Projects/tasks matching skills + real availability. |
| Finance · Budget audit | Budget, spend, forecast, variance + corrective levers. |
| Project · Start from a brief write | Brief → project: tasks, dependencies, staffing. |
| Project · Close out write | Close-out checklist, then mark completed. |
| Project · Announce a change write | Drafts and sends an announcement to stakeholders. |
| Team · Staff a project write | Proposes an optimal assignment (skills + availability). |
| Team · Onboard someone write | Team assignment, declared skills, first mission. |
| Time · Timesheet catch-up write | Spots empty days, proposes the missing time entries. |
Two full example prompts (the level of detail to aim for)
Project · Status report (read):
Write a clear status report for project "<NAME>". Get the project id via
vaks_list_projects, then combine vaks_get_project_health, vaks_list_project_tasks,
vaks_get_tasks_in_window (deadlines) and vaks_get_workload. Factual tone, ready to
share. Use exactly this structure:
## Status report — Project · Period · Overall status (green / amber / red)
### Progress
### Milestones & deadlines
### Risks & blockers
### Next steps
Team · Staff a project (write — note the “propose, then wait for approval” guardrail):
Propose staffing for project "<NAME>". Get the id via vaks_list_projects,
coverage via vaks_get_skill_gap, candidates per task via vaks_suggest_assignees,
and a plan preview via vaks_plan_project_preview (apply NOTHING yet). Show 2–3
DISTINCT staffing options — e.g. a tight team, a load spread more widely,
reinforcement on the missing skills — and for each: who does what, the load per
person, the delivery window, the warnings, and its trade-off (cost / time / risk).
Ask me to CHOOSE an option and approve BEFORE applying via vaks_plan_project_apply.
vaks_* tools and the order, ask the agent to propose before it writes and to wait for your approval, and keep finance read-only. If you want the exact wording Vaks uses, run the matching prompt once in Claude (which shows it) and copy it.
Where to put them in Copilot Studio
- Suggested / starter prompts — the chips shown when the agent opens. Paste one full instruction per workflow. Closest match to the native menu.
- A Topic — a trigger phrase (“status report”, “staff this project”) that routes to a generative answer carrying the full instruction. Use it when you want a guided, repeatable flow.
- Agent instructions — list the workflows in the agent's Instructions so it offers them spontaneously. Least visible, zero maintenance.
Troubleshooting
| Symptom | Cause & fix |
|---|---|
Connect fails with prvReadConnector / “Administrative access mode” | You are testing with a Global Admin account — Dataverse filters its privileges. Test with a normal, licensed user (a standard M365 Copilot licence is enough). |
| Authorize step fails / redirect error | The callback registered in Vaks does not match the connector's redirect URL exactly. Copy it character for character. |
| Token step fails / invalid client secret | The secret was not re-pasted (red warning on the field). Re-enter it and Update connector. |
| Consent screen has no approve button | The connector is disabled in Vaks (mcp.enabled off). Enable it. |
| Agent published but nobody sees it in Teams | “Available” ≠ shared. Approve it in the Teams admin center and Share it. See publish & share. |
| Everyone seems to act as you | The connector is on maker/shared credentials, not per-user. Set the agent to Authenticate with Microsoft and per-user auth; confirm via Active AI connections in Vaks. |
Related: MCP overview (hub) — permissions, admin toggles, deployment · Claude · ChatGPT · all integrations.