The Important Distinction
MCP is a protocol boundary. “MCP App” is a product and ecosystem term that can describe several different deployments:
human or agent
|
v
Host / Client -- approval, identity, UI, model policy
|
v
MCP Server -- protocol endpoint and capability descriptions
|
v
application services, data, and external side effects
The protocol does not automatically provide a marketplace, a billing system, a trusted publisher, a user interface, or authorization. Those remain product and deployment responsibilities.
Four Product Shapes
| Shape | Typical use | Main risk |
|---|---|---|
| local adapter | expose a user-owned filesystem or development tool | process permissions and local data leakage |
| remote integration | connect a tenant to a SaaS or internal system | token audience, object authorization, and data egress |
| embedded capability | one product exposes a narrow feature to its own Host | coupling, quotas, and support boundaries |
| catalog distribution | many organizations discover and install Servers | provenance, review, credentials, and lifecycle |
These shapes can share an SDK but should not share assumptions. A local stdio adapter does not become a multi-tenant SaaS product by adding a manifest.
Capability Design
Tools, Resources, and Prompts have different contracts:
| Primitive | Contract | Product question |
|---|---|---|
| Tool | request may execute work or cause a side effect | what is the exact object, actor, purpose, and idempotency key? |
| Resource | returns bounded context or data | who may read it, how fresh is it, and how is deletion propagated? |
| Prompt | reusable instruction or interaction template | what untrusted data can it include, and who may invoke it? |
Prefer a narrow business operation over a generic capability:
{
"name": "invoice.get_summary",
"description": "Return an approved summary for one invoice in the caller's tenant. Does not modify billing data.",
"inputSchema": {
"type": "object",
"properties": {
"invoice_id": {"type": "string", "minLength": 1}
},
"required": ["invoice_id"],
"additionalProperties": false
}
}
The schema constrains shape. The server must still derive the principal from trusted context, check tenant and object access, bound the result, and redact sensitive fields.
Product Architecture
A production MCP product normally needs more than an SDK:
- Capability boundary: narrow Tools, Resources, and Prompts with versioned contracts.
- Identity boundary: authenticated principal, tenant, scopes, and workload identity.
- Policy boundary: object ownership, purpose, side effects, approvals, quotas, and egress.
- Reliability boundary: timeout, cancellation, retries, idempotency, backpressure, and recovery.
- Data boundary: minimization, retention, deletion propagation, audit, and export controls.
- Commercial boundary: plan, meter, invoice, refund, and support semantics.
Keep these boundaries explicit. A description or Tool Annotation can help a Host present risk, but it cannot authorize a call.
From Capability to Product
Use this sequence:
1. Identify a repeated job
Describe the user outcome, not the novelty of “AI integration.” Specify the input, evidence needed, expected result, human fallback, and unacceptable failure.
2. Choose the smallest interface
Start with one bounded read or reversible action. Avoid generic SQL, arbitrary HTTP, shell execution, unrestricted file access, and “do anything” prompts.
3. Establish ownership
For each object, define the source of truth for tenant, subject, account, price, role, and approval. Never accept those values from model-generated arguments when the application already knows them.
4. Measure the real outcome
Track successful business tasks, evidence correctness, authorization denials, duplicate side effects, latency tails, token and downstream cost, cancellation, and support events. Tool-call count alone is not product value.
5. Add distribution only after operations work
A catalog increases installation and supply-chain risk. First prove upgrades, rollback, credential rotation, incident response, rate limiting, and deletion.
Distribution and Discovery
A catalog or registry is an additional trust system. Its minimum design should include:
- publisher identity and verified ownership;
- signed or reproducibly built artifacts where applicable;
- version and dependency pinning;
- declared capabilities and side effects;
- permission review before installation;
- isolated credentials and network egress;
- vulnerability and malicious-result response;
- revocation, rollback, uninstall, and deletion propagation;
- an audit trail for who installed and approved each version.
Discovery metadata is untrusted input. A listing cannot prove that a Server is safe, that its annotations are honest, or that every Tool should be exposed to every tenant.
Host and Client Experience
“Zero-code” is not the same as zero responsibility. A good Host should make the following visible at the moment of risk:
- which identity and tenant will be used;
- which objects will be read or changed;
- whether the action is reversible;
- what data leaves the boundary;
- expected latency, quota, and cost;
- what approval is required;
- how to cancel or recover.
Natural-language selection can propose a capability. The application and server decide whether it may execute.
Billing and Metering
Pricing is a contract, not a model output. Define:
| Question | Required decision |
|---|---|
| unit | request, successful outcome, bytes, duration, or subscription |
| retries | whether provider or client retries are billable |
| cancellation | when a canceled task incurs cost |
| duplicate delivery | how idempotency avoids double charge |
| limits | per-principal, tenant, plan, and downstream quota |
| evidence | what the customer can inspect or dispute |
| privacy | retention and deletion of metering data |
Keep account, price, currency, discount, and ownership server-side. A model may select a plan-related intent, but it must not set the authoritative amount or customer identity.
Reliability and Support
An MCP product is an operational service. Test:
- initialization and capability negotiation;
- schema rejection and unknown fields;
- authentication, scope, tenant, and object mismatch;
- result size, pagination, and sensitive-field redaction;
- timeout, cancellation, retry classification, and idempotency;
- reconnects, duplicate delivery, and rolling upgrades;
- downstream outage, partial failure, and compensation;
- quota exhaustion and fair scheduling;
- replayed fixtures and abuse cases;
- deletion from primary data, caches, indexes, backups, and exports.
Publish an explicit compatibility matrix:
Host x Client x SDK x MCP revision x Transport x Authorization
“Works with MCP” is too broad to be a support promise.
Minimal Product Manifest
Keep commercial and operational metadata separate from protocol capabilities:
{
"product_id": "invoice-summary",
"server_version": "1.4.0",
"mcp_revision": "pinned-revision",
"transports": ["stdio", "streamable-http"],
"capabilities": ["invoice.get_summary"],
"side_effects": "read_only",
"data_classes": ["tenant_invoice_metadata"],
"required_scopes": ["invoices.read"],
"result_limits": {"max_bytes": 262144},
"support": {"rollback": true, "contact": "owned-by-provider"},
"billing": {"unit": "authorized_successful_task", "retry_policy": "idempotent"}
}
The manifest is a review artifact. Runtime authorization must not trust a field merely because it appears in the manifest.
When Not to Build an MCP App
Do not create a catalog product when:
- a deterministic API or scheduled workflow solves the job more clearly;
- the capability has no stable owner or source of truth;
- the data cannot be legally or operationally deleted;
- the side effect cannot be made idempotent or approved;
- the expected value cannot be separated from model speculation;
- support and rollback are not funded.
An MCP interface is useful when it improves a real workflow, not when it merely adds a new label to an existing endpoint.
Decision Checklist
- [ ] Define the user outcome and failure fallback.
- [ ] Keep the first Tool narrow, bounded, and read-only or reversible.
- [ ] Derive identity, tenant, object, price, and ownership from trusted application state.
- [ ] Separate protocol capabilities from catalog, UI, billing, and support metadata.
- [ ] Treat descriptions, annotations, prompts, resources, and results as untrusted.
- [ ] Test cancellation, retries, duplicate delivery, quotas, and downstream failure.
- [ ] Publish only after credential rotation, rollback, revocation, uninstall, and deletion work.
- [ ] Document the exact Host, Client, SDK, revision, Transport, and Authorization matrix.
- [ ] Measure successful outcomes and user trust, not only tool-call volume.
Conclusion
MCP can make a capability easier for a Host to discover and invoke, but it does not turn a protocol endpoint into a trusted app store or a business model. Build the narrow capability, establish the identity and object boundary, make failure and deletion observable, and only then choose distribution and billing. This order protects user experience because the product earns trust through predictable behavior rather than promotional claims.