feat: broadcast system notifications on MCP server register/unregister
Some checks failed
CI / Typecheck (push) Has been cancelled
CI / Broker tests (Postgres) (push) Has been cancelled
CI / Docker build (linux/amd64) (push) Has been cancelled
CI / Lint (push) Has been cancelled

Peers now receive [system] notifications when MCP servers join or
leave the mesh, with tool names and hosting peer info.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Alejandro Gutiérrez
2026-04-08 00:16:58 +01:00
parent 32fc4a0c98
commit e09671cdcb
2 changed files with 43 additions and 0 deletions

View File

@@ -2487,6 +2487,25 @@ function handleConnection(ws: WebSocket): void {
toolCount: mr.tools.length, toolCount: mr.tools.length,
...(_reqId ? { _reqId } : {}), ...(_reqId ? { _reqId } : {}),
}); });
// Broadcast to all peers: new MCP server available
const mcpJoinMsg: WSServerMessage = {
type: "push",
subtype: "system",
event: "mcp_registered",
eventData: { serverName: mr.serverName, description: mr.description, tools: mr.tools.map(t => t.name), hostedBy: conn.displayName },
messageId: crypto.randomUUID(),
meshId: conn.meshId,
senderPubkey: "system",
priority: "low",
nonce: "",
ciphertext: "",
createdAt: new Date().toISOString(),
};
for (const [pid, peer] of connections) {
if (pid === presenceId) continue;
if (peer.meshId !== conn.meshId) continue;
sendToPeer(pid, mcpJoinMsg);
}
log.info("ws mcp_register", { log.info("ws mcp_register", {
presence_id: presenceId, presence_id: presenceId,
server: mr.serverName, server: mr.serverName,
@@ -2500,6 +2519,25 @@ function handleConnection(ws: WebSocket): void {
const entry = mcpRegistry.get(unregKey); const entry = mcpRegistry.get(unregKey);
if (entry && entry.presenceId === presenceId) { if (entry && entry.presenceId === presenceId) {
mcpRegistry.delete(unregKey); mcpRegistry.delete(unregKey);
// Broadcast: MCP server removed
const mcpLeaveMsg: WSServerMessage = {
type: "push",
subtype: "system",
event: "mcp_unregistered",
eventData: { serverName: mu.serverName, hostedBy: conn.displayName },
messageId: crypto.randomUUID(),
meshId: conn.meshId,
senderPubkey: "system",
priority: "low",
nonce: "",
ciphertext: "",
createdAt: new Date().toISOString(),
};
for (const [pid, peer] of connections) {
if (pid === presenceId) continue;
if (peer.meshId !== conn.meshId) continue;
sendToPeer(pid, mcpLeaveMsg);
}
} }
log.info("ws mcp_unregister", { log.info("ws mcp_unregister", {
presence_id: presenceId, presence_id: presenceId,

View File

@@ -1354,6 +1354,11 @@ Your message mode is "${messageMode}".
content = `[system] Peer "${data.name ?? "unknown"}" joined the mesh`; content = `[system] Peer "${data.name ?? "unknown"}" joined the mesh`;
} else if (eventName === "peer_left") { } else if (eventName === "peer_left") {
content = `[system] Peer "${data.name ?? "unknown"}" left the mesh`; content = `[system] Peer "${data.name ?? "unknown"}" left the mesh`;
} else if (eventName === "mcp_registered") {
const tools = Array.isArray(data.tools) ? (data.tools as string[]).join(", ") : "";
content = `[system] New MCP server available: "${data.serverName}" (hosted by ${data.hostedBy}). Tools: ${tools}. Use mesh_tool_call to invoke.`;
} else if (eventName === "mcp_unregistered") {
content = `[system] MCP server "${data.serverName}" removed (was hosted by ${data.hostedBy})`;
} else { } else {
content = `[system] ${eventName}: ${JSON.stringify(data)}`; content = `[system] ${eventName}: ${JSON.stringify(data)}`;
} }