Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a cikk bemutatja, hogyan hozhat létre modellkörnyezeti protokoll (MCP) kiszolgálót Node.js és TypeScript használatával. A kiszolgáló kiszolgáló nélküli környezetben futtat eszközöket és szolgáltatásokat. Használja ezt a struktúrát kiindulási pontként egyéni MCP-kiszolgálók létrehozásához.
A kód megismerése
Ismerje meg a TypeScript távoli modellkörnyezeti protokoll (MCP) kiszolgálómintáját . Bemutatja, hogyan használható a Node.js és a TypeScript egy távoli MCP-kiszolgáló létrehozásához és az Azure Container Appsben való üzembe helyezéséhez.
A minta működésének megismeréséhez ugorjon a kódbemutató szakaszra .
Architekturális áttekintés
Az alábbi ábra a mintaalkalmazás egyszerű architektúráját mutatja be:
Az MCP-kiszolgáló tárolóalapú alkalmazásként fut az Azure Container Appsben (ACA). Egy Node.js/TypeScript háttérrendszer használatával biztosít eszközöket az MCP-ügyfélnek a Model Context Protocolon keresztül. Minden eszköz egy háttérbeli SQLite-adatbázissal működik.
Költség
A költségek alacsony szinten tartása érdekében ez a minta alapszintű vagy fogyasztási tarifacsomagokat használ a legtöbb erőforráshoz. Igény szerint állítsa be a szintet, és törölje az erőforrásokat, ha elkészült a díjak elkerülése érdekében.
Előfeltételek
- Visual Studio Code – Az MCP Server fejlesztését támogató legújabb verzió.
- GitHub Copilot Visual Studio Code-bővítmény
- GitHub Copilot Chat Visual Studio Code kiterjesztés
- Azure Developer CLI (azd)
A fejlesztői tároló tartalmazza a cikkhez szükséges összes függőséget. Futtathatja a GitHub Codespacesben (böngészőben) vagy helyileg a Visual Studio Code használatával.
A cikk követéséhez győződjön meg arról, hogy megfelel az alábbi előfeltételeknek:
- Azure-előfizetés – Ingyenes létrehozás
- Azure-fiókengedélyek – Az Azure-fióknak rendelkeznie
Microsoft.Authorization/roleAssignments/writekell engedélyekkel, például szerepköralapú hozzáférés-vezérlési rendszergazdával, felhasználói hozzáférés-rendszergazda vagy tulajdonos. Ha nem rendelkezik előfizetési szintű engedélyekkel, meg kell kapnia egy meglévő erőforráscsoporthoz tartozó RBAC jogosultságokat, és üzembe kell helyeznie az adott csoportban.- Az Azure-fióknak előfizetési szinten is szüksége van
Microsoft.Resources/deployments/writeengedélyekre.
- Az Azure-fióknak előfizetési szinten is szüksége van
- GitHub-fiók
Nyílt fejlesztési környezet
Az alábbi lépésekkel előre konfigurált fejlesztői környezetet állíthat be az összes szükséges függőséggel együtt.
A GitHub Codespaces egy, a GitHub által felügyelt fejlesztői tárolót futtat a Webes Visual Studio Code-tal felületként. A legegyszerűbb beállításhoz használja a GitHub Codespacest, mivel a cikkhez előre telepített szükséges eszközökkel és függőségekkel rendelkezik.
Fontos
Minden GitHub-fiók legfeljebb 60 órán át használhatja a Codespace-eket havonta két alapvető példánnyal. További információkért lásd: GitHub Codespaces havi tárterület- és alapóra-kontingense.
Az alábbi lépésekkel hozzon létre egy új GitHub-kódteret a mainAzure-Samples/mcp-container-ts GitHub-adattár ágán.
Kattintson a jobb gombbal az alábbi gombra, és válassza a Hivatkozás megnyitása az új ablakban lehetőséget. Ez a művelet lehetővé teszi, hogy a fejlesztési környezet és a dokumentáció egymás mellett legyen megnyitva.
A Kódtér létrehozása lapon tekintse át, majd válassza az Új kódtér létrehozása lehetőséget.
Várja meg, amíg a kódolási környezet elindul. Eltarthat néhány percig.
Jelentkezzen be az Azure-ba az Azure Developer CLI-vel a képernyő alján található terminálon.
azd auth loginMásolja ki a kódot a terminálból, majd illessze be egy böngészőbe. Kövesse az utasításokat az Azure-fiókkal való hitelesítéshez.
A többi feladatot ebben a fejlesztési tárolóban hajtja végre.
Megjegyzés:
Az MCP-kiszolgáló helyi futtatása:
- Állítsa be a környezetet a mintaadattár Helyi környezet beállítás szakaszában leírtak szerint.
- Konfigurálja az MCP-kiszolgálót a helyi környezet használatára az MCP-kiszolgáló konfigurálása a Visual Studio Code-ban szakasz utasításait követve a mintaadattárban.
- A folytatáshoz ugorjon a TODO MCP-kiszolgálóeszközök használata ügynök módban szakaszra.
Üzembe helyezés és futtatás
A mintaadattár tartalmazza az MCP-kiszolgáló Azure-beli üzembe helyezéséhez szükséges összes kódot és konfigurációs fájlt. Az alábbi lépések végigvezetik az MCP szerver Azure alapú telepítési folyamatán.
Telepítés az Azure-ra
Fontos
Az ebben a szakaszban lévő Azure-erőforrások azonnal költségeket generálnak, akkor is, ha a parancsot a befejezés előtt leállítja.
Futtassa a következő Azure Developer CLI-parancsot az Azure-erőforrások kiépítéséhez és a forráskód üzembe helyezéséhez:
azd upAz alábbi táblázat segítségével válaszolhat a kérdésekre:
Haladéktalan Válasz Környezet neve Legyen rövid és kisbetűs. Adja hozzá a nevét vagy aliasát. Például: my-mcp-server. Az erőforráscsoport nevének részeként használják.Előfizetés Válassza ki az előfizetést az erőforrások létrehozásához. Hely (üzemeltetéshez) Válasszon ki egy Önhöz közeli helyet a listából. Az Azure OpenAI-modell helye Válasszon ki egy Önhöz közeli helyet a listából. Ha ugyanaz a hely érhető el, mint az első hely, válassza ezt. Várja meg az alkalmazás üzembe helyezését. Az üzembe helyezés általában 5–10 percet vesz igénybe.
Az üzembe helyezés befejezése után a kimenetben megadott URL-cím használatával érheti el az MCP-kiszolgálót. Az URL-cím így néz ki:
https://<env-name>.<container-id>.<region>.azurecontainerapps.io
- Másolja az URL-címet a vágólapra. A következő szakaszban szüksége lesz rá.
Az MCP-kiszolgáló konfigurálása a Visual Studio Code-ban
Konfigurálja az MCP-kiszolgálót a helyi VS Code-környezetben úgy, hogy hozzáadja az URL-címet a mcp.json.vscode mappában lévő fájlhoz.
Nyissa meg a
mcp.jsonfájlt a.vscodemappában.Keresse meg a
mcp-server-sse-remoteszakaszt a fájlban. Ennek így kell kinéznie:"mcp-server-sse-remote": { "type": "sse", "url": "https://<container-id>.<location>.azurecontainerapps.io/sse" }Cserélje le a meglévő
urlértéket az előző lépésben másolt URL-címre.Mentse a
mcp.jsonfájlt a.vscodemappába.
TODO MCP-kiszolgálóeszközök használata ügynök módban
Az MCP-kiszolgáló módosítása után használhatja az eszközöket, amelyet ügynök módban biztosít. Az MCP-eszközök használata ügynök módban:
Nyissa meg a Csevegés nézetet (
Ctrl+Alt+I), és válassza az Ügynök módot a legördülő listában.Kattintson az Eszközök gombra az elérhető eszközök listájának megtekintéséhez. Tetszés szerint jelölje ki vagy törölje a használni kívánt eszközök kijelölését. Az eszközök kereséséhez használja a keresőmezőt.
A csevegés beviteli mezőjébe írja be a "Szerdán e-mailt kell küldenem a felettesemnek" üzenetet, és figyelje meg, hogy az eszközök szükség szerint automatikusan hogyan lesznek meghívva, ahogyan az alábbi képernyőképen látható:
Megjegyzés:
Alapértelmezés szerint egy eszköz meghívásakor meg kell erősítenie a műveletet az eszköz futtatása előtt. Ellenkező esetben előfordulhat, hogy az eszközök helyileg futnak a számítógépen, és fájlokat vagy adatokat módosító műveleteket hajthatnak végre.
A Folytatás gomb legördülő menüjének használatával automatikusan megerősítheti az aktuális munkamenet, munkaterület vagy az összes jövőbeli hívás konkrét eszközét.
A mintakód felfedezése
Ez a szakasz áttekintést nyújt az MCP-kiszolgáló mintájában található kulcsfájlokról és kódstruktúráról. A kód több fő összetevőbe van rendezve:
-
index.ts: Az MCP-kiszolgáló fő belépési pontja, amely beállítja a Express.js HTTP-kiszolgálót és az útválasztást. -
server.ts: Az Server-Sent események (SSE) kapcsolatait és az MCP protokollkezelést kezelő átviteli réteg. -
tools.ts: Az MCP-kiszolgáló üzleti logikáját és segédprogramfüggvényét tartalmazza. -
types.ts: Az MCP-kiszolgálón használt TypeScript-típusokat és interfészeket határozza meg.
index.ts – A kiszolgáló indítása és HTTP-kapcsolatok elfogadása
A index.ts fájl az MCP-kiszolgáló fő belépési pontja. Inicializálja a kiszolgálót, beállítja a Express.js HTTP-kiszolgálót, és meghatározza az útválasztást Server-Sent események (SSE) végpontjaihoz.
Az MCP-kiszolgálópéldány létrehozása
Az alábbi kódrészlet inicializálja az MCP-kiszolgálót az StreamableHTTPServer osztály használatával, amely egy burkoló az alapvető MCP-osztály Server körül. Ez az osztály kezeli az Server-Sent Események (SSE) átviteli rétegét, és kezeli az ügyfélkapcsolatokat.
const server = new StreamableHTTPServer(
new Server(
{
name: 'todo-http-server',
version: '1.0.0',
},
{
capabilities: {
tools: {},
},
}
)
);
Fogalmak:
-
Összeállítási minta:
SSEPServeraz alacsony szintűServerosztály körbefuttatása - Képességek deklarálása: A kiszolgáló bejelenti, hogy támogatja az eszközöket (de nem erőforrásokat/kéréseket)
- Elnevezési konvenció: A kiszolgáló neve az MCP-azonosítás részévé válik
Express-útvonalak beállítása
Az alábbi kódrészlet beállítja a Express.js kiszolgálót az SSE-kapcsolatok és az üzenetkezelés bejövő HTTP-kéréseinek kezelésére:
router.post('/messages', async (req: Request, res: Response) => {
await server.handlePostRequest(req, res);
});
router.get('/sse', async (req: Request, res: Response) => {
await server.handleGetRequest(req, res);
});
Fogalmak:
- Két végpontos minta: GET SSE-kapcsolat létrehozásához, POST üzenetek küldéséhez
-
Delegálási minta: Az expressz útvonalak azonnal delegálnak
SSEPServer
Folyamat életciklusának kezelése
A következő kódrészlet kezeli a kiszolgáló életciklusát, beleértve a kiszolgáló indítását és a leállási jeleken való kecses leállítását:
process.on('SIGINT', async () => {
log.error('Shutting down server...');
await server.close();
process.exit(0);
});
Fogalmak:
- Kecses leállítás: Megfelelő törlés a Ctrl+C billentyűkombináción
- Aszinkron tisztítás: A kiszolgáló bezárása aszinkron módon történik
- Erőforrás-kezelés: Fontos az SSE-kapcsolatokhoz
Átviteli réteg: server.ts
A server.ts fájl implementálja az MCP-kiszolgáló átviteli rétegét, különös tekintettel az Server-Sent események (SSE) kapcsolatainak kezelésére és az MCP protokollüzenetek útválasztására.
SSE-ügyfélkapcsolat beállítása és átvitel létrehozása
Az SSEPServer osztály az MCP-kiszolgálón Server-Sent események (SSE) kezelésére szolgáló fő átviteli réteg. Az SSEServerTransport osztályt használja az egyes ügyfélkapcsolatok kezelésére. Több átvitelt és azok életciklusát kezeli.
export class SSEPServer {
server: Server;
transport: SSEServerTransport | null = null;
transports: Record<string, SSEServerTransport> = {};
constructor(server: Server) {
this.server = server;
this.setupServerRequestHandlers();
}
}
Fogalmak:
- Állapotkezelés: Nyomon követi az aktuális és az összes szállítást
-
Munkamenet-leképezés:
transportsaz objektum leképezi a munkamenet-azonosítókat az átviteli példányokra - Konstruktor-delegálás: Kéréskezelők azonnali beállítása
SSE-kapcsolat létesítése (handleGetRequest)
A handleGetRequest metódus feladata egy új SSE-kapcsolat létrehozása, amikor egy ügyfél GET kérést küld a /sse végponthoz.
async handleGetRequest(req: Request, res: Response) {
log.info(`GET ${req.originalUrl} (${req.ip})`);
try {
log.info("Connecting transport to server...");
this.transport = new SSEServerTransport("/messages", res);
TransportsCache.set(this.transport.sessionId, this.transport);
res.on("close", () => {
if (this.transport) {
TransportsCache.delete(this.transport.sessionId);
}
});
await this.server.connect(this.transport);
log.success("Transport connected. Handling request...");
} catch (error) {
// Error handling...
}
}
Fogalmak:
-
Átvitel létrehozása: Új
SSEServerTransportminden GET-kéréshez - Munkamenet-kezelés: Gyorsítótárban tárolt automatikus munkamenet-azonosító
- Eseménykezelők: Törlés a kapcsolat bezárásakor
-
MCP-kapcsolat:
server.connect()protokollkapcsolatot hoz létre - Aszinkron folyamat: A kapcsolat beállítása aszinkron hibahatárokkal
Üzenetfeldolgozás (handlePostRequest)
A handlePostRequest metódus feldolgozza a bejövő POST-kéréseket az ügyfél által küldött MCP-üzenetek kezelésére. A lekérdezési paraméterek munkamenet-azonosítóját használja a megfelelő átviteli példány megkereséséhez.
async handlePostRequest(req: Request, res: Response) {
log.info(`POST ${req.originalUrl} (${req.ip}) - payload:`, req.body);
const sessionId = req.query.sessionId as string;
const transport = TransportsCache.get(sessionId);
if (transport) {
await transport.handlePostMessage(req, res, req.body);
} else {
log.error("Transport not initialized. Cannot handle POST request.");
res.status(400).json(/* error response */);
}
}
Fogalmak:
- Munkamenet-keresés: A lekérdezési paraméter segítségével keresi meg az átvitelt.
- Munkamenet-ellenőrzés: Először ellenőrzi az SSE-kapcsolatot.
- Üzenetdelegálás: Az átvitel kezeli a tényleges üzenetfeldolgozást
- Hibaválaszok: Megfelelő HTTP-hibakódok a hiányzó munkamenetekhez
MCP protokollkezelő beállítása (setupServerRequestHandlers)
A setupServerRequestHandlers metódus a következő kezelőket regisztrálja az MCP protokollkérelmekhez:
- Ez egy kezelő az
ListToolsRequestSchemaszámára, amely visszaadja az elérhető TODO-eszközök listáját. - Egy
CallToolRequestSchemakezelő megkeresi és végrehajtja a kért eszközt a megadott argumentumokkal.
Ez a módszer Zod-sémákkal határozza meg a várt kérés- és válaszformátumokat.
private setupServerRequestHandlers() {
this.server.setRequestHandler(ListToolsRequestSchema, async (_request) => {
return {
tools: TodoTools,
};
});
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
const tool = TodoTools.find((tool) => tool.name === name);
if (!tool) {
return this.createJSONErrorResponse(`Tool "${name}" not found.`);
}
const response = await tool.execute(args as any);
return { content: [{ type: "text", text: response }] };
});
}
Fogalmak:
- Schema-Based Útválasztás: Zod-sémákat használ a típusbiztos kéréskezeléshez
-
Eszközfelderítés:
ListToolsRequestSchemastatikus TodoTools-tömböt ad vissza -
Eszközvégrehajtás:
CallToolRequestSchemaeszközök keresése és végrehajtása - Hibakezelés: Ismeretlen eszközök kecses kezelése
- Válaszformátum: MCP-kompatibilis válaszstruktúra
- Típusbiztonság: A TypeScript-típusok biztosítják a helyes argumentumátadást
Üzleti logika: tools.ts
A tools.ts fájl az MCP-ügyfelek számára elérhető tényleges funkciókat határozza meg:
- Eszköz metaadatai (név, leírás, sémák)
- Bemeneti érvényesítési sémák
- Eszközvégrehajtási logika
- Integráció az adatbázisréteggel
Ez az MCP-kiszolgáló négy TODO felügyeleti eszközt határoz meg:
-
add_todo: Új TODO-elem létrehozása -
complete_todo: TODO-elem megjelölése befejezettként -
delete_todo: TODO-elem törlése -
list_todos: Az összes TODO-elem listázása -
update_todo_text: Meglévő TODO-elem szövegének frissítése
Eszközdefiníciós minta
Az eszközök objektumtömbként vannak definiálva, amelyek mindegyike egy adott TODO-műveletet jelöl. A addTodo eszköz a következő kódrészletben van definiálva.
{
name: "addTodo",
description: "Add a new TODO item to the list...",
inputSchema: {
type: "object",
properties: {
text: { type: "string" },
},
required: ["text"],
},
outputSchema: { type: "string" },
async execute({ text }: { text: string }) {
const info = await addTodo(text);
return `Added TODO: ${text} (id: ${info.lastInsertRowid})`;
},
}
Minden eszközdefiníció a következő:
-
name: Az eszköz egyedi azonosítója -
description: Az eszköz céljának rövid leírása -
inputSchema: A várt bemeneti formátumot meghatározó zod séma -
outputSchema: A várt kimeneti formátumot meghatározó zod séma -
execute: Az eszköz logikáját implementáló függvény
Ezeket az eszközdefiníciókat a server.ts-ban kerülnek importálásra, és a ListToolsRequestSchema kezelő által válnak elérhetővé.
Fogalmak:
- Moduláris eszköztervezés: Minden eszköz egy önálló objektum
-
JSON-séma érvényesítése:
inputSchemameghatározza a várt paramétereket - Típusbiztonság: A TypeScript-típusok megegyeznek a sémadefiníciókkal
- Aszinkron végrehajtás: Minden eszközvégrehajtás aszinkron
- Adatbázis-integráció: Meghívja az importált adatbázisfüggvényeket
- Human-Readable Válaszok: Formázott sztringeket ad vissza, nem nyers adatokat
Eszköztömb exportálása
Az eszközök statikus tömbként vannak exportálva, így könnyen importálhatók és használhatók a kiszolgálón. Minden eszköz egy objektum, amelynek metaadatai és végrehajtási logikája van. Ez a struktúra lehetővé teszi, hogy az MCP-kiszolgáló dinamikusan felderítse és végrehajtsa az eszközöket az ügyfélkérések alapján.
export const TodoTools = [
{ /* addTodo */ },
{ /* listTodos */ },
{ /* completeTodo */ },
{ /* deleteTodo */ },
{ /* updateTodoText */ },
];
Fogalmak:
- Statikus regisztráció: A modul betöltési idején definiált eszközök
- Tömbstruktúra: Az egyszerű tömb megkönnyíti az eszközök iterálását
- Importálás/exportálás: A kiszolgálólogikától való tiszta elkülönítés
Eszközvégrehajtási hibakezelés
Minden eszköz függvénye execute zökkenőmentesen kezeli a hibákat, és a kivételek helyett tiszta üzeneteket ad vissza. Ez a megközelítés biztosítja, hogy az MCP-kiszolgáló zökkenőmentes felhasználói élményt nyújtson.
Az eszközök különböző hibaforgatókönyveket kezelnek:
async execute({ id }: { id: number }) {
const info = await completeTodo(id);
if (info.changes === 0) {
return `TODO with id ${id} not found.`;
}
return `Marked TODO ${id} as completed.`;
}
Fogalmak:
-
Adatbázis-válasz ellenőrzése: Hibák észlelésére használ
info.changes - Kecses romlás: Leíró hibaüzeneteket ad vissza ellentétben a hiba kiváltásával
- User-Friendly hibák: AI-értelmezésre alkalmas üzenetek
Adatréteg: db.ts
A db.ts fájl kezeli az SQLite adatbázis-kapcsolatot, és kezeli a TODO-alkalmazás CRUD-műveleteit. A tárat better-sqlite3 használja a szinkron adatbázis-hozzáféréshez.
Adatbázis inicializálása
Az adatbázis inicializálásához az SQLite-hez csatlakozik, és létrehoz táblákat, ha azok nem léteznek. Az alábbi kódrészlet az inicializálási folyamatot mutatja be:
const db = new Database(":memory:", {
verbose: log.info,
});
try {
db.pragma("journal_mode = WAL");
db.prepare(
`CREATE TABLE IF NOT EXISTS ${DB_NAME} (
id INTEGER PRIMARY KEY AUTOINCREMENT,
text TEXT NOT NULL,
completed INTEGER NOT NULL DEFAULT 0
)`
).run();
log.success(`Database "${DB_NAME}" initialized.`);
} catch (error) {
log.error(`Error initializing database "${DB_NAME}":`, { error });
}
Fogalmak:
-
In-Memory Adatbázis:
:memory:az újraindításkor elveszett adatokat jelenti (csak bemutató/tesztelés) - WAL mód: Write-Ahead naplózás a teljesítmény javítása érdekében
- Schema Definition: Egyszerű TODO-tábla autoinkrementáló azonosítóval
- Hibakezelés: Az inicializálási hibák türelmes kezelése
- Naplózási integráció: Az adatbázisműveleteket hibakeresés céljából naplózza a rendszer
CRUD műveleti minták
A db.ts fájl négy fő CRUD-műveletet biztosít a TODO-elemek kezeléséhez:
Létrehozási művelet:
export async function addTodo(text: string) {
log.info(`Adding TODO: ${text}`);
const stmt = db.prepare(`INSERT INTO todos (text, completed) VALUES (?, 0)`);
return stmt.run(text);
}
Olvasási művelet:
export async function listTodos() {
log.info("Listing all TODOs...");
const todos = db.prepare(`SELECT id, text, completed FROM todos`).all() as Array<{
id: number;
text: string;
completed: number;
}>;
return todos.map(todo => ({
...todo,
completed: Boolean(todo.completed),
}));
}
Frissítési művelet:
export async function completeTodo(id: number) {
log.info(`Completing TODO with ID: ${id}`);
const stmt = db.prepare(`UPDATE todos SET completed = 1 WHERE id = ?`);
return stmt.run(id);
}
Törlési művelet:
export async function deleteTodo(id: number) {
log.info(`Deleting TODO with ID: ${id}`);
const row = db.prepare(`SELECT text FROM todos WHERE id = ?`).get(id) as
| { text: string }
| undefined;
if (!row) {
log.error(`TODO with ID ${id} not found`);
return null;
}
db.prepare(`DELETE FROM todos WHERE id = ?`).run(id);
log.success(`TODO with ID ${id} deleted`);
return row;
}
Fogalmak:
- Előkészített utasítások: Védelem az SQL-injektálás ellen
- Típuskiosztás: Explicit TypeScript-típusok lekérdezési eredményekhez
- Adatátalakítás: SQLite-egész számok átalakítása logikai értékekké
- Atomi műveletek: Minden függvény egyetlen adatbázis-tranzakció
- Visszaadott értékkonzisztencia: Függvények visszaadják a művelet metaadatait
- Védekező programozás: Törlés előtti ellenőrzés minta
Sématervezés
Az adatbázisséma egy egyszerű SQL-utasítással van definiálva a db.ts fájlban. A todos tábla három mezőből áll:
CREATE TABLE todos (
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Unique identifier
text TEXT NOT NULL, -- TODO description
completed INTEGER NOT NULL DEFAULT 0 -- Boolean as integer
);
Segédeszközök: helpers/ könyvtár
A helpers/ könyvtár segédprogramfüggvényeket és osztályokat biztosít a kiszolgáló számára.
Strukturált naplózás hibakereséshez és monitorozáshoz: helpers/logs.ts
A helpers/logs.ts fájl egy strukturált naplózási segédprogramot biztosít az MCP-kiszolgálóhoz. A kódtárat a debug naplózáshoz és chalk a konzol színkódolt kimenetéhez használja.
export const logger = (namespace: string) => {
const dbg = debug('mcp:' + namespace);
const log = (colorize: ChalkInstance, ...args: any[]) => {
const timestamp = new Date().toISOString();
const formattedArgs = [timestamp, ...args].map((arg) => {
if (typeof arg === 'object') {
return JSON.stringify(arg, null, 2);
}
return arg;
});
dbg(colorize(formattedArgs.join(' ')));
};
return {
info(...args: any[]) { log(chalk.cyan, ...args); },
success(...args: any[]) { log(chalk.green, ...args); },
warn(...args: any[]) { log(chalk.yellow, ...args); },
error(...args: any[]) { log(chalk.red, ...args); },
};
};
Munkamenetkezelés SSE-átvitelekhez: helpers/cache.ts
A helpers/cache.ts fájl az Map SSE-átvitelek munkamenet-azonosító szerinti tárolására szolgál. Ezzel a módszerrel a kiszolgáló gyorsan megtalálhatja és kezelheti az aktív kapcsolatokat.
import type { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse";
export const TransportsCache = new Map<string, SSEServerTransport>();
Megjegyzés:
Ez TransportsCache egy egyszerű memóriabeli gyorsítótár. Éles környezetben fontolja meg egy robusztusabb megoldás, például a Redis vagy egy adatbázis használatát a munkamenet-kezeléshez.
Végrehajtási folyamat összegzése
Az alábbi ábra az ügyféltől az MCP-kiszolgálóig és vissza irányuló kérések teljes menetét szemlélteti, beleértve az eszközvégrehajtást és az adatbázis-műveleteket:
GitHub-kódterek tisztítása
Távolítsa el a GitHub Codespaces környezetet, hogy maximálisan kihasználhassa az ingyenes órákat magonként.
Fontos
A GitHub-fiók ingyenes tárhelyéről és alapóráiról további információt a GitHub Codespaces havonta tartalmazott tárhelye és alapórái című dokumentumban talál.
Jelentkezzen be a GitHub Codespaces vezérlőpultjára.
Keresse meg a
Azure-Samples//mcp-container-tsGitHub-adattárból létrehozott aktív codespace-eket.Nyissa meg a kódtér helyi menüjét, és válassza a Törléslehetőséget.
Segítség kérése
Naplózza a problémát az adattár Issues részébe.