AI integracijų standartizavimas naudojant Model Context Protocol (MCP)
Praktinis vadovas, kaip kurti ir apsaugoti individualius MCP serverius, siekiant saugiai prijungti įmonės duomenis prie AI programuotojų agentų.

Didelių kalbos modelių (LLM) prijungimas prie vidinių duomenų šaltinių ir sistemų istoriškai buvo fragmentuotas, ad-hoc darbas. Kiekvienas AI inžinerijos projektas paprastai prasideda nuo individualių API apvalkalų (wrappers) rašymo, JSON schemų atvaizdavimo arba patentuoto klijavimo kodo kūrimo orkestratoriaus vykdymo aplinkose, siekiant valdyti įrankių iškvietimus.
Jei pereinate nuo „OpenAI“ prie „Anthropic“ arba programuotojai pereina iš vienos AI palaikomos IDE į kitą, dažnai turite iš naujo perrašyti integracijos sluoksnį.
Būtent dėl šios trinties Model Context Protocol (MCP), atviras standartas, kuriam vadovauja „Anthropic“, greitai įgyja populiarumą. Panašiai kaip Language Server Protocol (LSP) standartizavo, kaip kompiliatoriai bendrauja su kodo redaktoriais, MCP standartizuoja, kaip AI modeliai bendrauja su duomenų šaltiniais ir programuotojų įrankiais.
Štai praktinis vadovas, kaip sukurti, struktūrizuoti ir apsaugoti individualų MCP serverį, kad saugiai atvertumėte įmonės duomenis savo programuotojų agentams.
Architektūra: klientų ir serverių atskyrimas
Pagrindinis MCP projektavimo principas yra atskyrimas. Vietoj to, kad API integracijos būtų įrašytos tiesiai į agento vykdymo aplinką, MCP pristato kliento-serverio architektūrą:
[ AI Agent / IDE ] (MCP Client)
│
│ (JSON-RPC 2.0 over Stdio or SSE)
▼
[ Custom MCP Server ]
│
├─► Secure Database (PostgreSQL / BigQuery)
├─► Internal Microservices
└─► Local Development Tools- MCP klientas: Koordinatorius (pvz., „Cursor“, „Windsurf“ arba individualus „LangChain“ orkestratorius). Jis valdo LLM samprotavimą, saugo vartotojo kontekstą ir inicijuoja įrankių užklausas.
- MCP serveris: Lengvas procesas arba paslauga, atverianti tris pagrindinius primityvus:
- Prompts: Daugkartinio naudojimo šablonai, skirti nukreipti modelio sąveiką.
- Resources: Tik skaitomi duomenų šaltiniai (failų turinys, duomenų bazės eilutės, API atsakymai).
- Tools: Vykdomosios funkcijos, kurios gali atlikti operacijas arba iškviesti išorines API.
Individualaus MCP serverio kūrimas TypeScript aplinkoje
Sukurkime gamybai paruoštą Node.js MCP serverį, naudodami oficialų TypeScript SDK. Šis serveris atvers saugų įrankį, skirtą ieškoti vidiniuose duomenų bazės įrašuose (pavyzdžiui, kandidatų ar atvejų tyrimų) su integruotu argumentų patvirtinimu vykdymo metu.
1. Projekto inicijavimas
Pirmiausia nustatykite TypeScript projektą ir įdiekite reikiamas priklausomybes:
npm init -y
npm install @modelcontextprotocol/sdk zod
npm install --save-dev typescript @types/node
npx tsc --init2. Serverio diegimas
Žemiau pateikiamas saugaus, stdio pagrįsto MCP serverio kodas. Registruojame paieškos įrankį ir naudojame zod, kad užtikrintume griežtą schemos patvirtinimą ateinantiems duomenims:
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
import { z } from "zod";
// 1. Initialize the MCP Server
const server = new Server(
{
name: "enterprise-search-service",
version: "1.0.0",
},
{
capabilities: {
tools: {}, // Advertise tool capabilities to the client
},
}
);
// 2. Define the Search Schema using Zod
const CandidateSearchSchema = z.object({
query: z.string().min(2),
limit: z.number().optional().default(5),
department: z.enum(["Engineering", "Design", "Product", "Sales"]).optional(),
});
// 3. Register Available Tools
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
{
name: "search_candidates",
description: "Search internal database for candidates matching specific skills and departments.",
inputSchema: {
type: "object",
properties: {
query: { type: "string", description: "Search term or required skill" },
limit: { type: "number", description: "Maximum records to return" },
department: { type: "string", enum: ["Engineering", "Design", "Product", "Sales"] },
},
required: ["query"],
},
},
],
};
});
// Mock database resolver
async function queryDatabase(query: string, limit: number, dept?: string) {
// Real implementation would connect to Cloud SQL / BigQuery
return [
{ id: 101, name: "Sarah Connor", role: "Staff Platform Engineer", tags: ["Kubernetes", "Go", "MACH"] },
{ id: 102, name: "Marcus Wright", role: "Solutions Architect", tags: ["Next.js", "React", "AI Agents"] }
];
}
// 4. Handle Tool Executions
server.setRequestHandler(CallToolRequestSchema, async (request) => {
if (request.params.name !== "search_candidates") {
throw new Error(`Tool ${request.params.name} not found`);
}
try {
// Validate the arguments at runtime
const args = CandidateSearchSchema.parse(request.params.arguments);
// Fetch secure records
const results = await queryDatabase(args.query, args.limit, args.department);
return {
content: [
{
type: "text",
text: JSON.stringify(results, null, 2),
},
],
};
} catch (error: any) {
return {
content: [
{
type: "text",
text: `Error validating arguments: ${error.message}`,
},
],
isError: true,
};
}
});
// 5. Start Server Transport (stdio is standard for local IDE integrations)
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("Enterprise Search MCP Server running on stdio");Saugumo stiprinimas įmonės naudojimui
Nors rašyti TypeScript kodą yra paprasta, vidinių gamybinių duomenų atvėrimas LLM reikalauja griežtų operacinio saugumo taisyklių. AI modeliai yra linkę į haliucinacijas, promptų injekcijas ir nenumatytus įrankių vykdymo ciklus.
Štai keturi įmonės MCP saugumo ramsčiai:
1. Schemos patvirtinimas ir įvesties sanitarizavimas
Niekada nepasitikėkite LLM sugeneruotais argumentais. Visada patvirtinkite parametrus naudodami tokias bibliotekas kaip Zod, ir išvalykite eilutes, kad išvengtumėte pavojaus duomenų bazėms:
- Naudokite parametrizuotas užklausas arba ORM, kad išvengtumėte SQL injekcijos.
- Patikrinkite katalogų kelius, kad išvengtumėte katalogų perėjimo (directory traversal) atakų, jei jūsų įrankis skaito vietinius failus.
2. Autentifikavimas ir OAuth konteksto perdavimas
Kai vykdote įmonės tinkle, turite patikrinti už agento esančio vartotojo autorizacijos lygį.
- Atverkite MCP per Server-Sent Events (SSE), o ne stdio. Tai leidžia paleisti MCP serverį kaip nepriklausomą mikropaslaugą už API vartų (API Gateway).
- Persiųskite vartotojo tapatybės žetoną (JWT) užklausos antraštėse, leisdami MCP serveriui taikyti eilučių lygio saugumą (Row-Level Security - RLS) tikslinėje duomenų bazėje.
3. Vartotojo patvirtinimas (Human-in-the-Loop - HITL)
Skaitymo įrankių (tokių kaip search_candidates) atvėrimas yra mažos rizikos. Tačiau rašymo įrankių (tokių kaip update_records arba deploy_service) atvėrimas yra pavojingas.
- Įdiekite aiškius patvirtinimus rašymo veiksmams. MCP klientas turėtų perimti rašymo užklausas ir parodyti programuotojui diff peržiūrą su pakeitimais, kuriuos agentas nori atlikti.
[ Agent Tool Request ] ──► [ Security Middleware ] ──► (Diff Check / UI Popup)
│
┌──────────────────────────────────────────┘
▼
[ User Approves? ] ──(Yes)──► [ Execute Write on Server ]4. Užklausų ribojimas ir apsaugos barjerai
Agentai gali patekti į rekurzinius mąstymo ciklus, kai jie iškviečia įrankį dešimtis kartų per kelias sekundes, sukeldami didelę apkrovą duomenų bazėms arba dideles žetonų išlaidas.
- Taikykite užklausų ribojimą (rate limiting) vienai sesijai.
- Apribokite maksimalų rezultatų dydį, kad išvengtumėte žetonų perpildymo.
Žvilgsnis į ateitį: pasenusių sistemų atvėrimas kaip AI primityvų
Model Context Protocol galia yra ta, kad jis paverčia pasenusias programinės įrangos sąsajas švariomis, lengvai aptinkamomis galimybėmis.
Apgaubdami vidines duomenų bazes, diegimo scenarijus ir API standartizuotu MCP sluoksniu, užtikrinate, kad bet koks AI įrankis – nesvarbu, ar tai būtų redaktorius, pvz., „Cursor“, terminalo kompanionas ar autonominis diegimo agentas – galėtų saugiai, nuspėjamai ir be papildomų vertimo išlaidų sąveikauti su jūsų verslo logika.