Agent Architecture and Protocol Strategy Artifacts

MCP Server Contract Workbench

SIMULATEDVerified Jul 2, 2026

MCP is not a magic layer. It is an integration contract. This artifact shows how a shared protocol can reduce bespoke connector work as the number of tools and agent consumers grows.

Same instrument · three industries pick a use case to reconfigure the run

Prefer to read? The two minute case study · problem → approach → metric → outcome

Problem

Enterprise agent programs often stall because every new tool requires custom integration work. When systems and agent consumers multiply, point to point integration becomes an operating burden that MCP can reduce when the integration surface is large enough.

Approach

The workbench shows a modeled MCP client interacting with server manifests, tools, resources, prompts, structured requests, typed errors, and the initialization handshake, making the protocol contract and its integration tradeoff visible rather than claiming production MCP coverage.

Why this way

This artifact connects protocol design to delivery speed, integration cost, change failure risk, and operating maintainability, showing why integration strategy matters before agent work scales across teams.

The metric

The crossover in the producers×consumers chart: the consumer count at which the shared protocol becomes cheaper than bespoke glue.

The trade-off

A protocol layer is overhead for a tiny surface (a few tools, one consumer). The lab shows exactly where the surface is large enough that standardizing pays.

Outcome

A defensible recommendation to adopt (or not adopt) MCP for a given integration surface, with the crossover math and honest failure modes on the wire, not a slide asserting it.

Card disputes system of record (finserv).

Server manifest · Disputes API

+ Build a custom tool

Validated against the MCP tool shape, then callable above with real JSON RPC frames (honest -32602 on bad args).

Most demos stop at tools. Resources (read only context) and prompts (reusable templates) are part of the same contract.

Session lifecycle · the initialize handshake
  1. client→serverrequestinitialize
    {
      "jsonrpc": "2.0",
      "id": 1,
      "method": "initialize",
      "params": {
        "protocolVersion": "2025-06-18",
        "capabilities": {
          "tools": {},
          "resources": {},
          "prompts": {}
        },
        "clientInfo": {
          "name": "ai-labs-playground",
          "version": "1.0.0"
        }
      }
    }

    The client opens the session by declaring the protocol version and the capabilities it supports, nothing tool specific yet.

  2. server→clientresponse
    {
      "jsonrpc": "2.0",
      "id": 1,
      "result": {
        "protocolVersion": "2025-06-18",
        "capabilities": {
          "tools": {
            "listChanged": true
          },
          "resources": {},
          "prompts": {}
        },
        "serverInfo": {
          "name": "Disputes API",
          "version": "1.0.0"
        }
      }
    }

    The server replies with the version it agreed to plus its own capabilities and identity. Version is negotiated here, once.

  3. client→servernotificationnotifications/initialized
    {
      "jsonrpc": "2.0",
      "method": "notifications/initialized"
    }

    The client acknowledges with a notification (no id, no reply). The session is now live.

  4. client→serverrequesttools/list
    {
      "jsonrpc": "2.0",
      "id": 2,
      "method": "tools/list",
      "params": {}
    }

    Discovery is one call, not N bespoke integrations: the client asks the server what it can do.

  5. server→clientresponse
    {
      "jsonrpc": "2.0",
      "id": 2,
      "result": {
        "tools": [
          {
            "name": "get_dispute"
          },
          {
            "name": "open_dispute"
          }
        ]
      }
    }

    The server returns its 2 tools by name. The client codes to this list, so a newly added tool appears here with no client change.

Call get_dispute

MCP vs bespoke, the crossover

8
6

Bespoke integrations

48

systems × consumers

MCP endpoints

14

systems + consumers

Bespoke integration grows as N×M; a shared protocol grows as N+M. The crossover is early, here MCP is 3.4× fewer connections.

If you act on this · the call → expected lift → how you'd measure it

The call

Adopt MCP when the number of systems and agent consumers makes bespoke integration inefficient.

Expected lift · illustrative

Reduces repeated connector work by moving shared tools behind a reusable protocol contract.

How you'd measure it

Connector count reduced, tool onboarding time, protocol adoption share, integration change failure rate.

What the wire teaches

Every tool call is the same envelope: a named tool, typed arguments, structured content back, typed errors on failure. That uniformity is the whole value, one contract, many systems, many consumers.

Steering committee takeaway: The MCP decision is not ideological. Count the systems, count the consumers, and identify the crossover where standardization becomes cheaper than custom glue.

How this is built

Manifests are authored per mock system (tools with typed args, resources, prompts). The composer builds a real JSON RPC 2.0 `tools/call` frame; arguments are validated against the tool's schema, and failures return a −32602 error frame, the same path a real server takes.

Stack: Next.js (static) + shared design system; deterministic, client side. No live server, the round trip is constructed, not fetched, and labeled SIMULATED.

Limitations: this is a deterministic portfolio artifact. A production MCP implementation would require authentication, authorization, capability negotiation, streaming, pagination, observability, and enterprise security controls.