Практычныя прытамулкі: MCP-інструменты ў корпаратывных прыкладнах: падходяча для пачаткуюцых
Практычныя прыказкі: Адзінства MCP у корпоратывных застосоўчых рашэннях: прыемны для пачатківаўцаў — кантракты, перакрыцчы і слоты для коду для команд, якія выкарыстоўваюць гэты патэрн.
Наступныя прытамлівкі паказваюць практычны шлях для вывучэння тэмы «MCP Tools Inside Enterprise Applications: A Beginner-Friendly Deep Dive». Акцэнт ставіцца на кантракты, пераконтроўкі і месцы для адмешчання коду, а не на мотывацыйныя аспекты. Калі працуеце над стадзіяй Адгляду, спачатку запісайце кантракт: неабяжныя даны, сігнал успеху і тое, што выканаецца у разе частковага невыпалення. Такі список пераконтроўкі дапамагае заставіць пазнейшыя змены коду быць чыстымі. Спрыймайце гэтую стадзію як кантракт межа данымі і перакананымі выходнымі даннымі. Дайце назвы элементам, задаце критэрыя успеху і не падтрымайце частковае завершэння без паведамлення.
1. Проблема: Чаму падпрыемствам спачатку быў неабходны MCP
1. Проблема: Этап работае наяўней калі яго спрыяваць як мерыемую паверхню. Зафіксавайце адна ідеальная транскрыпцыю, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Запісвайце часы выканання і косты токеноў або запытак па боку функцыйнальных рэзультаатаў. Відразлівасць костоў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя среды. Актуалізавайце інструменты з вузкімі схемамі та чысткімі пазначэннямі побачных эфектаў. Хостам неабходна знать, якія вызовы мутуюць стан, перш чым яны автаматычна схваляюць іх.
BEFORE MCP — the N x M integration problem
┌───────────┐ ┌─────────────┐
│ Agent A │───────▶│ CRM API │ (custom connector #1)
└───────────┘ └─────────────┘
┌───────────┐ ┌─────────────┐
│ Agent A │───────▶│ Ticketing │ (custom connector #2)
└───────────┘ └─────────────┘
┌───────────┐ ┌─────────────┐
│ Agent B │───────▶│ CRM API │ (custom connector #3 -
└───────────┘ └─────────────┘ yes, AGAIN, for a different agent)
┌───────────┐ ┌─────────────┐
│ Agent B │───────▶│ Data │ (custom connector #4)
└───────────┘ │ Warehouse │
└─────────────┘
N agents x M systems = N x M custom, non-reusable integrations.
Every new agent re-implements auth, retries, schemas, error handling.
AFTER MCP — one protocol, many servers, many clients
┌───────────┐ ┌───────────────────┐
│ Agent A │──┐ ┌─▶│ MCP Server: CRM │
└───────────┘ │ ┌───────────┐ │ └───────────────────┘
├───▶│ MCP │───┤ ┌───────────────────┐
┌───────────┐ │ │ (shared │ ├─▶│ MCP Server: Ticket │
│ Agent B │──┘ │ protocol)│ │ └───────────────────┘
└───────────┘ └───────────┘ │ ┌──────────────────┐
└─▶│ MCP Server: DW │
└──────────────────┘
Any MCP-compatible agent can now talk to any MCP server.
Build the connector once, reuse it everywhere.
2. Основныя паняці, адказна поясненыя
Этап «Адказанне двух галоўных канцэпцый» работае наякша, калі яго спрыяваць як мерыемую паверхню. Зафіксавайце адна ідеальная транскрыпцыю, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць масштабы. Зберагаюце настройкі паза кодам прыемліка. Файлы сяродавішча, хранільнікі секрэтных дадзеных і пазначкі функцый должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць контроль, не чытаючы весь лянцуг задач. Адкройце інструменты з вузкімі схемамі та чысткімі пазначкамі побачных эфектаў. Хостам неабходна знаты, якія вызовы мутуюць стан, перш чым яны автаматычна схваляюць іх.
Тры прымітывы, якія сервер можа адкрыць
Этап працюе найкраща, калі яго можна расследзіць як вимерную паверхню. Перш чым расширваць масштаб, зафіксавайце адны ідеальны прыклад роботы, адну ситуацыю неудачы і прыметку па поверненні да пачатковага стану. Дакументавайце як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія контраліны і обработка некоректных паведамленняў є частью продукту, а не етапамі далейшай наладкі. Аб’екты, якія выкарыстоўваюцца, должны маты часткавыя схемы і чысткія пазначкі пра побачныя наследкі. Адпаведальныя за аператыўную супервізію люди павінны знать, якія вызовы мутуюць стан, перш чым автаматычна схваліць іх. Этап працюе найкраща, калі яго можна расследзіць як вимерную паверхню. Перш чым расширваць масштаб, зафіксавайце адны ідеальны прыклад роботы, адну ситуацыю неудачы і прыметку па поверненні да пачатковага стану. Расследзівайце этап як кантракт межа вхіднымі даннымі і перакананымі выходнымі рэзультатамі. Дайце назвы аб’ектам, задаць критэрыя успеху і не падтрымвайце беззвучнае часткова завершэння задання.
3. Архітектура, усе тры шары разам
Для ўсіх стадзій проекта «Архітэктура» неабходна прадзефінавацыя вхідных дадзеных, адпаведальнага за кожны крок і крэтарыяў завершэння працы перад зменым коду. Аперацыйныя працавнікі должны магчыма было перзапускаць кожны крок з вядомага пункта контролю, не прымуячы спадчынных даных у секрэтным стацусе. Запісваюцься часы выканання і вартасць токенаў або запытак па боку функцыйнальных рэзультаатаў. Відразлівая вартасць з самага пачатку запобегае неспакою, калі процес пераходзіць з дэмавайнага режыма ў спяльныя сераўры. Аутентыфікацыя выкананая ў воратах сеті, а паўторная автарызацыя — у роўні обробкі дадзеных. Толькі токен-носіцель не є межай адпаведальнасці за даны.
┌─────────────────────────── HOST APPLICATION ───────────────────────────┐
│ e.g. an internal AI assistant, IDE plugin, support copilot │
│ │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ MCP Client 1 │ │ MCP Client 2 │ │ MCP Client 3 │ │
│ └───────┬───────┘ └───────┬───────┘ └───────┬───────┘ │
└───────────┼────────────────────────┼───────────────────────┼───────────┘
│ JSON-RPC over │ JSON-RPC over │ JSON-RPC over
│ stdio / HTTPS │ stdio / HTTPS │ stdio / HTTPS
▼ ▼ ▼
┌──────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ MCP Server │ │ MCP Server │ │ MCP Server │
│ wraps HR system │ │ wraps Ticketing │ │ wraps Data │
│ (tools: lookup, │ │ (tools: create, │ │ Warehouse │
│ update) │ │ status, close) │ │ (tools: query) │
└──────────────────┘ └──────────────────┘ └─────────────────┘
4. Стварэнне вашага першага сервера MCP (Node.js / TypeScript)
У стадії «Стварэнне першага проекту» 4 неабяжна практычна визначыць даннэ, адпаведальнага за крок і критэрыі завершэння пры перадзеяванні коду. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не падозрываючы схованы стан. Конфігурацыю трэба знаходзіць за межамі коду прыемлі. Файлы сераўнавання, хранальнікі секрэтных дадзеных і флагі функцый належаць у аднам месца, якое аператары можаць пераглядаць, не чытаяўшы весь лянцуг задач. Автентыфікуйцеся на воратах і паўторна автарызуйцеся на роўні дадзеных. Толькі токэн-носіцель не є межай арендавання.
4.1 Наладка проекту
У стадії налагоджэння проекта 4 1 неабяцкова ўзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры перадзеі коду. Аперацыйныя працавнікі должны магчымае перайсці на выкананне кроку з вядомага пункта контролю, не спрабоўваючы здогадвацца пра схованы стан. Неабяцкова задокументаваць як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія перакрыцця і обробка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.
mkdir helpdesk-mcp-server && cd helpdesk-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk zod
npm install -D typescript tsx @types/node
npx tsc --init
У стадії налагоджэння проекта 4 1 неабяцкова ўзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры перадзеі коду. Аперацыйныя працавнікі должны магчымае перайсці на выкананне кроку з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Неабяцкова спрацавляць гэтую стадію як кантракт межы вхідных данных і перакананых выходных рэзультатаў. Даць назвы артыфактам, узначыць перакананні на успех і не прабаваць прыймать часткова завершаныя рэзультаты без падтверджэння.
4.2 Код сервера
Калі працюеце над этапам 4.2 «Сервер», спачатку запісайце шаблон: неабяжныя вхідныя даны, сигнал працэйскага успеху і тое, што выканаецца у разы ў частковай нявыполненасці. Такі список дапамагае залічваць змяны ў кодзе чыста. Празрачнае фіксаванне часу выконання і косту токена або запыту разам з рэзультатамі функцыйнасці запобегае неспадзячым рахункам, калі працэ пераходзіць з дэмаверсіі ў спяльныя среды. Запісвайце назву інструмента, хэш аргументаў, час затрымкі і рэзультат кожнага вызову. Без такога лёгкага следу дэбагаванне агента, які ціркулюе без канца, можа зайняць гады.
// src/server.ts
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
// --- A stand-in for a real internal ticketing API client ---
// In a real enterprise server this would call your ITSM system
// (ServiceNow, Jira Service Management, Zendesk, an internal API, etc.)
const ticketStore = new Map<string, { status: string; subject: string }>();
let nextId = 1000;
// 1. Create the server instance.
// "name" and "version" identify this server to any client that connects.
const server = new McpServer({
name: "helpdesk-mcp-server",
version: "1.0.0",
});
// 2. Register a tool: create_support_ticket
server.registerTool(
"create_support_ticket",
{
title: "Create Support Ticket",
description:
"Creates a new IT helpdesk ticket for the requesting employee.",
inputSchema: {
subject: z.string().describe("Short summary of the issue"),
priority: z.enum(["low", "medium", "high", "urgent"]),
employeeId: z.string().describe("Requesting employee's ID"),
},
outputSchema: {
ticketId: z.string(),
status: z.string(),
},
},
async ({ subject, priority, employeeId }) => {
const ticketId = `TCK-${nextId++}`;
ticketStore.set(ticketId, { status: "open", subject });
const output = { ticketId, status: "open" };
// MCP tool results return a "content" array (what a human/LLM reads)
// and, optionally, "structuredContent" (typed data other code can use).
return {
content: [
{
type: "text",
text: `Created ticket ${ticketId} (priority: ${priority}) for employee ${employeeId}.`,
},
],
structuredContent: output,
};
}
);
// 3. Register a second tool: get_ticket_status
server.registerTool(
"get_ticket_status",
{
title: "Get Ticket Status",
description: "Looks up the current status of an existing support ticket.",
inputSchema: {
ticketId: z.string(),
},
outputSchema: {
status: z.string(),
},
},
async ({ ticketId }) => {
const ticket = ticketStore.get(ticketId);
if (!ticket) {
// Returning isError lets the model know the call failed
// WITHOUT crashing the whole conversation.
return {
content: [{ type: "text", text: `No ticket found with ID ${ticketId}.` }],
isError: true,
};
}
return {
content: [{ type: "text", text: `Ticket ${ticketId} is currently "${ticket.status}".` }],
structuredContent: { status: ticket.status },
};
}
);
// 4. Wire the server to a transport and start listening.
// stdio is perfect for local development and desktop-hosted tools.
const transport = new StdioServerTransport();
await server.connect(transport);
4.3 Што на самай працэ выканаецца тут (теорыя па лініях)
Калі працуеце над стадзіяй 4 3 What s, спачатку запісайце угоду: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага неяксамоства. Такі список пераконтролюе чыстасць пазнейшых змян у кодзе. Зберагаюце настройкі за межамі коду прыемлена. Файлы сераўнавання, хранілішчы секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавіць аудыт без неабяжлівага чытання всей структуры. Запісвайце назву інструмента, хэш аргументаў, час затрымкі і рынак кожнага вызову. Без такога следу дэбагаванне агента займае гадзіны.
4.4 Адклэюванне
Калі працуеце над стадзіяй «4 4 Running it», спачатку запісайце умовы кантракту: неабяжлівыя данні, сигнал працэздольнасці і тое, што выходзіць пад частковую нявыполненасць. Такі список контроля дапамагае залічыць пазнейшыя змены коду.
npx tsx src/server.ts
Калі працуеце над стадзіяй «4 4 Running it», спачатку запісайце умовы кантракту: неабяжлівыя данні, сигнал працэздольнасці і тое, што выходзіць пад частковую нявыполненасць. Такі список контроля дапамагае залічыць пазнейшыя змены коду.
Спрэтавайцеся да гэтай стадзіі як да кантракту межа даннімі і перакананымі выходамі. Дайце назву кожнам элементам, задаце правіла пераканання працэздольнасці і не падтрымайце тыхчасовую частковую завершэннасць.
5. Стварэнне кліента MCP унутрь корпоратыўскага прыемніка
Этап 5 «Стварэнне MCP» работае наякша, калі яго розглядаць як мерыемую величыну. Запісайце адна ідеальная транскрыпцыя, адзін прыклад неудачы і прыметкі па поверненню да пачатковага стану пры розширэнні масштаба. Запісвайце часы виконання і косты токена або запита разам з функцыональнымі рэзултатамі. Відразлівае відображэння костаў з самага пачатку запобегае неспакою з боку расчыткаў, калі праця пераходзіць з дэмовай среды ў спакульную. Адкройце інструменты з вузкімі схемамі і чыткімі пазначэннямі па бокавых эфектах. Хостам неабходна знаты, якія вызовы мутуюць стан, перш чым яны автаматычна схваляюць іх.
// src/client.ts
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
async function main() {
// 1. Describe how to launch the server. Here we spawn it as a
// local subprocess - in production you'd more commonly point
// this at a remote HTTP-based server instead (see Section 6).
const transport = new StdioClientTransport({
command: "npx",
args: ["tsx", "src/server.ts"],
});
// 2. Create a client and connect. This performs the MCP
// handshake and capability negotiation automatically.
const client = new Client({ name: "internal-ai-assistant", version: "1.0.0" });
await client.connect(transport);
// 3. Discover what tools this server offers - this is the same
// mechanism an LLM uses to "learn" what it can do.
const { tools } = await client.listTools();
console.log("Available tools:", tools.map((t) => t.name));
// 4. Call a tool, just like the LLM would.
const result = await client.callTool({
name: "create_support_ticket",
arguments: {
subject: "VPN keeps disconnecting",
priority: "high",
employeeId: "E-4821",
},
});
console.log(result.content);
await client.close();
}
main();
Чаму гэта мае значэнне з канцэптуальной точкі зору
Канцэпцыя «Чаму гэта мае значэнне» працюе найкраща, калі яе розглядаць як вимерную паверхню. Зафіксавце адны ідеальны прыклад, адну справу з бягам і прыметку пра вярнэнне да пачатковага стану, перш чым расширваць масштабы. Зберагаеце настройкі пазнаходзячыся за межамі коду прыемліцеля. Файлы сяродавішняе сераўні, хранілішчы секрэтных данных і пазнакі функцый должны знаходзіцца ў адном месцы, куды аператары можаць адбавляць контроль, не чытаючы весь структураны дадзеныя. Адкрывайце інструменты з вузкімі схемамі та чытальнымі пазначэннямі побачных эфектаў. Хостам неабходна знать, якія вызовы мутуюць стан, перш чым яны автаматычна схваляюць іх.
6. Ад локальнага пратотыпу да розгортання ў корпаратыўных умовах
Этап «6 From Local Prototype» працюе найкраща, калі яго розглядаць як меркавыя парадакты. Зберагчыце адны ідеальны прыклад роботы, адну справу з бягамі та прыметку па анулюванні змян перш чым расширваць масштабы. Дакументавайце як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія перакрыцці та обробка некоректных паведамленняў ёсць часткай продукту, а не элементамі пазнейшай дапрацоўкі. Адкрывайце інструменты з вузкімі схемамі та чысткі маркірамі пабочных эфектаў. Хостам неабходна знать, якія вызовы мутуюць стан, перш чым яны автаматычна схваляюць ўпрацоўкі. Этап «6 From Local Prototype» працюе найкраща, калі яго розглядаць як меркавыя парадакты. Зберагчыце адны ідеальны прыклад роботы, адну справу з бягамі та прыметку па анулюванні змян перш чым расширваць масштабы. Разглядвайце гэты этап як кантракт межа вхіднымі даннымі та перакананымі выходнымі рэзультатамі. Даўайце назвы артыфактам, задаюце критэрыя успеху та адмовляйцеся ад беззвучнага частковага завершэння.
// src/httpServer.ts
import express from "express";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
const app = express();
app.use(express.json());
app.post("/mcp", async (req, res) => {
// In a real enterprise deployment, authentication middleware would
// run BEFORE this point - verifying a bearer token, checking scopes,
// and attaching the caller's identity to the request.
const server = buildHelpdeskServer(); // same registerTool calls as before
const transport = new StreamableHTTPServerTransport({
sessionIdGenerator: undefined, // stateless mode: simplest to scale horizontally
});
res.on("close", () => transport.close());
await server.connect(transport);
await transport.handleRequest(req, res, req.body);
});
app.listen(3000, () => console.log("MCP server listening on :3000"));
7. Спіс пераканаў для падбору рашэнняў на рэвэрс-эндзе
У стадії 7 «Чакліст для аспектаў рэнтабельнасці на рэвэрс-эндзе» неабходна практычна апісацыя вхідных дадзеных, адпаведнага адпаведальнага за крок і крэатарыяў завершэння працы перад зменым коду. Аперацыйныя системы павінны магчымае перзапуск кроку з вядомай точкі контролю, не прабуючы спадарацца пра схованы статус. Неабходна фіксавацыя часу выкарыстоўвання та косту токенаў чы апыткаў праза функцыйнае рэзультат. Відкрытыя данні пра косцы з’являюцца ўчасна, чым утрымліваецца можлівасць неспакоючых сум у момент пераходу з дэмовай среды ў спадзеленыя сераўеры. Аутентыфікацыя павінна выконвацца на воратах, а пераправерка — на роўні дадзеных. Толькі токен-носіцель не є межай адпаведальнасці за выкарыстоўвання ресурсаў.
8. Дзе гэта выкорыстоўваецца ў рэальных практычных сценарыях
Для стадіі «8. Дзе гэта паказваецца» неабяжна ўскладніць вхідныя даны, адпаведальнага за крок і крэтыяры завершэння пры перадзеіснаванні коду. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не падозрываючы схованы стан. Конфігурацыю трэба знаходзіць за межамі коду прыкладнення. Файлы сераўнавання, хранільнікі секрэтных данных і флагі функцый крануцца ў аднам месцы, якое аператары можаць пераглядаць без неабяжнай чытанняў усіх элементаў системы. Автентыфікацыя павінна выканацца на воратах системы, а пераправерка — на роўні дадзеных. Толькі токэн-носіцель не є межай адпаведнае часткі системы.
9. Частыя падступкі, з якімі сталкаюцца пачатківцы
Для стадії «9 распашчыхя для пачаткунав» неабходна ясная дэфініцыя вхідных даных, адміністратара крока і крэтэрыяў завершэння пры зміне коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Неабходна аддакументаваць як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў є часткай продукту, а не етапамі пазнейшай доработкі. Аутентыфікацыя выканаўцца ў воратах системы, а прабыванне знову — у роўні обробкі дадзеных. Толькі токэн-носіцель не є межой адпаведнае часткі системы. Для стадії «9 распашчыхя для пачаткунав» неабходна ясная дэфініцыя вхідных даных, адміністратара крока і крэтэрыяў завершэння пры зміне коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Спрыяйце таму, каб гэтае стадія была схожа на контракт межа вхідных даных і перакананых выходных рэзультатаў. Называйце всі элементы, дэфініруйце крэтэрыяў успеху і не прабоўваць прыймаць часткова завершаныя рэзультаты без падтверджэння.
10. Заключанне
Калі працюеце над стадзіяй «10. Заканчэнне», спачатку запісайце контракт: неабяжлівыя данні, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі список пераконтроўкі дапамагае заліцварыць пазнейшыя змены ў кодзе. Запісвайце часы выканання і кост токена або запиту праза функцыональныя рэзультаты. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя среды. Запісвайце назву інструмента, хэш аргументаў, час затрымкі і рэзультат кожнага вызову. Без такога лёгкага следу дэбагаванне агента, які ціркулюе без канца, марнуе гадзіны.
Чэк-ліст для эксплуатацыі
Для стадзіяй «Чэк-ліст для эксплуатацыі» перад змянай кодза задазвольце данні, адпаведальную за крок і критэрыяы завершэння. Аперацыйныя працавнікі павінны магчымае перазваляць крок з вядомай точкі контролю, не падозрываючы прыхованы стан.
Лепшыя маленькія, тэставаныя елементы чым велікія скрыпты. Калі якісь крок не выйшае, адказчыкам трэба быць чыткімі ў вызначэнні адпаведнаея адпаведальнасці, а не пасляўязаных процэсаў.
Автентыфікуйцеся на воратах і паўторна надайце правыя на роўні дадзенняў. Сам токэн-носіцель не ёстся межай адпаведнаея часткі системы.
Напісце кароткі посібнік: як зменяць кантроллеры, як спрачысці очакванні, як вярнуць стан да пярэднега рыжымента.
Спрыяйце таму, каб гэты этап быў схожы на контракт межа вхідных дадзенняў і перакананых выходных рэзультатаў. Дайце назвы всім элементам, задаць критэрыя успеху і не прымайце частковае завершэнне без паведамлення.
Автентыфікуйцеся на воратах і паўторна надайце правыя на роўні дадзенняў. Сам токэн-носіцель не ёстся межай адпаведнаея часткі системы.
Перш чым запускать стак, заморозьце версіі, зафіксавце «золаты» транскрыпты для критычнага шляху і паказвце способы абяроны. У спільных средах неабходны ліміты частоты запытанняў, пераконтрольванне прав на выкарыстоўвання ресурсаў і чысткі власнік для змены секрэтных даных. Валіце простую надзяйнасць працы над крэатывнымі, адзінразовымі дамаваннямі.
Запіс для 100916d5ed60: не кладзіце ключы прадастаўцаў у репазітарый, задаце верхнюю межу токенав на сесію і зберагачыце транскрыпты празаўседы ў фіксы для ацэнкі, каб пазнейшыя замены моделяў заставаліся пораўнанымі.