Appendix L: Decision Trees
Should This Be an MCP Server?
Does natural language improve the workflow?
├── No -> Stop: a CLI, script or UI (ch03)
└── Yes
└── Does a shared protocol create reuse or control?
├── No -> Stop: function calling or a skill (App D)
└── Yes
└── Will you own the operating cost and risk?
├── No -> Stop and simplify
└── Yes -> Build the MCP server
Local or Remote?
Shared across users or machines?
├── No -> Local STDIO; revisit at the second user
└── Yes
└── Need central auth, policy or rollout?
├── Yes -> Remote server over Streamable HTTP
└── No -> Local STDIO
→ ch07
Tool, Resource, or Prompt?
Does it cause a side effect?
├── Yes -> Tool
└── No
└── Readable context with a stable URI?
├── Yes -> Resource (plus a read tool if the model fetches it)
└── No -> Prompt or workflow template
→ ch06
Which Auth Pattern?
Acting for a signed-in user?
├── Yes -> Authorization Code + PKCE
└── No
└── Confidential service?
├── Yes -> Client Credentials
└── No -> Rethink trust; API keys only for narrow first-party use
→ ch18
Which Client Registration?
Pre-registered credentials for this issuer?
├── Yes -> Use them
└── No
└── AS advertises client_id_metadata_document_supported?
├── Yes -> CIMD
└── No
└── AS advertises registration_endpoint?
├── Yes -> DCR (deprecated) + application_type
└── No -> Ask the user
Does This Tool Need Approval?
readOnlyHint: true, backed by a read-only credential?
├── Yes -> None, unless openWorldHint after untrusted input
└── No
└── destructiveHint: true?
├── Yes -> Approval showing exactly what is lost
└── No
└── idempotentHint: true, caller's own data only?
├── Yes -> Host-level approval
└── No -> Approval, or split the tool
How Should I Test It?
What changed?
├── Business logic -> Unit tests
├── Tool schema -> Contract tests
├── Dependency -> Integration tests
├── Client behavior -> Client-in-the-loop test
└── Model routing -> Real-model evaluation
→ ch12