Ting Guides · For the CTO and CIO

MCP or API: how do you connect an AI assistant to your CRM safely?

The short answer

Use both. Your CRM's API stays the way in to the data; an MCP server wraps that API as a few named tools any MCP-capable AI application can call, instead of one custom integration per application. Safety comes from what you build inside the server: the user's own permissions on every call, minimal fields, timeouts and logs.

From this guide's worked example
See it worked through

What it depends on

  1. What MCP is, and what it is not

    The Model Context Protocol is an open standard that Anthropic introduced in November 2024 for connecting AI assistants to the systems where data lives. Its documentation says it "focuses solely on the protocol for context exchange" and does not dictate how AI applications use language models. It is a way in, not a security model.[1][2]

  2. How many AI applications will connect

    One assistant talking to one CRM can call the API directly. When a second or third AI application, or a second team, needs the same data, an MCP server in front of the API lets each of them reuse the same tools instead of a new integration each time.

  3. How each application connects

    MCP defines two transports: stdio, for a local server on the same machine, and Streamable HTTP, for remote servers, which supports standard HTTP authentication such as bearer tokens, with OAuth recommended for obtaining them. Check which transport and which authentication each AI application supports before you promise it will connect.[2]

  4. What the AI should be allowed to do

    Reading a customer file and creating a ticket are different risks. OWASP's guidance on excessive agency is to limit tools and their permissions to the minimum necessary, and to require a human to approve high-impact actions before they are taken.[4]

When does an MCP server beat a direct API integration?

MCP doesn't replace the API. The question is whether each AI application gets its own integration, or all of them share one server.

ADirect API
  • Sales assistant
  • Service assistant
  • Reporting assistant

CRM API

Three integrations to build, update and secure separately

BMCP server
  • Sales assistant
  • Service assistant
  • Reporting assistant

One MCP server

Identity and permission check on every call

CRM API

A new application connects to the same server and the same tools

QuestionDirect API integrationMCP server over the same API
Connecting a new AI applicationBuild another integration from scratchIt connects to the same server and uses the same tools
A change in the CRMUpdate every integrationUpdate the server once
Where permissions liveSpread across each integrationInside each tool, in one server
What the AI seesWhatever each integration exposesA list of named tools, each with a description and an input schema
Fits best whenOne application, one system, a few callsSeveral AI applications or teams need the same data

How do you connect it, step by step?

1Read

  1. Start with fictional data and one read-only tool

    For example get_customer(customer_id). Don't start with deleting records or anything that moves money.

  2. Use the official SDK in your team's language

    Follow the current server quickstart in the MCP documentation, and record the SDK version in a pilot project before anything touches real data.[2]

  3. Give each tool a clear name, description and input schema

    get_customer takes customer_id and nothing else, and its description says it returns a customer file the signed-in user is allowed to see. Never let the model pick the company or entity from the text of the question.

2Permissions

  1. Check identity and permissions inside the server

    Take the user's identity, entity and permissions from the sign-in, a trusted source, and check that this user may see this customer before returning anything. A tool's description, or an approval prompt in the AI application, is not that check. MCP's security guidance is explicit that a server must not accept tokens that were not issued for it.[3]

  2. Return the fewest fields, with limits

    Return only the fields the request needs, set a timeout and a result-size limit, and write error messages that reveal no data and no secrets.

3Go-live

  1. Connect one AI application, then the next

    Confirm the first application lists the tools and uses them correctly. Connect a second one only after confirming it supports the same transport and authentication.

  2. Then add one write tool

    A tool such as create_ticket changes data, so it needs narrower permissions, a human approval when the impact is high, and protection against running twice.[4]

  3. Log every call

    Record who asked, which tool, when, and the result, without logging the full customer file or any access token.

One tool, as the AI application sees it

This is the definition the server returns when an application lists its tools: a name, a title, a description and an input schema. The description is written for the model, so it says exactly what the tool returns and for whom.

tools/list → get_customerjson
{
  "name": "get_customer",
  "title": "Customer file",
  "description": "One customer file the signed-in user may see: name, owner, open orders, balance.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "customer_id": {
        "type": "string",
        "description": "The CRM customer ID, for example C10482"
      }
    },
    "required": ["customer_id"]
  }
}

The order of the checks inside the tool

A sketch, not a framework: verify the caller, fetch with a timeout, check the permission, log, and only then return the minimum. The same message for "not found" and "not allowed" keeps the tool from revealing which customer IDs exist.

get_customer handler (sketch)python
def get_customer(request, args):
    user = verify_token(request)          # issued to THIS server; reject any other token
    if user is None:
        return error("Please sign in again")   # no tool runs without a valid identity

    record = crm.get_customer(args["customer_id"], timeout_s=5)
    if record is None or not user.may_view(record):   # entity, branch and role
        log(user.id, "get_customer", args["customer_id"], "refused")
        return error("Customer not found or not available to you")

    log(user.id, "get_customer", args["customer_id"], "ok")
    return pick(record, "name", "owner", "open_orders", "overdue_balance")

What changes for companies in Saudi Arabia

General information, not legal advice. Each regulatory point summarises the official source cited beside it, as checked on the date shown under Sources; confirm how it applies to your company with your legal adviser.

  • Several entities on one CRM

    When a group's companies share one CRM, the entity belongs to the user's identity from the sign-in, never to the words of the question. A request for another entity's customer is then refused by the server, whatever the prompt says.

  • Customer records and model hosting

    A tool that returns customer files sends personal data to wherever the AI model runs. If that is outside the Kingdom, Article 29 of the Personal Data Protection Law (Royal Decree M/19 of 9/2/1443H, amended by Royal Decree M/148 of 5/9/1444H) sets the conditions for the transfer, including an adequate level of protection and limiting it to the minimum personal data needed, and the Transfer Regulation sets the exemptions from those two conditions and the safeguards they require (Article 4). Returning the fewest fields is good engineering and fits the minimum-data condition; whether the transfer is allowed is a question for your legal adviser.[5][6]

  • Arabic questions, English tool names

    Keep tool names in English snake_case, but write descriptions that cover how your users actually ask, and test Arabic questions that name customers in Arabic and in Latin letters.

The fifteen-minute permission test, filled in

ExhibitWorked example

Ting

Six cases to run before any AI application connects, here at the fictional Rasikh Holding, where Rasikh Motors and Rasikh Trading share one CRM. If one case fails, fix it before connecting anything else.

CaseRequest (fictional)Correct resultIn this run
Allowed requestSara, sales at Rasikh Motors, asks for Rasikh Motors' customer C10482The file comes back with four fields onlyPass
Outside her permissionsSara asks for Rasikh Trading's customer C20931Refused before any data leaves the serverFailed, then fixed
Incomplete requestcustomer_id left empty or mistypedA clear error messagePass
CRM slow or downThe CRM doesn't answer within five secondsA timeout and a safe message, no retry loopPass
Invalid sign-inAn expired session, or an application that isn't approvedNo tool runsPass
Same request, two applicationsSara asks the same question in two AI applicationsSame result, same permissionsPass

The decisionConnect the first application. The one failure leaked nothing from the record itself: the error said "not allowed" for real IDs and "not found" for unknown ones, which showed which IDs exist in another entity. One message now covers both, and the case passes.

Source: Illustrative example: not a Ting client and not client data.

Questions people ask

Does MCP replace our CRM's API?
No. The MCP server calls the same API. It changes how AI applications reach your CRM, not how the CRM exposes its data.
Is an MCP connection secure by default?
No protocol makes an integration safe by itself. Checking the user's permissions, returning the fewest fields, timeouts and logging are your server's job; the steps above cover each one.
Do we need MCP if we only use one AI application?
Not necessarily. A direct API integration is simpler for one application and one system. MCP pays off when several AI applications or teams need the same tools.

What Ting does and doesn't do here

What we do

  • We define the tools, permissions and approval rules in an AI Solution Blueprint, then build the server on your CRM's existing API.
  • We run the permission tests on fictional data first, then on the agreed live scope, before any application connects, and hand over the logs and runbooks.

Where Ting helps: Custom AI Implementation

What we don't do

  • We don't give an AI application a shared all-access account to your CRM.
  • We don't connect write tools before the read-only tools pass their tests.

Sources

Primary sources only, each read in full on the date shown.

  1. Introducing the Model Context Protocol (25 November 2024)Anthropic · checked
  2. Architecture overview: hosts, clients, servers, tools and transportsModel Context Protocol · checked
  3. Security Best Practices: token passthrough and scope minimizationModel Context Protocol · checked
  4. LLM06:2025 Excessive AgencyOWASP GenAI Security Project · checked
  5. Personal Data Protection Law (Royal Decree M/19 of 9/2/1443H, amended by Royal Decree M/148 of 5/9/1444H)SDAIA · checked
  6. Regulation on Personal Data Transfer outside the Kingdom, version 2.0 (August 2024)SDAIA · checked

Ready to try this
on your own workflow?

Contact us