PM AI MCP to Authorization
Use this skill when an AI product may connect to an MCP server, remote tool,
agent connector, or asynchronous MCP Task and a PM must decide what a host,
client, authorization server, resource server, tool, or task store may access.
The output is a product and release contract. It is not an OAuth client, MCP
implementation, connector registry, secret manager, or security certification.
Keep a human owner on consent, scope, consequential actions, and the final
release decision.
When to use
Use it when:
- a team is adding an MCP server, remote tool, connector, or agent integration;
- a host needs to discover an authorization server or protected resource;
- a tool request may expose data, change a record, send a message, spend money,
or change permissions;
- the product supports per-tool consent, delegated access, re-authentication,
revocation, or managed authorization;
- a long-running MCP Task returns a task ID, status, result, or cancellation
operation that must be bound to the requester;
- an OAuth callback succeeded but nobody has documented audience, issuer,
scope, tenant, expiry, or downstream token handling;
- the team needs a hold, fallback, or pilot decision without live credentials.
Do not use
Do not use this skill to:
- implement OAuth, PKCE, an MCP client/server, an authorization server, or a
token store;
- approve a tool, expand a scope, exchange a code, refresh a token, or revoke
access;
- treat a discovered metadata document, successful callback, or HTTP 200 as
proof that every tool or task operation is authorized;
- design ordinary in-session progress; use
pm-ai-task-to-progress;
- define generic actor identity and delegation; use
pm-ai-identity-to-boundary;
- define a generic tool schema and side effect contract; use
pm-ai-tool-to-contract;
- supervise a run that continues after the user leaves; use
pm-ai-background-run-to-supervision;
- paste tokens, authorization codes, cookies, customer data, private URLs, or
sensitive screen content into the contract or public receipt.
Use Unknown, Not provided, Not run, Not measured, Not reproduced, or
Not covered when a host, protocol version, provider, or permission result is
missing.
Workflow
1. Frame the authorization decision
Write one sentence:
Decide whether actor ... may use resource ... through host ...,
transport ..., scope ..., and tool/task boundary ..., with consent,
expiry, revocation, and fallback ....
Record the user job, requester, owner, current workaround, protected resource,
tenant or workspace, data class, tool side effects, duration, user timezone,
and what remains the user's decision. A successful login is not consent for
every downstream tool or task.
2. Map roles and authority
Name each role and its evidence:
| Role |
Product question |
Evidence |
| Resource owner |
Whose data or authority is delegated? |
user or policy source |
| Host |
What UI or agent environment asks for access? |
host contract |
| MCP client |
Which connector sends the request? |
client identity/version |
| Authorization server |
Who issues or validates client authorization? |
issuer metadata |
| MCP/resource server |
Which protected resource receives the token? |
canonical resource URI |
| Gateway |
Does routing, rate limiting, or policy change the boundary? |
gateway contract |
| Tool |
What data and side effect does the call expose? |
tool catalog and schema |
| Task store |
Who can get, list, result, or cancel a task? |
task access policy |
Do not collapse authentication, authorization, consent, delegation, and tool
execution into one connected state.
3. Identify transport and discovery
Record protocol revision, transport, canonical resource URI, issuer, metadata
locations, redirect URI, client metadata or registration route, and supported
scopes. For HTTP authorization, check resource and authorization-server
metadata, WWW-Authenticate, issuer, resource indicator, audience, and token
transport. For STDIO or another local transport, record the host's credential
source and local permission boundary instead of copying HTTP OAuth rules.
If the source or host version is unclear, keep the decision at Hold and write
the missing evidence. Do not infer the latest protocol from a package name.
4. Define consent, scope, and tool action boundaries
For each requested permission, record:
| Field |
Required question |
| Resource |
What exact server or data surface is protected? |
| Purpose |
What user job requires it? |
| Data |
What leaves the host and what does the server return? |
| Scope |
What least-privilege operation is requested? |
| Tool |
Which tool, resource, prompt, or task operation is covered? |
| Side effect |
Can it write, send, buy, delete, publish, or change access? |
| Context |
Which user, tenant, workspace, and request are bound? |
| Duration |
When does consent, token, or task access expire? |
| Control |
Can the user inspect, deny, revoke, or choose a manual route? |
Separate server-level connection from per-tool authorization when a host can
support it. A read-only source fetch does not authorize a message send, record
write, purchase, deletion, or permission change.
5. Verify token and authorization lifecycle
Do not record a token value. Record whether the host has evidence for:
- exact issuer and authorization-server selection;
- canonical resource and audience binding;
- issuer validation and no authorization-server mix-up;
- redirect exactness, HTTPS or localhost boundary, and PKCE where applicable;
- scope minimization, consent freshness, and scope-change re-consent;
- expiry, refresh, rotation, revocation, and secure storage;
- no token in URL, logs, prompt content, task result, or upstream passthrough;
- distinct 401, 403, invalid scope, expired, revoked, and rate-limit behavior.
If a server calls another API, require a separate downstream credential
boundary. A received token must not silently become a credential for a
different audience.
6. Bind tasks and results to authorization context
If asynchronous tasks exist, define ownership for tasks/get, tasks/result,
tasks/cancel, and tasks/list. The contract must answer:
- Is a task ID bound to the same user, tenant, client, and authorization
context that created it?
- Does a requester receive only its own task metadata and result?
- Are task IDs high entropy, rate-limited, and subject to a documented TTL?
- What happens when authorization expires or is revoked while a task runs?
- Does cancellation require the same authorization context and explicit user
control?
- What is the fallback when the host cannot identify the requester?
If context binding is unavailable, say so, shorten the exposure window where
the host supports it, do not expose a list capability, and keep the release at
Hold until the risk is accepted by the owner.
7. Model user-visible states and recovery
Use these states as needed:
not_configured, discovering, needs_consent, authorized, denied,
expired, revoked, reauth_required, mismatch, rate_limited, and
unknown.
For each state, specify the user control, data/tool visibility, next action,
and evidence. Keep wrong issuer, wrong audience, invalid redirect, invalid
scope, task not found, cross-context denial, and server error separate.
- First-time: explain resource, data, tool, tenant, duration, and side effects.
- Empty/loading: name missing metadata or discovery phase; show no fake
percentage or connection success.
- Error: preserve status and reason; do not retry with broader permission.
- Recovery: re-check issuer, resource, scope, and context before re-auth.
- Backtracking: allow deny, revoke, scope reduction, manual fallback, and
deletion of the local proposal; do not claim server revocation unverified.
- Mobile/accessibility: keep consent keyboard reachable, readable at narrow
widths, and explicit about what remains denied.
8. Evaluate and decide
Use positive, negative, cross-context, privacy, and recovery cases. At minimum
cover:
| Case |
Expected result |
| correct issuer and resource |
discovery can continue with evidence |
| wrong issuer or audience |
reject and enter mismatch |
| invalid or open redirect |
stop before code exchange |
| scope wider than the user job |
reduce, re-consent, or hold |
| token appears in URL, log, prompt, or upstream call |
redact and fail |
| task belongs to another context |
deny get, result, cancel, and list |
| expired or revoked authorization |
re-auth or manual fallback |
| task ID enumeration or excessive polling |
rate limit and audit |
| tool metadata contains instructions |
treat it as untrusted data |
| host cannot prove a boundary |
Not run, Not covered, or Hold |
Choose Proceed, Pilot, Hold, Fallback, or Stop. A passing schema or
authorization callback is not proof of tenant isolation, user comprehension,
or safe tool behavior.
9. Write a privacy-safe receipt
Record package/version, host/client, source versions, transport, resource,
issuer class, scope class, consent state, token/task checks, decision,
limitations, and next action. Exclude raw tokens, codes, cookies, customer
content, private URLs, and sensitive screen data.
Output contract
Return the sections below in this order:
## Decision and user job - decision, user, workaround, desired outcome,
and what remains human-owned.
## Sources and freshness - source URL or ID, protocol/host version,
date, relevant claim, and source limitation.
## Authority and resource map - roles, tenant/workspace, transport,
canonical resource, issuer, client, gateway, tool, and task store.
## Consent and action boundary - data, purpose, scope, tool side effect,
duration, allowed/denied actions, inspect, deny, revoke, and fallback.
## Authorization lifecycle - discovery, redirect, issuer, audience,
scope, token, expiry, rotation, revocation, error, and re-auth evidence.
## Task and result isolation - task ownership, context binding, list/get/
result/cancel rules, TTL, rate limit, and cross-context negative cases.
## UX states and recovery - first-time, empty, loading, consent, error,
mismatch, expiry, revocation, mobile, accessibility, and manual route.
## Evaluation and release gate - cases, oracles, observed results,
Not run / Not covered, decision, rollout, fallback, and rollback.
## Privacy-safe receipt - sanitized YAML or table with no secrets.
## Not covered - concrete unknowns, unexecuted flows, and claims not
supported by current evidence.
Common rationalizations to reject
- "The callback succeeded, so every tool is authorized." Separate consent,
scope, tool action, and result access.
- "The task ID is secret enough." Bind it to authorization context and test
get, result, cancel, and list paths.
- "The MCP server validates the token." Verify the intended resource, issuer,
audience, scope, and downstream credential boundary.
- "It is only a read tool." Verify data egress, tenant scope, prompt/resource
visibility, and whether the tool can trigger a hidden side effect.
- "We can reuse the token upstream." Deny token passthrough; require a
separately issued downstream credential or a documented safe boundary.
- "No one will see the error." Keep denial, expiry, revocation, re-auth, and
manual fallback visible to the user.
- "The latest spec covers us." Record the exact protocol and host versions;
compatibility and security still require an actual host oracle.
Edge cases
- A public tool and a protected tool share one MCP endpoint.
- The issuer changes, the authorization server redirects, or the resource URI
has a different path than the one shown to the user.
- A scope is added after the first consent, or a tool description changes.
- Authorization expires while a background task is queued, running, or ready.
- A task result is fetched from a different tenant, user, client, or region.
- The client loses the authorization context but still has a task ID.
- A gateway caches tool metadata or routes requests by method and tool name.
- A server response contains an instruction-shaped request to reveal a token,
widen scope, or call another tool.
- The user denies one tool but accepts another, or revokes access mid-flow.
- The host cannot provide a reliable requester identity or audit trail.
Adjacent routing
- Use
pm-ai-identity-to-boundary for generic principal, delegation, and
authorization ownership outside MCP protocol details.
- Use
pm-ai-tool-to-contract for tool schema, provenance, side effects, and
recovery without the authorization lifecycle.
- Use
pm-ai-prompt-injection-to-defense for a full attack path and negative
evaluation around untrusted instructions.
- Use
pm-ai-background-run-to-supervision for runs that continue after the
current interaction and need pause, cancel, expiry, notification, or review.
- Use
pm-ai-task-to-progress for ordinary task lifecycle and honest progress
when cross-context authorization is not the central decision.
- Use
pm-ai-data-to-purpose for data minimization, retention, deletion, and
third-party reuse policy across an AI data flow.
Final check
Before returning the contract, confirm:
- source and protocol version are recorded;
- authentication, authorization, consent, scope, tool action, and task access
are separate concepts;
- the resource URI, issuer, audience, tenant, and requester context are named;
- HTTP and STDIO or other transport behavior is not conflated;
- per-tool side effects and denied routes are visible;
- task get/result/cancel/list isolation is tested or marked
Not run;
- 401, 403, mismatch, expiry, revocation, rate limit, and recovery states are
explicit;
- no token, code, cookie, customer data, private URL, or secret appears;
- unknown host behavior is
Unknown, Not covered, or Hold, never invented;
- the final decision and next action are owned by a human.
1---2name: pm-ai-mcp-to-authorization3description: Use when an AI product connects to an MCP server or agent connector and the team needs a source-bounded authorization contract for resource, issuer, consent, scope, tool side effects, token lifecycle, task isolation, and recovery.4---56# PM AI MCP to Authorization78Use this skill when an AI product may connect to an MCP server, remote tool,9agent connector, or asynchronous MCP Task and a PM must decide what a host,10client, authorization server, resource server, tool, or task store may access.1112The output is a product and release contract. It is not an OAuth client, MCP13implementation, connector registry, secret manager, or security certification.14Keep a human owner on consent, scope, consequential actions, and the final15release decision.1617## When to use1819Use it when:2021- a team is adding an MCP server, remote tool, connector, or agent integration;22- a host needs to discover an authorization server or protected resource;23- a tool request may expose data, change a record, send a message, spend money,24 or change permissions;25- the product supports per-tool consent, delegated access, re-authentication,26 revocation, or managed authorization;27- a long-running MCP Task returns a task ID, status, result, or cancellation28 operation that must be bound to the requester;29- an OAuth callback succeeded but nobody has documented audience, issuer,30 scope, tenant, expiry, or downstream token handling;31- the team needs a hold, fallback, or pilot decision without live credentials.3233## Do not use3435Do not use this skill to:3637- implement OAuth, PKCE, an MCP client/server, an authorization server, or a38 token store;39- approve a tool, expand a scope, exchange a code, refresh a token, or revoke40 access;41- treat a discovered metadata document, successful callback, or HTTP 200 as42 proof that every tool or task operation is authorized;43- design ordinary in-session progress; use `pm-ai-task-to-progress`;44- define generic actor identity and delegation; use `pm-ai-identity-to-boundary`;45- define a generic tool schema and side effect contract; use46 `pm-ai-tool-to-contract`;47- supervise a run that continues after the user leaves; use48 `pm-ai-background-run-to-supervision`;49- paste tokens, authorization codes, cookies, customer data, private URLs, or50 sensitive screen content into the contract or public receipt.5152Use `Unknown`, `Not provided`, `Not run`, `Not measured`, `Not reproduced`, or53`Not covered` when a host, protocol version, provider, or permission result is54missing.5556## Workflow5758### 1. Frame the authorization decision5960Write one sentence:6162> Decide whether actor `...` may use resource `...` through host `...`,63> transport `...`, scope `...`, and tool/task boundary `...`, with consent,64> expiry, revocation, and fallback `...`.6566Record the user job, requester, owner, current workaround, protected resource,67tenant or workspace, data class, tool side effects, duration, user timezone,68and what remains the user's decision. A successful login is not consent for69every downstream tool or task.7071### 2. Map roles and authority7273Name each role and its evidence:7475| Role | Product question | Evidence |76| --- | --- | --- |77| Resource owner | Whose data or authority is delegated? | user or policy source |78| Host | What UI or agent environment asks for access? | host contract |79| MCP client | Which connector sends the request? | client identity/version |80| Authorization server | Who issues or validates client authorization? | issuer metadata |81| MCP/resource server | Which protected resource receives the token? | canonical resource URI |82| Gateway | Does routing, rate limiting, or policy change the boundary? | gateway contract |83| Tool | What data and side effect does the call expose? | tool catalog and schema |84| Task store | Who can get, list, result, or cancel a task? | task access policy |8586Do not collapse authentication, authorization, consent, delegation, and tool87execution into one `connected` state.8889### 3. Identify transport and discovery9091Record protocol revision, transport, canonical resource URI, issuer, metadata92locations, redirect URI, client metadata or registration route, and supported93scopes. For HTTP authorization, check resource and authorization-server94metadata, `WWW-Authenticate`, issuer, resource indicator, audience, and token95transport. For STDIO or another local transport, record the host's credential96source and local permission boundary instead of copying HTTP OAuth rules.9798If the source or host version is unclear, keep the decision at `Hold` and write99the missing evidence. Do not infer the latest protocol from a package name.100101### 4. Define consent, scope, and tool action boundaries102103For each requested permission, record:104105| Field | Required question |106| --- | --- |107| Resource | What exact server or data surface is protected? |108| Purpose | What user job requires it? |109| Data | What leaves the host and what does the server return? |110| Scope | What least-privilege operation is requested? |111| Tool | Which tool, resource, prompt, or task operation is covered? |112| Side effect | Can it write, send, buy, delete, publish, or change access? |113| Context | Which user, tenant, workspace, and request are bound? |114| Duration | When does consent, token, or task access expire? |115| Control | Can the user inspect, deny, revoke, or choose a manual route? |116117Separate server-level connection from per-tool authorization when a host can118support it. A read-only source fetch does not authorize a message send, record119write, purchase, deletion, or permission change.120121### 5. Verify token and authorization lifecycle122123Do not record a token value. Record whether the host has evidence for:124125- exact issuer and authorization-server selection;126- canonical resource and audience binding;127- issuer validation and no authorization-server mix-up;128- redirect exactness, HTTPS or localhost boundary, and PKCE where applicable;129- scope minimization, consent freshness, and scope-change re-consent;130- expiry, refresh, rotation, revocation, and secure storage;131- no token in URL, logs, prompt content, task result, or upstream passthrough;132- distinct 401, 403, invalid scope, expired, revoked, and rate-limit behavior.133134If a server calls another API, require a separate downstream credential135boundary. A received token must not silently become a credential for a136different audience.137138### 6. Bind tasks and results to authorization context139140If asynchronous tasks exist, define ownership for `tasks/get`, `tasks/result`,141`tasks/cancel`, and `tasks/list`. The contract must answer:142143- Is a task ID bound to the same user, tenant, client, and authorization144 context that created it?145- Does a requester receive only its own task metadata and result?146- Are task IDs high entropy, rate-limited, and subject to a documented TTL?147- What happens when authorization expires or is revoked while a task runs?148- Does cancellation require the same authorization context and explicit user149 control?150- What is the fallback when the host cannot identify the requester?151152If context binding is unavailable, say so, shorten the exposure window where153the host supports it, do not expose a list capability, and keep the release at154`Hold` until the risk is accepted by the owner.155156### 7. Model user-visible states and recovery157158Use these states as needed:159160`not_configured`, `discovering`, `needs_consent`, `authorized`, `denied`,161`expired`, `revoked`, `reauth_required`, `mismatch`, `rate_limited`, and162`unknown`.163164For each state, specify the user control, data/tool visibility, next action,165and evidence. Keep wrong issuer, wrong audience, invalid redirect, invalid166scope, task not found, cross-context denial, and server error separate.167168- First-time: explain resource, data, tool, tenant, duration, and side effects.169- Empty/loading: name missing metadata or discovery phase; show no fake170 percentage or connection success.171- Error: preserve status and reason; do not retry with broader permission.172- Recovery: re-check issuer, resource, scope, and context before re-auth.173- Backtracking: allow deny, revoke, scope reduction, manual fallback, and174 deletion of the local proposal; do not claim server revocation unverified.175- Mobile/accessibility: keep consent keyboard reachable, readable at narrow176 widths, and explicit about what remains denied.177178### 8. Evaluate and decide179180Use positive, negative, cross-context, privacy, and recovery cases. At minimum181cover:182183| Case | Expected result |184| --- | --- |185| correct issuer and resource | discovery can continue with evidence |186| wrong issuer or audience | reject and enter `mismatch` |187| invalid or open redirect | stop before code exchange |188| scope wider than the user job | reduce, re-consent, or hold |189| token appears in URL, log, prompt, or upstream call | redact and fail |190| task belongs to another context | deny get, result, cancel, and list |191| expired or revoked authorization | re-auth or manual fallback |192| task ID enumeration or excessive polling | rate limit and audit |193| tool metadata contains instructions | treat it as untrusted data |194| host cannot prove a boundary | `Not run`, `Not covered`, or `Hold` |195196Choose `Proceed`, `Pilot`, `Hold`, `Fallback`, or `Stop`. A passing schema or197authorization callback is not proof of tenant isolation, user comprehension,198or safe tool behavior.199200### 9. Write a privacy-safe receipt201202Record package/version, host/client, source versions, transport, resource,203issuer class, scope class, consent state, token/task checks, decision,204limitations, and next action. Exclude raw tokens, codes, cookies, customer205content, private URLs, and sensitive screen data.206207## Output contract208209Return the sections below in this order:2102111. `## Decision and user job` - decision, user, workaround, desired outcome,212 and what remains human-owned.2132. `## Sources and freshness` - source URL or ID, protocol/host version,214 date, relevant claim, and source limitation.2153. `## Authority and resource map` - roles, tenant/workspace, transport,216 canonical resource, issuer, client, gateway, tool, and task store.2174. `## Consent and action boundary` - data, purpose, scope, tool side effect,218 duration, allowed/denied actions, inspect, deny, revoke, and fallback.2195. `## Authorization lifecycle` - discovery, redirect, issuer, audience,220 scope, token, expiry, rotation, revocation, error, and re-auth evidence.2216. `## Task and result isolation` - task ownership, context binding, list/get/222 result/cancel rules, TTL, rate limit, and cross-context negative cases.2237. `## UX states and recovery` - first-time, empty, loading, consent, error,224 mismatch, expiry, revocation, mobile, accessibility, and manual route.2258. `## Evaluation and release gate` - cases, oracles, observed results,226 `Not run` / `Not covered`, decision, rollout, fallback, and rollback.2279. `## Privacy-safe receipt` - sanitized YAML or table with no secrets.22810. `## Not covered` - concrete unknowns, unexecuted flows, and claims not229 supported by current evidence.230231## Common rationalizations to reject232233- "The callback succeeded, so every tool is authorized." Separate consent,234 scope, tool action, and result access.235- "The task ID is secret enough." Bind it to authorization context and test236 get, result, cancel, and list paths.237- "The MCP server validates the token." Verify the intended resource, issuer,238 audience, scope, and downstream credential boundary.239- "It is only a read tool." Verify data egress, tenant scope, prompt/resource240 visibility, and whether the tool can trigger a hidden side effect.241- "We can reuse the token upstream." Deny token passthrough; require a242 separately issued downstream credential or a documented safe boundary.243- "No one will see the error." Keep denial, expiry, revocation, re-auth, and244 manual fallback visible to the user.245- "The latest spec covers us." Record the exact protocol and host versions;246 compatibility and security still require an actual host oracle.247248## Edge cases249250- A public tool and a protected tool share one MCP endpoint.251- The issuer changes, the authorization server redirects, or the resource URI252 has a different path than the one shown to the user.253- A scope is added after the first consent, or a tool description changes.254- Authorization expires while a background task is queued, running, or ready.255- A task result is fetched from a different tenant, user, client, or region.256- The client loses the authorization context but still has a task ID.257- A gateway caches tool metadata or routes requests by method and tool name.258- A server response contains an instruction-shaped request to reveal a token,259 widen scope, or call another tool.260- The user denies one tool but accepts another, or revokes access mid-flow.261- The host cannot provide a reliable requester identity or audit trail.262263## Adjacent routing264265- Use `pm-ai-identity-to-boundary` for generic principal, delegation, and266 authorization ownership outside MCP protocol details.267- Use `pm-ai-tool-to-contract` for tool schema, provenance, side effects, and268 recovery without the authorization lifecycle.269- Use `pm-ai-prompt-injection-to-defense` for a full attack path and negative270 evaluation around untrusted instructions.271- Use `pm-ai-background-run-to-supervision` for runs that continue after the272 current interaction and need pause, cancel, expiry, notification, or review.273- Use `pm-ai-task-to-progress` for ordinary task lifecycle and honest progress274 when cross-context authorization is not the central decision.275- Use `pm-ai-data-to-purpose` for data minimization, retention, deletion, and276 third-party reuse policy across an AI data flow.277278## Final check279280Before returning the contract, confirm:281282- source and protocol version are recorded;283- authentication, authorization, consent, scope, tool action, and task access284 are separate concepts;285- the resource URI, issuer, audience, tenant, and requester context are named;286- HTTP and STDIO or other transport behavior is not conflated;287- per-tool side effects and denied routes are visible;288- task get/result/cancel/list isolation is tested or marked `Not run`;289- 401, 403, mismatch, expiry, revocation, rate limit, and recovery states are290 explicit;291- no token, code, cookie, customer data, private URL, or secret appears;292- unknown host behavior is `Unknown`, `Not covered`, or `Hold`, never invented;293- the final decision and next action are owned by a human.