Use caseAI agentCustom software

Connect your ERP and CRM to Claude, ChatGPT or Copilot without handing over the keys

A custom MCP server that gives Claude, ChatGPT and Copilot scoped access to SAP Business One and your databases: read-only by default, writes behind approval.

A blueprint, not a client story. The business described is illustrative; the architecture, integrations and trade-offs are real, and this is how I would build it. By Ergini, .

The short version

A custom MCP server that lets Claude, ChatGPT or Microsoft Copilot look things up in SAP Business One, HubSpot and your own databases on behalf of each employee. Instead of the whole API, it exposes a handful of purpose-built tools, such as checking stock or drafting a quote. People sign in through your identity provider and see only their own scope, anything that writes waits for a person's approval, and every call is logged.

Best for
Companies whose staff already paste ERP or CRM data into chat assistants, on systems with no official MCP server, like SAP Business One.
Connects to
SAP Business One, HubSpot, Postgres or SQL Server database, Claude, ChatGPT and Copilot Studio, Microsoft Entra ID or another OAuth provider, Microsoft Teams
The AI does
The assistant your staff already use picks which tool to call and writes the answer. The server itself contains no model at all.
People do
Decide which tools exist and who may call each one, approve writes above set limits, and turn draft quotes into real ones in the ERP.
Built as
AI Integration, usually $3.5K - $15K

The ERP is already in the chat window, one paste at a time

Picture an 80-person distributor of hydraulic fittings, hoses and pneumatics, selling to machine builders and repair shops in Austria and southern Germany. Orders, stock, prices and invoices live in SAP Business One. The pipeline lives in HubSpot. Truck routes and drop windows sit in a small Postgres database behind a planning tool a contractor built years ago.

The sales team found chat assistants on its own. Each morning a few reps export stock and open orders from B1 to Excel, then paste pieces into ChatGPT or Claude all day to write quotes and replies. It works until it does not: the export is stale by ten, the paste lands in whichever account the rep has open, sometimes a personal one, purchase prices travel along with selling prices, and nothing records any of it. It is copy-paste between apps with a language model at the end.

The fix is to give those assistants a proper connection. MCP, the Model Context Protocol, is the standard Claude, ChatGPT and Copilot Studio all use to call outside tools, and since December 2025 it has been governed by the Agentic AI Foundation under the Linux Foundation rather than by a single vendor. A company runs an MCP server offering a few tools, staff connect their assistant and sign in, and the assistant then looks things up live, as that person and within that person's rights.

Which systems already have an official MCP server

The first question is whether you need a build at all. Many systems now publish their own server, usable from Claude, ChatGPT and Copilot Studio alike, and for those the answer is usually to use it.

HubSpotYes: remote, OAuth, CRM read and writeUse it, and build only what it cannot do
QuickBooks Online, XeroYes: official servers from Intuit and Xero that run locallyUse them, wrapped if writes need approval rules
StripeYes: remote, OAuth or restricted keysUse it with human confirmation of tool calls, as Stripe advises
SlackYes, for Marketplace and internal apps onlyUse it through an internal app
Microsoft 365Yes: Work IQ servers for Teams, SharePoint, calendar and more, through Agent 365Use them inside your tenant
Atlassian, NotionYes; Atlassian's is permission-awareUse them
SAP Business One, Odoo, DATEV, PipedriveNo official server; community ones at mostCustom server, or Zapier's MCP for light Pipedrive use
Your own database or appNo, by definitionCustom server over prepared views, never raw SQL
Checked against the official MCP registry and vendor documentation in September 2026. Community servers exist for most systems, and a registry search for Shopify alone returned 22 entries, almost all unofficial. Nobody vouches for what those do with your credentials.

A quote request in Claude, with the calls behind it

The rep types one message. The model in Claude decides which tools to call; the server decides what this rep may see and what may be created.

Claude, Thursday 10:12

  1. Sales rep · Claude

    K10442 wants 400 HX-2240 fittings and 60 m of HS-16 hose by Friday next week. Can we do it, and at what price? Draft a quote if we can.

  2. find_customer(query: "K10442")machine builder, Linz / account owner: this rep / price list OEM-B / 30 days net / no credit hold
  3. check_stock(items: ["HX-2240", "HS-16"])HX-2240: 460 free across two warehouses / HS-16: 42 m free, 200 m on a purchase order due 18 Sep
  4. get_delivery_slots(postcode: "4020", before: "2026-09-18")Linz route: Tue 15 Sep, Thu 17 Sep
  5. get_price(customer: "K10442", items: ["HX-2240", "HS-16"])HX-2240: EUR 4.18 each (OEM-B, 250+ break) / HS-16: EUR 11.90 per m / source: B1 price list
  6. draft_quote(customer: "K10442", lines: 3, deliver: "2026-09-17", key: "q-7f2c")B1 draft 5531 created / not a quotation, not sent / discount 0%, within limit
  7. Claude · Claude

    Mostly. The 400 fittings are in stock for the Thursday 17 September truck to Linz, at EUR 4.18 each on their OEM-B price list. The hose is the constraint: 42 m is free, and the next 200 m arrive a day after that truck. Draft 5531 in SAP has the fittings and 42 m for Thursday, and the other 18 m on the 22 September truck. Nothing has been sent; the office turns the draft into a quotation in B1.

  8. Had the rep asked for 12% off, draft_quote would have refused anything above the rep's 5% limit and sent an approval request to the sales manager in Teams instead.
Prices and stock came from B1 at the moment of asking, not from a morning export. The only thing the assistant could create was a draft, and the idempotency key makes a retried call return draft 5531 rather than a second draft.

Inside the server, from tool call to audit log

The only model in this picture runs inside Claude, ChatGPT or Copilot. The server is ordinary code, deliberately: it is where the rules live that no prompt can argue with.

  1. 01 Trigger · Claude, ChatGPT, Copilot Studio

    Someone asks their assistant

    A rep, a buyer or someone in finance asks a question in Claude, ChatGPT or Copilot, signed in with a company account.

  2. 02 AI model · MCP over streamable HTTP

    The assistant's model picks a tool

    From the tool names and descriptions, the model decides to call, say, check_stock with two item codes. It is the only model in the chain, and it runs at the vendor, not on your server.

  3. 03 Plain code · Entra ID, OAuth 2.1

    Check the token and the person

    The server validates the token's signature, expiry and audience, and rejects any token not issued for it; the MCP specification forbids passing a user's token through to other systems. Entra groups then decide the person's role, region and B1 sales employee code.

  4. 04 Plain code

    Apply the person's scope

    A policy table in version control decides which tools and fields each role gets, and arguments are validated against each tool's schema. A rep sees selling prices for their own accounts, never purchase prices or margins.

  5. 05 System · SAP B1 Service Layer, Postgres views

    Read from the source, gently

    B1 is called through the Service Layer from a small session pool, under per-person and global rate limits and a ten-second timeout, with stock cached for sixty seconds. The delivery database is read through views by a read-only role.

  6. 06 Decision

    Does this call change anything?

    Code decides, from the policy table and the values B1 returns.

    • A read then return only the fields the tool promises, trimmed and marked as data
    • A draft quote within the person's discount limit, for a customer without a credit hold then create one B1 draft, deduplicated by its idempotency key
    • A discount above the limit, a credit hold, or a write tool not enabled for this role then no write; an approval request goes to the sales manager in Teams
    • B1 does not answer in time then a clear error the assistant can pass on, and no automatic retry of writes
  7. 07 Person

    A person approves or finishes the job

    The sales manager sees customer, lines, requested discount and rep in a Teams card, and approves or declines. Office staff turn drafts into quotations in B1, as they do today.

  8. 08 Result · Append-only log

    Every call lands in the audit log

    Who asked, through which assistant, which tool, the arguments, the decision and the time. Tool results are not stored, so the log never becomes a second copy of the ERP.

Eight tools, and the line each one cannot cross

Tools follow the tasks people actually do, not every endpoint. A short list means the model picks the right tool more often, and each tool is a permission boundary with its own tests; see tool calling best practices.

find_customerFinds a customer by name, number or VAT IDSales, service, financeReturn customers outside the caller's region, except for finance
get_customer_termsPayment terms, credit limit, open balance, credit holdSales managers, financeShow bank details or change terms
check_stockFree, committed and on-order quantities per warehouseEveryoneShow purchase prices or supplier names to sales
get_priceThe customer's selling price from their B1 price listSalesAccept a price from the assistant: prices only ever come from B1
get_open_ordersOpen sales orders and promised dates for one customerSales, serviceShow orders of customers outside the caller's scope
get_delivery_slotsNext truck dates for a postcodeEveryoneRun anything except its prepared view
find_datasheetA link to the product datasheetEveryoneReturn documents marked internal
draft_quoteCreates a B1 draft quotationSalesCreate a real quotation, send anything to a customer, or exceed the caller's discount limit
Each tool carries MCP's read-only or destructive hint so clients know to ask before a write. The specification tells clients to treat such hints as untrusted, so the server enforces every line above itself.

The parts that are harder than the demo

A demo server with one tool takes an afternoon. These are the parts that take the rest of the build.

Data that carries instructions

A B1 remarks field or a HubSpot note copied from a customer's email can contain text aimed at the model. Tool results come back as structured fields, free text is truncated and labeled as data, and no tool can send anything outside the company, so an injected instruction has nowhere to go. The prompt injection guide explains why that matters.

One technical user, fifty real ones

B1 sees a single technical user, so the server, not B1, enforces who may see what. The policy table is code-reviewed and tested with one test account per role. Whether people who reach B1 data through an integration need licenses of their own is a question for your SAP partner and your contract, best settled before rollout.

Tokens that outlive the person

Access tokens are short-lived and bound to this server. The B1 service credentials sit in a secrets vault and never reach a client. Disabling someone in Entra ID ends their access at their next call, not at the next password change.

An assistant stuck in a loop

Models retry, rephrase and sometimes call the same tool thirty times. Rate limits per person and per tool, a capped session pool and short caching mean a runaway loop hits a limit, never the ERP that invoices your customers.

Why there is no run_sql tool

A free-form SQL tool makes the fastest demo and the worst production system: injected queries, accidental full-table reads, answers built on joins nobody checked. Every query here is written in advance, parameterized, and run by a read-only role against views.

The server from a stranger's GitHub

Community MCP servers run with whatever credentials you hand them. In 2026 a trojanized MCP server for the Oura ring delivered an infostealer, and an unauthenticated MCP endpoint in nginx-ui left more than 2,600 instances exposed. A custom server has a known author, pinned dependencies and code you can read.

The order I would switch it on in

  1. Read-only tools for three or four reps, in the assistant they already use, with the audit log reviewed daily for the first week.
  2. The same server added to the company's other assistants, with sign-in tested in each, because Claude, ChatGPT and Copilot Studio handle connectors slightly differently.
  3. draft_quote switched on, with confirmation in the chat and the Teams approval for discounts above each rep's limit.
  4. The whole sales team, then purchasing and finance with their own scopes. New tools only on request, each with an owner, a test and a line in the policy table.

Nothing writes to the ERP in the first stage, so the only early risk is a wrong answer, and the log shows it.

Official server, Zapier, or a server of your own?

Use the official server wherever one exists. HubSpot, Stripe, Xero, QuickBooks Online, Slack, Atlassian and Notion all publish their own, and they will follow their own API changes faster than any custom server. For breadth across many apps with simple actions, Zapier's MCP server covers thousands of apps for little effort, and connector vendors such as CData sell ready-made MCP servers for common systems. For a team that mainly reads HubSpot and QuickBooks from Claude, that is the whole answer.

A custom server earns its place when there is no official one (SAP Business One, Odoo, DATEV, an in-house database), when your permissions are finer than the vendor's (reps who may see selling prices but not margins), when business rules must sit between the assistant and the system (discount limits, credit holds, drafts instead of documents), or when you want one audited entry point that behaves the same in Claude, ChatGPT and Copilot Studio. The engineering is covered in building a production MCP server.

Most companies end up with a mix: official servers for HubSpot and Microsoft 365, a small custom server for the ERP and the database, and an allowlist in each assistant's admin console so staff can connect only approved servers. A private AI gateway is a natural place to enforce that list. Offering your own product to customers' assistants is a different job, covered in the SaaS MCP server use case.

How you would know it is working

A blueprint has no results to report, so here is what I would measure from the first week instead, on your own data.

Tool calls per person per week
From the audit log. A server nobody calls is a server to switch off, and a sudden spike is worth a look.
Drafts that become quotations
The share of B1 drafts the office converts rather than deletes, the plainest test of whether the drafts are useful.
Refusals by reason
Out of scope, over limit, missing approval. Many refusals mean the policy or the tool descriptions are wrong.
Load on the ERP
Service Layer calls per minute and response times, before and after. The server must never be the reason B1 is slow.

What a build like this costs

This is built as AI Integration, which runs $3.5K - $45K overall. A build like this one usually lands in the single AI feature tier: $3.5K - $15K, 1-3 weeks. The first working version runs on your real data well before the end of that window.

What it costs to run

The server is small: a container and a database for the audit log, usually tens of dollars a month to host. Model costs sit in the assistant subscriptions your staff already have. The real running cost is attention: someone reading the audit log and deciding on new tool requests.

What moves the price

  • How many tools write: a lookup is quick, a write with approvals and idempotency is several times the work
  • Where the system runs: a cloud API, or an on-premise B1 that needs a secure tunnel or relay
  • How fine the permissions are: one role for all, or rules per region, account and field
  • How many assistants must work with it, since each handles sign-in slightly differently
  • Audit requirements: retention, who reviews the log, and whether it feeds your SIEM

Who this is for

  • Distributors and manufacturers on SAP Business One, Odoo or another ERP with no official MCP server
  • Sales teams already pasting ERP exports into ChatGPT or Claude, with or without permission
  • SaaS companies that want support staff to query the internal admin database without SQL access
  • IT leads who found community MCP servers on staff laptops and want one approved route instead

Questions people ask about this

Is there an MCP server for SAP Business One?

Not an official one, as of September 2026: the registry lists only community servers for it. A custom server over B1's Service Layer gives Claude, ChatGPT or Copilot a few scoped tools, such as customer lookup, stock, prices and draft quotes, with your permissions, approvals and audit log built in.

Can I connect QuickBooks or HubSpot to Claude?

Yes. Intuit publishes an official QuickBooks Online MCP server with OAuth, covering invoices, bills, customers, vendors, estimates and reports, and Xero has one too. HubSpot's official remote server reads and writes CRM records and is listed in Claude's connector directory. Use them as they are; build around them only when writes need approval rules or the data must meet an ERP.

Our ERP is old and has no API. Can Claude or Copilot still work with it?

Usually, for reading. If the database is reachable, an MCP server can offer lookups over read-only views without touching the application. Writing is the careful part: through the vendor's import mechanism where one exists, or a supervised screen-level agent where none does, never with direct database writes. The legacy system automation use case covers the second route.

Is giving ChatGPT access to our ERP a breach waiting to happen?

It can be, if it means a broad API key and a community server. Done properly, access runs through company accounts only, each person has their own scope, tools are read-only unless approved, there is no raw SQL, and every call is logged. Either way, whatever a tool returns goes to the assistant's vendor, so their business terms and your data processing agreement matter as much as the code.

How much does a custom MCP server cost to build?

A read-only server with a handful of tools over one system is a small build, in the lowest AI integration tier shown on this page. Write tools with approvals, several source systems, on-premise connectivity and fine-grained permissions move it up. Running it costs little; the ongoing work is reviewing the log and choosing which tools to add.

Sources