Kaip veikia MCP serveris
Įvesties duomenys
Serveris priima trijų pagrindinių kategorijų įvesties duomenis:
- Naudotojo užklausą iš Copilot Chat, MCP kliento arba HTTP kliento;
- Ryšio parametrus: duomenų bazės pavadinimą, vykdymo aplinkos (angl. „runtime“) režimą, serverio adresą ir prievadą (angl. „host/port“) bei, jei reikia, autentifikavimo duomenis;
- Konkrečiai operacijai reikalingus duomenis: lentelės pavadinimą, filtrą, rikiavimo ir puslapiavimo parinktis arba duomenų keitimo užklausos turinį.
Naudojimo atvejo žingsniai
- Klientas iškviečia ProBro MCP įrankį;
- Serveris pakartotinai naudoja aktyvų prisijungimą arba nustato automatinę konfigūraciją;
- Zod patikrina įvesties duomenis, o serveris juos normalizuoja pagal esamą ProBro protokolą;
- ProBroBridge siunčia base64 koduotą JSON per OpenEdge „socket“ vykdymo aplinką;
- Atsakymas išanalizuojamas ir grąžinamas kaip struktūrizuotas JSON tekstinis turinys.
Išvesties duomenys
Priklausomai nuo iškviesto įrankio, serveris grąžina:
- Galimas lenteles ir jų metaduomenis;
- Užklausų rezultatų rinkinius;
- Užklaustos įterpimo, atnaujinimo, šalinimo ar kopijavimo operacijos rezultatą;
- Prisijungimo, versijos ir išsaugotų prisijungimų diagnostiką.
Architektūra ir įgyvendinimas
Serveris ProBro galimybes pateikia kaip MCP įrankius. Pasirinktinai tuos pačius įrankius jis gali pateikti ir per REST apvalkalą (angl. „wrapper“) – taip paprasčiau integruotis su kitomis sistemomis.
MCP įrankių rinkinys
Serveris yra savarankiška Node.js programa, sukurta modelcontextprotocol/sdk pagrindu. Užuot tiesiogiai atvėręs patį „socket“ protokolą, jis pateikia nedidelį, aiškiai apibrėžtą įrankių rinkinį (angl. „tool surface“).
Dabartiniai įrankiai apima prisijungimo nustatymą, diagnostiką, schemų aptikimą, užklausas ir duomenų keitimą:
- probro_set_connection;
- probro_get_connection_status;
- probro_refresh_auto_connection;
- probro_get_saved_connections;
- probro_get_version;
- probro_list_tables;
- probro_get_table_details;
- probro_query_table;
- probro_mutate_table.
Kodo fragmentas – ProBro-MCP/src/index.js.
const server = new McpServer({
name: 'probro-mcp-server',
version: '0.1.0',
});
server.tool(
'probro_get_table_details',
withBehavioralDefaults('Get detailed schema and field information for a specific table.'),
{ tableName: z.string() },
async ({ tableName }) => asTextContent(await exec('get_table_details', tableName))
);
Automatinis prisijungimas ir atsarginio varianto strategija
Tiesioginis probro_set_connection iškvietimas palaiko tiek vietinį, tiek nuotolinį vykdymo aplinkos režimą. Vietiniu režimu paleidžiama OpenEdge „socket“ vykdymo aplinka, o nuotoliniu – prisijungiama prie jau veikiančio agento.
Kad serveris galėtų pasileisti be naudotojo įsikišimo, dabartinis sprendimas automatinę konfigūraciją nustato tokia tvarka:
- ProBro raktai faile .vscode/settings.json;
- PROBRO_* aplinkos kintamieji, jei įjungtas PROBRO_AUTO_CONNECT.
VS Code būsenoje (pro-bro.dbconfig) išsaugotas ProBro prisijungimų konfigūracijas galima peržiūrėti per probro_get_saved_connections. Tačiau šiuo metu jos nenaudojamos kaip automatinio prisijungimo šaltinis.
Kodo fragmentas – ProBro-MCP/src/index.js.
function getAutoConnectionInput() {
const proBroStateInput = getAutoConnectionInputFromProBroState();
if (proBroStateInput) {
return { source: 'proBroState', input: proBroStateInput };
}
const settingsInput = getAutoConnectionInputFromWorkspaceSettings();
if (settingsInput) {
return { source: 'workspaceSettings', input: settingsInput };
}
const envInput = getAutoConnectionInputFromEnv();
if (envInput) {
return { source: 'env', input: envInput };
}
return null;
}
Įvesties normalizavimas ir numatytosios elgsenos taisyklės
Serveris priima naudotojui patogaus formato užklausas ir pritaiko jas ProBro, o jų patvirtinimui naudoja Zod. Pavyzdžiui, iš filtrų frazių jis pašalina neprivalomą pradinį žodį where ir palaikomų formų filtrus paverčia tokiu formatu, kokio tikisi serverinė dalis (angl. „backend“).
Kodo fragmentas – ProBro-MCP/src/index.js.
function normalizeWherePhrase(wherePhrase) {
if (!wherePhrase) {
return wherePhrase;
}
const trimmed = String(wherePhrase).trim();
return trimmed.replace(/^where\s+/i, '');
}
function normalizeFilters(filters) {
if (Array.isArray(filters)) {
const columns = {};
for (const item of filters) {
const key = item.column || item.columnKey || item.name;
const value = item.value;
if (key && value !== undefined && value !== null) {
columns[key] = String(value);
}
}
return { enabled: true, columns };
}
return filters;
}
ProBro tilto (angl. „bridge“) vykdymo modelis
ProBroBridge išlaiko esamą OpenEdge integracijos kontraktą: JSON užkoduojamas base64 formatu ir išsiunčiamas kaip TCP pranešimas, užbaigtas naujos eilutės simboliu. Gautas atsakymas išanalizuojamas kaip JSON.
Kodo fragmentas – ProBro-MCP/src/probroBridge.js.
export class ProBroBridge {
async execute(requestPayload) {
const encoded = Buffer.from(JSON.stringify(requestPayload), 'utf8').toString('base64');
return this.sendEncoded(encoded);
}
async sendEncoded(encoded) {
this.socket.write(`${encoded}\n`);
// wait for newline-terminated response and parse JSON
}
}
HTTP apvalkalas platesniam naudojimui
HTTP apvalkalas kreipiasi į MCP serverį kaip MCP klientas ir kiekvieną įrankį pateikia adresu POST /api/<tool-name>. Taip serverį gali naudoti ir tos integracijos, kurios negali tiesiogiai kviesti MCP per „stdio“ (standartinį įvesties ir išvesties srautą).
Kodo fragmentas – ProBro-MCP/src/http-wrapper.js.
const server = http.createServer(async (req, res) => {
const toolName = req.url.split('/').filter(Boolean)[1];
const args = body ? JSON.parse(body) : {};
const result = await callMcpTool(toolName, args);
const text = extractText(result);
const payload = parsePayload(text);
res.end(JSON.stringify({ ok: true, tool: toolName, result: payload }));
});
Kaip naudoti šį MCP serverį
Būtinos sąlygos
- Node.js 18 ar naujesnė versija;
- ProBro-MCP saugykloje įvykdyta komanda npm install;
- OpenEdge vykdymo aplinka vietiniam režimui arba pasiekiamas ProBro / OpenEdge agentas nuotoliniam režimui.
Užregistruokite serverį VS Code aplinkoje
Į savo VS Code MCP konfigūraciją įtraukite MCP serverio aprašą ir nurodykite kelią iki vietinės ProBro-MCP saugyklos kopijos (angl. „checkout“):
{
"servers": {
"probro": {
"command": "node",
"args": ["c:/Users/sjakubenas/projects/ProBro-MCP/src/index.js"]
}
}
}
Pakeitę konfigūraciją, iš naujo paleiskite MCP serverį VS Code aplinkoje. Tada Copilot Chat lange galėsite tiesiogiai iškviesti įrankį arba užduoti klausimą apie konkrečią operaciją, pavyzdžiui: „Išvardyk galimas ProBro lenteles.“ Sudėtingesni naudojimo scenarijai aprašyti Copilot Chat integracijos vadove.
Sukurkite prisijungimą
Vietinį režimą rinkitės tada, kai MCP serveris turi pats paleisti vietinę OpenEdge vykdymo aplinką, o nuotolinį – kai OpenEdge agentas jau veikia. Bet kurį iš šių duomenų rinkinių nusiųskite į probro_set_connection, tada prisijungimą patikrinkite su probro_get_connection_status arba probro_get_version.
Vietinis režimas
{
"mode": "local",
"dlc": "C:\\Progress\\OpenEdge",
"database": "C:\\data\\sports2020.db",
"agentPort": 23456
}
Nuotolinis režimas
{
"mode": "remote",
"agentHost": "127.0.0.1",
"agentPort": 23456,
"database": "sports2020"
}
Raskite ir užklauskite duomenis
- Iškvieskite probro_list_tables, kad rastumėte galimą lentelę;
- Prieš kurdami užklausą ar duomenų keitimo operaciją, iškvieskite probro_get_table_details su { "tableName": "Customer" };
- Iškvieskite probro_query_table su apribota užklausa:
{
"tableName": "Customer",
"wherePhrase": "Customer.CustNum = 3000",
"pageLength": 10,
"sortColumns": [
{ "columnKey": "CustNum", "direction": "ASC" }
]
}
Prieš atnaujindami įrašą, pirmiausia jį užklauskite ir išsaugokite jo ROWID kaip lastRowID. MCP serveris nurodo klientams laikytis šio modelio, kad įrašymo operacijos būtų apibrėžtos:
{
"tableName": "Customer",
"mode": "UPDATE",
"crud": [],
"data": [
{ "key": "Country", "value": "USA", "defaultValue": "Mexico" }
],
"useWriteTriggers": true,
"useDeleteTriggers": true,
"wherePhrase": "Customer.CustNum = 3000",
"lastRowID": "0x0000000000002401"
}
Naudokite HTTP apvalkalą
Paleiskite apvalkalą ProBro-MCP saugykloje:
```powershell
npm run start:http
```
Tada tuos pačius MCP įrankius kvieskite per HTTP, pavyzdžiui:
```powershell
Invoke-RestMethod -Method Post `
-Uri 'http://localhost:3000/api/probro_list_tables' `
-ContentType 'application/json' `
-Body '{}'
```
Apvalkalas visada grąžina vienodos struktūros atsakymą (angl. „envelope“):
{
"ok": true,
"tool": "probro_list_tables",
"result": []
}
Patikrinkite diegimą
Paleiskite greitąjį testą (angl. „smoke test“) ir įsitikinkite, kad MCP procesas pasileidžia, o numatyti įrankiai užsiregistruoja:
```powershell
npm run test:smoke
```
Integracinį testą paleiskite tik nustatę prisijungimo aplinkos kintamuosius ir įsitikinę, kad tikslinis agentas ir duomenų bazė pasiekiami:
```powershell
$env:PROBRO_MCP_MODE = 'remote'
$env:PROBRO_AGENT_HOST = '127.0.0.1'
$env:PROBRO_DB_DATABASE = 'sports2020'
npm run test:integration
```
Iššūkiai ir sprendimai
Kuriant ProBro MCP serverį iškilo keturi praktiniai iššūkiai. Kiekvienas jų nulėmė tam tikrą dabartinio sprendimo dalį.
Įrankių schemų patvirtinimo neatitikimai
Problema: taikant griežtus schemų reikalavimus, MCP įrankių patvirtinimas nepavykdavo. Ypač tai lietė masyvus, kuriems reikėjo aiškiai apibrėžti items.
Kas padaryta: sugriežtintos masyvų laukų (sortColumns, crud, data) Zod schemos, o numatytosios reikšmės paliktos aiškiai apibrėžtos.
Kodo fragmentas – ProBro-MCP/src/index.js.
const sortColumnSchema = z.object({
columnKey: z.string(),
direction: z.enum(['ASC', 'DESC']).default('ASC'),
});
sortColumns: z.array(sortColumnSchema).default([]),
crud: z.array(z.string()).default([]),
data: z.array(z.object({
key: z.string(),
value: z.union([z.string(), z.number(), z.boolean(), z.null()]),
defaultValue: z.union([z.string(), z.number(), z.boolean(), z.null()]).optional(),
})).default([])
Prisijungimo inicijavimo patikimumas
Problema: vykdymo aplinkos paleidimas ir prisijungimo elgsena vietiniu ir nuotoliniu režimais skyrėsi. Be to, pasenusi registracija ar konfigūracija galėjo sukelti klaidinančių gedimų.
Kas padaryta: įdiegtas apibrėžtas prisijungimo nustatymas, būsenos ataskaitos bei atnaujinimo galinis taškas (angl. „endpoint“) ir įrankis. Taip pat patobulinti klaidų pranešimai – dabar jie nurodo konfigūracijos šaltinį ir atsarginio varianto elgseną.
Kodo fragmentas – ProBro-MCP/src/index.js.
server.tool(
'probro_refresh_auto_connection',
'Force-refresh auto-connect settings and reconnect using env or workspace ProBro configuration.',
{},
async () => {
const status = await refreshAutoConnection();
return asTextContent({ ok: true, refreshed: true, status });
}
);
Perduodamų duomenų suderinamumas su serverinės dalies lūkesčiais
Problema: skirtingų klientų pateikiami įvesties duomenys ne visada atitiko struktūrą, kurios tikisi ProBro serverinė dalis.
Kas padaryta: pridėtas wherePhrase ir lanksčių filters formatų normalizavimas. Be to, numatytosios elgsenos gairės įtrauktos tiesiai į įrankių aprašus – jos padeda nukreipti agentų elgseną.
Sąveikumas su pokalbių ir įrankių ekosistema
Problema: kai kurias sistemas paprasčiau integruoti per HTTP nei per MCP „stdio“.
Kas padaryta: pridėtas HTTP apvalkalas su vienodos struktūros atsakymais ir modeliu „vienas įrankis – vienas galinis taškas“. Taip tas pačias funkcijas gali pasiekti ir ne MCP klientai.
ProBro MCP įgyvendinimo rezultatai
Per MCP atvėrus ProBro, nuosavas „socket“ protokolas tampa standartiniu ir nuspėjamu įrankių rinkiniu. Juo gali pasikliauti DI agentai ir programuotojų įrankiai – nesvarbu, ar jie jungiasi per „stdio“, ar per HTTP. Serveris vienoje vietoje nuosekliai tvarko prisijungimo nustatymą, įvesties normalizavimą bei perduodamų duomenų patvirtinimą. Todėl kiekvienai integracijai nebereikia atskirai spręsti tų pačių problemų.
Rezultatas – pagrindas, kurį jau galima naudoti kasdienėms užklausoms ir duomenų keitimo darbams. Be to, jam yra kur augti: prisijungiant vis daugiau jį naudojančių sistemų, galima plėsti įrankių rinkinį ir stiprinti automatinį prisijungimą.
Įgyvendintos galimybės
ProBro funkcijos, pasiekiamos per MCP įrankius:
- probro_set_connection;
- probro_get_connection_status;
- probro_get_version;
- probro_get_saved_connections;
- probro_refresh_auto_connection;
- probro_list_tables;
- probro_get_table_details;
- probro_query_table;
- probro_mutate_table.
Pasirinktinis HTTP prieigos sluoksnis ne MCP klientams (npm run start:http). Greitojo ir integracinio testavimo rašmenys pakartojamai patikrai.
Patikros įrodymai
Greitasis testas patikrina, ar serveris pasileidžia ir ar užsiregistruoja įrankiai.
Kodo fragmentas – ProBro-MCP/scripts/smoke-test.cjs.
const expectedTools = [
'probro_set_connection',
'probro_get_version',
'probro_get_saved_connections',
'probro_list_tables',
'probro_get_table_details',
'probro_query_table',
'probro_mutate_table',
];
for (const expected of expectedTools) {
assert(toolNames.includes(expected));
}
Poveikio apžvalga
- ProBro duomenų bazė dabar pasiekiama per formalų MCP kontraktą;
- DI pagrįstos darbo eigos gali atlikti skaitymo ir rašymo operacijas su nuoseklia semantika;
- HTTP apvalkalas leidžia sprendimą naudoti ir ten, kur MCP klientų palaikymo nėra;
- Prisijungimo ir automatinio prisijungimo logika dabar pakankamai patikima kasdieniam naudojimui ir demonstracijoms.
ProBro atvėrimas per MCP – viena platesnio siekio dalis: OpenEdge sistemas turi būti lengviau integruoti su šiuolaikiniais DI pagrįstais įrankiais. Agentais grįstoms darbo eigoms tampant vis įprastesnėms, nuosekli ir gerai ištestuota sąsaja tarp OpenEdge duomenų bazės ir ją naudojančių įrankių bus tik vertingesnė.
Jei jūsų organizacija svarsto, kaip modernizuoti ar išplėsti savo Progress OpenEdge sistemas, apsilankykite Progress OpenEdge produkto puslapyje ir sužinokite daugiau apie platformą bei jos ekosistemą.




