MCP kūrimas ERP sistemoje remiasi keturiais sprendimais. Atidarykite transakcijas, o ne lenteles: įrankis turėtų būti kažkas, ką žmogus galėtų padaryti sistemoje, pavyzdžiui, sukurti sąskaitą faktūrą arba užregistruoti mokėjimą, su verslo taisyklėmis viduje. Pavadinkite ir aprašykite kiekvieną įrankį modeliui, kuris skaitys sąrašą, su apribojimais, kurių jis turi laikytis aprašyme, o ne dokumentacijoje, kurios niekada nematys. Leiskite OAuth tapatybei kiekviename užklausoje nuspręsti, kurie įrankiai bus išvardyti ir ar kiekvienas skambutis bus vykdomas. Ir sukurkite kiekvieną rašymą taip, kad pakartojimas, atsisakymas ar klausimas būtų saugus, nes modelis sukurs visus tris.
Transportas, atradimas ir prisijungimas yra nurodyti, ir bet kuris SDK juos tvarko. Serverio vertė yra tuose keturiuose sprendimuose, o verslo sistema, kuri juos teisingai supranta, gali būti valdoma Claude, ChatGPT ar bet kurio kito kliento, nes tas klientas nieko apie tai nežino.
Pradėkite nuo transakcijos, o ne nuo lentelės.
Pirmasis instinktas atidarant ERP yra generuoti įrankį kiekvienai lentelei su sukurti, skaityti, atnaujinti ir ištrinti kiekvienam. Tai sukuria didelį, vienodą sąrašą, kurį modelis tvarko prastai, nes verslo taisyklė, kad sąskaitai faktūrai reikia mokesčių normos kiekviename eilutėje, arba kad atsargos negali būti išsiųstos, kol jos nėra rezervuotos, niekur nėra, kur modelis galėtų tai matyti. Vietoj to atidarykite veiksmus. Naudingas testas yra tai, ar žmogus galėtų apibūdinti įrankį kaip kažką, ką jie padarė šiandien: išrašė sąskaitą faktūrą, užregistravo mokėjimą, pervedė sandorį, atidėjo sekimą. Kiekvienas iš jų turi savo taisykles, patvirtina savo įvestis ir grąžina skaitomą rezultatą.
Kartu su veiksmais pridėkite nedidelį skaičių santraukos įrankių, kurie atsako į klausimus, kuriuos modelis užduoda prieš veiksmą. Vienas skambutis, kuris grąžina paskyros profilį, būklę, atviras prekes ir neseną istoriją, išsaugo modeliui keturis skambučius ir kelis tūkstančius konteksto tokenų, ir tai padaro kitą veiksmą geriau informuotą. Sois šiuos įrankius vadina tikrintojų įrankiais; išnagrinėtiKontaktą ir gautiApskaitosSantrauką yra du. Taip pat laikykite visą paviršių matomą: Claude Code pagal numatytuosius nustatymus riboja serverio išvestį per kiekvieną užklausą, o tiek Claude, tiek OpenAI siūlo atidėtą įkėlimą arba įrankių paiešką didelėms sąrašams, todėl serveris su keliais šimtais įrankių turėtų juos grąžinti deterministiniu tvarka (specifikacija to reikalauja, kad klientai galėtų talpinti) ir turėtų filtruoti pagal vaidmenį prieš sąrašo sudarymą.
Pavadinkite įrankius, kad modelis pasirinktų tinkamą.
Specifikacija švelniai riboja pavadinimus: nuo 1 iki 128 simbolių, raidės, skaitmenys, pabraukimas, brūkšnys ir taškas, atsižvelgiama į didžiąsias ir mažąsias raides, unikalūs serveryje. Viskas kitas yra konvencija, o veikianti konvencija yra veiksmažodis, po kurio eina verslo daiktavardis nuosekliai, su tais pačiais veiksmažodžiais, reiškiančiais tą patį visur. Modelis, pasirinkdamas tarp ieškotiSąskaitų, gautiSąskaitą ir sukurti sąskaitą faktūrą pasirenka tarp sąrašo, vieno įrašo ir rašymo, ir jis išmoksta tą modelį vieną kartą visam serveriui.
| Silpnas | Geriau | Kodėl |
|---|---|---|
sąskaita | sukurti sąskaitą faktūrą | Vienas daiktavardis nesako, ar jis skaito, ar rašo; klientas negali jo anotuoti, o modelis negali jo vertinti lyginant su kitais. |
sąskaitaSukurtiV2Galutinis | sukurti sąskaitą faktūrą | Versija ir būsena priklauso serveriui, o ne pavadinimui. Pavadinimai, kurie keičiasi, sugadina talpinamus įrankių sąrašus ir užklausų talpyklas. |
darytiApskaitą | įrašytiMokėjimą, siųstiSąskaitųPrimintuvus | Visuotinė funkcija su režimo argumentu slepia transakciją. Vienas pavadinimas kiekvienai transakcijai leidžia klientui taikyti patvirtinimą kiekvienam įrankiui. |
gauti_sąskaitą ir gautiKontaktą mišrus | Vienas atvejis visur | Konsoliduojant klientus, pavadinimai pradedami serveriu; nuoseklumas serverio viduje yra tai, kuo remiasi modelis. |
Aprašymas apima viską: kada naudoti įrankį, kada ne, ir bet kurią taisyklę, kurios modelis turi laikytis prieš jį kviesdamas.
Aprašymai skaitomi modelio, kuris veikia spaudimo sąlygomis, todėl rašykite juos kaip instrukcijas. Pirmame sakinyje nurodykite, ką įrankis daro, tada sąlygas. Jei gretimas įrankis yra tinkamas pasirinkimas artimai užklausai, nurodykite tai pavadinimu. Jei laukas turi būti nustatytas, kad rezultatas būtų teisingas, pasakykite tai DIDELIAIS RAIDĖMIS, jei reikia; Sois sąskaitų įrankis sako modeliui, kad PVM tarifas turi būti nustatytas kiekvienoje eilutėje ir kad tikslūs tarifai gaunami iš , nes sąskaitų faktūrų įrankio aprašyme nurodyta, kad mokesčių tarifas turi būti nustatytas kiekvienoje eilutėje, o darbo erdvės tikslūs tarifai gaunami iš to skambučio; modelis skaito aprašymus, o geras aprašymas neleidžia sąskaitai faktūrai išeiti be PVM. Jis sukūrė sąskaitą faktūrą su viena eilute, kiekiu dvylika, pagal kliento sąlygose nurodytą tarifą ir gavo naujos sąskaitos identifikatorių ir numerį rezultatuose. Jis perdavė tą identifikatorių į, nes sąskaita faktūra be PVM yra didesnis nesėkmės atvejis nei atmestas skambutis. Įtraukite vieną pavyzdinį skambutį. Viskas, ko modeliui reikia teisingai pasikviesti įrankį, turi būti pačiame įrankyje, nes jis niekada neatidarys jūsų dokumentacijos.
Pavyzdinė įrankio apibrėžtis.
Tai yra Sois sąskaitų įrankis, kaip klientas jį gauna iš tools/listsumažinta iki svarbiausių laukų, su pastabomis ir išvesties schema, pridėta pagal dabartinę specifikaciją. Tai rodo modelį: veiksmažodis-daiktavardis pavadinimas, instrukcinis aprašymas, schema, kurios savybių aprašymai užkerta kelią modelio klaidoms, ir užuominos, kurias klientas gali naudoti sprendžiant, ar patvirtinti.
{
"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
}
}Pastabose sakoma: tai rašo, tai tik prideda (juodraštį), skambinimas du kartus sukuria du juodraščius, ir tai nieko nepaliečia už sistemos ribų. Klientai turi laikyti pastabas nepatikimomis, nebent serveris yra patikimas, todėl jos yra užuominos patvirtinimo elgsenai, o ne serverio patikrinimų pakaitalas.
Trys pasirinkimai šioje apibrėžtyje yra apgalvoti. Rezultatas grąžina identifikatorių, kurį modelis turi perduoti į , kuris prideda PDF ir išsiunčia jį el. paštu, ir galiausiai į ir įrašytiMokėjimą, which is the specification's recommended way to relate calls now that servers hold no session state. The tool creates a draft, not a posted invoice, so the write is additive and a person or a separate approval tool finalises it. And the output schema means an integration can read the number and total as data while the model reads the same result as text.
Priskirkite įrankius vartotojui.
Per HTTP skambinantis atvyksta su OAuth prieigos žetonu, susietu su jūsų serveriu, ir šis žetonas identifikuoja asmenį. Specifikacija leidžia rezultato tools/list kinta priklausomai nuo prašymo akreditacijų, todėl pirmasis apibrėžimo sprendimas yra filtruoti sąrašą pagal to asmens vaidmenį prieš jį grąžinant: sandėlio vartotojas negauna patvirtinti sąskaitąŠis sąrašas neturi keistis priklausomai nuo ryšio ar kitų skambučių šalutinio poveikio, tik pagal leidimą, kas jį daro talpinamą.
Antras sprendimas yra dar kartą patikrinti vykdymo metu. Klientas gali siųsti bet kokį skambutį, kurio nori, o modelį galima manipuliuoti tekstu įrankio rezultatu, kad jis bandytų vieną. Išspręskite vartotoją iš žetono kiekviename skambutyje, patikrinkite, kokios teisės reikalauja įrankis, ir atsisakykite su įrankio vykdymo klaida, kurią modelis gali perskaityti. Laikykite OAuth sritis šiurkščias (Sois išduoda skaitymo, rašymo ir neprisijungimo sritis) ir leiskite ERP savo vaidmenims būti smulkiai apibrėžtu ribu, nes šie vaidmenys jau egzistuoja, jau yra palaikomi ir jau turi prasmę verslui. Priskirkite kiekvieną skambutį asmeniui žurnale su jo argumentais ir rezultatu, kad agento darbas būtų peržiūrimas tiksliai taip pat, kaip ir asmens.
- Žetonas atvykstaPatvirtinkite parašą ir tai, kad auditorija yra šis serveris, kaip reikalauja RFC 8707; atminkite viską kitą su 401.
- Išspręsti asmenįPriskirkite žetoną vartotojui darbo erdvėje ir įkelkite jo vaidmenį bei įdiegtas programas.
- Filtruokite sąrašąGrąžinkite tik tuos įrankius, kuriuos gali naudoti vaidmuo, stabilia tvarka iš tools/list.
- Patikrinkite skambutįĮrankių skambutyje dar kartą patikrinkite leidimą ir atsisakykite su isError, jei jo trūksta; niekas nevykdomas.
- Vykdyti ir registruotiVykdykite operaciją, matuokite ją, jei jūsų agentas atliko mąstymą, ir užfiksuokite skambutį audito žurnale po tuo asmeniu.
Rašymo tvarkymas.
Modelis, kuris gauna neaiškų rezultatą, vėl paskambins, o tas, kuris gauna klaidą, bandys pataisyti įvestį. Tam sukurkite dizainą. Rašymai, kurie kuria, turėtų grąžinti rankeną ir, kur įmanoma, priimti idempotencijos raktą arba natūralų raktą, kad būtų galima atpažinti pakartojimą. Rašymai, kurie keičia būseną, turėtų aiškiai nurodyti atliekamą perėjimą ir atsisakyti neįmanomų su aiškia priežastimi: mokėjimo už anuliuotą sąskaitą faktūrą įrašymas yra isError rezultatas, tai nurodantis, o ne tylus no-op ir ne steko ataskaita. Niekada nepalikite dalinio rašymo; jei kelių žingsnių įrankis negali būti užbaigtas, grąžinkite ir praneškite.
- Teikite pirmenybę juodraščiams ir patvirtinimams. Sukūrimą padarykite papildomą (juodraštį) ir suteikite galutinimui savo įrankį su savo leidimu, kad destruktyvus žingsnis būtų tas, kurį patvirtina klientas, o vaidmuo kontroliuoja.
- Pažymėkite destruktyvius įrankius. Nustatyti
destructiveHintdėl anuliavimų ir ištrynimų ir pasakykite tai aprašyme; Claude ir ChatGPT abu naudoja tokius signalus, kai nusprendžia klausti prieš skambindami. - Klauskite, o ne spėkite. Kai skambinant reikia sprendimo, kurio įrankis negali priimti, grąžinkite rezultatą, kuriam reikia įvesties, su užklausos prašymu; klientas užduoda klausimą asmeniui ir pakartoja skambutį su atsakymu.
- Apribokite poveikio sritį. Apribokite greitį pagal ryšį, nustatykite išlaidų lubas kiekvienai integracijai, kur jūsų agentas atlieka mąstymą, ir patvirtinkite kiekvieną įvestį serverio pusėje, nepriklausomai nuo schemos, nes schema yra patarimas modeliui, o ne privaloma taisyklė.
Paviršiaus testavimas su tikru klientu.
MCP inspektorius atliks tools/list ir tools/call ir pereis per OAuth srautą. Tikrasis testas yra modelis. Prijunkite Claude kaip pritaikytą jungtį arba ChatGPT kūrėjo režimu, prisijunkite kaip vartotojas su siaura rolė, ir paprašykite vieno įprasto rezultato, kuriam reikia trijų ar keturių įrankių. Stebėkite, kuriuos įrankius jis pasirenka ir kodėl; neteisingas pasirinkimas beveik visada yra aprašymo problema. Tada prisijunkite kaip vartotojas be vienos iš teisių ir patvirtinkite, kad vykdymas sustoja tinkamu skambučiu su priežastimi, kurią modelis pakartoja.
Taip sukurtas ir patikrintas Sois darbo vietos serveris: sandoriai kaip įrankiai, instrukcijos aprašymai, rolėmis filtruotas sąrašas, antras patikrinimas kiekvienam skambučiui, juodraščiai prieš patvirtinimus ir žurnalas, kurį gali perskaityti asmuo. Kūrėjai, kuriantys programas rinkai, skelbia įrankius į tą patį sąrašą pagal tas pačias taisykles, todėl programa gali būti naudojama bet kurio agento, kai ji yra įdiegta. Šis modelis nėra specifinis vienam produktui; bet kuris ERP, kuris jį priima, tampa kažkuo, ką agentas gali vykdyti.
Klausimai, kuriuos žmonės užduoda
Kiek įrankių turėtų atskleisti ERP MCP serveris?
Tiek, kiek yra sandorių, kuriuos verta automatizuoti, filtruojant pagal vartotoją, kad kiekvienas skambinantis matytų veikiančių įrankių rinkinį. Kelias šimtus yra normalu pilnai sistemai; svarbu, kad sąrašas būtų stabilus, filtruotas pagal rolę ir organizuotas nuosekliais veiksmažodžiais, kad modelis galėtų reitinguoti kandidatus.
Ar turėčiau naudoti OAuth sritis smulkiai apibrėžtoms teisėms?
Naudokite šiurkščias sritis jungčiai ir ERP savo vaidmenis smulkiai apibrėžtai ribai, tikrinamai kiekviename kvietime. Vaidmenys jau egzistuoja ir juos palaiko verslas; paralelinė srities schema nukryptų nuo jų.
Kaip turėtų elgtis rašymas, jei modelis jį kviečia du kartus?
Arba nustatykite pasikartojimą per idempotenciją arba natūralų raktą ir grąžinkite esamą įrašą, arba padarykite rašymą papildomą ir aiškiai praneškite, kad dubliatas būtų matomas. Niekada nesėdėkite tyliai ir niekada nepalikite dalinio rašymo.
Ar įrankių anotacijos yra privalomos klientui?
Ne. Tai yra užuominos, o specifikacija nurodo klientams jas laikyti nepatikimomis, nebent serveris yra patikimas. Klientai jas naudoja pasirinkdami patvirtinimo elgesį; serverio leidimų ir validacijos patikrinimai yra tai, kas užkerta kelią žalai.
- Modelio konteksto protokolo specifikacija (2026-07-28): įrankiai įrankių pavadinimai, schemos, anotacijos, struktūrizuoti rezultatai, klaidų tvarkymas ir būsenos valdymo gairės
- Model Context Protocol specifikacija: autorizacija žetono auditorijos patvirtinimas, srities iššūkiai ir autorizacijos modelis pagal užklausą
- OpenAI programų SDK: sukurkite MCP serverį kaip ChatGPT naudoja readOnlyHint, destructiveHint ir openWorldHint patvirtinimo elgesiui
- Sois dokumentacija: darbo erdvės MCP serveris įrankio nuoroda, iš kurios paimtas pavyzdys, vaidmenų filtravimas, limitai ir klaidų kodai
Šis straipsnis peržiūrimas, kai keičiasi jame aprašyti produktai. Kita suplanuota peržiūra: 2026 m. gruodžio 4 d..
