Skip to main content
Glama

@brooswit/thatch

Un servidor MCP central HTTP, implementado como un plugin de Elysia(https://elysiajs.com). Muchas sesiones de Claude Code se conectan a un único servidor por URL; el servidor se dirige a ellas por nombre y puede enviar mensajes dentro de una sesión activa.

import { Elysia } from "elysia";
import { thatch, z } from "@brooswit/thatch";

const { plugin, mcp } = thatch({
  identify: (req) => req.headers.get("x-connection-name"),   // names the connection; null rejects it
  tools: {
    status: { description: "Fleet status", input: {}, handler: (_a, c) => `hello ${c.name}` },
  },
});

const app = new Elysia().use(plugin).listen(3000);

// push a message into a named session — from anywhere
const d = await mcp.send("epic-kan-39", { content: "PR #296 approved", meta: { key: "KAN-39" } });
//  d: { claim: "C2" }  — a connected session's stream took it
//     { claim: "refused", reason: "not-connected" | "no-channel-stream" | "bad-meta" | "closed-mid-send" }

Claude Code se conecta con:

claude mcp add --transport http fleet http://localhost:3000/mcp --header "x-connection-name: epic-kan-39"

Por qué el tipo de entrega no es void

Enviar a una sesión puede fallar de maneras que el SDK de MCP oculta: una conexión puede estar registrada sin que su flujo de notificaciones esté conectado, en cuyo caso el SDK descarta la trama en silencio. thatch lo rechaza en voz alta ("no-channel-stream") y solo afma C2 cuando esté de verda un flujo que puedqa transportar la trama. C3 (entró en la transcripción) y C4 (el model lo leyó) no son obsrvables, así que no hay API aquí que prétenda alcanzarlos.

Related MCP server: agent-network

API

  • thatch(options) → { plugin, mcp } — plugin monta el endpoint (por defecto /mcp); mcp es el controlador.

  • options: identify, onDuplicate ("replace" por defecto | "reject"), history (por defecto 50), tools, path, serverInfo.

  • mcp.connections: list(), get(name), has(name), count(), waitFor(name, { timeoutMs }).

  • mcp.send(name, frame), mcp.sendMany(names, frame), mcp.sendAll(frame, { where? }).

  • mcp.on("connect" | "disconnect" | "send", handler)`.

  • Una Connection contiere name, connectedAt, lastSeenAt, meta, channelReady, y history.

  • A and import { FakeConnection } from "@broker wit/atch/testing" para probas.

Layers

protocol (trama, entrega, método — puro) · registry (con exiones con nombra + historial) · channel (en viío, afirmaciones honestas) · plugin (el montaje de Elysia, un servidor MCP por conexión) · testing.

Scripts

bun run check        # generate load tests + typecheck + unit + load + coverage ≥90%
bun test test/unit
MCP_LIVE=1 bun test test/live   # against a real Claude Code session (opt-in)

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers