Liiketoiminnalle Yrityksille Ratkaisut Sovellukset Hinnoittelu Kehittäjät Blogi Dokumentaatio Avaa työtila
Blogi / MCP liiketoimintaohjelmistolle

MCP ERP:lle: käytännön opas

Rakentajan opas. Se olettaa, että olet lukenut spesifikaation tai siihen liittyvän artikkelin siitä, mitä ERP MCP -palvelin on, ja se keskittyy päätöksiin, jotka spesifikaatio jättää sinulle: mitkä toimet julkaistaan, mitä niille kutsutaan, miten kutsujan henkilöllisyyden saavuttaa jokainen kutsu ja mitä kirjoituksen tulisi tehdä, kun malli yrittää sitä uudelleen. Esimerkkityökalu on todellinen.

7 minuutin lukuaikaPäivitetty 4. syyskuuta 2026Sois-insinöörit, tiimi, joka rakentaa alustaa

Työpajan pöytä pienessä insinööri-studiossa: merkittyjä osalaatikoita, painettu kaavio klipsin alla, suljettu kannettava ja sammutettu juotoslamppu.
Lyhyt vastaus

MCP:n rakentaminen ERP:lle perustuu neljään päätökseen. Näytä tapahtumat, ei tauluja: työkalun tulisi olla jotain, mitä henkilö voisi tehdä järjestelmässä, kuten luoda lasku tai kirjata maksu, liiketoimintasäännöt sisältyvät siihen. Nimeä ja kuvaa jokainen työkalu mallille, joka lukee luetteloa, rajoituksilla, joita sen on kunnioitettava kuvauksessa eikä asiakirjassa, jota se ei koskaan näe. Anna OAuth-henkilöllisyyden jokaisessa pyynnössä päättää, mitkä työkalut on lueteltu ja toimiiko kukin kutsu. Suunnittele jokainen kirjoitus niin, että uudelleenyritys, kieltäytyminen tai kysymys on turvallinen, koska malli tuottaa kaikki kolme.

Kuljetus, löytö ja sisäänkirjautuminen on määritelty, ja mikä tahansa SDK käsittelee ne. Palvelimen arvo on näissä neljässä päätöksessä, ja liiketoimintajärjestelmä, joka saa ne oikein, on toiminnassa Claude, ChatGPT tai minkä tahansa muun asiakkaan toimesta ilman, että asiakas tietää siitä mitään.

Aloita transaktiosta, ei taulukosta.

Ensimmäinen vaisto ERP:n esittämisessä on luoda työkalu jokaiselle taululle, jossa on luonti, luku, päivitys ja poisto. Se tuottaa suuren, yhtenäisen luettelon, jota malli käsittelee huonosti, koska liiketoimintasääntö, että laskulla on oltava verokanta jokaisella rivillä, tai että varasto ei voi lähteä ennen kuin se on varattu, ei ole missään, missä malli voi nähdä. Näytä sen sijaan toiminnot. Hyvä testi on, voisiko henkilö kuvata työkalua joksikin, mitä he tekivät tänään: laskun nostaminen, maksun kirjaaminen, kaupan siirtäminen, jahtauksen lykkääminen. Jokaisella niistä on omat sääntönsä, se validoi syötteensä ja palauttaa luettavan tuloksen.

Toimintojen ohella lisää pieni määrä yhteenvetotyökaluja, jotka vastaavat kysymyksiin, joita malli kysyy ennen toimimista. Yksi kutsu, joka palauttaa tilin profiilin, terveyden, avoimet asiat ja viimeaikaisen historian, säästää mallilta neljä kutsua ja useita tuhansia kontekstitokeneita, ja se tekee seuraavasta toiminnasta paremmin informoidun. Sois kutsuu näitä tarkastustyökaluiksi; tarkistaYhteystiedot and hanki kirjanpito yhteenveto on kaksi. Pidä myös kokonaispinta mielessä: Claude Code rajoittaa palvelimen tulostusta per kutsu oletuksena, ja sekä Claude että OpenAI tarjoavat viivästettyä lataamista tai työkaluhakua suurille listoille, joten palvelimen, jossa on useita satoja työkaluja, tulisi palauttaa ne deterministisessä järjestyksessä (määrittely vaatii tätä, jotta asiakkaat voivat välimuistittaa) ja suodattaa roolin mukaan ennen luetteloimista.

Nimeä työkalut, jotta malli valitsee oikean.

Määrittely rajoittaa nimiä kevyesti: yksi enintään 128 merkkiä, kirjaimia, numeroita, alaviivaa, viivaa ja pistettä, kirjainkoolla on merkitystä, ainutlaatuisia palvelimella. Kaikki muu on käytäntöä, ja toimiva käytäntö on verbi, jota seuraa liiketoimintanimi johdonmukaisessa muodossa, jossa samat verbit tarkoittavat samaa kaikkialla. Malli valitsee vaihtoehtojen välillä etsiLaskut, hanki lasku and luoLasku valitsee listan, yhden tietueen ja kirjoittamisen välillä, ja se oppii tämän kaavan kerran koko palvelimelle.

HeikkoParempiMiksi
laskuluoLaskuPelkkä substantiivi ei kerro, lukevatko vai kirjoittavatko; asiakas ei voi merkitä sitä ja malli ei voi arvioida sitä sisarustensa suhteen.
laskuLuoV2LoppuluoLaskuVersio ja tila kuuluvat palvelimeen, eivät nimeen. Nimet, jotka muuttuvat, rikkovat välimuistissa olevat työkalulistat ja kehotteiden välimuistit.
tee kirjanpitoakirjaaMaksu, lähetäLaskumuistutuksiaYksi yleinen tilaargumentti piilottaa tapahtuman. Yksi nimi per tapahtuma antaa asiakkaalle mahdollisuuden vahvistaa työkalukohtaisesti.
hanki_lasku and hanki_yhteystieto sekoitettuYksi tapaus koko ajanAsiakkaiden nimien yhdistäminen palvelimen mukaan; johdonmukaisuus palvelimen sisällä on se, mihin malli perustuu.

Kuvaus sisältää loput: milloin työkalua käytetään, milloin ei, ja kaikki säännöt, joita mallin on noudatettava ennen sen kutsumista.

Kuvaukset luetaan mallin toiminnan paineessa, joten kirjoita ne ohjeina. Ilmoita, mitä työkalu tekee ensimmäisessä lauseessa, sitten ehdot. Jos sisarustyökalu on oikea valinta läheiselle pyyntöön, mainitse se nimeltä. Jos kenttä on asetettava, jotta tulos olisi oikea, sano se ISOILLA KIRJAIMILLA, jos on tarpeen; Soisin laskutyökalu kertoo mallille, että verokannan on oltava asetettu jokaiselle riville ja että tarkat hinnat tulevat listTaxTypes, because an invoice with no VAT is a worse failure than a refused call. Include one example call. Everything the model needs to call the tool correctly should be in the tool, because it will never open your documentation.

Esimerkkityökalun määritelmä

Tämä on Soisin laskutyökalu, kuten asiakas saa sen työkalut/lista, trimmed to the fields that matter, with annotations and an output schema added in the form the current specification defines. It shows the pattern: a verb-noun name, an instructional description, a schema whose property descriptions do the model's error-prevention, and hints a client can use to decide whether to confirm.

{
  "name": "createInvoice",
  "title": "Create invoice",
  "description": "Create a new invoice of any type and return the draft with its auto-generated number. TAX: set tax_rate on each line (for example 20 for 20% VAT); call listTaxTypes for this workspace's exact rates. If the user says 'plus VAT' you MUST set tax_rate or the invoice goes out with no VAT. To email the result use sendInvoice. Example: createInvoice({ type: \"sales_invoice\", contact_id: \"uuid\", currency: \"GBP\", lines: [{ description: \"Consulting\", quantity: 10, unit_price: 150 }] })",
  "inputSchema": {
    "type": "object",
    "properties": {
      "type": { "type": "string", "description": "sales_invoice, purchase_invoice, sales_credit_note or purchase_credit_note" },
      "contact_id": { "type": "string", "description": "Contact UUID (bill-to for sales, bill-from for purchases)" },
      "currency": { "type": "string", "description": "ISO code, for example GBP. Uses the workspace default if omitted" },
      "invoice_date": { "type": "string", "description": "ISO date. Defaults to today" },
      "reference": { "type": "string" },
      "lines": {
        "type": "array",
        "description": "Line items. Every line MUST carry the numeric unit_price the user asked for",
        "items": {
          "type": "object",
          "properties": {
            "description": { "type": "string" },
            "quantity": { "type": "number", "description": "Defaults to 1" },
            "unit_price": { "type": "number", "description": "NUMBER only: no currency symbols, no thousands separators. Use the exact amount stated; never guess or round" },
            "tax_rate": { "type": "number" },
            "discount_percent": { "type": "number" }
          },
          "required": ["description", "unit_price"]
        }
      }
    },
    "required": ["type"]
  },
  "outputSchema": {
    "type": "object",
    "properties": {
      "invoice_id": { "type": "string" },
      "number": { "type": "string" },
      "status": { "type": "string" },
      "total": { "type": "number" }
    },
    "required": ["invoice_id", "number", "status"]
  },
  "annotations": {
    "readOnlyHint": false,
    "destructiveHint": false,
    "idempotentHint": false,
    "openWorldHint": false
  }
}

Huomautukset sanovat: tämä kirjoittaa, se lisää vain (luonnoksen), kutsuminen kahdesti tekee kaksi luonnosta, eikä se kosketa mitään järjestelmän ulkopuolella. Asiakkaiden on käsiteltävä huomautuksia epäluotettavina, ellei palvelinta pidetä luotettavana, joten ne ovat vihjeitä vahvistuskäyttäytymiselle, eivät palvelimen omien tarkistusten korvike.

Määritelmässä on kolme tarkoituksellista valintaa. Tulos palauttaa tunnisteen, jonka malli on vietävä mukanaan sendInvoice and kirjaaMaksu, joka on spesifikaation suosittelema tapa yhdistää kutsuja nyt, kun palvelimilla ei ole istuntotilaa. Työkalu luo luonnoksen, ei lähetettyä laskua, joten kirjoitus on lisäys, ja henkilö tai erillinen hyväksyntätyökalu viimeistelee sen. Ja tuloskaava tarkoittaa, että integraatio voi lukea numeron ja kokonaismäärän datana, kun taas malli lukee saman tuloksen tekstinä.

Raja työkalut käyttäjälle

HTTP:n yli kutsuja saapuu OAuth-pääsytunnuksella, joka on sidottu palvelimeesi, ja tämä tunnus tunnistaa henkilön. Spesifikaatio sallii tuloksen työkalut/lista vaihdella pyynnön tunnistetietojen mukaan, joten ensimmäinen rajauspäätös on suodattaa lista kyseisen henkilön roolin mukaan ennen sen palauttamista: varastokäyttäjä ei saa hyväksy laskuLista ei saa vaihdella yhteyksittäin tai muiden kutsujen sivuvaikutuksena, vaan vain valtuutuksen perusteella, mikä tekee siitä välimuistitettavan.

Toinen päätös on tarkistaa uudelleen suorituksessa. Asiakas voi lähettää mitä tahansa kutsua haluaa, ja mallia voidaan manipuloida tekstillä työkalun tuloksessa kokeilemaan yhtä. Ratkaise käyttäjä tunnuksesta jokaisessa kutsussa, tarkista työkalun vaatimukset ja kieltäydy työkalun suorituksen virheellä, jonka malli voi lukea. Pidä OAuth-alueet karkean suuruisina (Sois myöntää luku-, kirjoitus- ja offline-alueita) ja anna ERP:n omien roolien olla hienojakoinen raja, koska nämä roolit jo olemassa, niitä ylläpidetään ja niillä on jo merkitystä liiketoiminnalle. Liitä jokainen kutsu lokissa henkilöön sen argumenttien ja tuloksen kanssa, jotta agentin työ on tarkastettavissa aivan kuten henkilön työ.

  1. Tunnus saapuuVahvista allekirjoitus ja että kohde on tämä palvelin, kuten RFC 8707 vaatii; hylkää kaikki muu koodilla 401.
  2. Ratkaise henkilöMääritä tunnus käyttäjälle työtilassa ja lataa heidän roolinsa ja asennetut sovellukset.
  3. Suodata luetteloPalauta vain ne työkalut, joita rooli voi käyttää, vakaassa järjestyksessä, työkalut/listalta.
  4. Tarkista kutsuTyökaluissa/kutsu tarkista lupa uudelleen ja kieltäydy isErrorilla, jos se puuttuu; mitään ei suoriteta.
  5. Suorita ja kirjaaSuorita tapahtuma, mittaa se, jos oma agenttisi teki päättelyn, ja kirjoita kutsu tarkastuspäiväkirjaan kyseisen henkilön alle.

Kirjoitusten käsittely

Malli, joka saa epäselvän tuloksen, kutsuu uudelleen, ja malli, joka saa virheen, yrittää korjattua syötettä. Suunnittele tämä. Luontitoiminnot tulisi palauttaa käsittelytunnus ja, missä mahdollista, hyväksyä idempotenssiavain tai luonnollinen avain, jotta toisto havaitaan. Tilaa muuttavat kirjoitukset tulisi olla selkeitä suorittamastaan siirtymästä ja kieltäytyä mahdottomista siirtymistä luettavalla syyllä: maksun kirjaaminen mitätöidylle laskulle on onVirhe tulos, joka sanoo niin, ei hiljainen ei-toiminto eikä pinojälki. Älä koskaan jätä osittaista kirjoitusta; jos monivaiheinen työkalu ei voi valmistua, peruuta ja raportoi.

  • Suosi luonnoksia ja hyväksyntöjä. Tee luomisesta lisäys (luonnos) ja anna viimeistelylle oma työkalu omalla luvallaan, jotta tuhoava vaihe on se, jonka asiakas vahvistaa ja rooli hallitsee.
  • Merkitse tuhoavat työkalut. Aseta destructiveHint tyhjentämisestä ja poistamisesta ja mainitse se kuvauksessa; Claude ja ChatGPT käyttävät tällaisia signaaleja päättäessään kysyä ennen kutsumista.
  • Kysy sen sijaan, että arvaat. Kun kutsu vaatii päätöksen, jota työkalu ei voi tehdä, palauta syötettä vaativa tulos kyselypyynnön kanssa; asiakas esittää kysymyksen henkilölle ja yrittää kutsua uudelleen vastauksen kanssa.
  • Rajoita vaikutusaluetta. Rajoita nopeutta per yhteys, aseta kuluraja per integraatio, jossa oma agenttisi tekee päättelyä, ja validoi jokainen syöte palvelinpuolella riippumatta skeemasta, koska skeema on neuvo mallille, ei pakko.

Pinnan testaaminen oikealla asiakkaalla

MCP-tarkastaja käyttää työkalut/lista and työkalut/kutsu ja käy läpi OAuth-virran. Todellinen testi on malli. Yhdistä Claude mukautettuna liittimenä tai ChatGPT kehittäjätilassa, kirjaudu sisään käyttäjänä, jolla on kapea rooli, ja pyydä yhtä rutiinitulosta, joka tarvitsee kolme tai neljä työkalua. Katso, mitkä työkalut se valitsee ja miksi; väärä valinta on lähes aina kuvausongelma. Kirjaudu sitten sisään käyttäjänä, jolla ei ole yhtä oikeutta, ja vahvista, että suoritus pysähtyy oikeassa kutsussa syyn kanssa, jonka malli toistaa takaisin.

Näin Sois-työtilapalvelin rakennetaan ja tarkistetaan: tapahtumat työkaluina, ohjeelliset kuvaukset, roolisuodatettu lista, toinen tarkistus jokaiselle kutsulle, luonnokset ennen hyväksyntöjä ja loki, jonka henkilö voi lukea. Markkinapaikalle sovelluksia rakentavat kehittäjät julkaisevat työkaluja samaan listaan samoilla säännöillä, joten sovellus on käytettävissä minkä tahansa agentin toimesta heti, kun se on asennettu. Kaava ei ole spesifinen yhdelle tuotteelle; mikä tahansa ERP, joka omaksuu sen, muuttuu sellaiseksi, että agentti voi sen suorittaa.

Kysymyksiä, joita ihmiset kysyvät

Kuinka monta työkalua ERP MCP -palvelimen tulisi paljastaa?

Niitä on niin monta kuin on automatisoinnin arvoista tapahtumaa, suodatettuna käyttäjän mukaan, jotta jokainen soittaja näkee toimivan joukon. Useita satoja on normaalia täydelle järjestelmälle; tärkeää on, että lista on vakaa, roolin mukaan suodatettu ja järjestetty johdonmukaisilla verbeillä, jotta malli voi arvioida ehdokkaita.

Pitäisikö minun käyttää OAuth-alueita tarkkoihin käyttöoikeuksiin?

Käytä karkea-asteisia alueita yhteyden muodostamiseen ja ERP:n omia rooleja tarkasti rajattuna rajapintana, tarkistettuna jokaisessa kutsussa. Rooleja on jo olemassa ja niitä ylläpidetään liiketoiminnassa; rinnakkainen aluejärjestelmä poikkeaisi niistä.

Miten kirjoitus pitäisi käyttäytyä, jos malli kutsuu sitä kahdesti?

Tunnista toisto idempotenssin tai luonnollisen avaimen avulla ja palauta olemassa oleva tietue, tai tee kirjoituksesta lisäys ja raportoi se selkeästi, jotta kaksoiskappale on näkyvissä. Älä koskaan epäonnistu hiljaa, äläkä jätä osittaista kirjoitusta.

Pakottavatko asiakas työkalun annotaatiot?

Ei. Ne ovat vihjeitä, ja spesifikaatio kertoo asiakkaille, että niitä tulee käsitellä epäluotettavina, ellei palvelin ole luotettava. Asiakkaat käyttävät niitä vahvistuskäyttäytymisen valitsemiseen; palvelimen omat käyttöoikeus- ja vahvistustarkistukset estävät vahinkoa.

Lähteet
  1. Model Context Protocol -spesifikaatio (2026-07-28): työkalut työkalujen nimet, skeemat, annotaatiot, jäsennellyt tulokset, virheiden käsittely ja tilallisen käsittelyn ohjeet
  2. Model Context Protocol -määrittely: valtuutus tokenin kohdeyleisön vahvistaminen, aluehaasteet ja per-pyyntö valtuutusmalli
  3. OpenAI Apps SDK: rakenna MCP-palvelin kuinka ChatGPT käyttää readOnlyHint, destructiveHint ja openWorldHint vahvistuskäyttäytymiseen
  4. Sois-dokumentaatio: työtilan MCP-palvelin työkalun viittaus, josta esimerkki on otettu, roolisuodatus, rajoitukset ja virhekoodit

Tätä artikkelia tarkastellaan, kun sen kuvaamat tuotteet muuttuvat. Seuraava tarkastusaika: 4. joulukuuta 2026.

Aloita

Rakenna Soisin päälle.

Yhdistä oma agenttisi rakennustyökaluihin, kuvaa sovellus, vahvista se, julkaise se ja ansaitse käytöstä.

  • Ilmainen aloittaa
  • Tuo oma agenttisi
  • Ei toimittajalukitusta