Set up WorkerKit in Microsoft Copilot.

Written for the agent executing the setup and the person approving it. The work happens in Microsoft Copilot Studio: two MCP tools, one connection carrying a manager key, then a publish that puts the agent in front of Microsoft 365 Copilot and Teams. After that the agent verifies its own scopes and proves the wiring with a run.

Before you start

What you need.

A Copilot Studio agent you can edit, at copilotstudio.microsoft.com. Reaching Copilot Studio needs a Copilot Studio license, a Microsoft 365 Copilot license, or membership of the authors security group, and a trial license can build and test an agent but cannot publish one.

Generative orchestration on that agent. Microsoft states it is required to use MCP at all, and new agents default to it, so this is usually a confirmation rather than a change.

A WorkerKit account, and admin access on it: creating a manager key is an admin-only action. The Free plan is enough, and no card is needed.

A tenant that has not blocked the connector. MCP access in Copilot Studio rides Power Platform connectors, so a data policy over connectors governs this server and its tools too, and that is an admin decision rather than a WorkerKit one.

WhatAddressWhy
Copilot Studiohttps://copilotstudio.microsoft.comWhere the agent lives and where the MCP tool is added. The Copilot surface that takes a server URL and a key without writing any code.
Directory MCPhttps://mcp.workerkit.ai/directoryThe public kit catalog and the authoring guides. No auth, so it takes the None option and can be added first.
Workers MCPhttps://mcp.workerkit.ai/workersFleet operations, behind a bearer manager key. This is the mount that runs and configures workers.
OAuth client registrationhttps://api.workerkit.ai/api/oauth/registerAnonymous, and gated on the redirect address: one POST returns a client id and secret for a redirect WorkerKit already allows. Its siblings are https://api.workerkit.ai/api/oauth/authorize and /api/oauth/token. Step 4 only.
Fleet accesshttps://workerkit.ai/fleet-accessWhere an account admin creates the manager key. Admin only.
Skill filehttps://workerkit.ai/microsoft-copilot/SKILL.mdThe tool reference and the operating rules the agent keeps after setup.
This guide as markdownhttps://workerkit.ai/microsoft-copilot/setup.mdThe same steps, for an agent that reads markdown rather than a page.

Why this route: Copilot Studio is the one Copilot surface that adds a remote MCP server by URL with a static key on a header the maker names. Microsoft 365 Copilot has no such field, so an agent built here and published to the Teams and Microsoft 365 Copilot channel is how the fleet reaches the assistant people actually have open, and the consumer Copilot app has no custom connector mechanism. Copilot Studio takes the Streamable transport only, and both mounts are streamable HTTP, so there is nothing to choose.

Why not the other doors. A declarative agent built in the Microsoft 365 Agents Toolkit can attach an MCP server, but Microsoft states that MCP plugins do not support API key authentication: the choices are Entra SSO, OAuth 2.0 authorization code, dynamic client registration and none. WorkerKit speaks dynamic client registration, so that door opens under the same redirect gate step 4 describes, and an API plugin built from an OpenAPI document may also send a bearer key, which is where the REST API fits. The one door that does not fit at all is a custom federated connector in the admin center: Microsoft requires the server behind it to expose read-only tools, and the fleet writes.

The case for connecting at all is on the Microsoft Copilot page.

Step 0. Human, under a minute

Confirm generative orchestration.

MCP tools are unreachable without it, and the failure is silent: the agent connects, calls nothing, and answers from its own knowledge instead.

  • Copilot Studio: open the agent, then Settings Generative AI > Orchestration > "Use generative AI orchestration for your agent's responses?" > Yes

Microsoft is unambiguous: you must turn on generative orchestration to use MCP. New agents default to it, so this is usually a glance, and it is worth the glance because an agent on classic orchestration cannot use an MCP server and does not say so. Copilot Studio supports MCP tools and resources, not prompts, which costs WorkerKit nothing: every fleet capability is a tool.

Step 1. Human and agent, under a minute

Add the public catalog.

The catalog mount takes no credential, so it proves the wizard, the transport and the tenant policy before any key exists.

  • Copilot Studio: Tools > Add a tool > New tool > Model Context Protocol Server name: WorkerKit catalog Server description: Browse the public WorkerKit kit catalog and the kit authoring guides. Server URL: https://mcp.workerkit.ai/directory Authentication: None
  • Then finish in the Add tool dialog Select Create > the Add tool dialog appears > Create a new connection > Add to agent

The catalog mount takes no credential at all, on either path. It is the fastest proof that the client can reach WorkerKit, and it is worth adding first for exactly that reason: if it connects and the fleet mount does not, the problem is the credential rather than the wiring.

The second block is the step people miss. Microsoft routes the None path to Create as well, and then to the same Add tool dialog; whether a server with no auth still needs a connection object of its own is not spelled out. Either way, discovery runs once the dialog is finished, so an empty tool list right after Create is unfinished wiring rather than a bad URL.

Step 2. Human, about a minute

Create a manager key and connect your fleet.

The fleet mount takes API key authentication on a header you name yourself. Enter Authorization, and give the connection the key with its scheme.

  1. 01

    Sign in as the account that owns the fleet

    At workerkit.ai. Someone who belongs to several accounts confirms the active one first: a key created in the wrong account shows up later as an empty fleet, and checking now saves that round trip.

  2. 02

    Open Fleet access

    workerkit.ai/fleet-access is an admin-only page. A member sees a notice saying so rather than a broken page.

  3. 03

    Create a manager key named for its purpose

    Name it for the assistant that will hold it. A purpose-specific name makes the key easy to audit, and easy to revoke later without touching anything else.

  4. 04

    Pick its scopes

    The tables below say what each one grants. Start with the reads and add only the scopes needed for the approved task. Choose an expiry and request fresh approval when more access is needed.

  5. 05

    Copy the key once

    It is shown at creation and never again, so keep it to hand for the wiring step. It reaches the fleet only: no scope on it reads a mailbox, a calendar or a CRM.

KeyScopesWhat the assistant can then do
ObserverreadWorkers, readRunsDescribe the fleet and everything it has done, and change nothing. Most of the first session's value is here.
Operatoradd runWorkers, manageState, manageDeliveriesRun workers now, start and stop them, and route their reports.
Full automationadd manageSchedules, manageMemory, manageInstructions, manageBudgets, createWorkersSchedule, teach, rewrite, cap and clone. manageInstructions rewrites a worker's tested method, so it is the one to add last.
Builderadd installKits, publishKits, manageConnections, manageDeployments, deleteWorkersInstall directory kits as new workers, author and publish kits, connect apps by credential and register your own MCP servers. installKits is the one a brand-new account wants first, because it is what puts a worker in an empty fleet. manageDeployments is what puts an installed worker on the hosted runtime: without it the worker exists but never runs, and a run answers not_deployed.
  • Copilot Studio: Tools > Add a tool > New tool > Model Context Protocol Server name: WorkerKit fleet Server description: Operate WorkerKit AI workers: list, run, schedule, budget and deliver. Server URL: https://mcp.workerkit.ai/workers Authentication: API key Type: Header Header name: Authorization
  • Then Create, and supply the key on the connection Create a new connection API key: Bearer pe_mgr_... > Add to agent

A client that cannot run an OAuth flow takes the same fleet on one header instead. An account admin creates a key at https://workerkit.ai/fleet-access, copies it once, and it becomes the value of an Authorization header on the fleet mount. That header is the whole of the authentication: there is nothing to register and nothing to pre-approve.

Two details decide whether this works first time. The value carries its scheme: Microsoft documents only that the agent includes the key in its requests, and adds no scheme of its own, so enter Bearer pe_mgr_..., word and space included; a bare key arrives without a scheme and is refused. And the header name is the one thing here Microsoft has not published: it says to enter the name of the header, never names Authorization as an accepted value, and uses other names in its own header-auth examples. Authorization is what the fleet mount reads, so enter it, and if the tenant rejects it go to step 4 rather than to another header name.

A key carries the scopes it was granted when it was created. Granting a scope later never reaches an existing key: if a call answers 403 OPERATION_NOT_ALLOWED, an admin re-scopes the key at Fleet access or creates a new one, and the new key drops into the same place. Read key_info rather than assuming.

Step 3. Human and agent, only if step 3 was refused

The alternative: connect with OAuth 2.0.

The fleet mount is a full OAuth 2.1 authorization server, so the same screen takes an OAuth connection instead, and then no key is pasted anywhere.

One gate decides whether this path is open at all, so read it first. WorkerKit registers an OAuth client only for a redirect address on its allowlist of known assistant hosts, and no Power Platform address is on that list today: registration answers invalid_client_metadata: redirect_uri domain not allowed until the address Copilot Studio shows on its OAuth 2.0 screen is added. Read that address off the screen and ask us to allow it.

The points below are what OAuth buys once it is. The first of them holds for the dynamic flavours of Copilot Studio's OAuth option, where the client finds the authorization server and registers itself; the manual flavour asks for the endpoints and a client instead, and the two requests under it are how you get them.

  1. 01

    Give the client the URL and nothing else

    The fleet mount publishes OAuth discovery, so a client that supports it finds the authorization server on its own and registers itself. There is no client ID to create, no secret to store and no redirect address to register in advance.

  2. 02

    Approve on the WorkerKit consent page

    The client sends the person to https://workerkit.ai/mcpauth. Signing in there is what proves who is connecting; nothing is typed into the assistant.

  3. 03

    An account admin picks the key the client will hold

    The consent page lists the account's manager keys and can create one on the spot, so a first connect needs no visit to Fleet access beforehand. It is admin-only on the server, not just in the page: a member sees an honest notice rather than a broken screen.

  4. 04

    Scopes are chosen with the key, and are the whole of the reach

    Whatever that key carries is exactly what the assistant can do, and nothing on it reaches a connected app. Narrow it now or widen it later; a new key drops into the same connection.

  • 1. Register a client, once the redirect address is allowed. Send it exactly as Copilot Studio shows it: authorize rejects a redirect that was not registered curl -X POST https://api.workerkit.ai/api/oauth/register \ -H "Content-Type: application/json" \ -d '{"client_name":"Copilot Studio","redirect_uris":["<the redirect URL Copilot Studio shows>"]}'
  • 2. Copilot Studio: the MCP tool, Authentication > OAuth 2.0 Authorization URL: https://api.workerkit.ai/api/oauth/authorize Token URL: https://api.workerkit.ai/api/oauth/token Client ID: the client_id from the response Client secret: the client_secret from the response Scopes: manager scope names, space separated

Nothing is pasted into the chat on this path, which is its real advantage: the credential never passes through a message, a log or a screenshot, and revoking it later is one action in the dashboard rather than an edit inside the assistant.

The Scopes field is load-bearing rather than decorative. It takes WorkerKit manager scope names, the same ones in the table above, so readWorkers readRuns is the observer key. Every name has to be a real one: a name WorkerKit does not know drops the request out of the manager-key flow and lands the person on the wrong consent screen rather than erroring. What the assistant may then do is still the key the admin picks there.

Step 4. Agent

Verify the scopes.

Call key_info on the fleet mount. The scope list it returns is the truth, whatever was intended.

  • Ask the key what it can do (no arguments) key_info

It returns the account title, the key name, the key's scopes and expiry, and serverTimeUtc; any valid key may ask. If a scope is missing it was either not granted, or granted after the key was created, and an admin re-scopes it at Fleet access or creates a new one.

Step 5. Human and agent

Give the agent its WorkerKit instructions.

For an agent with skill upload, import SKILL.md. Otherwise use concise agent instructions and add the full document as an accessible knowledge source.

  • Copilot Studio: the agent, then Instructions Use WorkerKit for requests about workers, runs and kits. Start with key_info and use only available tools and granted scopes. Before a run, inspect the worker instruction, permissions and cost limits. Follow existing user authorization; confirm unapproved changes. Never expose credentials. Inspect run status, results, coverage and settled cost before reporting completion. Use the attached WorkerKit skill reference for operation details; if it is unavailable, say so rather than inventing tool arguments.

In Copilot Studio agents powered by the GitHub Copilot harness, choose Build, Skills, Add skill, then Upload a skill. That experience accepts SKILL.md or a ZIP containing it. Other agent types and tenants can expose different skill controls; use the controls documented for that experience.

For an Instructions field, paste the short text above without YAML frontmatter. Add the full file as a supported knowledge source and select that source and the configured WorkerKit tools with the instruction editor resource picker. A URL alone does not configure retrieval, and the full catalog does not belong in the instruction field.

Get the current reference from https://workerkit.ai/microsoft-copilot/SKILL.md. Where a skill package requires a named folder, use workerkit-fleet/SKILL.md to match its name metadata.

Step 6. Human, a few minutes

Publish the agent to Microsoft 365 Copilot.

This is the step that makes the fleet reachable from the assistant people already use. Nothing inside the Copilot chat app does it for you.

  • Copilot Studio: Channels > the Teams and Microsoft 365 Copilot tile Keep "Make agent available in Microsoft 365 Copilot" selected > Add channel > publish the agent at least once > See agent in Teams > Add

Then, in Microsoft 365 Copilot, type @ and pick the agent. Leaving that checkbox clear publishes to Teams only: if the agent answers there and not in Copilot, this is why.

Sharing goes one of two ways. Availability options offers a link for named people, and showing it to teammates puts it in the Teams app store under Built with Power Platform. Showing it to everyone in the organization is Submit for admin approval, a tenant decision rather than a maker one. Two smaller facts save a support round trip: the tenant must allow Power Platform apps in Teams, and installation links do not work in the Teams mobile app.

Step 7. Agent

Run the smoke test.

List the fleet and read recent runs, which alone prove the setup. If the account has workers, read one before running it, run it with approval, and report the receipt.

If the fleet is empty, stop after step 3 and say so: a new account has no workers yet, and the steps above have already proved the setup, because the key authenticated and both read scopes answered. Do not read it as a fault, and do not invent a worker to run. Go to the first-worker step and give the fleet something to do.

If the fleet has workers, pick one whose effects are reads. Judge it from the instruction and the permissions, never from the name: a worker whose apps are all read-level and whose instruction only gathers, summarises or reports is safe to run; one that sends, posts, writes, orders or pays is not, whatever it is called. If none is clearly read-only, run one with an explicit prompt for that run bounding it to a read.

  • 1. The directory is alive: confirm a kit count comes back directory_overview
  • 2. The fleet list: report how many workers the assistant can see workers_list
  • 3. Recent runs across the fleet: confirms readRuns runs_feed { "limit": 5 }
  • 4. Before running anything, read what that worker does and what it may touch. Both ride on readWorkers, and this is the step that decides whether the run is safe instruction_get worker_permissions_get
  • 5. Run it with the person's approval, then poll every 3 to 5 seconds until a terminal event arrives: run.succeeded, run.failed, run.blocked or run.awaiting_input worker_run run_events { "afterSeq": <lastSeq> }
  • 6. Read the receipt: costAuthority first, then modelCostUsd run_get

Read costAuthority first, then modelCostUsd beside it, and report both. A null finalDigest is not a failure: a run produces one only when its harness wrote a report. A costAuthority of unbilled_estimate, none or in_flight is not a failure either; it says how far to trust the number, and the operating rules below say what each value means.

A Skipped run is also a pass, and it is the cost brake working: the gate refused the run before any money moved. Report the skipReason rather than retrying. Then report the fleet size, the active scopes, and what the test cost, and the fleet is live.

Step 8. Human and agent

Give the fleet its first worker.

A new account starts empty. Install a kit from its page in one click, or let the agent preview and install one with kit_install_preview and kit_install once the person approves.

A new WorkerKit account starts with no workers, so the last step of setup is getting one. A kit is a ready-made worker: its instruction, its exact app permissions and its schedule, written and reviewed in advance, so installing one is how a fleet usually starts rather than a shortcut. There are two paths, and either ends with something to operate.

  1. 01

    The one-click path: install a kit from its page

    Browse the catalog at workerkit.ai/kits, open a kit whose job you recognise, and install it. It arrives pre-instructed, pre-permissioned and pre-scheduled, and asks for whatever it needs to connect. This path needs no scope on the manager key at all, so it works on the first session whatever the key can do.

  2. 02

    The agent path: shortlist, preview, approve, install

    With installKits on the key, the assistant can do the whole thing in chat: shortlist with kits_search, read the candidate with kit_get, then call kit_install_preview to surface its setup questions and exactly what the new worker would be allowed to touch. Put that in front of the person in plain words, and call kit_install once they approve, with deploy set to true so the new worker is actually able to run (that half needs manageDeployments on the key; without it the worker is installed but inert until worker_deploy). The new worker's key is shown once in the response.

  3. 03

    Then run it once and read the receipt

    A worker earns its place on the first run. Trigger it with worker_run, follow run_events until a terminal event arrives, and report the digest and the settled cost from run_get. Set a schedule with schedule_create when the person is happy with what it did, and the fleet is not just connected, it is working.

The catalog is public, so the agent can read all of it through the tool added in step 2 and explain what each candidate would do while the person chooses.

Classification on demand

Create a decision worker from your questions.

Categorize, score or triage connected data, then reuse and adjust the worker.

Reuse an existing worker or decision kit when its questions fit. For a custom classification task, creation compiles a supported source recipe and typed questions into a private kit and an installed decision worker. Optional deploy:true adds deployment; creation never starts a run or adds a schedule. The kit can be edited and published later through the normal kit lifecycle.

On the workers connection, call kit_app_tools(purpose:"decision") for recipes, argument schemas, permissions and examples, then kit_authoring_guide(section:"decision"). Check account connections with apps_list; public discovery does not check them. Send the request to decision_worker_create, follow nextCall, then use worker_run and run_get. Running needs runWorkers; results need readRuns. Use instruction_get / instruction_set for saved category or level answers, or answers on one run. Structural question/source changes need a revised kit and a replacement install. Check receipt status, coverage, omissions, warnings and cost before claiming completion.

Start with email-previews, calendar-events or sheets-rows. These recipes return judgments without app writes. Email previews do not include full threads; calendar events are invitation data, not transcripts; Sheets needs a Google file ID, a finite tab-qualified range and a columns map. A connected app alone does not make every tool a supported source. Source filters select evidence, not permissions: the Sheets recipe grants spreadsheet reads across the linked Drive account.

Supply 1–8 questions: choice with named options, score with ordered levels, or noul for the probability of a statement. Choice adds unclear automatically. Set an explicit confidenceFloor between 0 and 1; it routes uncertainty and does not promise accuracy. maxItems is 1–50, default 20. Creation requires publishKits and installKits; optional deployment also needs manageDeployments.

Use a fresh requestId for each new worker. Retry with the same ID and identical body to recover the original receipt; a changed body returns 409. The response includes tokenId for MCP/CLI worker commands, stable workerId, kitSlug, readiness and nextCall. A deploymentError means the worker already exists: fix deployment on that worker. The receipt is a snapshot; check current worker readiness before running. No worker API secret is returned.

The workers connection includes discovery and authoring, so classification needs one MCP connection. Its full profile has 91 tools (84 manager tools and 7 public discovery reads); only decision_worker_create is new. For a smaller list, a client that supports custom headers can send X-WorkerKit-Profile: decision on every request, including initialization, listing and calls, to select 20 workflow tools. A server operator can instead set MCP_WORKERS_PROFILE=decision. The endpoint and existing sign-in stay the same; a profile grants no additional permissions. Reconnect and relist after changing profiles. Use the advertised tool list: fleet administration, publishing and event-stream tools require the full profile. Successful responses include structured content and a text fallback; creation declares an output schema.

Read the request example and full contract.

Least privilege

What each scope grants.

The key's scopes are exactly its reach, and a refusal names the scope it wanted. Start with the reads and add scopes as the work asks for them.

ScopeWhat it grants
readWorkersThe fleet list, worker detail, and reads of memory, schedules and the instruction.
readRunsRun history, run detail, run events and a run's stored transcript. A receipt returned by a waiting run request is run content too: without this scope the run still starts and the receipt comes back with contentWithheld.
runWorkersRun now, one worker or up to 20 in one call, and cancel.
manageMemoryAdd, edit, retire and delete rules and facts; clear a run's report; grade a run.
manageSchedulesCreate, edit and delete schedules.
manageInstructionsCreate or replace a language worker's instruction, and answer a decision worker's install questions.
manageStateStart and stop a worker.
installKitsPreview and install a directory kit as a new worker.
manageDeliveriesCreate, edit and delete run-result delivery destinations: where the platform sends a run report when the worker finishes. Reading them rides on readWorkers. Availability is judged per account, so ask the channels operation rather than inferring it from the worker apps.
manageBudgetsRead and change a worker's spend and run ceilings, and the account-wide fleet ceiling. Its own scope because raising a dollar cap is the one management action that can cost money without starting anything.
createWorkersClone a worker into a new one, singly or in bulk, with a dry-run preview. The only non-kit creation path: a clone carries permissions a person already approved on the source.
publishKitsAuthor kits: validate (a dry run that reports every gate at once), publish from content or from an owned worker, edit, replace, unlist, relist, make private, delete, and edit the publisher profile. A private kit installed with installKits is how a worker is built from scratch through the reviewed manifest pipeline. The anonymous Directory API serves the authoring guide, the live permission vocabulary and the per-app tool explorer; reads of your own kits ride on readWorkers.
manageConnectionsConnect and disconnect apps for your operators by credential: every family the Apps page accepts by paste (bot tokens, API keys, private-app tokens), validated live against the provider, stored encrypted, never returned; register your account's own MCP servers as custom MCP apps (with their credentials) and enable their tools; and set or remove your account's own model-provider keys. Reading which apps are connected, with a recipe for connecting each, rides on readWorkers. Google, Microsoft, GitHub and Reddit are browser sign-ins and stay on the Apps page.
manageDeploymentsDeploy a worker onto the hosted runtime and manage that deployment: its model and reasoning, its transcript setting, its spend ceilings, pause and resume, and undeploy. This is the step that makes an installed worker run at all: without a deployment it fires no schedule and a run request is refused with not_deployed. Reading the deployment and the model catalog rides on readWorkers.
deleteWorkersDelete a worker permanently: its key stops working, its schedules stop firing, and its instruction, memory, deployment and delivery destinations go with it — as do its sub-workers, because a dead orchestrator must never leave live workers behind. Not reversible by any call, which is why it is its own scope rather than part of start/stop: stopping a worker is reversible and this is not. Run receipts survive, and the freed worker slot is what clears a 402 limit_exceeded on install.
readWalletRead spendable wallet balance, fees and account checkout status.
requestWalletTopUpCreate a human-confirmed Stripe Checkout link and inspect purchases requested by this key. Does not authorize charging a saved card.

Operating rules

What the agent follows on every call.

The same rules the skill file carries, so a session that read neither still has them. Every row is a fact of the platform, not advice.

RuleWhat it means
Type the scheme into the key valueCopilot Studio puts the API key into the header the maker named, and Microsoft documents no scheme being added to it. So the value is `Bearer pe_mgr_...`, with the word Bearer and the space; a bare key arrives with no scheme and is refused.
The connection belongs to the person using the agentMicrosoft says the user of the agent provides the API key. Whether one connection can be shared across an agent's users is not documented, so plan for each person connecting with a key an admin issued them, and keep those keys narrow rather than assuming one full-scope key covers a team.
Prefer short calls to held onesPoll run_events every 3 to 5 seconds with afterSeq rather than holding runs_feed with a long wait. Copilot Studio publishes no tool-call timeout, so a held connection is the one behaviour here nobody has documented, and the polling path returns the same events.
Read the key before planningCall key_info first in any session that touches the fleet, and plan against the scopes it returns. It also carries serverTimeUtc, which every age and deadline below is measured against.
Confirm before changing the fleetRunning, stopping, deleting or editing a worker changes the person's fleet: state the exact worker and action in plain words and get approval first, unless the person already approved that exact action. Publishing, unlisting or deleting a kit affects the directory and other installers, so confirm those too.
Know what a run will do before you start itA run can send mail, post, write or spend, and the person approving it is trusting your reading of the worker. Read instruction_get and worker_permissions_get first (both ride on readWorkers) and say what the run will touch.
The key is not a secret to repeatIt travels once, where the platform takes credentials, and after that it is sent for you. Never repeat it in a later message, print it, log it, or write it into memory, a skill or a shared file. A key that has been somewhere it should not be is revoked and replaced at Fleet access in under a minute.
An empty fleet has a next stepA new account has no workers until someone installs a kit, creates a decision worker or clones one. Say so plainly, then offer the two paths: the person installs a kit from its page in one click, or, with installKits, you shortlist with kits_search, preview with kit_install_preview and install with kit_install once they approve. Never invent a worker id to have something to run.
Rate limits, per accountThe fleet surface allows 120 requests a minute and 1,200 an hour; run triggers 30 a minute; run-event polls 120 a minute and 2,400 an hour, exempt from the surface windows; the kits surface 60 a minute; kit installs 10 an hour. On a 429, wait out Retry-After. Extra machines buy no extra budget.
Watching runsPoll run_events every 3 to 5 seconds and pass afterSeq so each call returns only what is new. To watch the whole fleet, hold runs_feed with wait: one connection covers every worker, up to four held per account, and it always returns within the wait. fleet_pulse gives the in-flight rows beside it.
Brief from fleet_healthWhen the person asks how the fleet is doing, call fleet_health once instead of crawling workers_list, worker_get and runs_feed: it lists the workers that are blocked, the ones installed but never deployed, the schedules the runtime is not picking up, the runs waiting on an answer, and the last runs that did not end clean. Empty sections are the healthy answer; paused workers are counted, not listed, because stopping one is a decision.
Check account_usage before spendingBefore an install, a deploy or a run, read account_usage: worker slots, hosted slots, spendable wallet balance and request windows. With requestWalletTopUp and permission for the amount, request a wallet_checkout_create link for the person to pay. Otherwise hand them topUpUrl. Only credited confirms committed funds.
404 not_foundThe worker is missing or belongs to another account, and the two are indistinguishable by design. Never claim which.
403 OPERATION_NOT_ALLOWEDThe key lacks a scope, and the message names it. A wider key is the fix, not a retry.
TimeCompute every age, deadline and countdown against the response's serverTimeUtc (on key_info, workers_list, fleet_pulse and fleet_health), never against your own clock.
Skipped is the brake workingA Skipped run is a receipt, not a transport error: the gate refused it before any money moved. Read skipReason (DailyRunCap, DailySpendCap, FleetSpendCap, ConcurrencyLimit, InsufficientCredits, DeploymentPaused, TokenDisabled or a readiness reason) and retry only when the reason clears on its own.
MoneyRead costAuthority before the number beside it: settled, unbilled_estimate, none or in_flight. modelCostUsd is the settled figure; costSoFarUsd exists only while a run is Running.
Cloning multiplies ceilingsA clone carries the source worker's per-run and per-day ceilings, so read fleet_budget_get before worker_clone_bulk and size the fleet ceiling for the copies you are about to make.

Quick answers

Symptoms, causes, fixes.

SymptomCause and fix
The agent never calls a WorkerKit toolGenerative orchestration is off. Settings, then Generative AI, then Orchestration, then Use generative AI orchestration for your agent's responses, then Yes. An agent on classic orchestration cannot use MCP and gives no error saying so.
401 on the fleet mount, right after the connection is madeThe key value went in without its scheme. It is `Bearer pe_mgr_...`, not `pe_mgr_...`. Edit the connection rather than the tool.
Copilot Studio will not accept the header nameDo not substitute another header name: the fleet mount reads the key off Authorization only. Go to step 4 and read its gate first, because the OAuth path pastes no key anywhere but needs the redirect address Copilot Studio uses allowed on the WorkerKit side.
No tools listed after creating the MCP toolThe connection was not completed. On the Add tool dialog select Create a new connection, supply the credential, then Add to agent. Microsoft routes the None path through the same dialog, so finish it there before suspecting the URL.
The connector is blocked by tenant policyMCP in Copilot Studio rides Power Platform connectors, so a data policy over connectors also governs this server and its tools. That is a Power Platform admin decision; the WorkerKit mount is public and unchanged.
It works in the test panel but will not publishA Copilot Studio trial license can build and test an agent but cannot publish one. A different license is the fix, not a retry.
A tool is missing from the list and the connection is fineMicrosoft's known issues cover this: tools whose input schema uses reference types are filtered out of the list entirely. Nothing on the WorkerKit side hides a tool.
The published agent answers "Sorry, something unexpected happened. Error code: SystemError"Teams is serving a previously published version. Microsoft's workaround is to disable and re-enable the app in the Teams admin center, toggle the Teams channel off and on in Copilot Studio, then republish.
401 on the fleet surfaceRead the code rather than guessing: auth_required means the Authorization header never arrived, which is a wiring problem and not a key problem, and auth_failed means the key is unknown or revoked. Re-send it spelled exactly Authorization: Bearer pe_mgr_... and it connects.
403 OPERATION_NOT_ALLOWEDA scope is missing. Read key_info; an admin re-scopes the key at Fleet access or creates a new one, and the new key drops into the same place (the snapshot rule).
404 not_found on a workerMissing, or on another account. Verify the id, and that the key belongs to the account that owns the fleet.
429Rate limited. Honour Retry-After; the per-account windows are in the operating rules above.
Empty fleet on a new accountExpected, and not a fault: an account has no workers until someone installs a kit, creates a decision worker or clones one. The setup is proved already, because the key authenticated and the reads answered. Install a kit to fill it.
Empty fleet, or the wrong workers, on an account that has someThe key was created in a different WorkerKit account. Create it in the account that owns the fleet.

Each WorkerKit failure names itself in the response, so an agent never has to guess which one it met: read the code, apply the row, and carry on.