partner-center-mcp
The partner-center-mcp server is a knowledge and code-generation assistant for the Microsoft Partner Center REST API. It helps you discover, build, validate, and debug Partner Center API integrations — without holding credentials or making live API calls.
Scenario Discovery & Reference
Browse supported REST scenarios, optionally filtered by area (customers, subscriptions, orders, licenses, invoicing, etc.)
Get full details for a specific scenario: endpoint, auth, headers, ready REST examples, and gotchas
Look up REST reference info: base URLs, required headers, versioning, sandbox, rate limits, and national cloud differences
Search Microsoft Learn Partner Center docs beyond the curated knowledge pack
Code Generation & Request Building
Generate ready-to-run REST calls in
curl,C#,TypeScript, orPowerShellwith optional auth/retry/pagination helpersBuild a ready-to-send request with path placeholders filled, auto-generated correlation headers, and a body skeleton
Validation & Linting
Lint a REST call (method, URL, headers, auth) against known scenarios to catch wrong methods, missing headers, or retired audiences
Lint auth/client code for deprecated patterns like
graph.windows.net, ADAL, archived SDK, or AzureAD PowerShell
Authentication Guidance
Get current auth guidance for app-only or app+user flows, per national cloud, with GDAP and MFA enforcement notes
Error Diagnosis & Debugging
Decode a Partner Center error code or HTTP status: meaning, causes, and remediation steps
Paste a raw error response (JSON or text) to decode it, link likely scenarios, and extract the correlation ID for support
Describe a symptom in natural language and get likely causes, fixes, and relevant scenarios
Migration
Translate archived .NET SDK code into equivalent current REST scenarios
Workflow Planning
Step-by-step workflows for New Commerce purchases, billing-ownership transfers, GDAP onboarding, and invoice reconciliation
Reference Data
Look up enum values (e.g.,
billingCycle,termDuration,subscriptionStatus)Field dictionary for Partner Center resources (Customer, Subscription, Order, Invoice, CartLineItem)
View deprecations and deadlines: MFA enforcement,
graph.windows.netretirement, DAP→GDAP migration, SDK retirements, etc.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@partner-center-mcpHow do I authenticate to Partner Center REST API?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
partner-center-mcp
Building against the Partner Center REST API means living in Microsoft Learn. Two hundred odd endpoint pages, an archived .NET SDK that still turns up in search results, and error codes that tell you almost nothing on their own.
This MCP server puts that knowledge next to your agent. Ask how to cancel a subscription and you get the verified method, path, headers, a working code sample, and the constraints the page actually warns about. It holds no credentials and never calls Partner Center. Every answer comes from a bundled knowledge pack, with a cached Microsoft Learn search as the fallback.
Unofficial, community project. Not affiliated with, sponsored, or endorsed by Microsoft. "Partner Center" and "Microsoft" are trademarks of Microsoft, used here only descriptively.
Why
Microsoft archived the Partner Center .NET SDK (3.4.0) in June 2023 and points partners at the
REST APIs instead. Plenty of code still hasn't moved. The retired graph.windows.net audience
keeps producing 401 / 900420, and from 2026-04-01 App+User API calls enforce MFA.
So the server does two things. It shows you the current REST and auth patterns, and it explains the errors you hit on the way there.
Related MCP server: weclapp-api-knowledge-mcp
How it works
Your MCP host (Claude Code, Cursor, Copilot, VS Code) talks to the server over MCP, on stdio by default or HTTP if you'd rather. The server reads from a knowledge pack that is zod-validated at load and anchored to official Learn pages. When the pack has no answer it falls back to a cached doc search.
A typical call: the agent picks a tool such as pc_generate_call, the server looks the scenario up
in the pack, and back comes the method, path, headers, a ready code sample, and the gotchas, each
carrying the docUrl it was verified against.
Run
npx partner-center-mcpNo configuration, API keys, or network access to Partner Center required.
Requires Node.js 20 or newer. (0.9.0 dropped Node 18, which reached end of life in April 2025.)
Add to your MCP host
The server speaks MCP over stdio, so any MCP-capable host works. There's nothing host-specific to install. Use whichever config your host expects:
VS Code (.vscode/mcp.json) and Visual Studio (.mcp.json):
{ "servers": { "partner-center": { "command": "npx", "args": ["-y", "partner-center-mcp"] } } }GitHub Copilot. Copilot reads the same .vscode/mcp.json (VS Code) / .mcp.json (Visual
Studio) shown above; no extra config needed.
Cursor (.cursor/mcp.json) and Windsurf (~/.codeium/windsurf/mcp_config.json):
{ "mcpServers": { "partner-center": { "command": "npx", "args": ["-y", "partner-center-mcp"] } } }Claude Code:
claude mcp add partner-center -- npx -y partner-center-mcpClaude Desktop (claude_desktop_config.json), Cline, and Zed use the same
mcpServers shape as Cursor above.
Tip: also add the Microsoft Learn MCP server (
https://learn.microsoft.com/api/mcp) alongside this one for broad documentation search.
Remote / HTTP (optional)
Prefer a hosted endpoint over stdio? Run the Streamable HTTP variant:
PORT=3000 npx -p partner-center-mcp partner-center-mcp-http
# MCP endpoint: POST http://localhost:3000/mcp • health: GET /healthzThe endpoint has no authentication of its own, so it binds 127.0.0.1 by
default. Request bodies are capped at 1 MiB, and a browser Origin has to be
loopback or explicitly allowed, which is what keeps a random web page from
driving your local server.
Variable | Default | What it does |
|
| Port to listen on. |
|
| Interface to bind. Set |
| none | Comma-separated browser origins allowed in addition to loopback. |
|
| Largest accepted request body. |
Tools
Tool | Purpose |
| List supported REST scenarios, optionally filtered by |
| Full detail for one scenario: method, path, headers, examples, gotchas. |
| Emit a current REST call ( |
| Lint a REST call (method, URL, headers, auth) against the known scenarios. |
| The ordered New Commerce purchase workflow: product → SKU availability → cart → checkout → subscriptions. |
| Translate archived .NET SDK code into the equivalent REST scenario(s). |
| Current auth guidance for app-only / app+user, per national cloud, with GDAP + MFA notes. |
| Lint an auth/client snippet for retired patterns (graph.windows.net, ADAL, archived SDK, AzureAD PS). |
| Build a ready-to-send request: fills path placeholders, generates |
| What you can do to a subscription in its current state: legal operations, the field each precondition reads, and the errors a failed precondition returns. |
| Ordered call sequence for one lifecycle change: seats up/down, upgrade, cancel, renewal changes, suspend, reactivate, migrate, transfer. |
| Ordered call sequence from cart to provisioned subscriptions, with the cancellation and add-on branches. |
| Ordered billing-ownership transfer workflow (create → poll → verify). |
| Ordered GDAP onboarding workflow (create → approve → verify) over Microsoft Graph. |
| Ordered CSP customer onboarding (account linking): invite → verify relationship → confirm agreement → transact. |
| Ordered user onboarding: create user → assign licenses → grant roles → verify. |
| Ordered user offboarding: remove licenses → strip roles → delete user (30-day restore window). |
| Ordered reconciliation workflow (invoice → billed/unbilled line items → statement). |
| Decode an error code: causes, remediation, and the scenarios it commonly hits. |
| Paste a raw error response → decoded code, likely scenarios, and the correlation id for support. |
| Map a symptom to likely causes, fixes, and relevant scenarios. |
| Look up enum values (billingCycle, termDuration, targetView, transitionType, status, …). |
| Field dictionary for resources (Customer, Subscription, Order, Invoice, migration schedules, …). |
| Deprecations & deadlines (MFA enforcement, graph.windows.net, v1→v2 reconciliation, …). |
| For any scenario, the ordered calls that produce the ids its path needs, and the parameters you supply yourself. |
| What changed between pack releases: scenarios added, removed, or whose route, auth, fields or constraints moved. |
| Fetch live Microsoft Learn excerpts. The fallback when the curated pack has no answer. |
| Base URLs, headers, versioning, sandbox, rate limits, national-cloud differences. |
Every tool carries the metadata a calling agent needs: a title, a description that says when to
use it and which sibling to prefer instead, a description on every input parameter, a declared
outputSchema, and MCP behaviour annotations. All 28 are readOnlyHint: true and
destructiveHint: false, because the server holds no credentials and calls no Partner Center
endpoint. It only reads the bundled pack. Three tools break idempotentHint or openWorldHint:
pc_search_docs and pc_get_scenario with enrich: true both reach Microsoft Learn, and
pc_build_request mints a fresh MS-RequestId on every call.
Responses share one envelope. { ok, data } on success, { ok: false, error, suggestions? } on
failure, returned as structuredContent and validated against each tool's outputSchema by the
MCP SDK.
Coverage
Scenarios cover:
Customers. Identity and profiles, search, users and directory roles, relationship removal, agreements and consent, self-serve policies.
Subscriptions. The whole lifecycle: seats up and down, upgrade, cancel, renewal changes, suspend and reactivate, add-ons, New Commerce migration, transfer.
Orders and carts. Through to provisioning status, not just checkout.
Devices. Autopilot batches and configuration policies, end to end.
Billing and pricing. Azure consumption usage at every level, spending budgets and overage, invoices and reconciliation line items, service costs, margins and growth margins, price sheets, the offer matrix, FX rates, and promotion eligibility.
Analytics. Subscription, indirect reseller, referral and search analytics, plus the three separate licence usage and deployment families.
Plus catalog and products, licenses, address and domain validation, audit, support, security and MFA, and partner profiles.
Every scenario carries the docUrl it was verified against and the date it was last checked, and
185 of them ship the response example their page publishes, so field names and nesting can be read
off rather than guessed at.
National clouds covered: commercial, 21Vianet (China), and US Gov.
Lifecycle changes come with their preconditions, not just their endpoints. pc_explain_lifecycle
returns the state machine: which operation is legal from which state, the field to read off the
live subscription first (cancellationAllowedUntilDate, autoRenewEnabled, suspensionReasons),
and the error you get when the precondition fails.
The pack is also browsable as MCP resources (pc://scenarios, pc://errors, pc://auth,
pc://reference, pc://sdk-map, pc://enums, pc://deprecations, pc://resources,
pc://lifecycle, pc://examples, pc://history, pc://scenario/{id}) and three prompts (migrate-sdk, diagnose-issue,
plan-purchase) for hosts that surface them.
Alongside the scenarios it ships enum values, a resource field dictionary, and a deprecations and
deadlines timeline. npm run export turns the whole pack into an OpenAPI 3.0 spec and a Postman
collection.
Examples
Decode an error you hit in production:
// pc_lookup_error { "code": "900420" }
{
"httpStatus": 401,
"errorCode": "900420",
"description": "The audience in the token is invalid and is no longer supported in Partner Center API.",
"causes": ["Token requested with the retired graph.windows.net audience"],
"remediation": "Request the token with resource https://api.partnercenter.microsoft.com ...",
"docUrl": "https://learn.microsoft.com/partner-center/developer/deprecate-azure-active-directory-graph-token"
}Lint old auth/client code before you ship it:
// pc_check_auth { "code": "new AuthenticationContext(); get(\"https://graph.windows.net\"); partner.Customers..." }
{
"findings": [
{ "severity": "error", "message": "Uses the retired graph.windows.net audience; Partner Center returns 401 / 900420.", "fix": "Request the token with resource https://api.partnercenter.microsoft.com." },
{ "severity": "warning", "message": "Appears to use ADAL, which is deprecated.", "fix": "Use MSAL with the secure application model." }
],
"clean": false
}Catch a wrong call before you make it:
// pc_validate_request { "method": "POST", "url": "/v1/customers/abc/subscriptions", "headers": { "Authorization": "Bearer x" } }
{
"ok": false,
"findings": [
{ "severity": "error", "message": "Path matches a known scenario but the method POST is wrong; expected GET.",
"fix": "Use GET for /v1/customers/{customer-id}/subscriptions." }
]
}Develop
npm install
npm test
npm run buildThe knowledge pack lives in data/ (date-versioned; each record carries a docUrl and
lastVerified). Schemas in src/knowledge/schema.ts validate every
file at load time, so malformed or drifted data fails fast.
Verification runs in two halves, one offline and one networked.
npm run check-pack is the offline half and runs on every PR. It compares each scenario's
method, path, and headers against verification/doc-facts.json, a committed snapshot of what
the Learn pages actually say, and lists documented endpoints that still have no scenario.
npm run check-docs is the weekly networked half. It re-fetches every referenced page and diffs it
against the snapshot, keying drift off the source commit each Learn page embeds. It fails on a
dead, moved, or replaced page, on a page that became unreadable, and when a field the pack depends
on changed. The weekly GitHub Action opens an issue when that happens. An upstream edit that
touched only prose is reported without failing the run. npm run check-docs:update does the same
fetch and rewrites the snapshot; npm run docfacts:refresh rebuilds it from scratch across the
whole developer/ section of the Learn table of contents.
For the rest: npm run eval runs a deterministic golden-case suite, npm run eval:llm (needs
ANTHROPIC_API_KEY) checks that a real model picks the right tool for a question, and
npm run export emits the OpenAPI spec and Postman collection.
npm run read-doc -- <slug> prints one Learn page as plain text, which is how new scenarios get
authored. npm run examples:refresh re-collects the response examples; it merges rather than
overwrites, so a run that Learn rate-limits cannot lose the previous one's work.
The .NET server in dotnet/ exposes the same 28 tools from the same data/ pack and
ships to NuGet as tunahanaliozturk.PartnerCenterMcp. dotnet test PartnerCenterMcp.Tests runs its
suite, one test of which asserts the two servers expose the same tool names.
npm run pack-diff reports what changed since the last recorded release, comparing a fingerprint
of every scenario's route, auth, headers, fields, response shape and gotchas. Re-verifying a
scenario is deliberately not a change. npm run pack-diff -- --record X.Y.Z writes the result into
data/history.json, which is what the pc_diff_pack tool serves.
Contributing
New scenarios and doc-accuracy fixes are very welcome. See CONTRIBUTING.md. This is an unofficial, community project and is not affiliated with Microsoft.
Available Tools
29 toolspc_auth_guidanceGet authentication guidanceARead-onlyIdempotent
Return how to authenticate against Partner Center for a given token flavour and national cloud: the token resource and authority to use, the ordered steps of the flow, Secure Application Model and MFA requirements, and what is deprecated. Use this when deciding or setting up how to get a token. To check whether existing code already uses a retired pattern, use pc_check_auth instead; to decode a 401/403 you already hit, use pc_decode_error. Read-only, offline, deterministic. Returns guidance only — it issues no tokens, contacts no identity provider, and handles no secrets.
| Name | Required | Description | Default |
|---|---|---|---|
| cloud | No | Sovereign cloud whose endpoints and authority to return. Defaults to "commercial". Choose "china-21vianet" or "us-gov" only for tenants in those clouds — their authorities and feature availability differ. | |
| authType | Yes | Which token flavour to describe. "app+user" is the Secure Application Model refresh-token flow required by most Partner Center operations; "app-only" is application permissions, which only a subset of endpoints accept. Required — check a scenario's authType with pc_get_scenario if unsure. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
| suggestions | No | Valid values to retry with, returned alongside `error` when the requested identifier was not found. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond annotations by adding 'offline', 'deterministic', and 'issues no tokens, contacts no identity provider, avoids handling secrets', giving a precise safety profile. No contradictions with the readOnlyHint/idempotentHint/destructiveHint annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loading the core purpose, then usage guidance, then behavioral caveats. Every sentence contributes distinct value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists to explain return values, and annotations cover safety. The description adds the missing pieces: when to use it, what it covers, and that it is offline and side-effect-free. It also provides clear alternatives, making it complete for agent decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed enum descriptions for both cloud and authType. The description merely maps these to domain terms ('token flavour', 'national cloud'), adding no syntax beyond the schema, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Return') and clear resource (authentication guidance for Partner Center), scoped by token flavour and national cloud. It explicitly distinguishes itself from siblings by naming pc_check_auth and pc_decode_error.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool ('Use this when deciding or setting up how to get a token') and provides concrete alternatives for other scenarios ('To check whether existing code already uses a retired pattern, use pc_check_auth instead; to decode a 401/403 you already hit, use pc_decode_error').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_build_requestBuild a ready-to-send requestARead-only
Assemble one Partner Center REST request as structured data: the resolved URL with your params substituted into the path placeholders, concrete headers (Bearer plus a freshly generated MS-RequestId on writes), and a request-body skeleton derived from the operation's documented fields. Use this when you want an object to send from your own client. For a language-specific code snippet use pc_generate_call instead, and to lint a request you already wrote use pc_validate_request. Read-only and offline: the request is constructed and handed back, never sent, and the Authorization header is a <access-token> placeholder — no credentials are read or required. Not idempotent in one respect: a random MS-RequestId is minted on each call for write operations, so reuse the returned value across retries rather than calling again. Unsupplied placeholders are reported in missingParams rather than failing, and an unknown id returns ok:false with suggestions.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Exact scenario id in kebab-case, e.g. "create-cart". Case-sensitive; discover ids with pc_list_scenarios or any pc_plan_* tool. | |
| params | No | Values for the {placeholder} segments in the operation's path, as a flat string-to-string map — e.g. { "customer-id": "c7f6e4b1-...", "subscription-id": "..." }. Keys are matched loosely, so "customer-id", "customerId", and "customerid" all work. Values are URL-encoded for you. Omit it, or leave some out, to get the URL with those placeholders intact and the names listed in `missingParams`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
| suggestions | No | Valid values to retry with, returned alongside `error` when the requested identifier was not found. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: the request is never sent, the Authorization header is a placeholder, a fresh MS-RequestId is minted on each call for write operations (explaining the idempotentHint=false), unsupplied placeholders appear in missingParams instead of failing, and unknown IDs return ok:false with suggestions. This richly supplements the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single structured paragraph with front-loaded purpose, followed by usage guidance, then important caveats. Every sentence earns its place, and despite being ~160 words, it packs detailed behavior without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (request assembly, auth headers, non-idempotency, error handling) and the existence of an output schema, the description covers all essential aspects: what gets returned (URL, headers, body skeleton), the non-sending nature, authentication behavior, retry guidance, and error behavior. It is complete enough for an agent to invoke correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the schema already describes both parameters at 100% coverage, the description adds meaningful semantics: values are URL-encoded automatically, key matching is loose ('customer-id', 'customerId', 'customerid' all work), and omitting params yields the URL with placeholders intact plus missingParams. This goes well beyond the schema, making it easy to use correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and object: 'Assemble one Partner Center REST request as structured data,' and enumerates the output components. It clearly differentiates from siblings by naming pc_generate_call and pc_validate_request as alternatives, so an agent can easily distinguish this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'Use this when' and alternatives are provided: 'For a language-specific code snippet use pc_generate_call instead, and to lint a request you already wrote use pc_validate_request.' It also suggests how to discover scenario IDs with pc_list_scenarios or pc_plan_* tools, giving clear contextual direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_check_authLint auth code for retired patternsARead-onlyIdempotent
Scan a Partner Center auth or client code snippet for retired and deprecated patterns — the graph.windows.net token audience, ADAL, the archived .NET SDK, and the AzureAD/MSOnline PowerShell modules — and return the severity, explanation, fix, and doc link for each hit. Use this to triage existing code before or after a 401. For guidance on what to build instead, use pc_auth_guidance; to translate archived SDK calls into REST, use pc_migrate_from_sdk. Read-only, offline, deterministic pattern matching: the snippet is not executed, nothing is sent anywhere, and no code is modified. A clean snippet returns findings: [] with clean: true. Detection is regex-based, so a clean result is not a guarantee of correctness.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The code to lint, pasted as-is. Any language — C#, TypeScript, PowerShell, or a raw token request URL. A partial snippet is fine: only the auth-related lines matter, and matching is case-insensitive. Secrets are matched against locally and never transmitted, but paste redacted code where you can. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description discloses crucial behavioral traits: 'Read-only, offline, deterministic pattern matching: the snippet is not executed, nothing is sent anywhere, and no code is modified.' It also explains output behavior ('A clean snippet returns findings: [] with clean: true') and the limitation ('Detection is regex-based, so a clean result is not a guarantee of correctness').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and each sentence earns its place: purpose, usage, alternatives, safety guarantees, output format, and a caveat. It is front-loaded with the core action and tapers into additional context, with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter linting tool with a detailed schema, clear annotations, and an output schema, the description is complete. It covers what, when, how, safety, output expectations, and limitations. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers 100% of parameter information with a rich description (any language, partial snippet fine, case-insensitive, secrets not transmitted). The tool description adds little beyond that, mentioning 'snippet' in context but not introducing new parameter semantics. Baseline 3 is appropriate because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Scan') and resource ('Partner Center auth or client code snippet for retired and deprecated patterns'), listing exact patterns (graph.windows.net, ADAL, archived .NET SDK, AzureAD/MSOnline modules). It distinguishes itself from siblings by explicitly naming pc_auth_guidance and pc_migrate_from_sdk.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear usage context: 'Use this to triage existing code before or after a 401.' It also names alternatives with specific guidance: 'For guidance on what to build instead, use pc_auth_guidance; to translate archived SDK calls into REST, use pc_migrate_from_sdk.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_decode_errorDecode a raw error responseARead-onlyIdempotent
Take a raw Partner Center error response and decode it: extract the error code, HTTP status, and MS-CorrelationId, then return the documented causes, remediation, likely scenarios, and the exact wording to quote in a support request. This is the right first tool when something failed and you have the response in hand. Use pc_lookup_error instead when you have already isolated a clean code, and pc_diagnose when you only have a prose description with no response body. Read-only, offline, deterministic parsing — the input is never sent anywhere and no request is replayed. Always returns ok:true: an unrecognised code still yields the parsed fields, status-based candidates, and a note on what to try next.
| Name | Required | Description | Default |
|---|---|---|---|
| error | Yes | The error response pasted verbatim — a JSON body such as {"code":"900400","description":"..."}, or unstructured log text containing the failure. Include the response headers if you have them so the MS-CorrelationId can be recovered. Partial or malformed input is handled: whatever cannot be parsed is reported as null. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint), the description discloses that the tool is offline and deterministic, never sends input anywhere, and never replays requests. It also explains the edge-case behavior of always returning ok:true with parsed fields and a note for unrecognized codes. This adds behavioral context well beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, usage trigger, alternatives, behavioral guarantees, and return behavior. It is front-loaded with the core purpose and uses concise language without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (handles raw, partial, or malformed input) and that an output schema exists, the description nevertheless covers input expectations, output guarantees (always ok:true), and follow-up guidance (note with next steps). It is fully self-contained for an agent to decide when and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage, with a detailed description of the 'error' parameter covering verbatim input, JSON or unstructured text, headers, and malformed input handling. The tool description itself does not add significant meaning about the parameter beyond what the schema already states, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('decode') and resource ('raw Partner Center error response'), and details exactly what is extracted (error code, HTTP status, MS-CorrelationId) and returned (causes, remediation, scenarios, support wording). It explicitly distinguishes from sibling tools like pc_lookup_error and pc_diagnose, making the tool's unique role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the intended usage context: 'the right first tool when something failed and you have the response in hand.' It also provides clear exclusion criteria by naming alternatives (use pc_lookup_error when you have a clean code, pc_diagnose when you have only a prose description). This is textbook when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_diagnoseDiagnose a symptomARead-onlyIdempotent
Match a Partner Center problem described in plain language against the documented errors and return the likely candidates plus an ordered fix path. Use this when you have no error body and no code — just a description of what is going wrong. If you have the raw response use pc_decode_error, and if you have a clean code use pc_lookup_error; both are far more precise than this. Read-only, offline, deterministic keyword matching, so the candidate list is a heuristic shortlist and can be empty or noisy. Always returns ok:true; nextSteps is a fixed checklist and is returned even when nothing matched.
| Name | Required | Description | Default |
|---|---|---|---|
| symptom | Yes | What is going wrong, in plain language — e.g. "checkout returns 400 for NCE carts in Germany" or "token works for Graph but Partner Center says unauthorized". Matching is keyword-based and case-insensitive, so include concrete nouns: the operation, the HTTP status, error text. Any codes or statuses in the text are matched directly. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description discloses that matching is heuristic, keyword-based, offline, deterministic, and that results can be empty or noisy. It also notes the always-ok:true return and fixed nextSteps checklist even on no match, providing rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, each serving a distinct purpose: purpose, usage, alternative tools, and behavioral caveats. It is front-loaded with the core function and remains concise without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has a single parameter, an output schema, and rich annotations, the description covers all essential aspects: what it does, when to use it, how it behaves, and what it returns. There are no significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage of the single parameter 'symptom' with examples and keyword-matching details. The description adds usage context but no additional parameter syntax or format nuances beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool matches a plain-language Partner Center problem against documented errors and returns candidates plus an ordered fix path. It explicitly contrasts with sibling tools pc_decode_error and pc_lookup_error, making its specific role unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this tool when there is no error body and no code, and directs users with raw responses or clean codes to more precise alternatives. This gives clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_diff_packSee what changed between knowledge pack releasesARead-onlyIdempotent
Return the scenarios added, changed, or removed across releases of this pack, newest first. Use it to find out what moved since the version you last built against: a changed scenario means its route, auth, headers, request fields, response shape, or documented constraints are not what they were. This tracks THIS PACK, which follows Microsoft Learn. It is the closest thing here to an API changelog, but it is not Microsoft's. For deprecations and enforcement deadlines use pc_whats_new instead; for one scenario's current detail use pc_get_scenario. Read-only, offline, deterministic.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Only report releases that touched this scenario id. Combine with `since` to ask whether one operation moved. | |
| since | No | Only report releases after this pack version, e.g. "0.15.0". Omit for the full recorded history. A version with no recorded release comes back as ok:false listing the versions that do exist. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnly, idempotent, non-destructive), the description adds meaningful behavioral traits: 'Read-only, offline, deterministic.' It also explains what counts as a 'changed scenario' (route, auth, headers, request fields, response shape, constraints) and clarifies the tool's relationship to Microsoft Learn. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded. The first sentence states the core function; the second explains use case; the third provides alternatives; final sentence gives safety traits. Every sentence serves a distinct purpose with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description need not detail return format. It covers purpose, usage, alternatives, parameter interplay, and behavioral traits. For a moderate-complexity tool with good schema/annotations, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for both parameters, so baseline is 3. The description adds value by suggesting a use case: 'Combine with `since` to ask whether one operation moved,' and discloses error behavior: 'A version with no recorded release comes back as ok:false listing the versions that do exist.' This goes beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Return the scenarios added, changed, or removed across releases of this pack, newest first.' It clearly distinguishes this tool from siblings by naming alternatives (pc_whats_new, pc_get_scenario) and stating what this tool uniquely provides ('closest thing here to an API changelog').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use: 'Use it to find out what moved since the version you last built against.' It gives clear exclusions and alternatives: 'For deprecations and enforcement deadlines use pc_whats_new instead; for one scenario's current detail use pc_get_scenario.' This is unambiguous guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_explain_lifecycleExplain the subscription lifecycleARead-onlyIdempotent
Return the subscription lifecycle state machine: which operations (increase-seats, decrease-seats, upgrade, cancel, renew-change, suspend, reactivate, migrate, transfer) are legal from which state, the field to read off the live subscription before attempting each one, the scenario that performs it, and the error codes a failed precondition returns. Use this to answer "what can I do to this subscription right now" before reaching for an endpoint. For the endpoint itself use pc_get_scenario, for an ordered call sequence use pc_plan_subscription_change, and to decode a rejection use pc_lookup_error. Read-only, offline, deterministic. Omit operation for the whole machine.
| Name | Required | Description | Default |
|---|---|---|---|
| operation | No | Narrow the answer to one operation: increase-seats, decrease-seats, upgrade, cancel, renew-change, suspend, reactivate, migrate, or transfer. Omit to get every operation. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds 'Read-only, offline, deterministic,' which provides extra context beyond annotations (offline and deterministic are not captured by hints). It also describes the behavioral structure (failed preconditions return error codes). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: primary purpose first, then usage guidance, alternatives, and behavior notes. It is slightly verbose due to enumerating all nine operations, but every sentence contributes unique value. The layout is logical and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool returning a state machine, the description covers what is returned, when to use it, alternatives, parameter behavior, and characteristics. The presence of an output schema means return values need not be detailed. Comprehensive for the task.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single `operation` parameter, and the schema description already states that omission returns every operation. The description repeats this guidance ('Omit `operation` for the whole machine') without adding new semantic information, so it stays at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns the subscription lifecycle state machine, enumerates the operations covered, and specifies the exact output components (legal states, fields to read, scenarios, error codes). It distinguishes itself from siblings like pc_get_scenario and pc_plan_subscription_change by positioning itself as the 'what can I do right now' reference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool ('before reaching for an endpoint') and names specific alternatives with their use cases: 'For the endpoint itself use pc_get_scenario, for an ordered call sequence use pc_plan_subscription_change, and to decode a rejection use pc_lookup_error.' This is explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_explain_policyAnswer a question about how Partner Center behavesARead-onlyIdempotent
Answer questions about Partner Center's RULES rather than its endpoints: cancellation windows per product type, what happens when a customer does not pay, how promotion limits are counted, what a GDAP expiry does to subscriptions, how billing and proration work. This is the tool for "why was this refused", "how long do we have", "who is liable", "does this carry over at renewal". For the endpoint that performs an operation use pc_get_scenario; for whether an operation is legal right now use pc_explain_lifecycle; for a specific error code use pc_lookup_error. Read-only, offline, deterministic. Every entry carries the Microsoft Learn page it was read from and the date it was checked.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Narrow to one area: customers, billing, pricing, security, lifecycle, announcements. Omit to search them all. | |
| limit | No | How many answers to return, ranked best first. Defaults to 5; raise it when exploring an area rather than asking one question. | |
| question | No | The question in plain words, e.g. "can I reduce seats on a software subscription" or "customer went bankrupt who pays". Matched against the question each entry answers, then its rule. Omit to list everything in an area. PASS IT IN ENGLISH: the rules are written in the words Microsoft's documentation uses, so a question in another language will not match. Translate the user's question first and answer them in whatever language they asked. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds 'Read-only, offline, deterministic' and 'Every entry carries the Microsoft Learn page it was read from and the date it was checked,' offering provenance and determinism not present in annotations. It does not discuss pagination or error behavior, but with annotations covering safety, the added context is meaningful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is multi-sentence but every sentence serves a purpose: examples of rule types, usage guidance, sibling differentiation, behavioral disclosure, and language warning. It is front-loaded with the core purpose. Slightly long but every clause earns its place, so no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 3 optional params, a thorough schema, annotations, and an output schema, the description fully covers the tool's role. It includes example use cases, explicit sibling exclusions, behavioral traits, data provenance, and language constraints. No major gaps remain for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds valuable guidance beyond the schema: 'Omit to search them all' for area, 'raise it when exploring an area rather than asking one question' for limit, and a critical warning to pass questions in English because 'the rules are written in the words Microsoft's documentation uses.' This significantly enriches parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Answer questions about Partner Center's RULES rather than its endpoints' with concrete examples (cancellation windows, non-payment, promotion limits, GDAP expiry). It clearly distinguishes from sibling tools by naming pc_get_scenario, pc_explain_lifecycle, and pc_lookup_error for different use cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'This is the tool for' and provides example question types. It gives direct alternatives: 'For the endpoint that performs an operation use pc_get_scenario; for whether an operation is legal right now use pc_explain_lifecycle; for a specific error code use pc_lookup_error.' This is unambiguous when-to-use vs. when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_generate_callGenerate REST call codeARead-onlyIdempotent
Emit ready-to-adapt code for one Partner Center scenario in the language you ask for, plus the Secure Application Model token exchange, 429 retry, 202 polling, and pagination boilerplate. Use this when you want code. For a structured method/url/headers/body object to send yourself, use pc_build_request; for the underlying facts and gotchas, use pc_get_scenario. Only current REST is emitted — never the archived .NET SDK. Read-only, offline, deterministic: the code is returned as text and is never executed, and the placeholder credentials it contains are read from environment variables at your end. An unknown id returns ok:false with suggestions listing every valid id.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Exact scenario id in kebab-case, e.g. "create-cart". Case-sensitive; discover ids with pc_list_scenarios or any pc_plan_* tool. | |
| language | Yes | Target language for the snippet. Required — there is no default. "curl", "csharp", and "typescript" come from curated per-scenario examples; "powershell" is generated from the endpoint definition and is therefore more skeletal. | |
| includeHelpers | No | Whether to append the reusable boilerplate — token exchange, 429/Retry-After handling, 202 polling, pagination — as a separate `helpers` field. Defaults to true. Set false when you already have that plumbing and only want the call itself. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
| suggestions | No | Valid values to retry with, returned alongside `error` when the requested identifier was not found. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive, and the description adds substantial context: 'Read-only, offline, deterministic,' 'the code is returned as text and is never executed,' placeholder credentials from environment variables, and the specific error behavior for unknown ids returning suggestions. This goes well beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four dense sentences, each adding unique value: purpose, when to use and alternatives, behavioral constraints, and error behavior. It is front-loaded with the core action and contains no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool complexity, the output schema, and full parameter documentation, the description is complete: it covers purpose, usage timing, explicit alternatives, safety/behavior, and error handling. No essential guidance is missing for an AI agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema describes all three parameters with detailed semantics, including an enum for language and a note that powershell is more skeletal. Since schema coverage is 100%, the description adds little beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Emit ready-to-adapt code for one Partner Center scenario in the language you ask for', providing a specific verb and resource. It distinguishes itself from siblings by explicitly naming pc_build_request and pc_get_scenario, and by noting only current REST is emitted, never the archived .NET SDK.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States 'Use this when you want code' and explicitly directs users to alternatives: 'For a structured method/url/headers/body object to send yourself, use pc_build_request; for the underlying facts and gotchas, use pc_get_scenario.' It also sets a clear exclusion with 'Only current REST is emitted — never the archived .NET SDK.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_get_enumsLook up enum valuesARead-onlyIdempotent
Return the accepted values for a Partner Center enum, each with a note on what it means — billingCycle, termDuration, targetView, segment, transitionType, subscriptionStatus, qualification, agreementType, billingType, provisioningStatus and more. Use this before sending a request body so you send a value the API will accept, rather than guessing a plausible-looking string. For the fields of a whole resource use pc_get_resource; for a pre-filled body skeleton use pc_build_request. Read-only, offline, deterministic. Omitting name returns the index of every enum instead of one enum's values. An unknown name returns ok:false with suggestions listing all valid enum names.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Enum to expand, e.g. "billingCycle" or "subscriptionStatus". Matched case-insensitively. Omit it to list every available enum with its description and value count, then call again with the one you want. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
| suggestions | No | Valid values to retry with, returned alongside `error` when the requested identifier was not found. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description adds meaningful context: 'offline, deterministic', the index returned when name is omitted, and the error shape with suggestions for unknown names. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with each sentence serving a distinct purpose: primary function, usage context, sibling alternatives, behavioral notes. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one optional parameter) and the description covers all key aspects: what it returns, when to use it, how it behaves with omitted/unknown names, and relationship to siblings. Output schema exists, so return details are already specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema description covers 100% of parameter semantics, including examples, case-insensitivity, and the omit behavior. The tool description reiterates these points but adds little beyond the schema; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states clearly that the tool returns accepted values for a Partner Center enum with explanations, and lists common enum names. It distinguishes itself from sibling tools by explicitly pointing to pc_get_resource and pc_build_request for different needs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance ('Use this before sending a request body... rather than guessing'), names alternatives (pc_get_resource, pc_build_request), and explains behavior for omitted or unknown names. This is strong direction on selecting the correct tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_get_referenceGet API-wide reference factsARead-onlyIdempotent
Return the cross-cutting facts that apply to every Partner Center call rather than to one operation: base URLs, required headers, API versioning, the sandbox account, rate limits, and national cloud differences. Use this for questions about the API as a whole. For a specific endpoint use pc_get_scenario, and for authentication specifics use pc_auth_guidance. Read-only, offline, deterministic. topic is required and the payload shape differs per topic.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Which reference topic to return. "base-urls": host per API surface. "headers": the headers every request should carry and why. "versioning": how API versions are selected. "sandbox": integration sandbox account rules. "rate-limits": throttling behaviour and how to back off. "national-clouds": what differs in the sovereign clouds. Required — there is no default. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, but the description adds valuable beyond-annotation context: 'offline' and 'deterministic', plus the insight that the payload shape differs per topic. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tight and front-loaded, using a single sentence for the core purpose followed by usage and a behavioral note. No wasted words, every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple one-parameter interface and the presence of an output schema, the description fully covers the tool's scope. It explains the topic categories, usage boundaries, and behavioral traits, making it complete for an agent to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed enum descriptions, so baseline is 3. The description adds the useful note that the payload shape differs per topic, which is not in the schema, justifying a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool returns cross-cutting facts (base URLs, headers, versioning, sandbox, rate limits, national clouds), naming the verb 'Return' and the resource. It distinguishes from siblings by naming pc_get_scenario and pc_auth_guidance as alternatives for specific endpoint and auth topics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage guidance: 'Use this for questions about the API as a whole' and directly names alternatives for specific endpoints (pc_get_scenario) and authentication (pc_auth_guidance). This makes the when-to-use decision unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_get_resourceLook up a resource's fieldsARead-onlyIdempotent
Return the field dictionary for a Partner Center resource — Customer, Subscription, Order, Invoice, CartLineItem and others — listing each field's name, type, and usage note. Use this to understand a payload you received or to work out what a request body needs. For the accepted values of an individual field use pc_get_enums, and for a ready-to-fill body skeleton for a specific operation use pc_build_request. Read-only, offline, deterministic. Omitting name returns the index of every resource instead of one resource's fields. An unknown name returns ok:false with suggestions listing all valid resource names.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Resource to expand, e.g. "Subscription" or "CartLineItem". Matched case-insensitively. Omit it to list every documented resource with its description and field count, then call again with the one you want. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
| suggestions | No | Valid values to retry with, returned alongside `error` when the requested identifier was not found. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description adds highly relevant behavioral details: 'Read-only, offline, deterministic' plus expected behaviors when 'name' is omitted and for unknown names (returning ok:false with suggestions). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet comprehensive. Each sentence earns its place: purpose, usage guidance, alternative tools, behavioral traits, and edge-case behavior. It is front-loaded with the core purpose and structured for quick scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one optional parameter, rich output schema, strong annotations), the description is complete. It covers all key aspects needed by an agent: what it does, when to use it, how edge cases behave, and how it relates to sibling tools. No important information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage with a thorough description of the 'name' parameter (including case-insensitivity and omission behavior). The tool description does not add any parameter-specific semantics beyond what the schema already states, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Return the field dictionary for a Partner Center resource') and lists concrete resource examples. It explicitly distinguishes itself from siblings by naming pc_get_enums and pc_build_request as alternative tools for different needs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states when to use the tool ('understand a payload you received or to work out what a request body needs') and gives explicit alternatives for different use cases ('For the accepted values of an individual field use pc_get_enums, and for a ready-to-fill body skeleton use pc_build_request').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_get_scenarioGet one scenario in fullARead-only
Return the complete verified record for one Partner Center REST operation: method, path, auth type, required headers, request and response shapes, per-field notes, working curl/C#/TypeScript examples, gotchas, and the doc link. Use this once you know the scenario id — get one from pc_list_scenarios, a pc_plan_* workflow, or pc_lookup_error. For runnable code in a specific language prefer pc_generate_call; for a request body skeleton prefer pc_build_request. Read-only. Offline and deterministic unless enrich is set, which adds a live Microsoft Learn fetch. An unknown id returns ok:false with suggestions listing close or valid ids.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Exact scenario id in kebab-case, e.g. "create-cart", "get-invoices", "list-customer-subscriptions". Case-sensitive; call pc_list_scenarios to discover valid ids. A near miss comes back as `suggestions` rather than a guess. | |
| enrich | No | Set true to also fetch live Microsoft Learn excerpts for this operation and attach them as `liveDocs`. Defaults to false. Turning it on adds a network round-trip and makes the result non-deterministic; leave it off unless the bundled record is not enough. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
| suggestions | No | Valid values to retry with, returned alongside `error` when the requested identifier was not found. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=true, destructiveHint=false, idempotentHint=false), the description adds substantial behavior: 'Read-only. Offline and deterministic unless `enrich` is set...' and the unknown-id behavior returning ok:false with suggestions. This goes well beyond what annotations provide and does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph with no filler words. Every sentence contributes critical information: return contents, usage timing, alternative tools, behavioral caveats, and error handling. The structure front-loads the purpose and then supplies necessary context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and the presence of an output schema, the description covers all necessary contextual aspects: what the tool returns, when to use it, how to get the id, alternative tools, offline/deterministic behavior, enrich side effects, and error response shape. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are already described in detail in the schema. The description reinforces the id lookup and enrich effects but does not introduce new parameter semantics beyond what the schema provides, earning the baseline score for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb and resource: 'Return the complete verified record for one Partner Center REST operation' and enumerates the exact contents (method, path, auth type, headers, request/response shapes, examples, gotchas, doc link). It clearly differentiates from siblings like pc_list_scenarios and pc_generate_call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool ('once you know the scenario id') and names the exact sources for the id. It also gives explicit alternatives: 'For runnable code in a specific language prefer pc_generate_call; for a request body skeleton prefer pc_build_request.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_list_scenariosList available scenariosARead-onlyIdempotent
List every Partner Center REST operation this server knows about, as a compact index of id, title, area, method, resolved url, and auth type. Start here to discover what is available and to find the scenario id that the other tools take; then call pc_get_scenario for the full record or pc_generate_call for code. This is a catalogue of documented operations, not a query against a live tenant — it returns no customer data. Read-only, offline, deterministic. Filtering by an area with no entries returns an empty list rather than an error.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Restrict the list to one functional area. One of: customers, subscriptions, orders, licenses, invoicing, profiles, auth, catalog, utilities, audit, support, security, analytics, devices, referrals. Omit to list every scenario across all areas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint), the description adds substantive behavioral disclosures: 'returns no customer data', 'Read-only, offline, deterministic', and 'Filtering by an area with no entries returns an empty list rather than an error.' These provide context that annotations alone do not convey, such as offline operation and the error-handling policy.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each serving a distinct purpose: what the tool returns, how to use it in the workflow, and clarifying its non-live nature and edge-case behavior. It is front-loaded with the core listing purpose and immediately actionable next-step guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one optional parameter, output schema present), the description fully covers purpose, usage, behavioral traits, and edge cases. No further elaboration is needed; the output schema handles return-value details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage of the sole parameter 'area' with a detailed description and enum values. The tool description adds little beyond the schema, except the empty-list behavior context, which is more a behavioral trait than parameter semantics. Baseline 3 is appropriate as schema carries the descriptive burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and clearly defines the resource: 'every Partner Center REST operation this server knows about, as a compact index of id, title, area, method, resolved url, and auth type.' It explicitly distinguishes itself from siblings like pc_get_scenario (full record) and pc_generate_call (code), making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Start here to discover what is available and to find the scenario id that the other tools take; then call pc_get_scenario for the full record or pc_generate_call for code.' It also clarifies that it is not a live query (returns no customer data) and describes the empty-list behavior for filtering, covering both when-to-use and behavioral expectations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_lookup_errorLook up an error codeARead-onlyIdempotent
Look up a Partner Center error by its numeric code or HTTP status and return what it means, its known causes, the remediation, the doc link, and the scenarios where it usually appears. Use this when you already have a clean code. If you have a raw error response, pc_decode_error is better — it extracts the code and correlation id for you first. For a symptom described in prose with no code at all, use pc_diagnose. Read-only, offline, deterministic. Exactly one of code or httpStatus must be supplied; supplying neither returns ok:false. An unknown code returns ok:false with suggestions listing every code in the pack.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Partner Center error code as a string, e.g. "900400" or "20002". Matched exactly, so strip surrounding text first. Takes precedence when both this and `httpStatus` are given. Supply this or `httpStatus`. | |
| httpStatus | No | HTTP status code to list errors for, e.g. 400 or 403. Use this when you have no Partner Center code — it returns every documented error with that status, so expect several. Ignored when `code` is supplied. Supply this or `code`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
| suggestions | No | Valid values to retry with, returned alongside `error` when the requested identifier was not found. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint; the description adds 'offline, deterministic' and details the ok:false cases (missing both params, unknown code with suggestions). This goes beyond the annotations, informing the agent about side-effect-free, repeatable behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences with no filler; front-loads the core function, then gives alternatives and constraints. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter lookup tool with a rich output schema and strong annotations, the description covers use cases, alternatives, edge cases, and failure modes. No significant gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage of both parameters. The description adds the exclusive-or rule that exactly one must be supplied and mentions the precedence and unknown-code suggestions, which are not in the schema. Since the schema is thorough, the extra value is moderate but meaningful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Look up') with a clear resource ('Partner Center error') and enumerates the returned fields (meaning, causes, remediation, doc link, scenarios). It explicitly distinguishes from siblings by naming pc_decode_error and pc_diagnose, so the agent knows exactly when this tool is appropriate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States 'Use this when you already have a clean code' and provides explicit alternatives for raw responses (pc_decode_error) and prose symptoms (pc_diagnose). It also specifies the input constraint (exactly one of code/httpStatus) and the failure behavior, giving clear operational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_migrate_from_sdkMap archived SDK calls to RESTARead-onlyIdempotent
Find the archived Partner Center .NET SDK calls in a snippet and map each one to the current REST scenario that replaces it, with migration notes. Use this to port code off the SDK, which was archived in June 2023. Run pc_check_auth alongside it to catch retired auth in the same snippet, then pass each returned scenario id to pc_generate_call to emit the replacement code. Read-only, offline, deterministic pattern matching: the snippet is not executed and nothing is rewritten in place — you get the mapping, not modified code. Always returns ok:true; when nothing matched, matches is empty and unmatched is true.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | C# code that calls the archived SDK, pasted as-is — e.g. a block using IAggregatePartner or PartnerService.Instance. A fragment is enough; matching is on the SDK call chain and is case-insensitive. Multiple calls in one snippet each get their own entry. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the annotations: it is 'read-only, offline, deterministic pattern matching', the snippet is not executed, and nothing is rewritten in place. It also discloses the return contract — always ok:true, with empty `matches` and `unmatched:true` when nothing matches. No contradiction with the readOnlyHint/idempotentHint annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, front-loaded with the purpose, followed by workflow and behavioral guarantees. Every sentence earns its place, and there is no filler or redundant restatement of the title beyond a natural subject line. It is information-dense but still easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with an output schema, the description is complete: it covers why to use it, how to chain it with other tools, what it does and does not modify, and what the empty-result response looks like. The agent has everything needed to invoke it correctly and interpret the outcome.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema is 100% covered, including details like case-insensitive matching and multiple calls per snippet, so the tool description does not need to add parameter-specific semantics. It does include 'snippet' and 'each one', but those largely repeat what the schema already says. Baseline 3 is appropriate because the schema carries the parameter documentation burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action — 'Find the archived Partner Center .NET SDK calls in a snippet and map each one to the current REST scenario' — clearly identifying the resource and the transformation. It also distinguishes itself from sibling tools by naming pc_check_auth and pc_generate_call as complementary steps, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool ('Use this to port code off the SDK') and describes a workflow with pc_check_auth and pc_generate_call. The alternative tools are named, so an agent can decide whether to run this tool or a sibling. This is exactly the kind of guidance needed for correct tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_plan_csp_onboardingPlan CSP customer onboardingARead-onlyIdempotent
Return the ordered CSP customer onboarding workflow: send the reseller relationship invitation, confirm the customer accepted it, record the Microsoft Customer Agreement, then read their subscriptions. Use this to link an existing tenant to your CSP account before you can transact for them. For admin access on top of the relationship use pc_plan_gdap_onboarding; to move an already-linked customer between partners use pc_plan_transfer. Planning only: nothing is executed, no Partner Center credentials are used, and no network call is made — it is a lookup over the bundled scenario pack. Returns { goal, steps[] with order/scenarioId/method/path/url/authType/why/keyGotchas/docUrl, notes[] }. Pass any step's scenarioId to pc_generate_call for runnable code, or pc_get_scenario for its full record.
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | No | Optional Partner Center customer tenant id (GUID, e.g. "c7f6e4b1-3a2d-4c5e-9f80-1b2c3d4e5f60"). When supplied it is substituted for the {customer-id} placeholder in every step's path and url, so the plan comes back ready to run. Omit it to get the generic plan with placeholders left in place; the steps returned are identical either way. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint), the description adds valuable behavioral context: "nothing is executed, no Partner Center credentials are used, and no network call is made — it is a lookup over the bundled scenario pack." This clarifies exactly what the tool does and does not do, going beyond the safety profile implied by annotations. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then efficiently covers usage, alternatives, behavioral constraints, return structure, and follow-up tools. Every sentence adds useful information with no filler. The density is high but not overwhelming; it is appropriately sized for a workflow-planning tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, the description covers the full picture: what it returns (goal, steps with key fields, notes), how to use the output (pass scenarioId to pc_generate_call or pc_get_scenario), and the planning-only constraint. The output schema handles detailed return structures, so the description need not restate them. This is complete for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully covers the single optional customerId parameter with a detailed description of substitution behavior. The tool description itself does not mention this parameter or add any extra nuance beyond the schema. Since schema coverage is 100%, the baseline of 3 is appropriate, but the description earns no credit for parameter enrichment.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb+resource: "Return the ordered CSP customer onboarding workflow" and lists the exact steps. It explicitly distinguishes itself from sibling tools pc_plan_gdap_onboarding and pc_plan_transfer, making its unique role clear. This is a model of purpose clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use context: "Use this to link an existing tenant to your CSP account before you can transact for them." It also names alternatives for other scenarios (admin access via pc_plan_gdap_onboarding, partner transfer via pc_plan_transfer). The "Planning only" note sets expectations that this is not for execution.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_plan_gdap_onboardingPlan GDAP onboardingARead-onlyIdempotent
Return the ordered GDAP onboarding workflow — create the relationship, lock it for customer approval, poll until active, then bind access assignments. Use this when you need granular delegated admin rights over a customer tenant. Note these steps are Microsoft Graph calls, not Partner Center ones; for the commercial relationship (invitation + agreement) use pc_plan_csp_onboarding, which is the usual prerequisite. Planning only: nothing is executed, no Partner Center credentials are used, and no network call is made — it is a lookup over the bundled scenario pack. Returns { goal, steps[] with order/scenarioId/method/path/url/authType/why/keyGotchas/docUrl, notes[] }. Pass any step's scenarioId to pc_generate_call for runnable code, or pc_get_scenario for its full record.
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | No | Optional Partner Center customer tenant id (GUID, e.g. "c7f6e4b1-3a2d-4c5e-9f80-1b2c3d4e5f60"). When supplied it is substituted for the {customer-id} placeholder in every step's path and url, so the plan comes back ready to run. Omit it to get the generic plan with placeholders left in place; the steps returned are identical either way. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations that already indicate a safe read-only operation, the description adds crucial context: 'Planning only: nothing is executed, no Partner Center credentials are used, and no network call is made — it is a lookup over the bundled scenario pack.' This fully discloses the tool's non-executing nature and resource usage, which is more informative than the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence serves a purpose: it states the function, lists the workflow steps, gives usage context, distinguishes from sibling tools, clarifies behavioral guarantees, defines the return structure, and directs next steps. It is front-loaded with the core purpose and contains no redundant or filler phrases.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (exposing an ordered workflow with multiple steps) and the presence of an output schema and full annotations, the description fully covers what the tool does, how to use it, what it returns, and how to proceed (pass scenarioId to pc_generate_call). It is complete for an agent to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage of the single parameter (customerId) with a detailed description including substitution behavior and optionality. The tool description does not add new semantic meaning; it merely restates the placeholder substitution concept already in the schema. Thus, baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Return the ordered GDAP onboarding workflow' and lists the specific steps involved. It explicitly differentiates from sibling tools by naming pc_plan_csp_onboarding as the alternative for the commercial relationship, making its scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: 'Use this when you need granular delegated admin rights over a customer tenant.' It also gives a clear exclusion and alternative: 'for the commercial relationship (invitation + agreement) use pc_plan_csp_onboarding, which is the usual prerequisite.' This fully addresses tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_plan_order_lifecyclePlan an order from cart to provisioned subscriptionsARead-onlyIdempotent
Return the ordered workflow that takes a purchase from cart to confirmed, provisioned subscriptions: build the cart, check out, poll the order's provisioning status, resolve the subscriptions it created, and confirm each one provisioned. Use this when a purchase has to be verified rather than assumed. For choosing WHAT to buy use pc_plan_purchase; for changing a subscription afterwards use pc_plan_subscription_change. Planning only: nothing is executed, no Partner Center credentials are used, and no network call is made — it is a lookup over the bundled scenario pack. Returns { goal, steps[] with order/scenarioId/method/path/url/authType/why/keyGotchas/docUrl, notes[] }. Pass any step's scenarioId to pc_generate_call for runnable code, or pc_get_scenario for its full record.
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | No | Optional Partner Center customer tenant id (GUID, e.g. "c7f6e4b1-3a2d-4c5e-9f80-1b2c3d4e5f60"). When supplied it is substituted for the {customer-id} placeholder in every step's path and url, so the plan comes back ready to run. Omit it to get the generic plan with placeholders left in place; the steps returned are identical either way. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (read-only, idempotent), the description discloses that no credentials are used, no network call is made, and nothing is executed. This is valuable operational context that goes beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured; the first sentence gives the core function, followed by usage, safety, output, and next steps. No filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It provides a complete picture: purpose, usage, constraints, output structure, and related tools (pc_generate_call, pc_get_scenario). Combined with the annotations, the agent has everything needed to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully documents the optional customerId parameter with a detailed description (GUID format, substitution behavior, omit to get placeholders). The tool description itself does not add further parameter details, but the schema coverage is 100%, making this acceptable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns an ordered workflow from cart to provisioned subscriptions, listing the phases (build cart, checkout, poll, resolve, confirm). It explicitly differentiates from pc_plan_purchase and pc_plan_subscription_change, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use ('when a purchase has to be verified rather than assumed') and names alternatives for choosing a purchase and for subscription changes. Also clarifies it's planning-only, not execution.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_plan_prerequisitesPlan the calls that produce a scenario's parametersARead-onlyIdempotent
Given any scenario, return the ordered calls that produce the ids its path needs, plus the parameters you have to supply yourself. Answers "I want to call this, what do I need first" for every operation in the pack, not just the ones with a hand-written workflow. For a business sequence and its preconditions prefer the curated planners: pc_plan_purchase, pc_plan_subscription_change, pc_plan_order_lifecycle, pc_plan_transfer, pc_plan_csp_onboarding, pc_plan_gdap_onboarding, pc_plan_user_onboarding, pc_plan_user_offboarding, pc_plan_reconciliation. This one only resolves parameters, which is why it works everywhere. Planning only: nothing is executed, no credentials are used, no network call is made.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Scenario id you want to end up calling, e.g. "cancel-subscription" or "get-batch-devices". Discover ids with pc_list_scenarios. An unknown id comes back as ok:false with suggestions. | |
| customerId | No | Optional customer tenant id (GUID). When supplied it is substituted for {customer-id} in every step, and the call that would have produced it is dropped from the plan. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and non-destructive behavior. The description adds valuable context beyond annotations: 'Planning only: nothing is executed, no credentials are used, no network call is made.' This clarifies safety and side-effect-free behavior, consistent with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence serves a distinct purpose: main function, scope, alternatives, rationale, and safety. No redundant or filler content; well-structured and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, usage guidance, alternatives, and safety considerations. With a full input schema and output schema present, all necessary context for an AI agent to select and invoke the tool is provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are well-documented in the schema. The description only references 'parameters you have to supply yourself' conceptually, adding little semantic detail beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Given any scenario, return the ordered calls that produce the ids its path needs, plus the parameters you have to supply yourself.' It also distinguishes itself from sibling tools by emphasizing it works for 'every operation in the pack, not just the ones with a hand-written workflow.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides when-to-use and alternatives: 'For a business sequence and its preconditions prefer the curated planners' and lists all sibling curated planners. It also clarifies the tool's niche: 'This one only resolves parameters, which is why it works everywhere.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_plan_purchasePlan an NCE purchaseARead-onlyIdempotent
Return the ordered end-to-end New Commerce purchase workflow — find the product, get a fresh SKU availability, build the cart, check out, resolve the provisioned subscriptions — with the exact operation, resolved URL, and key gotchas for each step. Use this to buy new subscriptions for a customer. To move existing subscriptions between partners use pc_plan_transfer, and to link the customer to your account first use pc_plan_csp_onboarding. Planning only: nothing is executed, no Partner Center credentials are used, and no network call is made — it is a lookup over the bundled scenario pack. Returns { goal, steps[] with order/scenarioId/method/path/url/authType/why/keyGotchas/docUrl, notes[] }. Pass any step's scenarioId to pc_generate_call for runnable code.
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | Optional two-letter ISO 3166-1 country code for the customer's market, e.g. "TR", "DE", "US". Substituted for the {country} placeholder in the catalog steps, since product availability and pricing are market-specific. Omit to keep the placeholder. | |
| customerId | No | Optional Partner Center customer tenant id (GUID, e.g. "c7f6e4b1-3a2d-4c5e-9f80-1b2c3d4e5f60"). Substituted for the {customer-id} placeholder in every step's path and url so the plan comes back ready to run. Omit to keep the placeholders. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and the description reinforces this with additional behavioral facts: 'Planning only: nothing is executed, no Partner Center credentials are used, and no network call is made — it is a lookup over the bundled scenario pack.' This adds context beyond annotations (credential use, network call) and clearly states the planning-only nature, making behavior fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence plus a follow-up sentence. It is front-loaded with the purpose, and every clause adds value: it lists workflow steps, distinguishes alternatives, clarifies planning-only scope, and describes return structure. While compact, the density makes it slightly less scannable than the ideal two-sentence structure, but there is no waste, so a 4 is appropriate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though an output schema exists, the description specifies the return shape: 'Returns { goal, steps[] with order/scenarioId/method/path/url/authType/why/keyGotchas/docUrl, notes[] }.' It also covers integration with pc_generate_call, clarifies scope (no network/credentials), and names alternatives. For a planning tool with two optional params and full schema coverage, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema documents both optional parameters (country and customerId) with 100% description coverage, including examples and substitution behavior. The description itself adds no parameter-specific semantics beyond referencing 'resolved URL' and placeholders, so it does not improve on the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Return the ordered end-to-end New Commerce purchase workflow' and enumerates the steps (find product, get SKU availability, build cart, check out, resolve subscriptions). It also distinguishes from siblings by naming pc_plan_transfer and pc_plan_csp_onboarding with their respective use cases, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: 'Use this to buy new subscriptions for a customer.' Alternatives are clearly named: 'To move existing subscriptions between partners use pc_plan_transfer, and to link the customer to your account first use pc_plan_csp_onboarding.' It also explains how to chain with pc_generate_call, giving complete when-to-use and when-not-to-use context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_plan_reconciliationPlan invoice reconciliationARead-onlyIdempotent
Return the ordered invoice reconciliation workflow for a billing period: locate the invoice, read its totals, pull billed and unbilled line items, download the statement. Use this for billing and revenue reconciliation. Note the v1 line-item endpoints are being retired in favour of async Graph v2 exports — call pc_whats_new for the cutoff dates before building on them. Planning only: nothing is executed, no Partner Center credentials are used, and no network call is made — it is a lookup over the bundled scenario pack. Returns { goal, steps[] with order/scenarioId/method/path/url/authType/why/keyGotchas/docUrl, notes[] }. Pass any step's scenarioId to pc_generate_call for runnable code, or pc_get_scenario for its full record.
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | No | Optional Partner Center customer tenant id (GUID, e.g. "c7f6e4b1-3a2d-4c5e-9f80-1b2c3d4e5f60"). When supplied it is substituted for the {customer-id} placeholder in every step's path and url, so the plan comes back ready to run. Omit it to get the generic plan with placeholders left in place; the steps returned are identical either way. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral detail beyond the readOnly/idempotent/non-destructive annotations: no Partner Center credentials are used, no network call is made, and it is a lookup over a bundled scenario pack. It also warns about v1 endpoint retirement, which is valuable operational context. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the primary action and purpose, then layers in caveats, return format, and related-tool guidance. It is longer than a minimal description but every sentence adds value; the only minor inefficiency is some redundancy in the 'Planning only' clarification.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the output schema exists and the description already covers purpose, usage boundaries, behavioral constraints, output structure, and next-step actions, the description is complete for an agent to select and invoke this tool correctly. No major operational gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter, customerId, and the input schema already fully documents it, including placeholder substitution behavior and omission semantics. The tool description itself does not add parameter-level detail, so the baseline of 3 applies due to 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Return the ordered invoice reconciliation workflow for a billing period' and enumerates concrete steps (locate invoice, read totals, pull line items, download statement). It clearly differentiates from sibling planning tools by naming its exact domain (billing and revenue reconciliation).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it: 'Use this for billing and revenue reconciliation.' It also provides an exclusion, 'Planning only: nothing is executed,' and points to an alternative tool for related concerns: 'call pc_whats_new for the cutoff dates.' It additionally tells the agent how to proceed with returned steps via pc_generate_call/pc_get_scenario.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_plan_subscription_changePlan a subscription lifecycle changeARead-onlyIdempotent
Return the ordered call sequence for one subscription lifecycle change: increase-seats, decrease-seats, upgrade, cancel, renew-change, suspend, reactivate, migrate or transfer. Each plan reads the subscription first, states the precondition that decides whether the change is legal, performs it, and confirms it. Use pc_explain_lifecycle to find out WHICH operation is available; use this to find out HOW to run it. For a new purchase use pc_plan_purchase, and for the order side use pc_plan_order_lifecycle. Planning only: nothing is executed, no Partner Center credentials are used, and no network call is made — it is a lookup over the bundled scenario pack. Returns { goal, steps[] with order/scenarioId/method/path/url/authType/why/keyGotchas/docUrl, notes[] }. Pass any step's scenarioId to pc_generate_call for runnable code, or pc_get_scenario for its full record.
| Name | Required | Description | Default |
|---|---|---|---|
| operation | Yes | Which lifecycle change to plan. One of: increase-seats, decrease-seats, upgrade, cancel, renew-change, suspend, reactivate, migrate, transfer. Required — there is no default. Use pc_explain_lifecycle first if you do not yet know which operation the subscription's current state allows. | |
| customerId | No | Optional Partner Center customer tenant id (GUID, e.g. "c7f6e4b1-3a2d-4c5e-9f80-1b2c3d4e5f60"). When supplied it is substituted for the {customer-id} placeholder in every step's path and url, so the plan comes back ready to run. Omit it to get the generic plan with placeholders left in place; the steps returned are identical either way. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint false), the description adds specific behavioral details: 'nothing is executed, no Partner Center credentials are used, and no network call is made — it is a lookup over the bundled scenario pack.' It also explains the internal plan structure (reads subscription first, states precondition, performs, confirms). This significantly exceeds annotation-only information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three well-structured sentences. The first sentence states the core purpose and operations. The second gives usage and alternatives. The third clarifies constraints and return structure. Every sentence adds value, and the content is front-loaded with the primary function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite the tool's complexity, the description covers the full context: what it does, how to choose it (with alternatives), safety/profile (no execution, no credentials, no network), the return shape ({ goal, steps[], notes[] }), and how to proceed (pass scenarioId to pc_generate_call or pc_get_scenario). The output schema is also present, so the description is thoroughly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage with descriptions for both parameters, including the enum values and the optional customerId placeholder substitution. The tool description itself does not add meaning beyond the schema—it mentions the return steps but not the parameters. Baseline of 3 is appropriate when schema fully documents parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns an ordered call sequence for one subscription lifecycle change, and enumerates the specific operations (increase-seats, decrease-seats, upgrade, etc.). It explicitly distinguishes from sibling tools by pointing to pc_explain_lifecycle for choosing an operation, pc_plan_purchase for new purchases, and pc_plan_order_lifecycle for order-side planning, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit guidance: 'Use pc_explain_lifecycle to find out WHICH operation is available; use this to find out HOW to run it.' It also clarifies planning-only nature and directs alternative tools for purchase and order lifecycle. The description even notes to pass a scenarioId to pc_generate_call for runnable code, giving clear next steps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_plan_transferPlan an NCE transferARead-onlyIdempotent
Return the ordered New Commerce transfer (billing-ownership change) workflow: create the transfer, poll it, verify the moved subscriptions. Use this when a customer is moving to a new partner of record. For a first-time customer link-up use pc_plan_csp_onboarding instead, and for buying new subscriptions use pc_plan_purchase. Planning only: nothing is executed, no Partner Center credentials are used, and no network call is made — it is a lookup over the bundled scenario pack. Returns { goal, steps[] with order/scenarioId/method/path/url/authType/why/keyGotchas/docUrl, notes[] }. Pass any step's scenarioId to pc_generate_call for runnable code, or pc_get_scenario for its full record.
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | No | Optional Partner Center customer tenant id (GUID, e.g. "c7f6e4b1-3a2d-4c5e-9f80-1b2c3d4e5f60"). When supplied it is substituted for the {customer-id} placeholder in every step's path and url, so the plan comes back ready to run. Omit it to get the generic plan with placeholders left in place; the steps returned are identical either way. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the tool is planning-only, executes nothing, uses no Partner Center credentials, and makes no network call — a lookup over the bundled scenario pack. This goes well beyond the annotations (readOnly, idempotent, non-destructive) by explaining the actual behavioral mechanics. It also specifies the return format and how to use the returned scenarioId with other tools, providing rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficient and well-structured: it opens with the core action, then usage context, then exclusions, then safety caveats, then return format and follow-up tools. Every sentence adds essential information without redundancy. It is somewhat longer than two sentences, but each sentence earns its place, and the structure aids comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's role as a planning/lookup tool, the description is complete: it covers purpose, usage criteria, behavioral safety, return value structure, and integration with pc_generate_call and pc_get_scenario. The output schema exists, so return details need not be exhaustively repeated. Combined with the detailed schema and annotations, the description leaves no critical gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already provides a thorough explanation of the optional customerId parameter, including a GUID example, substitution behavior, and what happens when omitted. The description itself does not add parameter-level information, but the baseline of 3 is appropriate because the schema carries the full burden and does so effectively.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns an ordered workflow for a New Commerce transfer, with specific verb 'Return' and resource 'ordered New Commerce transfer (billing-ownership change) workflow'. It also lists the steps (create, poll, verify), making the tool's purpose unmistakable. It explicitly distinguishes from siblings like pc_plan_csp_onboarding and pc_plan_purchase, removing any ambiguity about when to use each.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: 'Use this when a customer is moving to a new partner of record.' It also names two alternative tools for different scenarios (first-time link-up and buying new subscriptions), providing clear when-to-use vs. when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_plan_user_offboardingPlan user offboardingARead-onlyIdempotent
Return the ordered workflow for removing a user from a customer tenant in the safe order: read their licenses, reclaim the seats, strip directory roles, then delete the account. Use this to decommission a person without stranding licenses. The inverse is pc_plan_user_onboarding; cancelling the subscriptions themselves is a different concern. Planning only: nothing is executed, no Partner Center credentials are used, and no network call is made — it is a lookup over the bundled scenario pack. Returns { goal, steps[] with order/scenarioId/method/path/url/authType/why/keyGotchas/docUrl, notes[] }. Pass any step's scenarioId to pc_generate_call for runnable code, or pc_get_scenario for its full record.
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | No | Optional Partner Center customer tenant id (GUID, e.g. "c7f6e4b1-3a2d-4c5e-9f80-1b2c3d4e5f60"). When supplied it is substituted for the {customer-id} placeholder in every step's path and url, so the plan comes back ready to run. Omit it to get the generic plan with placeholders left in place; the steps returned are identical either way. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds crucial context beyond that: 'nothing is executed, no Partner Center credentials are used, and no network call is made — it is a lookup over the bundled scenario pack.' This fully characterizes the tool's behavior with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet information-dense. It front-loads the primary purpose, then covers usage, safety, output structure, and follow-up actions in a logical flow. Every sentence earns its place with no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool complexity is moderate, but the description covers the goal, return object shape, ordering of steps, and downstream integration (pc_generate_call, pc_get_scenario). The output schema exists, so not explaining return fields is acceptable. Annotations and schema fully complement the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful semantics for the single customerId parameter: substituting it makes the plan 'ready to run' while omitting yields 'generic plan with placeholders.' This goes beyond the schema's basic type/format info, meriting a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Return the ordered workflow for removing a user from a customer tenant' and details the safe order (licenses, seats, roles, delete). It clearly distinguishes from siblings by naming the inverse tool (pc_plan_user_onboarding) and a separate concern (cancelling subscriptions).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States explicitly when to use: 'Use this to decommission a person without stranding licenses.' Provides alternatives and exclusions: 'The inverse is pc_plan_user_onboarding; cancelling the subscriptions themselves is a different concern.' This is model usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_plan_user_onboardingPlan user onboardingARead-onlyIdempotent
Return the ordered workflow for onboarding a user inside a customer tenant: pick available SKUs, create the account, assign licenses, grant directory roles, verify. Use this for people-level provisioning. It is unrelated to buying subscriptions — for that use pc_plan_purchase — and the reverse direction is pc_plan_user_offboarding. Planning only: nothing is executed, no Partner Center credentials are used, and no network call is made — it is a lookup over the bundled scenario pack. Returns { goal, steps[] with order/scenarioId/method/path/url/authType/why/keyGotchas/docUrl, notes[] }. Pass any step's scenarioId to pc_generate_call for runnable code, or pc_get_scenario for its full record.
| Name | Required | Description | Default |
|---|---|---|---|
| customerId | No | Optional Partner Center customer tenant id (GUID, e.g. "c7f6e4b1-3a2d-4c5e-9f80-1b2c3d4e5f60"). When supplied it is substituted for the {customer-id} placeholder in every step's path and url, so the plan comes back ready to run. Omit it to get the generic plan with placeholders left in place; the steps returned are identical either way. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description explicitly states 'nothing is executed, no Partner Center credentials are used, and no network call is made — it is a lookup over the bundled scenario pack.' This adds operational context that is not captured by the annotations, such as the absence of network I/O and credential usage. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense but every sentence contributes: purpose, usage context, behavioral guarantees, return format, and tool relationships. It is front-loaded with the primary function and uses punctuation to pack a lot of value without being redundant. No filler or tautology.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides a full picture of what the tool returns (goal, steps[], notes[]), the structure of each step, and how to continue with pc_generate_call or pc_get_scenario. Combined with the output schema (present), the tool's behavior, limitations, and integrations are completely specified. The description is self-sufficient for an AI agent to select and invoke it appropriately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single optional parameter customerId, with full detail about placeholder substitution already in the schema. The tool description does not add new information about this parameter; it focuses on the output structure and cross-references. Since the schema fully covers the parameter, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Return the ordered workflow for onboarding a user inside a customer tenant' and enumerates the steps (pick SKUs, create account, assign licenses, grant roles, verify). It also explicitly distinguishes itself from siblings by stating it is 'unrelated to buying subscriptions' (pc_plan_purchase) and names the reverse tool (pc_plan_user_offboarding). This makes the purpose unmistakable and differentiates it from other planning tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: 'Use this for people-level provisioning.' It also provides exclusions and alternatives: 'It is unrelated to buying subscriptions — for that use pc_plan_purchase — and the reverse direction is pc_plan_user_offboarding.' Additionally, it clarifies that this is planning-only, not execution, which sets expectations for when to invoke this tool vs. a generation tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_search_docsSearch live Partner Center docsARead-only
Search the live Microsoft Learn Partner Center developer documentation and return matching excerpts. Use this as the fallback when the curated pack has no answer: try pc_list_scenarios / pc_get_scenario / pc_lookup_error first, since those are verified and offline. Reaches the public internet, so results are not deterministic and the call can be slow or come back empty with a note when the fetch fails. Read-only and safe to retry; no Partner Center credentials are involved. Returns { excerpts[] with title/url/text, note }.
| Name | Required | Description | Default |
|---|---|---|---|
| topK | No | Maximum number of excerpts to return, 1-10. Omit to get everything the fetcher found (usually a handful). Lower it to keep the response small. | |
| query | Yes | What to look up, in plain language or as keywords — e.g. "cart line item promotion eligibility" or "MS-CorrelationId header". "Partner Center" is prepended automatically, so do not repeat it. An error code or endpoint path works as a query too. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description discloses non-determinism ('results are not deterministic'), potential slowness, possible empty result with a note, retry safety, and no credential requirements. This enriches the readOnly/openWorld annotations with realistic failure and operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with no fluff. Each sentence contributes purpose, usage guidance, internet caveats, or return format. It is front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, when to use, behavioral traits, parameter nuances, and return shape ({ excerpts[], note }). Even though an output schema exists, the description summarizes it helpfully. No significant gaps given the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already covers both parameters with descriptions, but the description adds 'Partner Center is prepended automatically, so do not repeat it' and notes that error codes/endpoint paths work as queries, plus explains topK omission behavior. This goes beyond the schema's baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool searches 'live Microsoft Learn Partner Center developer documentation' and returns 'matching excerpts', using a specific verb and resource. It clearly distinguishes from offline curated siblings by emphasizing 'live'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to try pc_list_scenarios / pc_get_scenario / pc_lookup_error first, and to use this tool as a fallback when the curated pack has no answer. This names concrete alternatives and gives both when and when-not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_validate_requestLint a REST requestARead-onlyIdempotent
Check a Partner Center REST request you have already written against the documented operations and report what is wrong: unrecognised or mismatched method and path, missing Authorization or MS-RequestId, a retired token audience, app-only used where it is not supported, and sovereign-cloud host mismatches. Use this to catch mistakes before sending, or to explain a call that is failing. To build a correct request from scratch instead, use pc_build_request; to decode a response you already received, use pc_decode_error. Read-only, offline, deterministic: the request is analysed statically and never sent, so pass placeholder tokens rather than real ones. Findings are limited to what the bundled pack covers, so an empty list means no known problem — not a guarantee the call will succeed.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The request URL. A full URL or a bare path both work; the scheme and host are stripped before matching. Concrete ids in place of {placeholder} segments are expected and matched positionally, e.g. "https://api.partnercenter.microsoft.com/v1/customers/c7f6.../subscriptions". A query string is ignored. | |
| cloud | No | Sovereign cloud the request targets. Defaults to "commercial". Supply a non-commercial value to get the correct base URL and login authority reported as an info finding. | |
| method | Yes | HTTP verb of the request you are checking. Required — a verb that does not match the endpoint is one of the things this reports. | |
| headers | No | Request headers as a flat string-to-string map, e.g. { "Authorization": "Bearer <token>", "MS-RequestId": "..." }. Names are compared case-insensitively. Omit to skip the header checks entirely — which also suppresses the missing-Authorization finding. Use placeholder token values; real ones are unnecessary. | |
| authType | No | The token flavour you intend to use. Supply it to be told when the endpoint does not accept app-only. Omit to skip that check. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (read-only, idempotent, non-destructive), the description discloses that the tool is offline and deterministic, never sends the request, and recommends placeholder tokens. It also notes the limitation that an empty result does not guarantee success, which is valuable honesty about the tool's coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense yet well-structured: it opens with the main purpose and checks, then gives usage context and alternatives, then safety behavior and limitations. Every sentence earns its place, and the length is appropriate for a tool with this complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema and annotations, the description covers all necessary context: purpose, when to use, key behaviors, safety, and limitations. It is sufficient for an agent to select and invoke the tool correctly among many siblings, with no major gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so a baseline of 3 applies. The description adds meaning by linking parameters to the checks performed (e.g., omitting headers skips header checks, omitting authType skips the app-only check, cloud influences sovereign-cloud findings), which goes beyond the individual field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as a linter for an already-written Partner Center REST request, enumerating specific validations (method/path, headers, auth audience, app-only support, cloud host). It explicitly contrasts with sibling tools pc_build_request and pc_decode_error, making the tool's unique role unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states precisely when to use the tool: to catch mistakes before sending or to explain a failing call. It also names alternatives for adjacent tasks (building a request with pc_build_request, decoding a response with pc_decode_error), providing clear decision guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pc_whats_newList deprecations and deadlinesARead-onlyIdempotent
List the Partner Center API deprecations and retirement deadlines — MFA enforcement, the graph.windows.net retirement, DAP to GDAP, v1 to v2 reconciliation, and the SDK/ADAL/AzureAD retirements — each with its date, impact, and the action to take, newest deadline first. Use this before committing to an endpoint or auth mechanism, and to explain why something that used to work has stopped. To check whether specific code is affected, run pc_check_auth on it. Read-only, offline, deterministic — sourced from the bundled pack, so it is only as current as the pack's last refresh rather than a live feed.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by lifecycle stage. "upcoming": announced, deadline not reached. "in-progress": rolling out now. "enforced": deadline passed and being applied. "retired": fully removed. Omit to get every item. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the call succeeded and `data` is populated; false when `error` explains why not. |
| data | No | The result payload. Present only when `ok` is true. |
| error | No | Human-readable reason the call failed. Present only when `ok` is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, but the description adds valuable behavioral context: it is 'offline, deterministic — sourced from the bundled pack' and thus 'only as current as the pack's last refresh rather than a live feed.' This goes beyond annotations and helps set accurate expectations about data freshness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is comprehensive but every sentence earns its place: it lists content, states usage, names an alternative, and discloses data-source characteristics. It is front-loaded with the tool's core function and does not include filler or redundant wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, return values need no explanation. The tool has only one optional parameter, and the description covers purpose, usage, alternatives, and behavioral limitations. It is complete for a list-oriented tool with strong annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description covers the status parameter fully (enum values and 'Omit to get every item'), so the baseline is 3. The tool description does not add further parameter-specific meaning, but it does not need to given the schema's high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('Partner Center API deprecations and retirement deadlines'), enumerates concrete examples, and distinguishes itself from siblings by explicitly referencing pc_check_auth for code-level checks. This clearly communicates what the tool does and how it differs from related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use the tool ('before committing to an endpoint or auth mechanism', 'to explain why something that used to work has stopped') and points to an alternative (pc_check_auth) for specific code checks. This is strong usage guidance with clear context and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.18.0- Added
pc_diff_pack - Added
pc_explain_policy - Changed
pc_get_scenario2 fields changed- changed
Output schema / properties / data / properties / api / enumPrevious value: -[ - "partner-center", - "graph", - "pricing-and-referrals" -]New value: +[ + "partner-center", + "graph", + "pricing-and-referrals", + "customer-service-admin" +] - added
Output schema / properties / data / properties / exampleResponseAdded value: +{ + "additionalProperties": false, + "description": "A real response taken from the operation's own doc page, so field names and nesting can be read off rather than guessed. Absent when the page publishes no example, which is normal for operations that return no body.", + "properties": { + "body": { + "description": "The response body exactly as Microsoft Learn publishes it." + }, + "httpStatus": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Status the example response carried." + } + }, + "required": [ + "httpStatus", + "body" + ], + "type": "object" +}
- Changed
pc_migrate_from_sdk1 field changed- changed
Output schema / properties / data / properties / matches / items / properties / scenario / properties / api / enumPrevious value: -[ - "partner-center", - "graph", - "pricing-and-referrals" -]New value: +[ + "partner-center", + "graph", + "pricing-and-referrals", + "customer-service-admin" +]
- Added
pc_plan_prerequisites
26 tool updates
v0.13.0- Changed
pc_auth_guidance4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / authType / descriptionAdded value: +"Which token flavour to describe. \"app+user\" is the Secure Application Model refresh-token flow required by most Partner Center operations; \"app-only\" is application permissions, which only a subset of endpoints accept. Required — check a scenario's authType with pc_get_scenario if unsure." - added
Input schema / properties / cloud / descriptionAdded value: +"Sovereign cloud whose endpoints and authority to return. Defaults to \"commercial\". Choose \"china-21vianet\" or \"us-gov\" only for tenants in those clouds — their authorities and feature availability differ." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "description": "The result payload. Present only when `ok` is true.", + "properties": { + "cloud": { + "additionalProperties": false, + "description": "Endpoints for the requested cloud.", + "properties": { + "authority": { + "description": "Login authority host for this cloud.", + "type": "string" + }, + "tokenResource": { + "description": "Audience/resource to request the token for.", + "type": "string" + } + }, + "required": [ + "tokenResource", + "authority" + ], + "type": "object" + }, + "deprecations": { + "description": "Auth mechanisms you must not build on.", + "items": { + "additionalProperties": false, + "properties": { + "fix": { + "description": "What to move to.", + "type": "string" + }, + "status": { + "description": "Where it stands, e.g. retired or enforced.", + "type": "string" + }, + "what": { + "description": "The retired or deprecated mechanism.", + "type": "string" + } + }, + "required": [ + "what", + "status", + "fix" + ], + "type": "object" + }, + "type": "array" + }, + "pattern": { + "description": "The flow for the requested authType: ordered steps plus Secure Application Model and MFA notes for app+user, or the supported-endpoints note for app-only." + } + }, + "required": [ + "cloud", + "pattern", + "deprecations" + ], + "type": "object" + }, + "error": { + "description": "Human-readable reason the call failed. Present only when `ok` is false.", + "type": "string" + }, + "ok": { + "description": "True when the call succeeded and `data` is populated; false when `error` explains why not.", + "type": "boolean" + }, + "suggestions": { + "description": "Valid values to retry with, returned alongside `error` when the requested identifier was not found.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "ok" + ], + "type": "object" +}
- Changed
pc_build_request5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / id / descriptionAdded value: +"Exact scenario id in kebab-case, e.g. \"create-cart\". Case-sensitive; discover ids with pc_list_scenarios or any pc_plan_* tool." - added
Input schema / properties / params / descriptionAdded value: +"Values for the {placeholder} segments in the operation's path, as a flat string-to-string map — e.g. { \"customer-id\": \"c7f6e4b1-...\", \"subscription-id\": \"...\" }. Keys are matched loosely, so \"customer-id\", \"customerId\", and \"customerid\" all work. Values are URL-encoded for you. Omit it, or leave some out, to get the URL with those placeholders intact and the names listed in `missingParams`." - added
Input schema / properties / params / propertyNamesAdded value: +{ + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "description": "The result payload. Present only when `ok` is true.", + "properties": { + "authType": { + "description": "Token flavour this request requires.", + "enum": [ + "app-only", + "app+user" + ], + "type": "string" + }, + "body": { + "anyOf": [ + { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Request-body skeleton with type-appropriate empty defaults, or null for operations that take no body. Fill in real values before sending." + }, + "docUrl": { + "description": "Microsoft Learn page documenting this operation.", + "type": "string" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "description": "Concrete headers to send. Authorization is a `<access-token>` placeholder for you to fill; MS-RequestId is a generated GUID you should reuse on retries.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "method": { + "description": "HTTP verb to use.", + "type": "string" + }, + "missingParams": { + "description": "Placeholder names still unfilled in `url`. Empty when everything was supplied.", + "items": { + "type": "string" + }, + "type": "array" + }, + "note": { + "description": "Either confirmation that all placeholders are filled, or the list of params still needed.", + "type": "string" + }, + "scenarioId": { + "description": "The scenario this request was built for.", + "type": "string" + }, + "url": { + "description": "Fully resolved URL against the correct host, with supplied params substituted and URL-encoded.", + "type": "string" + } + }, + "required": [ + "scenarioId", + "method", + "url", + "headers", + "body", + "missingParams", + "authType", + "docUrl", + "note" + ], + "type": "object" + }, + "error": { + "description": "Human-readable reason the call failed. Present only when `ok` is false.", + "type": "string" + }, + "ok": { + "description": "True when the call succeeded and `data` is populated; false when `error` explains why not.", + "type": "boolean" + }, + "suggestions": { + "description": "Valid values to retry with, returned alongside `error` when the requested identifier was not found.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "ok" + ], + "type": "object" +}
- Changed
pc_check_auth3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / code / descriptionAdded value: +"The code to lint, pasted as-is. Any language — C#, TypeScript, PowerShell, or a raw token request URL. A partial snippet is fine: only the auth-related lines matter, and matching is case-insensitive. Secrets are matched against locally and never transmitted, but paste redacted code where you can." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "description": "The result payload. Present only when `ok` is true.", + "properties": { + "clean": { + "description": "True when no pattern matched. Means only that these specific retirements were not found, not that the code is correct overall.", + "type": "boolean" + }, + "findings": { + "description": "One entry per matched pattern. Empty when nothing matched.", + "items": { + "additionalProperties": false, + "properties": { + "docUrl": { + "description": "Microsoft Learn page covering the retirement or its replacement.", + "type": "string" + }, + "fix": { + "description": "The concrete change to make.", + "type": "string" + }, + "message": { + "description": "What was detected and why it is a problem.", + "type": "string" + }, + "pattern": { + "description": "Source of the regex that matched, so you can see exactly what was detected.", + "type": "string" + }, + "severity": { + "description": "\"error\" means the code is already broken against the live API; \"warning\" means deprecated but still working.", + "enum": [ + "error", + "warning" + ], + "type": "string" + } + }, + "required": [ + "pattern", + "severity", + "message", + "fix", + "docUrl" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "findings", + "clean" + ], + "type": "object" + }, + "error": { + "description": "Human-readable reason the call failed. Present only when `ok` is false.", + "type": "string" + }, + "ok": { + "description": "True when the call succeeded and `data` is populated; false when `error` explains why not.", + "type": "boolean" + } + }, + "required": [ + "ok" + ], + "type": "object" +}
- Changed
pc_decode_error3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / error / descriptionAdded value: +"The error response pasted verbatim — a JSON body such as {\"code\":\"900400\",\"description\":\"...\"}, or unstructured log text containing the failure. Include the response headers if you have them so the MS-CorrelationId can be recovered. Partial or malformed input is handled: whatever cannot be parsed is reported as null." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "description": "The result payload. Present only when `ok` is true.", + "properties": { + "candidatesByStatus": { + "description": "Fallback shortlist keyed off the HTTP status, populated only when no exact code match was found.", + "items": { + "additionalProperties": false, + "properties": { + "description": { + "description": "What that code means.", + "type": "string" + }, + "errorCode": { + "description": "A code that shares the extracted HTTP status.", + "type": "string" + } + }, + "required": [ + "errorCode", + "description" + ], + "type": "object" + }, + "type": "array" + }, + "correlationGuidance": { + "description": "Ready-to-use sentence for a support request, or instructions for capturing the correlation id when it was missing.", + "type": "string" + }, + "match": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "causes": { + "description": "Known conditions that trigger it.", + "items": { + "type": "string" + }, + "type": "array" + }, + "description": { + "description": "What the error means.", + "type": "string" + }, + "docUrl": { + "description": "Microsoft Learn page covering this error.", + "format": "uri", + "type": "string" + }, + "errorCode": { + "description": "Partner Center error code, e.g. \"900400\".", + "type": "string" + }, + "httpStatus": { + "description": "HTTP status code the API returns with this error.", + "type": "number" + }, + "relatedScenarios": { + "description": "Scenario ids where this error commonly surfaces.", + "items": { + "type": "string" + }, + "type": "array" + }, + "remediation": { + "description": "Concrete fix to apply.", + "type": "string" + } + }, + "required": [ + "httpStatus", + "errorCode", + "description", + "causes", + "remediation", + "docUrl" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The documented error entry for the extracted code, or null when the code is unknown or absent." + }, + "note": { + "description": "Present when decoding was incomplete, explaining what to do next.", + "type": "string" + }, + "parsed": { + "additionalProperties": false, + "description": "What was extracted from the raw input.", + "properties": { + "code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Error code recovered from the input, or null if none could be found." + }, + "correlationId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "MS-CorrelationId GUID recovered from the input, or null. Microsoft support needs this to trace the request." + }, + "httpStatus": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "HTTP status recovered from the input, or null." + } + }, + "required": [ + "code", + "httpStatus", + "correlationId" + ], + "type": "object" + }, + "relatedScenarios": { + "description": "Operations where this error commonly appears. Empty when there was no match.", + "items": { + "additionalProperties": false, + "properties": { + "docUrl": { + "description": "Microsoft Learn page documenting this operation.", + "type": "string" + }, + "id": { + "description": "Scenario id to pass to pc_get_scenario or pc_generate_call.", + "type": "string" + }, + "title": { + "description": "Human-readable name of the operation.", + "type": "string" + } + }, + "required": [ + "id", + "title", + "docUrl" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "parsed", + "match", + "relatedScenarios", + "candidatesByStatus", + "correlationGuidance" + ], + "type": "object" + }, + "error": { + "description": "Human-readable reason the call failed. Present only when `ok` is false.", + "type": "string" + }, + "ok": { + "description": "True when the call succeeded and `data` is populated; false when `error` explains why not.", + "type": "boolean" + } + }, + "required": [ + "ok" + ], + "type": "object" +}
- Changed
pc_diagnose3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / symptom / descriptionAdded value: +"What is going wrong, in plain language — e.g. \"checkout returns 400 for NCE carts in Germany\" or \"token works for Graph but Partner Center says unauthorized\". Matching is keyword-based and case-insensitive, so include concrete nouns: the operation, the HTTP status, error text. Any codes or statuses in the text are matched directly." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "description": "The result payload. Present only when `ok` is true.", + "properties": { + "likely": { + "description": "Documented errors whose codes, statuses, or causes overlap the symptom text. A heuristic shortlist, not a ranked diagnosis; may be empty.", + "items": { + "additionalProperties": false, + "properties": { + "causes": { + "description": "Known conditions that trigger it.", + "items": { + "type": "string" + }, + "type": "array" + }, + "description": { + "description": "What the error means.", + "type": "string" + }, + "docUrl": { + "description": "Microsoft Learn page covering this error.", + "format": "uri", + "type": "string" + }, + "errorCode": { + "description": "Partner Center error code, e.g. \"900400\".", + "type": "string" + }, + "httpStatus": { + "description": "HTTP status code the API returns with this error.", + "type": "number" + }, + "relatedScenarios": { + "description": "Scenario ids where this error commonly surfaces.", + "items": { + "type": "string" + }, + "type": "array" + }, + "remediation": { + "description": "Concrete fix to apply.", + "type": "string" + } + }, + "required": [ + "httpStatus", + "errorCode", + "description", + "causes", + "remediation", + "docUrl" + ], + "type": "object" + }, + "type": "array" + }, + "nextSteps": { + "description": "Fixed triage checklist naming the tool to use at each step. Returned regardless of whether anything matched.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "likely", + "nextSteps" + ], + "type": "object" + }, + "error": { + "description": "Human-readable reason the call failed. Present only when `ok` is false.", + "type": "string" + }, + "ok": { + "description": "True when the call succeeded and `data` is populated; false when `error` explains why not.", + "type": "boolean" + } + }, + "required": [ + "ok" + ], + "type": "object" +}
- Added
pc_explain_lifecycle - Changed
pc_generate_call5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / id / descriptionAdded value: +"Exact scenario id in kebab-case, e.g. \"create-cart\". Case-sensitive; discover ids with pc_list_scenarios or any pc_plan_* tool." - added
Input schema / properties / includeHelpers / descriptionAdded value: +"Whether to append the reusable boilerplate — token exchange, 429/Retry-After handling, 202 polling, pagination — as a separate `helpers` field. Defaults to true. Set false when you already have that plumbing and only want the call itself." - added
Input schema / properties / language / descriptionAdded value: +"Target language for the snippet. Required — there is no default. \"curl\", \"csharp\", and \"typescript\" come from curated per-scenario examples; \"powershell\" is generated from the endpoint definition and is therefore more skeletal." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "description": "The result payload. Present only when `ok` is true.", + "properties": { + "authType": { + "description": "Token flavour this call requires.", + "enum": [ + "app-only", + "app+user" + ], + "type": "string" + }, + "code": { + "description": "The call itself, with {placeholder} path segments left for you to substitute.", + "type": "string" + }, + "docUrl": { + "description": "Microsoft Learn page documenting this operation.", + "type": "string" + }, + "helpers": { + "description": "Reusable auth, retry, polling, and pagination boilerplate. Present unless includeHelpers was false.", + "type": "string" + }, + "language": { + "description": "Language the snippet was emitted in.", + "enum": [ + "curl", + "csharp", + "typescript", + "powershell" + ], + "type": "string" + }, + "method": { + "description": "HTTP verb.", + "type": "string" + }, + "notes": { + "description": "Operational requirements for this specific call: pagination, MS-RequestId idempotency, throttling, 202 polling, token flavour.", + "items": { + "type": "string" + }, + "type": "array" + }, + "path": { + "description": "API-relative path with placeholders.", + "type": "string" + } + }, + "required": [ + "language", + "code", + "notes", + "authType", + "method", + "path", + "docUrl" + ], + "type": "object" + }, + "error": { + "description": "Human-readable reason the call failed. Present only when `ok` is false.", + "type": "string" + }, + "ok": { + "description": "True when the call succeeded and `data` is populated; false when `error` explains why not.", + "type": "boolean" + }, + "suggestions": { + "description": "Valid values to retry with, returned alongside `error` when the requested identifier was not found.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "ok" + ], + "type": "object" +}
- Changed
pc_get_enums3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / name / descriptionAdded value: +"Enum to expand, e.g. \"billingCycle\" or \"subscriptionStatus\". Matched case-insensitively. Omit it to list every available enum with its description and value count, then call again with the one you want." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "anyOf": [ + { + "description": "The index of all enums, returned when `name` was omitted.", + "items": { + "additionalProperties": false, + "properties": { + "count": { + "description": "How many values it has.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "description": { + "description": "What the enum controls.", + "type": "string" + }, + "name": { + "description": "Enum name to pass back in `name`.", + "type": "string" + } + }, + "required": [ + "name", + "description", + "count" + ], + "type": "object" + }, + "type": "array" + }, + { + "additionalProperties": false, + "description": "One expanded enum, returned when `name` was supplied.", + "properties": { + "description": { + "description": "What the enum controls.", + "type": "string" + }, + "docUrl": { + "description": "Microsoft Learn page documenting the enum.", + "type": "string" + }, + "name": { + "description": "Canonical enum name as stored, which may differ in casing from what you passed.", + "type": "string" + }, + "values": { + "description": "Every accepted value.", + "items": { + "additionalProperties": false, + "properties": { + "note": { + "description": "What this value means or when it applies.", + "type": "string" + }, + "value": { + "description": "The literal string to send in a request.", + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "name", + "description", + "values" + ], + "type": "object" + } + ], + "description": "The result payload. Present only when `ok` is true." + }, + "error": { + "description": "Human-readable reason the call failed. Present only when `ok` is false.", + "type": "string" + }, + "ok": { + "description": "True when the call succeeded and `data` is populated; false when `error` explains why not.", + "type": "boolean" + }, + "suggestions": { + "description": "Valid values to retry with, returned alongside `error` when the requested identifier was not found.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "ok" + ], + "type": "object" +}
- Changed
pc_get_reference3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / topic / descriptionAdded value: +"Which reference topic to return. \"base-urls\": host per API surface. \"headers\": the headers every request should carry and why. \"versioning\": how API versions are selected. \"sandbox\": integration sandbox account rules. \"rate-limits\": throttling behaviour and how to back off. \"national-clouds\": what differs in the sovereign clouds. Required — there is no default." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "description": "The result payload. Present only when `ok` is true." + }, + "error": { + "description": "Human-readable reason the call failed. Present only when `ok` is false.", + "type": "string" + }, + "ok": { + "description": "True when the call succeeded and `data` is populated; false when `error` explains why not.", + "type": "boolean" + } + }, + "required": [ + "ok" + ], + "type": "object" +}
- Changed
pc_get_resource3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / name / descriptionAdded value: +"Resource to expand, e.g. \"Subscription\" or \"CartLineItem\". Matched case-insensitively. Omit it to list every documented resource with its description and field count, then call again with the one you want." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "anyOf": [ + { + "description": "The index of all resources, returned when `name` was omitted.", + "items": { + "additionalProperties": false, + "properties": { + "description": { + "description": "What the resource represents.", + "type": "string" + }, + "fields": { + "description": "How many documented fields it has.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "name": { + "description": "Resource name to pass back in `name`.", + "type": "string" + } + }, + "required": [ + "name", + "description", + "fields" + ], + "type": "object" + }, + "type": "array" + }, + { + "additionalProperties": false, + "description": "One expanded resource, returned when `name` was supplied.", + "properties": { + "description": { + "description": "What the resource represents.", + "type": "string" + }, + "docUrl": { + "description": "Microsoft Learn page documenting the resource.", + "type": "string" + }, + "fields": { + "description": "Every documented field on the resource.", + "items": { + "additionalProperties": false, + "properties": { + "name": { + "description": "Field name as it appears in the JSON payload.", + "type": "string" + }, + "note": { + "description": "Constraints, accepted values, or gotchas.", + "type": "string" + }, + "type": { + "description": "Declared type of the field.", + "type": "string" + } + }, + "required": [ + "name", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "name": { + "description": "Canonical resource name as stored, which may differ in casing from what you passed.", + "type": "string" + } + }, + "required": [ + "name", + "description", + "fields" + ], + "type": "object" + } + ], + "description": "The result payload. Present only when `ok` is true." + }, + "error": { + "description": "Human-readable reason the call failed. Present only when `ok` is false.", + "type": "string" + }, + "ok": { + "description": "True when the call succeeded and `data` is populated; false when `error` explains why not.", + "type": "boolean" + }, + "suggestions": { + "description": "Valid values to retry with, returned alongside `error` when the requested identifier was not found.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "ok" + ], + "type": "object" +}
- Changed
pc_get_scenario4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / enrich / descriptionAdded value: +"Set true to also fetch live Microsoft Learn excerpts for this operation and attach them as `liveDocs`. Defaults to false. Turning it on adds a network round-trip and makes the result non-deterministic; leave it off unless the bundled record is not enough." - added
Input schema / properties / id / descriptionAdded value: +"Exact scenario id in kebab-case, e.g. \"create-cart\", \"get-invoices\", \"list-customer-subscriptions\". Case-sensitive; call pc_list_scenarios to discover valid ids. A near miss comes back as `suggestions` rather than a guess." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "description": "The result payload. Present only when `ok` is true.", + "properties": { + "api": { + "description": "Which API surface hosts this operation. Absent means \"partner-center\". GDAP and reconciliation-v2 operations are \"graph\" and need a different token audience.", + "enum": [ + "partner-center", + "graph", + "pricing-and-referrals" + ], + "type": "string" + }, + "area": { + "description": "Functional area of the Partner Center API this operation belongs to.", + "enum": [ + "customers", + "subscriptions", + "orders", + "licenses", + "invoicing", + "profiles", + "auth", + "catalog", + "utilities", + "audit", + "support", + "security", + "analytics", + "devices", + "referrals" + ], + "type": "string" + }, + "authType": { + "description": "Token flavour the operation requires. \"app+user\" needs the Secure Application Model refresh-token flow.", + "enum": [ + "app-only", + "app+user" + ], + "type": "string" + }, + "docUrl": { + "description": "Microsoft Learn page documenting this operation.", + "format": "uri", + "type": "string" + }, + "examples": { + "additionalProperties": false, + "description": "Ready-to-adapt request examples per language.", + "properties": { + "csharp": { + "description": "C# HttpClient snippet.", + "type": "string" + }, + "curl": { + "description": "Runnable curl invocation.", + "type": "string" + }, + "typescript": { + "description": "TypeScript fetch snippet.", + "type": "string" + } + }, + "required": [ + "curl", + "csharp", + "typescript" + ], + "type": "object" + }, + "gotchas": { + "description": "Pitfalls that commonly break this call in practice, most consequential first.", + "items": { + "type": "string" + }, + "type": "array" + }, + "headers": { + "description": "Request headers this operation expects.", + "items": { + "additionalProperties": false, + "properties": { + "name": { + "description": "Header name.", + "type": "string" + }, + "note": { + "description": "What to put in the header and why.", + "type": "string" + }, + "required": { + "description": "Whether the call fails without it.", + "type": "boolean" + } + }, + "required": [ + "name", + "required" + ], + "type": "object" + }, + "type": "array" + }, + "id": { + "description": "Stable kebab-case identifier, e.g. \"create-cart\". Pass this to pc_get_scenario, pc_generate_call, or pc_build_request.", + "type": "string" + }, + "lastVerified": { + "description": "YYYY-MM-DD on which this entry was last checked against the live documentation.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + "liveDocs": { + "description": "Live documentation excerpts. Present only when `enrich` was true.", + "items": { + "additionalProperties": false, + "properties": { + "text": { + "description": "The excerpted passage.", + "type": "string" + }, + "title": { + "description": "Title of the source documentation page.", + "type": "string" + }, + "url": { + "description": "Canonical Microsoft Learn URL for the excerpt.", + "type": "string" + } + }, + "required": [ + "title", + "url", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "liveNote": { + "description": "Explains a degraded live fetch. Present only when `enrich` was true.", + "type": "string" + }, + "method": { + "description": "HTTP verb for the call.", + "enum": [ + "GET", + "POST", + "PUT", + "PATCH", + "DELETE", + "HEAD" + ], + "type": "string" + }, + "path": { + "description": "API-relative path with {placeholder} segments, e.g. \"/v1/customers/{customer-id}/subscriptions\". Resolve it against the base URL for `api`.", + "type": "string" + }, + "requestFields": { + "description": "Per-field documentation for the request body, when the operation takes one.", + "items": { + "additionalProperties": false, + "properties": { + "name": { + "description": "Field path within the request body; \"[]\" marks an array hop, e.g. \"lineItems[].catalogItemId\".", + "type": "string" + }, + "note": { + "description": "Constraints, accepted values, or gotchas for this field.", + "type": "string" + }, + "required": { + "description": "Whether the request is rejected without it.", + "type": "boolean" + }, + "type": { + "description": "Declared type of the field.", + "type": "string" + } + }, + "required": [ + "name", + "type", + "required" + ], + "type": "object" + }, + "type": "array" + }, + "requestShape": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON body template, or null for operations that take no body." + }, + "responseShape": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON response template, or null when the operation returns no body." + }, + "title": { + "description": "Human-readable name of the operation.", + "type": "string" + } + }, + "required": [ + "id", + "area", + "title", + "method", + "path", + "authType", + "headers", + "requestShape", + "responseShape", + "examples", + "gotchas", + "docUrl", + "lastVerified" + ], + "type": "object" + }, + "error": { + "description": "Human-readable reason the call failed. Present only when `ok` is false.", + "type": "string" + }, + "ok": { + "description": "True when the call succeeded and `data` is populated; false when `error` explains why not.", + "type": "boolean" + }, + "suggestions": { + "description": "Valid values to retry with, returned alongside `error` when the requested identifier was not found.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "ok" + ], + "type": "object" +}
- Changed
pc_list_scenarios3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / area / descriptionAdded value: +"Restrict the list to one functional area. One of: customers, subscriptions, orders, licenses, invoicing, profiles, auth, catalog, utilities, audit, support, security, analytics, devices, referrals. Omit to list every scenario across all areas." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "description": "The result payload. Present only when `ok` is true.", + "items": { + "additionalProperties": false, + "properties": { + "area": { + "description": "Functional area the operation belongs to.", + "enum": [ + "customers", + "subscriptions", + "orders", + "licenses", + "invoicing", + "profiles", + "auth", + "catalog", + "utilities", + "audit", + "support", + "security", + "analytics", + "devices", + "referrals" + ], + "type": "string" + }, + "authType": { + "description": "Token flavour the operation requires.", + "enum": [ + "app-only", + "app+user" + ], + "type": "string" + }, + "docUrl": { + "description": "Microsoft Learn page documenting this operation.", + "type": "string" + }, + "id": { + "description": "Scenario id to pass to pc_get_scenario, pc_generate_call, or pc_build_request.", + "type": "string" + }, + "method": { + "description": "HTTP verb.", + "type": "string" + }, + "path": { + "description": "API-relative path with {placeholder} segments; ambiguous on its own, so prefer `url`.", + "type": "string" + }, + "title": { + "description": "Human-readable name of the operation.", + "type": "string" + }, + "url": { + "description": "Fully resolved URL including the correct host, which is Microsoft Graph for GDAP and reconciliation-v2 operations.", + "type": "string" + } + }, + "required": [ + "id", + "title", + "area", + "method", + "path", + "url", + "authType", + "docUrl" + ], + "type": "object" + }, + "type": "array" + }, + "error": { + "description": "Human-readable reason the call failed. Present only when `ok` is false.", + "type": "string" + }, + "ok": { + "description": "True when the call succeeded and `data` is populated; false when `error` explains why not.", + "type": "boolean" + } + }, + "required": [ + "ok" + ], + "type": "object" +}
- Changed
pc_lookup_error6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / code / descriptionAdded value: +"Partner Center error code as a string, e.g. \"900400\" or \"20002\". Matched exactly, so strip surrounding text first. Takes precedence when both this and `httpStatus` are given. Supply this or `httpStatus`." - added
Input schema / properties / httpStatus / descriptionAdded value: +"HTTP status code to list errors for, e.g. 400 or 403. Use this when you have no Partner Center code — it returns every documented error with that status, so expect several. Ignored when `code` is supplied. Supply this or `code`." - added
Input schema / properties / httpStatus / maximumAdded value: +9007199254740991 - added
Input schema / properties / httpStatus / minimumAdded value: +-9007199254740991 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "anyOf": [ + { + "additionalProperties": false, + "description": "The single matching error, returned for a `code` lookup.", + "properties": { + "causes": { + "description": "Known conditions that trigger it.", + "items": { + "type": "string" + }, + "type": "array" + }, + "description": { + "description": "What the error means.", + "type": "string" + }, + "docUrl": { + "description": "Microsoft Learn page covering this error.", + "format": "uri", + "type": "string" + }, + "errorCode": { + "description": "Partner Center error code, e.g. \"900400\".", + "type": "string" + }, + "httpStatus": { + "description": "HTTP status code the API returns with this error.", + "type": "number" + }, + "relatedScenarios": { + "description": "Scenarios where this error commonly surfaces, resolved from ids to { id, title, docUrl }.", + "items": { + "additionalProperties": false, + "properties": { + "docUrl": { + "description": "Microsoft Learn page documenting this operation.", + "type": "string" + }, + "id": { + "description": "Scenario id to pass to pc_get_scenario or pc_generate_call.", + "type": "string" + }, + "title": { + "description": "Human-readable name of the operation.", + "type": "string" + } + }, + "required": [ + "id", + "title", + "docUrl" + ], + "type": "object" + }, + "type": "array" + }, + "remediation": { + "description": "Concrete fix to apply.", + "type": "string" + } + }, + "required": [ + "httpStatus", + "errorCode", + "description", + "causes", + "remediation", + "docUrl", + "relatedScenarios" + ], + "type": "object" + }, + { + "description": "Every documented error with the requested status, returned for an `httpStatus` lookup.", + "items": { + "additionalProperties": false, + "properties": { + "causes": { + "description": "Known conditions that trigger it.", + "items": { + "type": "string" + }, + "type": "array" + }, + "description": { + "description": "What the error means.", + "type": "string" + }, + "docUrl": { + "description": "Microsoft Learn page covering this error.", + "format": "uri", + "type": "string" + }, + "errorCode": { + "description": "Partner Center error code, e.g. \"900400\".", + "type": "string" + }, + "httpStatus": { + "description": "HTTP status code the API returns with this error.", + "type": "number" + }, + "relatedScenarios": { + "description": "Scenario ids where this error commonly surfaces.", + "items": { + "type": "string" + }, + "type": "array" + }, + "remediation": { + "description": "Concrete fix to apply.", + "type": "string" + } + }, + "required": [ + "httpStatus", + "errorCode", + "description", + "causes", + "remediation", + "docUrl" + ], + "type": "object" + }, + "type": "array" + } + ], + "description": "The result payload. Present only when `ok` is true." + }, + "error": { + "description": "Human-readable reason the call failed. Present only when `ok` is false.", + "type": "string" + }, + "ok": { + "description": "True when the call succeeded and `data` is populated; false when `error` explains why not.", + "type": "boolean" + }, + "suggestions": { + "description": "Valid values to retry with, returned alongside `error` when the requested identifier was not found.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "ok" + ], + "type": "object" +}
- Changed
pc_migrate_from_sdk3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / code / descriptionAdded value: +"C# code that calls the archived SDK, pasted as-is — e.g. a block using IAggregatePartner or PartnerService.Instance. A fragment is enough; matching is on the SDK call chain and is case-insensitive. Multiple calls in one snippet each get their own entry." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "description": "The result payload. Present only when `ok` is true.", + "properties": { + "matches": { + "description": "One entry per recognised SDK call. Empty when the snippet used no known SDK pattern.", + "items": { + "additionalProperties": false, + "properties": { + "notes": { + "description": "What changes in the move to REST: renamed fields, behavioural differences, extra steps.", + "type": "string" + }, + "scenario": { + "additionalProperties": false, + "description": "The full REST scenario that replaces this SDK call.", + "properties": { + "api": { + "description": "Which API surface hosts this operation. Absent means \"partner-center\". GDAP and reconciliation-v2 operations are \"graph\" and need a different token audience.", + "enum": [ + "partner-center", + "graph", + "pricing-and-referrals" + ], + "type": "string" + }, + "area": { + "description": "Functional area of the Partner Center API this operation belongs to.", + "enum": [ + "customers", + "subscriptions", + "orders", + "licenses", + "invoicing", + "profiles", + "auth", + "catalog", + "utilities", + "audit", + "support", + "security", + "analytics", + "devices", + "referrals" + ], + "type": "string" + }, + "authType": { + "description": "Token flavour the operation requires. \"app+user\" needs the Secure Application Model refresh-token flow.", + "enum": [ + "app-only", + "app+user" + ], + "type": "string" + }, + "docUrl": { + "description": "Microsoft Learn page documenting this operation.", + "format": "uri", + "type": "string" + }, + "examples": { + "additionalProperties": false, + "description": "Ready-to-adapt request examples per language.", + "properties": { + "csharp": { + "description": "C# HttpClient snippet.", + "type": "string" + }, + "curl": { + "description": "Runnable curl invocation.", + "type": "string" + }, + "typescript": { + "description": "TypeScript fetch snippet.", + "type": "string" + } + }, + "required": [ + "curl", + "csharp", + "typescript" + ], + "type": "object" + }, + "gotchas": { + "description": "Pitfalls that commonly break this call in practice, most consequential first.", + "items": { + "type": "string" + }, + "type": "array" + }, + "headers": { + "description": "Request headers this operation expects.", + "items": { + "additionalProperties": false, + "properties": { + "name": { + "description": "Header name.", + "type": "string" + }, + "note": { + "description": "What to put in the header and why.", + "type": "string" + }, + "required": { + "description": "Whether the call fails without it.", + "type": "boolean" + } + }, + "required": [ + "name", + "required" + ], + "type": "object" + }, + "type": "array" + }, + "id": { + "description": "Stable kebab-case identifier, e.g. \"create-cart\". Pass this to pc_get_scenario, pc_generate_call, or pc_build_request.", + "type": "string" + }, + "lastVerified": { + "description": "YYYY-MM-DD on which this entry was last checked against the live documentation.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + }, + "method": { + "description": "HTTP verb for the call.", + "enum": [ + "GET", + "POST", + "PUT", + "PATCH", + "DELETE", + "HEAD" + ], + "type": "string" + }, + "path": { + "description": "API-relative path with {placeholder} segments, e.g. \"/v1/customers/{customer-id}/subscriptions\". Resolve it against the base URL for `api`.", + "type": "string" + }, + "requestFields": { + "description": "Per-field documentation for the request body, when the operation takes one.", + "items": { + "additionalProperties": false, + "properties": { + "name": { + "description": "Field path within the request body; \"[]\" marks an array hop, e.g. \"lineItems[].catalogItemId\".", + "type": "string" + }, + "note": { + "description": "Constraints, accepted values, or gotchas for this field.", + "type": "string" + }, + "required": { + "description": "Whether the request is rejected without it.", + "type": "boolean" + }, + "type": { + "description": "Declared type of the field.", + "type": "string" + } + }, + "required": [ + "name", + "type", + "required" + ], + "type": "object" + }, + "type": "array" + }, + "requestShape": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON body template, or null for operations that take no body." + }, + "responseShape": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "JSON response template, or null when the operation returns no body." + }, + "title": { + "description": "Human-readable name of the operation.", + "type": "string" + } + }, + "required": [ + "id", + "area", + "title", + "method", + "path", + "authType", + "headers", + "requestShape", + "responseShape", + "examples", + "gotchas", + "docUrl", + "lastVerified" + ], + "type": "object" + }, + "sdkPattern": { + "description": "The archived SDK call chain that was recognised.", + "type": "string" + } + }, + "required": [ + "sdkPattern", + "notes", + "scenario" + ], + "type": "object" + }, + "type": "array" + }, + "unmatched": { + "description": "True when nothing was recognised — either the code does not use the archived SDK, or the call is not in the mapping table. Try pc_search_docs in that case.", + "type": "boolean" + } + }, + "required": [ + "matches", + "unmatched" + ], + "type": "object" + }, + "error": { + "description": "Human-readable reason the call failed. Present only when `ok` is false.", + "type": "string" + }, + "ok": { + "description": "True when the call succeeded and `data` is populated; false when `error` explains why not.", + "type": "boolean" + } + }, + "required": [ + "ok" + ], + "type": "object" +}
- Added
pc_plan_csp_onboarding - Changed
pc_plan_gdap_onboarding3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / customerId / descriptionAdded value: +"Optional Partner Center customer tenant id (GUID, e.g. \"c7f6e4b1-3a2d-4c5e-9f80-1b2c3d4e5f60\"). When supplied it is substituted for the {customer-id} placeholder in every step's path and url, so the plan comes back ready to run. Omit it to get the generic plan with placeholders left in place; the steps returned are identical either way." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "description": "The result payload. Present only when `ok` is true.", + "properties": { + "goal": { + "description": "What the whole workflow accomplishes.", + "type": "string" + }, + "notes": { + "description": "Cross-cutting constraints that apply to the workflow as a whole: token audience, cloud availability, related tools.", + "items": { + "type": "string" + }, + "type": "array" + }, + "steps": { + "description": "The steps in the order they must be performed.", + "items": { + "additionalProperties": false, + "properties": { + "authType": { + "description": "Token flavour this step requires.", + "enum": [ + "app-only", + "app+user" + ], + "type": "string" + }, + "docUrl": { + "description": "Microsoft Learn page documenting this operation.", + "type": "string" + }, + "keyGotchas": { + "description": "Up to two of the most consequential pitfalls for this step.", + "items": { + "type": "string" + }, + "type": "array" + }, + "method": { + "description": "HTTP verb (GET, POST, PUT, PATCH, DELETE).", + "type": "string" + }, + "order": { + "description": "1-based position of this step in the workflow.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "path": { + "description": "API-relative path, with {customer-id} substituted when customerId was supplied.", + "type": "string" + }, + "scenarioId": { + "description": "Scenario id; pass to pc_generate_call to get ready-to-run code for this step.", + "type": "string" + }, + "title": { + "description": "Human-readable name of the operation.", + "type": "string" + }, + "url": { + "description": "Fully resolved URL: the path joined to the correct host, which is Microsoft Graph for GDAP and reconciliation-v2 steps.", + "type": "string" + }, + "why": { + "description": "Why this step exists and what it contributes to the workflow.", + "type": "string" + } + }, + "required": [ + "order", + "scenarioId", + "title", + "method", + "path", + "url", + "authType", + "why", + "keyGotchas", + "docUrl" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "goal", + "steps", + "notes" + ], + "type": "object" + }, + "error": { + "description": "Human-readable reason the call failed. Present only when `ok` is false.", + "type": "string" + }, + "ok": { + "description": "True when the call succeeded and `data` is populated; false when `error` explains why not.", + "type": "boolean" + } + }, + "required": [ + "ok" + ], + "type": "object" +}
- Added
pc_plan_order_lifecycle - Changed
pc_plan_purchase4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / country / descriptionAdded value: +"Optional two-letter ISO 3166-1 country code for the customer's market, e.g. \"TR\", \"DE\", \"US\". Substituted for the {country} placeholder in the catalog steps, since product availability and pricing are market-specific. Omit to keep the placeholder." - added
Input schema / properties / customerId / descriptionAdded value: +"Optional Partner Center customer tenant id (GUID, e.g. \"c7f6e4b1-3a2d-4c5e-9f80-1b2c3d4e5f60\"). Substituted for the {customer-id} placeholder in every step's path and url so the plan comes back ready to run. Omit to keep the placeholders." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "description": "The result payload. Present only when `ok` is true.", + "properties": { + "goal": { + "description": "What the whole workflow accomplishes.", + "type": "string" + }, + "notes": { + "description": "Cross-cutting constraints that apply to the workflow as a whole: token audience, cloud availability, related tools.", + "items": { + "type": "string" + }, + "type": "array" + }, + "steps": { + "description": "The steps in the order they must be performed.", + "items": { + "additionalProperties": false, + "properties": { + "authType": { + "description": "Token flavour this step requires.", + "enum": [ + "app-only", + "app+user" + ], + "type": "string" + }, + "docUrl": { + "description": "Microsoft Learn page documenting this operation.", + "type": "string" + }, + "keyGotchas": { + "description": "Up to two of the most consequential pitfalls for this step.", + "items": { + "type": "string" + }, + "type": "array" + }, + "method": { + "description": "HTTP verb (GET, POST, PUT, PATCH, DELETE).", + "type": "string" + }, + "order": { + "description": "1-based position of this step in the workflow.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "path": { + "description": "API-relative path, with {customer-id} substituted when customerId was supplied.", + "type": "string" + }, + "scenarioId": { + "description": "Scenario id; pass to pc_generate_call to get ready-to-run code for this step.", + "type": "string" + }, + "title": { + "description": "Human-readable name of the operation.", + "type": "string" + }, + "url": { + "description": "Fully resolved URL: the path joined to the correct host, which is Microsoft Graph for GDAP and reconciliation-v2 steps.", + "type": "string" + }, + "why": { + "description": "Why this step exists and what it contributes to the workflow.", + "type": "string" + } + }, + "required": [ + "order", + "scenarioId", + "title", + "method", + "path", + "url", + "authType", + "why", + "keyGotchas", + "docUrl" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "goal", + "steps", + "notes" + ], + "type": "object" + }, + "error": { + "description": "Human-readable reason the call failed. Present only when `ok` is false.", + "type": "string" + }, + "ok": { + "description": "True when the call succeeded and `data` is populated; false when `error` explains why not.", + "type": "boolean" + } + }, + "required": [ + "ok" + ], + "type": "object" +}
- Changed
pc_plan_reconciliation3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / customerId / descriptionAdded value: +"Optional Partner Center customer tenant id (GUID, e.g. \"c7f6e4b1-3a2d-4c5e-9f80-1b2c3d4e5f60\"). When supplied it is substituted for the {customer-id} placeholder in every step's path and url, so the plan comes back ready to run. Omit it to get the generic plan with placeholders left in place; the steps returned are identical either way." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "description": "The result payload. Present only when `ok` is true.", + "properties": { + "goal": { + "description": "What the whole workflow accomplishes.", + "type": "string" + }, + "notes": { + "description": "Cross-cutting constraints that apply to the workflow as a whole: token audience, cloud availability, related tools.", + "items": { + "type": "string" + }, + "type": "array" + }, + "steps": { + "description": "The steps in the order they must be performed.", + "items": { + "additionalProperties": false, + "properties": { + "authType": { + "description": "Token flavour this step requires.", + "enum": [ + "app-only", + "app+user" + ], + "type": "string" + }, + "docUrl": { + "description": "Microsoft Learn page documenting this operation.", + "type": "string" + }, + "keyGotchas": { + "description": "Up to two of the most consequential pitfalls for this step.", + "items": { + "type": "string" + }, + "type": "array" + }, + "method": { + "description": "HTTP verb (GET, POST, PUT, PATCH, DELETE).", + "type": "string" + }, + "order": { + "description": "1-based position of this step in the workflow.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "path": { + "description": "API-relative path, with {customer-id} substituted when customerId was supplied.", + "type": "string" + }, + "scenarioId": { + "description": "Scenario id; pass to pc_generate_call to get ready-to-run code for this step.", + "type": "string" + }, + "title": { + "description": "Human-readable name of the operation.", + "type": "string" + }, + "url": { + "description": "Fully resolved URL: the path joined to the correct host, which is Microsoft Graph for GDAP and reconciliation-v2 steps.", + "type": "string" + }, + "why": { + "description": "Why this step exists and what it contributes to the workflow.", + "type": "string" + } + }, + "required": [ + "order", + "scenarioId", + "title", + "method", + "path", + "url", + "authType", + "why", + "keyGotchas", + "docUrl" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "goal", + "steps", + "notes" + ], + "type": "object" + }, + "error": { + "description": "Human-readable reason the call failed. Present only when `ok` is false.", + "type": "string" + }, + "ok": { + "description": "True when the call succeeded and `data` is populated; false when `error` explains why not.", + "type": "boolean" + } + }, + "required": [ + "ok" + ], + "type": "object" +}
- Added
pc_plan_subscription_change - Changed
pc_plan_transfer3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / customerId / descriptionAdded value: +"Optional Partner Center customer tenant id (GUID, e.g. \"c7f6e4b1-3a2d-4c5e-9f80-1b2c3d4e5f60\"). When supplied it is substituted for the {customer-id} placeholder in every step's path and url, so the plan comes back ready to run. Omit it to get the generic plan with placeholders left in place; the steps returned are identical either way." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "description": "The result payload. Present only when `ok` is true.", + "properties": { + "goal": { + "description": "What the whole workflow accomplishes.", + "type": "string" + }, + "notes": { + "description": "Cross-cutting constraints that apply to the workflow as a whole: token audience, cloud availability, related tools.", + "items": { + "type": "string" + }, + "type": "array" + }, + "steps": { + "description": "The steps in the order they must be performed.", + "items": { + "additionalProperties": false, + "properties": { + "authType": { + "description": "Token flavour this step requires.", + "enum": [ + "app-only", + "app+user" + ], + "type": "string" + }, + "docUrl": { + "description": "Microsoft Learn page documenting this operation.", + "type": "string" + }, + "keyGotchas": { + "description": "Up to two of the most consequential pitfalls for this step.", + "items": { + "type": "string" + }, + "type": "array" + }, + "method": { + "description": "HTTP verb (GET, POST, PUT, PATCH, DELETE).", + "type": "string" + }, + "order": { + "description": "1-based position of this step in the workflow.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "path": { + "description": "API-relative path, with {customer-id} substituted when customerId was supplied.", + "type": "string" + }, + "scenarioId": { + "description": "Scenario id; pass to pc_generate_call to get ready-to-run code for this step.", + "type": "string" + }, + "title": { + "description": "Human-readable name of the operation.", + "type": "string" + }, + "url": { + "description": "Fully resolved URL: the path joined to the correct host, which is Microsoft Graph for GDAP and reconciliation-v2 steps.", + "type": "string" + }, + "why": { + "description": "Why this step exists and what it contributes to the workflow.", + "type": "string" + } + }, + "required": [ + "order", + "scenarioId", + "title", + "method", + "path", + "url", + "authType", + "why", + "keyGotchas", + "docUrl" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "goal", + "steps", + "notes" + ], + "type": "object" + }, + "error": { + "description": "Human-readable reason the call failed. Present only when `ok` is false.", + "type": "string" + }, + "ok": { + "description": "True when the call succeeded and `data` is populated; false when `error` explains why not.", + "type": "boolean" + } + }, + "required": [ + "ok" + ], + "type": "object" +}
- Added
pc_plan_user_offboarding - Added
pc_plan_user_onboarding - Changed
pc_search_docs4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / query / descriptionAdded value: +"What to look up, in plain language or as keywords — e.g. \"cart line item promotion eligibility\" or \"MS-CorrelationId header\". \"Partner Center\" is prepended automatically, so do not repeat it. An error code or endpoint path works as a query too." - added
Input schema / properties / topK / descriptionAdded value: +"Maximum number of excerpts to return, 1-10. Omit to get everything the fetcher found (usually a handful). Lower it to keep the response small." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "description": "The result payload. Present only when `ok` is true.", + "properties": { + "excerpts": { + "description": "Matching documentation passages, most relevant first. Empty when nothing matched or the live fetch failed.", + "items": { + "additionalProperties": false, + "properties": { + "text": { + "description": "The excerpted passage.", + "type": "string" + }, + "title": { + "description": "Title of the source documentation page.", + "type": "string" + }, + "url": { + "description": "Canonical Microsoft Learn URL for the excerpt.", + "type": "string" + } + }, + "required": [ + "title", + "url", + "text" + ], + "type": "object" + }, + "type": "array" + }, + "note": { + "description": "Explains a degraded result, e.g. that the live fetch timed out and the curated pack should be used instead.", + "type": "string" + } + }, + "required": [ + "excerpts" + ], + "type": "object" + }, + "error": { + "description": "Human-readable reason the call failed. Present only when `ok` is false.", + "type": "string" + }, + "ok": { + "description": "True when the call succeeded and `data` is populated; false when `error` explains why not.", + "type": "boolean" + } + }, + "required": [ + "ok" + ], + "type": "object" +}
- Changed
pc_validate_request8 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / authType / descriptionAdded value: +"The token flavour you intend to use. Supply it to be told when the endpoint does not accept app-only. Omit to skip that check." - added
Input schema / properties / cloud / descriptionAdded value: +"Sovereign cloud the request targets. Defaults to \"commercial\". Supply a non-commercial value to get the correct base URL and login authority reported as an info finding." - added
Input schema / properties / headers / descriptionAdded value: +"Request headers as a flat string-to-string map, e.g. { \"Authorization\": \"Bearer <token>\", \"MS-RequestId\": \"...\" }. Names are compared case-insensitively. Omit to skip the header checks entirely — which also suppresses the missing-Authorization finding. Use placeholder token values; real ones are unnecessary." - added
Input schema / properties / headers / propertyNamesAdded value: +{ + "type": "string" +} - added
Input schema / properties / method / descriptionAdded value: +"HTTP verb of the request you are checking. Required — a verb that does not match the endpoint is one of the things this reports." - added
Input schema / properties / url / descriptionAdded value: +"The request URL. A full URL or a bare path both work; the scheme and host are stripped before matching. Concrete ids in place of {placeholder} segments are expected and matched positionally, e.g. \"https://api.partnercenter.microsoft.com/v1/customers/c7f6.../subscriptions\". A query string is ignored." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "description": "The result payload. Present only when `ok` is true.", + "properties": { + "findings": { + "description": "Everything detected, in the order the checks ran. Empty means nothing known was wrong.", + "items": { + "additionalProperties": false, + "properties": { + "fix": { + "description": "The concrete change to make, when there is one.", + "type": "string" + }, + "message": { + "description": "What is wrong.", + "type": "string" + }, + "severity": { + "description": "\"error\" will break the call; \"warning\" is risky but works; \"info\" is contextual guidance.", + "enum": [ + "error", + "warning", + "info" + ], + "type": "string" + } + }, + "required": [ + "severity", + "message" + ], + "type": "object" + }, + "type": "array" + }, + "matched": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "authType": { + "description": "Token flavour the operation requires.", + "enum": [ + "app-only", + "app+user" + ], + "type": "string" + }, + "docUrl": { + "description": "Microsoft Learn page documenting the operation.", + "type": "string" + }, + "id": { + "description": "Scenario id of the matched operation.", + "type": "string" + }, + "method": { + "description": "The verb the operation actually expects.", + "type": "string" + }, + "path": { + "description": "The path template it matched against.", + "type": "string" + }, + "title": { + "description": "Human-readable name of the operation.", + "type": "string" + }, + "url": { + "description": "Fully resolved URL for the operation against its correct host.", + "type": "string" + } + }, + "required": [ + "id", + "title", + "method", + "path", + "url", + "authType", + "docUrl" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The documented operation this request was matched to, or null when no known endpoint has that shape." + }, + "ok": { + "description": "True when no finding has severity \"error\". Warnings and info findings can still be present.", + "type": "boolean" + } + }, + "required": [ + "ok", + "matched", + "findings" + ], + "type": "object" + }, + "error": { + "description": "Human-readable reason the call failed. Present only when `ok` is false.", + "type": "string" + }, + "ok": { + "description": "True when the call succeeded and `data` is populated; false when `error` explains why not.", + "type": "boolean" + } + }, + "required": [ + "ok" + ], + "type": "object" +}
- Changed
pc_whats_new3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / status / descriptionAdded value: +"Filter by lifecycle stage. \"upcoming\": announced, deadline not reached. \"in-progress\": rolling out now. \"enforced\": deadline passed and being applied. \"retired\": fully removed. Omit to get every item." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "data": { + "additionalProperties": false, + "description": "The result payload. Present only when `ok` is true.", + "properties": { + "count": { + "description": "Number of items returned after filtering.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "items": { + "description": "Matching items sorted by date, newest deadline first.", + "items": { + "additionalProperties": false, + "properties": { + "action": { + "description": "What to do about it.", + "type": "string" + }, + "date": { + "description": "Deadline or effective date as YYYY-MM-DD.", + "type": "string" + }, + "docUrl": { + "description": "Microsoft Learn announcement or migration guide.", + "type": "string" + }, + "impact": { + "description": "What breaks, and for whom.", + "type": "string" + }, + "status": { + "description": "Lifecycle stage of the change.", + "enum": [ + "upcoming", + "in-progress", + "enforced", + "retired" + ], + "type": "string" + }, + "title": { + "description": "What is changing.", + "type": "string" + } + }, + "required": [ + "title", + "status", + "date", + "impact", + "action" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "count", + "items" + ], + "type": "object" + }, + "error": { + "description": "Human-readable reason the call failed. Present only when `ok` is false.", + "type": "string" + }, + "ok": { + "description": "True when the call succeeded and `data` is populated; false when `error` explains why not.", + "type": "boolean" + } + }, + "required": [ + "ok" + ], + "type": "object" +}
8 tool updates
v0.6.0- Added
pc_build_request - Added
pc_decode_error - Added
pc_get_enums - Added
pc_get_resource - Added
pc_plan_gdap_onboarding - Added
pc_plan_reconciliation - Added
pc_plan_transfer - Added
pc_whats_new
5 tool updates
v0.5.0- Changed
pc_generate_call1 field changed- added
Input schema / properties / includeHelpersAdded value: +{ + "type": "boolean" +}
- Changed
pc_get_reference1 field changed- changed
Input schema / properties / topic / enumPrevious value: -[ - "base-urls", - "headers", - "versioning", - "sandbox", - "rate-limits" -]New value: +[ + "base-urls", + "headers", + "versioning", + "sandbox", + "rate-limits", + "national-clouds" +]
- Changed
pc_list_scenarios1 field changed- changed
Input schema / properties / area / enumPrevious value: -[ - "customers", - "subscriptions", - "orders", - "licenses", - "invoicing", - "profiles", - "auth" -]New value: +[ + "customers", + "subscriptions", + "orders", + "licenses", + "invoicing", + "profiles", + "auth", + "catalog", + "utilities", + "audit", + "support", + "security", + "analytics", + "devices", + "referrals" +]
- Added
pc_plan_purchase - Added
pc_validate_request
10 tool updates
v0.1.0- First observed
pc_auth_guidance - First observed
pc_check_auth - First observed
pc_diagnose - First observed
pc_generate_call - First observed
pc_get_reference - First observed
pc_get_scenario - First observed
pc_list_scenarios - First observed
pc_lookup_error - First observed
pc_migrate_from_sdk - First observed
pc_search_docs
TDQS
Scored across 29 tools
The pc_* prefix and explicit cross-references keep most tools distinct, and the error-handling trio is cleanly split by input type (raw response vs isolated code vs prose). However, pc_plan_purchase and pc_plan_order_lifecycle overlap in the cart/checkout/subscription-resolution steps, so an agent could plausibly select the wrong planner.
Nearly all tools follow a pc_<verb>_<noun> pattern, and the shared prefix makes the family easy to recognize. Minor deviations like pc_auth_guidance, pc_whats_new, and pc_diagnose break the otherwise consistent verb-noun convention, so it is not a perfect 5.
At 29 tools, this clearly exceeds the 25-tool threshold and feels heavy for an agent to reason about. Several families—especially the ten pc_plan_* tools and the three error/lookup tools—could reasonably be consolidated into parameterized variants without losing functionality.
The surface covers the full knowledge lifecycle: discover scenarios, inspect details, build or validate requests, generate code, decode errors, plan business workflows, check auth, track deprecations, and explain policies. Cross-references leave no obvious dead ends, and pc_search_docs plus pc_plan_prerequisites fill gaps not covered by curated workflows or the bundled pack.
Maintenance
Related MCP Connectors
The official Planning Center MCP server for interacting with your ministry's data.
AI-native mock API server with MCP. Create REST/SOAP mocks from Claude, Cursor, or Windsurf.
MCP server for Vonage API documentation, code snippets, tutorials, and troubleshooting.
The official MCP Server from Mia-Platform to interact with Mia-Platform Console
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA simple demonstration MCP server that provides an echo tool and resource for learning how to build MCP servers. Serves as a starting point and template for creating custom MCP server implementations.1-
- AlicenseBqualityDmaintenanceA standalone MCP server for exploring the weclapp REST API v2, providing offline knowledge about entities, endpoints, and relationships, plus optional live GET probes against a tenant.171MIT
- FlicenseNot gradedqualityDmaintenanceStarter scaffold for a workshop to build an MCP API testing server, intended to be extended through incremental steps.-
- AlicenseBqualityBmaintenanceMCP server for Microsoft Fabric REST APIs that enables data engineers and analysts to manage Fabric components using AI assistants.21944 npmAGPL 3.0