/
gkat
/
gitverse-codex-plugin
Обзор
Документация
Войти
/
gkat
/
gitverse-codex-plugin
Код
Запросы
0
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/gitverse-mcp.mjs
74 строки
2 KB
gkat
Register repository listing as standalone MCP server
29 июл 2026, 15:31
29 июл 2026, 15:31
8aee95b
Код
Авторство
О чём код?
#!/usr/bin/env node import readline from "node:readline"; import { resolveToken } from "./auth.mjs"; const endpoint = "https://mcp.gitverse.ru"; const { token } = resolveToken(); let sessionId; function emit(message) { process.stdout.write(`${JSON.stringify(message)}\n`); } function parseSse(body) { return body .split(/\r?\n\r?\n/) .flatMap((event) => event.split(/\r?\n/)) .filter((line) => line.startsWith("data:")) .map((line) => line.slice(5).trim()) .filter((data) => data && data !== "[DONE]") .map((data) => JSON.parse(data)); } async function forward(message) { const response = await fetch(endpoint, { method: "POST", headers: { Authorization: `Bearer ${token}`, Accept: "application/json, text/event-stream", "Content-Type": "application/json", ...(sessionId ? { "Mcp-Session-Id": sessionId } : {}), }, body: JSON.stringify(message), }); sessionId = response.headers.get("mcp-session-id") || sessionId; const body = await response.text(); if (!response.ok) { throw new Error(`GitVerse MCP returned HTTP ${response.status}`); } if (!body.trim()) return; const contentType = response.headers.get("content-type") || ""; const replies = contentType.includes("text/event-stream") ? parseSse(body) : [JSON.parse(body)]; for (const reply of replies) emit(reply); } const input = readline.createInterface({ input: process.stdin }); let chain = Promise.resolve(); input.on("line", (line) => { if (!line.trim()) return; chain = chain.then(async () => { let message; try { message = JSON.parse(line); await forward(message); } catch (error) { if (message?.id !== undefined) { emit({ jsonrpc: "2.0", id: message.id, error: { code: -32000, message: error.message }, }); } else { process.stderr.write(`GitVerse MCP bridge: ${error.message}\n`); } } }); });