MCP servers, built for the systems a security review actually protects

An MCP server gives an AI assistant controlled access to a company system: one server per system, speaking the Model Context Protocol. This guide covers the enterprise build: how the protocol works, the setup steps, and the security layer of registry, sandboxing and access control. Pexon builds MCP servers for CRM, ERP and engineering systems.

Integration approaches

MCP versus a bespoke API integration, scored for a company with several systems

DimensionMCP serverBespoke API integration
Integration effortEach system integrated once as a server; every assistant reuses itBuilt per system, per consuming application
Number of connectionsOne protocol for N systems and M assistants: N serversN systems times M applications of bespoke code
GovernanceRegistry, tool catalogue and audit trail across all serversPer-integration decisions, repeated
ControlTools and resources exposed explicitly; the model calls only what is listedEverything the API exposes is reachable unless you gate it
Best forSeveral AI tools against several company systemsOne stable system, one consumer, no protocol to learn

The crossover point is low: two systems and two assistants already favour servers. The protocol costs you one standard to learn and saves you every per-integration interface after it.

What a server actually is, and why one per system is the right unit

An MCP server is a small service that exposes tools, resources and prompts over the Model Context Protocol. A CRM server exposes tools like lookup-contact and create-ticket; a database server exposes read-query against approved tables; an engineering system server exposes search-part with the PLM's own access rules. The AI assistant connects to the server as a client, and the server decides what the model may call, which is the entire point of the architecture: the capability boundary sits in a component you own, not inside the model.

One server per system is the right unit for two reasons. The first is failure isolation: a server that breaks takes down its own system's tools, not the whole assistant estate. The second is governance: each server carries its own tool list, permission model and audit trail, so the security review of the CRM integration is a review of one small, readable component rather than of a feature buried inside an application.

The transport matters less than the protocol's shape. Servers can run as local processes over stdio or as network services over Streamable HTTP, and the choice is an operations decision: local for a desktop assistant, HTTP for a service other teams reach. The tools, resources and prompts vocabulary is what makes the ecosystem interoperable, and that is where the standard's value sits rather than in the wire format.

Executable artefact

The server skeleton, and the two lines that define its boundary

Framework and language are placeholders; every MCP SDK ships the same shape. The tool registration and the permission check are the two lines that make this a controlled interface rather than an open door.

# MCP server skeleton (conceptual, any SDK)
from mcp.server import Server, Tool

server = Server("crm")

@server.tool
def lookup_contact(contact_id: str) -> dict:
    """Find a contact by ID in the CRM."""
    # THE BOUNDARY: the caller's identity decides what may be read.
    if not can_read("crm.contacts", caller=caller_id()):
        raise PermissionError("no read access to contacts")
    return crm.get(contact_id, fields=["id", "name", "account"])

@server.tool
def create_ticket(subject: str, body: str) -> dict:
    """Open a ticket in the support queue."""
    if not can_write("crm.tickets", caller=caller_id()):
        raise PermissionError("no write access to tickets")
    return crm.tickets.create(subject=subject, body=body)

# Register the tool catalogue; the assistant sees only what is listed here.
server.register([lookup_contact, create_ticket])
server.run(transport="streamable-http")

The permission check inside each tool is the pattern that survives a security review; tools without it read whatever the underlying API allows.

Security: registry, sandboxing, and access control per call

The security conversation around MCP has a named vocabulary now, and it is worth using precisely. Tool poisoning is the first risk: a server, official-looking or malicious, offers a tool whose name promises one thing and whose code does another, and the assistant calls it because the name is plausible. The second is uncontrolled data access: an assistant with a read tool can read too much, because the tool's scope is whatever the underlying system allows rather than what the user is permitted to see.

The three controls that answer both are registry, sandboxing and per-call authorisation. A registry holds the approved servers and their versions, so only reviewed components join the estate and a poisoned server cannot be added silently. Sandboxing constrains what a server process can reach, so a compromised or broken server cannot walk sideways into other systems. Per-call authorisation means each tool call carries the caller's identity and is checked against the same access rules the human would face: the assistant can read what the user could read, and nothing more.

The client side deserves the same attention. The assistant's permission system should deny by default, require explicit approval for sensitive tool categories, and log every call to the audit trail. None of this is exotic; it is the same discipline as any other integration, applied to a component whose consumer is a model that will call tools it was told about. Treat the protocol as neutral and the discipline as yours, and MCP is no more dangerous than the API it standardises.

Our position: an MCP server without a permission check inside each tool is an API integration with a new hat on. The protocol is not the security boundary; the tool implementation is.

Build order

The five steps from first server to approved estate

  1. Pick the first system by value, not by ease. The CRM or the engineering system the assistant will actually be asked about. The first server proves the pattern and the review; it should be the one that matters.
  2. Define the tool list with the system owner, tool by tool. Each tool is a capability decision: what the model may call, what it may read, what it may change. The list is the contract the security review reads.
  3. Implement the permission checks inside the tools. Caller identity, scoped reads, denied writes by default. The pattern in the skeleton above, applied to every tool before the first one ships.
  4. Stand up the registry and the sandbox before the second server. The registry makes the estate reviewable; the sandbox makes it survivable. Both are infrastructure decisions, not per-server afterthoughts.
  5. Run the review on the first server and fix the class, not the instance. The first security review will find gaps. Fix the pattern they reveal, not the one server, so the second and third pass faster.

Why this matters now: the assistant is only as good as the systems it can reach

The reason MCP is the integration pattern worth building around is that the number of assistants is about to exceed the number of systems. An engineering company with a CRM, an ERP, a PLM and a quality system will run a service desk assistant, a search assistant and a maintenance assistant, and the alternative to a protocol is a tangle of bespoke integrations that each carry their own security story. The protocol collapses that into servers, each reviewed once, each with its own boundary.

The enterprise case is not the demo case. A demo server that reads a public table is a weekend project; a server that reads contracts and writes tickets is an infrastructure component with an owner, a review and an audit trail. The difference is exactly the three controls above, and it is why we build MCP servers as a fixed-scope engagement rather than as an add-on to something else: the security layer is the deliverable, not the protocol call.

What we have not done is run a full multi-server MCP estate in production for a customer, so nothing here is drawn from one. The argument is structural: it rests on what the protocol defines, what the tool pattern requires, and what a security review will ask, all of which are knowable before the first deployment.

Sources: Model Context Protocol specification and documentation · Anthropic — Introducing the Model Context Protocol. Read 2026-09-14. Vendor documentation changes; verify against the current release.

Questions we get asked when the first server is running and the second one is in review

What is an MCP server?

An MCP server is a component that provides functions to an AI application over the Model Context Protocol. It exposes tools, resources and prompts — a CRM lookup, a database read, a ticket creation — that the AI assistant can call. One server per system, and the assistant talks to all of them through the same protocol instead of one bespoke integration each.

How does MCP differ from a regular API integration?

An API integration is built per system, per client: your application owns the code for each endpoint. MCP standardises the connection layer, so one assistant can reach many systems through servers that speak the same protocol, and each system is integrated once rather than once per consuming application. For a company with three systems and five AI tools, that is fifteen integrations versus three servers.

Is MCP secure enough for enterprise systems?

The protocol is neutral; security is an operating discipline. The three controls that matter are a registry of approved servers, sandboxing so a malicious or broken server cannot reach beyond its scope, and access control so each tool call carries the caller's identity and permissions. Without them, an MCP server is a new attack surface: tool poisoning and uncontrolled data access are the named risks.

How long does it take to build an MCP server?

A working server for one system with a handful of tools is a matter of days. The production version — with registry, permissions, audit logging and the client-side sandbox — is weeks, because the security layer is the part that takes the time. Pexon offers MCP server development as a fixed-scope engagement for exactly this reason.

What can go wrong with MCP in production?

The failure modes are operational, not protocol-level. Tool poisoning — a server that offers a plausible-looking tool that does something else — is the one security teams ask about first. Uncontrolled data access is the second: an assistant that can read a system can read too much of it unless queries carry permissions. Both are addressed by registry, sandboxing and per-call authorisation.

Next step

One protocol, three systems, and the security layer already in place

Fixed-scope engagement, two to four weeks. We build the MCP servers for your first one to three systems, stand up the registry and the permission model, and hand back the architecture a security review can approve. The servers are yours to keep whether or not we build the rest.