Skill v1.0.1
currentAutomated scan100/100+1 new
version: "1.0.1" name: mcp-catalog description: Authoritative catalog of MCP servers actually configured and working in this Orchestra workspace. Use this skill whenever you author or generate an orchestration so every mcps: entry references a real MCP. Distinguishes pre-registered MCPs (in orchestra.mcp.json, no top-level declaration needed) from inline-only MCPs (must be declared in the orchestration's top-level mcps: block).
MCP Catalog (workspace-authoritative)
This is the canonical list of MCP servers wired up in this Orchestra workspace. Two classes exist:
- Pre-registered MCPs — declared globally in
config/Orchestra/orchestra.mcp.json and automatically available to every orchestration. Reference them by name only in a step's mcps: array. Do NOT add a top-level mcps: entry for them in your orchestration — re-declaring them is redundant noise that bloats the YAML.
- Inline-only MCPs — not in the global registry. **Must be declared in
the orchestration's top-level mcps: block** with full configuration (type, command+arguments for local, or endpoint for remote), then referenced by name in each step's mcps: array.
If a name is not in this catalog, it is not registered — do not fabricate.
Canonical example of mixed usage:Debug/debug-general-validation.yamldeclares onlyorchestraat thetop-level (inline-only) and references seven pre-registered MCPs via asingle step `mcps: [icm-readonly, icm-full, orchestra, azdo, azure,powerreview, debug-mcp]`. Match this idiom.
Quick Selector — pick the right MCP by intent
| Intended capability | Use this MCP | |
|---|---|---|
| Microsoft 365 calendar (events, attendees, scheduling) | calendar or workiq | |
| Microsoft 365 mail (Outlook, send/read) | mail or workiq | |
| Microsoft Teams chats / channel messages / meeting transcripts | teams or workiq | |
| Microsoft 365 People / contact lookup / "about me" | me or workiq | |
| Microsoft 365 Copilot capabilities | m365-copilot | |
| Azure DevOps (PRs, work items, repositories, comments) | azdo | |
| Azure resources (subscriptions, resource groups, ARM, etc.) | azure | |
| Microsoft IcM — read-only (incident lookup, status) | icm-readonly | |
| Microsoft IcM — read/write (acknowledge, mitigate, comment) | icm-full | |
| PowerReview (PR review tooling — fetch threads, reply, vote, fix branches) | powerreview | |
| MCP debugging / introspection harness | debug-mcp | |
| Persistent state / memory across runs (key-value, lists, history) | zakira | |
| Live web search / general research | recall | |
| Library or framework documentation lookup | context7 | |
| Microsoft Learn / docs.microsoft.com / Azure / .NET docs | microsoft-learn | |
| Browser automation, screenshots, scraping non-API web sources | playwright | |
| Introspecting Orchestra runs / launching child orchestrations from MCP | orchestra | |
Listing or responding to human-in-the-loop pauses (Approval steps, request_user_input) | orchestra | |
| Local filesystem read/write (sandboxed to a working directory) | filesystem |
Pre-registered MCPs (orchestra.mcp.json)
These are declared globally. Do NOT add a top-level `mcps:` entry for any of these — Orchestra resolves them automatically. Just list the name in a step's mcps: array.
The pre-registered set in this workspace: calendar, mail, me, m365-copilot, teams, azdo, azure, icm-full, icm-readonly, powerreview, debug-mcp.
Each entry below describes purpose, when-to-use, when-NOT-to-use, and a copy-paste step-level reference snippet.
Microsoft 365 HTTP proxy MCPs (calendar, mail, me, m365-copilot)
These four are served over HTTP by the m365-remote-mcps background service (see orchestra.services.json) on port 5113, fronting config/Orchestra/m365.proxy.json with routing.mode: perServer and basePath: /mcp — endpoints land at http://localhost:5113/mcp/<name>.
`workiq` vs proxy MCPs — when to choose which:
- Prefer `workiq` when an orchestration touches multiple M365 concerns
(e.g. calendar + mail) or when consistency with existing workspace orchestrations matters. workiq is local stdio with a broad toolset.
- Prefer a proxy MCP (
calendar/mail/me/m365-copilot) when
you want a smaller, focused toolset for a single concern, or when you specifically need M365 Copilot (m365-copilot) which is not part of workiq.
Auth note: all four use InteractiveBrowser auth with deferConnection: true. The first time an orchestration step touches one of these in a new session, the proxy will prompt for browser auth via ${VSCODE_CLIENT_ID} and ${CORP_TENANT_ID}.
calendar
Use for: listing and inspecting calendar events, attendees, organizers, free/busy, scheduling helpers, time-window searches. Do not use for: mail or Teams operations — pick the matching focused MCP, or workiq. Step-level reference:
steps:- name: list-meetingstype: Promptmcps: [calendar]
mail
Use for: reading, searching, composing, and managing Outlook messages; thread/conversation lookup. Do not use for: calendar or Teams operations. Step-level reference:
steps:- name: triage-inboxtype: Promptmcps: [mail]
me
Use for: the signed-in user's profile and personal information; "me / my org / my manager"-type queries. Do not use for: other people's profiles in bulk — workiq has broader People tooling. Step-level reference:
steps:- name: load-my-profiletype: Promptmcps: [me]
m365-copilot
Use for: Microsoft 365 Copilot tools (search M365 content, generate from M365 data, Copilot-side tooling not in workiq). Do not use for: generic LLM completions — use a Prompt step with model: directly. Step-level reference:
steps:- name: search-m365-contenttype: Promptmcps: [m365-copilot]
teams — Microsoft Teams (local stdio)
Pre-registered, but NOT served by the HTTP proxy. Unlike calendar / mail / me / m365-copilot (which are HTTP endpoints on port 5113), teams is a local stdio MCP (McpProxy.Samples.Teams.Mcp via dnx) registered in orchestra.mcp.json. It uses user-auth against ${CORP_TENANT_ID} / ${VSCODE_CLIENT_ID} with a deferred connection, so the first step that touches it in a new session triggers auth. Reference it by name only — do NOT add a top-level mcps: entry.
Use for: dedicated Microsoft Teams tooling — chat messages, channel posts, meeting transcripts, Teams search. Do not use for: calendar / mail / profile work — pick the matching focused proxy MCP, or workiq.
`teams` vs `workiq` for Teams: prefer `teams` for a focused, Teams-only toolset when the step needs nothing else. Prefer `workiq` when the same step also needs calendar / mail / people / AzDO, so one MCP covers every concern. Step-level reference:
steps:- name: read-team-channeltype: Promptmcps: [teams]
azdo — Azure DevOps (full)
Use for: Azure DevOps via the official @azure-devops/mcp package — PRs, work items, repos, builds, releases, comments, threads. Configured for the msazure organization. Do not use for: anything outside AzDO. Microsoft 365 needs go to workiq / proxy MCPs. Note workiq also has some AzDO tools but azdo is the dedicated, broader option. Step-level reference:
steps:- name: fetch-pr-detailstype: Promptmcps: [azdo]
azure — Azure resources
Use for: Azure subscriptions, resource groups, ARM operations, deployments, KQL/Log Analytics, RBAC — anything served by Azure.Mcp (azmcp server start). Do not use for: Azure DevOps (use azdo); Microsoft Learn docs (use microsoft-learn). Step-level reference:
steps:- name: list-subscriptionstype: Promptmcps: [azure]
icm-readonly and icm-full — Microsoft IcM (incident management)
Two flavors of the same IcM.Mcp package, sourced from the msazure/One/_packaging/ZTS Azure DevOps feed:
- `icm-readonly` — read-only mode (
-- --read-only). Use this by
default. Cannot acknowledge, mitigate, comment, or otherwise change incident state.
- `icm-full` — full read/write. Use only when the orchestration must
change incident state (acknowledge, transfer, mitigate, post comments).
Use for: querying incidents, fetching IcM history, change-management data, RP/SAR investigations. Do not use for: non-IcM tickets (Jira, AzDO work items) — those go to azdo. Step-level reference:
steps:- name: investigate-incidenttype: Promptmcps: [icm-readonly] # or [icm-full] when state changes are required
powerreview — PR review tooling
Use for: authoritative PR review workflow — sync threads from the remote provider, draft replies, vote (approve / wait-for-author), submit reviews, create fix branches (powerreview/fix/thread-{threadId}), and apply other automated PR actions. Do not use for: generic AzDO operations not specific to review state — prefer azdo. Step-level reference:
steps:- name: respond-to-commenttype: Promptmcps: [powerreview]
debug-mcp — MCP debugging harness
Use for: smoke-testing the engine's MCP plumbing during diagnostics (used by Debug/debug-general-validation.yaml). Do not use for: production work — this is a developer harness, not a real capability surface. Step-level reference:
steps:- name: smoke-test-mcptype: Promptmcps: [debug-mcp]
Inline-only MCPs (declare in top-level mcps:)
These are NOT in the global registry. You MUST declare each one your orchestration uses in its top-level mcps: block before referencing it from a step.
The inline-only set in this workspace: workiq, zakira, recall, context7, microsoft-learn, playwright, orchestra, filesystem.
workiq — Microsoft 365 + Azure DevOps super-MCP
Use for:
- Calendar: list/find/inspect upcoming meetings, attendees, organizers,
acceptance status, recurrence, free/busy.
- Mail: search and read Outlook mail; thread/conversation lookup.
- Teams: chat messages, channel posts, meeting transcripts.
- People / contacts: resolve a name to an attendee record, look up
organizational hierarchy, find teammates.
- Azure DevOps: pull requests (metadata, comments, diffs, threads),
work items, repositories, iterations.
Do not use for: anything outside Microsoft 365 / AzDO.
Top-level definition:
mcps:- name: workiqtype: localcommand: npxarguments:- "-y"- "@microsoft/workiq"- mcp
Step-level reference:
steps:- name: find-next-meetingtype: Promptmcps: [workiq]
zakira — persistent state / memory (Zakira.Exchange)
Use for: persisting structured state across orchestration runs (category + key with arbitrary JSON-ish data plus free-form reason); "have I already processed this PR / meeting / item?" patterns; append-only history logs scoped to an orchestration.
Do not use for: live data fetch — it's a memory store, not a query layer.
Shared database path: every orchestration must point Zakira at {{env.XDG_CONFIG_HOME}}/orchestra/zakira.db via the --db flag so that state is shared across all orchestrations on the host. Without --db, Zakira falls back to a path relative to the host process cwd (which is unpredictable and won't be shared with other orchestrations).
PowerShell Script steps that shell out to dnx zakira.exchange must use the same path: declare it once as an orchestration variable (e.g. vars.zakiraDb: "{{env.XDG_CONFIG_HOME}}/orchestra/zakira.db") and pass it as --db <path> to the CLI.
Top-level definition:
mcps:- name: zakiratype: localcommand: dnxarguments:- Zakira.Exchange- "--yes"- "--"- "--db"- "{{env.XDG_CONFIG_HOME}}/orchestra/zakira.db"- mcp- "--category"- "{{vars.zakiraCategory}}"
recall — live web research (Zakira.Recall)
Use for: open-web search, broad fact-finding, fresh research where the agent determines its own search/follow-up strategy.
Do not use for: documentation of specific named libraries (prefer context7); Microsoft documentation (prefer microsoft-learn).
Top-level definition:
mcps:- name: recalltype: localcommand: dnxarguments:- Zakira.Recall- "--yes"- --- "mcp"
context7 — library / framework documentation (REMOTE)
Use for: looking up usage docs and code snippets for a specific named library or framework; pre-flight research before generating code that depends on a third-party library.
Do not use for: general web search (prefer recall); Microsoft- specific docs (prefer microsoft-learn).
Top-level definition:
mcps:- name: context7type: remoteendpoint: "https://mcp.context7.com/mcp"
Note:context7is a remote MCP — do not use anpx-based localcommand. The endpoint above is the canonical Context7 MCP service.
microsoft-learn — Microsoft documentation
Use for: anything documented on learn.microsoft.com — Azure, .NET, Windows, PowerShell, M365 admin, Power Platform, etc.
Do not use for: non-Microsoft third-party libraries (prefer context7).
Top-level definition:
mcps:- name: microsoft-learntype: remoteendpoint: "https://learn.microsoft.com/api/mcp"
playwright — browser automation
Use for: scraping or automating a site that has no API; reproducing a bug that requires browser interaction; headless screenshot / DOM- state capture.
Do not use for: anything that has a documented API or MCP — those are cheaper and more reliable.
Top-level definition:
mcps:- name: playwrighttype: localcommand: npxarguments:# Force the public npm registry so `@playwright/mcp@latest` resolves to the current# build (with --browser); a machine default pointing at an internal proxy can serve a# stale build that lacks --browser and crashes the MCP at startup. --yes = non-interactive.- "--yes"- "--registry=https://registry.npmjs.org/"- "@playwright/mcp@latest"- "--headless"
orchestra — Orchestra control/data plane introspection
Use for: querying status of past orchestration runs; saving small files via the engine's helpers; working with Orchestra's own state from inside an orchestration; listing pending human-in-the-loop waits and submitting responses to them (so an LLM agent can drive its own approval flows or feed answers back into a paused run).
Do not use for: anything other than Orchestra introspection. The endpoint {{server.url}}/mcp/data is not a Microsoft Graph endpoint, not a generic data API, and not a passthrough to anything else.
Tools exposed (data plane):
| Tool | Purpose | |
|---|---|---|
list_orchestrations | Discover registered orchestrations and their inputs | |
invoke_orchestration | Start a run (sync or async). Sync mode accepts detail (summary / compact / full) controlling per-step content size. Sync stepResults now include errorMessage per step. | |
get_orchestration_status | Poll a run's status / fetch results. Accepts detail; per-step results include errorMessage, contentLength, truncated, hasRawContent. | |
get_orchestration_step | Fetch full or paginated content of one step. Works for BOTH active (in-flight) and persisted runs. Use when a step's content was truncated in get_orchestration_status, or to drill into a sibling step of an active run mid-flight. Supports part (content/rawContent/errorMessage/all) and offset/length paging. Response carries source (active / persisted) and runStatus (the overall run status, distinct from the step's status). | |
list_child_runs | List runs spawned within the caller's execution chain. Inside an orchestration, defaults to the caller's whole subtree via stamped headers; external callers must pass parentExecutionId or rootExecutionId. Supports status filter and limit/offset. | |
cancel_orchestration | Cancel a running execution | |
list_pending_inputs | List runs awaiting human input (Approval steps and orchestra_request_user_input tool calls). Optionally filter by orchestration name. | |
respond_to_input | Submit a choice and/or reply to unblock a waiting run. Validates against any declared choices and rejects responses for runs with no active wait (e.g., after host restart for engine-tool waits). |
Response detail levels (for `invoke_orchestration` sync and `get_orchestration_status`):
summary— Per-stepcontentis omitted; metadata (contentLength,truncated,hasRawContent,errorMessage,savedFiles) is preserved. Best when you only need failure diagnostics.compact(default) — Per-step content truncated to ~8000 chars with... (truncated)marker + structured metadata. Top-level summary truncated to ~16000 chars.full— No truncation. Use sparingly; responses can exceed 100 KB.
When a step's content is truncated and you need the full body, call get_orchestration_step(executionId, stepName, part: "content", length: -1) (or offset/length for paging).
Active-run drill-in. get_orchestration_step now serves data from in-flight runs too, via the host's active execution table. The response shape distinguishes live vs. terminal data:
source: "active"+runStatus: "running"— the overall run is still going. The targeted step has completed and its content is served from in-memory partial records.source: "persisted"+runStatus: "succeeded"|"failed"|"cancelled"— the run terminated; data is fromrun.json.error: "step-in-flight"— the targeted step is currently executing OR hasn't started yet. The response includes:runStatus(overall run status)stepStatus(runningif it's the current step,pendingotherwise)currentStep(what's running right now)completedStepNames(siblings you CAN drill into right now)totalSteps/completedSteps
The companion signal: get_orchestration_status for active runs now returns completedStepNames, telling you which sibling steps you can drill into via get_orchestration_step without trial-and-error.
Self-healing pattern (in-process): When a parent orchestration uses a type: Orchestration step, the parent's later steps can drill into the child via template bindings without ANY MCP call:
- name: attempt-1type: Orchestrationorchestration: build-and-testmode: sync- name: repairtype: PromptdependsOn: [attempt-1]systemPrompt: |Previous attempt {{attempt-1.executionId}} failed with status {{attempt-1.status}}.Errors per step:{{attempt-1.steps}}Build step output (for context):{{attempt-1.steps.build.output}}Test step error:{{attempt-1.steps.test.error}}
These bindings access untruncated, in-memory data and work for failed/cancelled child runs.
Top-level definition:
mcps:- name: orchestratype: remoteendpoint: "{{server.url}}/mcp/data"
Step-level reference for HITL flows:
steps:- name: triage-pending-runstype: PromptsystemPrompt: |You are the on-call orchestrator. Use list_pending_inputs to find runsawaiting human input, decide whether each one can be auto-resolved,and use respond_to_input to unblock the ones you can answer.userPrompt: "Triage all pending orchestration approvals."mcps: [orchestra]
filesystem — sandboxed local file I/O
Use for: reading or writing files inside a known working directory; creating sub-directories, listing, deleting, moving files.
Do not use for: reaching outside the sandboxed working directory (the MCP refuses paths outside its argument root); filesystem operations on a remote machine (this is local-only).
Top-level definition:
mcps:- name: filesystemtype: localcommand: npxarguments:- "-y"- "@modelcontextprotocol/server-filesystem"- "{{param.workingDirectory}}"
The last argument is the sandbox root — every path the MCP touches must be a descendant of that directory. Pass it via an orchestration input (workingDirectory) so the caller controls the sandbox.
Hard rules of usage
- Pre-registered MCPs need NO top-level definition. If you list a
pre-registered name in a step's mcps: array, do not also add it to the orchestration's top-level mcps: block. Re-declaring it is redundant noise.
- Inline-only MCPs MUST be defined in the top-level `mcps:` block
with full configuration before any step references them.
- Step `mcps:` is always a list of names (strings) referencing
either pre-registered names or names defined in the top-level mcps: block. Never inline a definition at step scope.
- Define each inline MCP at most once per orchestration in the
top-level mcps: block. Multiple steps reference it by name.
- If a step needs no MCP, omit `mcps:` on that step entirely.
Don't include it as an empty list.
- Never invent an MCP name or endpoint. If the task seems to need
a capability not in this catalog, write a # TODO: note in the orchestration's description: rather than fabricating an MCP.
- Endpoints are not interchangeable.
{{server.url}}/mcp/databelongs toorchestraonly.http://localhost:5113/mcp/<name>belongs to the M365 HTTP proxy
MCPs (calendar, mail, me, m365-copilot); the path segment must match the MCP name exactly. (And these are pre-registered, so you should not be writing endpoints for them at all — just reference the name from a step.)
https://mcp.context7.com/mcpbelongs tocontext7only.https://learn.microsoft.com/api/mcpbelongs to
microsoft-learn only.