diff --git a/jsr.json b/jsr.json index 83e70f33..994c7805 100644 --- a/jsr.json +++ b/jsr.json @@ -1,6 +1,6 @@ { "name": "@hyperpolymath/boj-server", - "version": "0.4.1", + "version": "0.4.2", "description": "Bundle of Joy — cartridge-based MCP server with 100 domain cartridges, formally verified (Idris2) coord core", "license": "MPL-2.0", "exports": "./mcp-bridge/main.js", diff --git a/mcp-bridge/lib/logger.js b/mcp-bridge/lib/logger.js index 314f3b55..2122a18b 100644 --- a/mcp-bridge/lib/logger.js +++ b/mcp-bridge/lib/logger.js @@ -7,7 +7,22 @@ // MCP JSON-RPC messages). Log level controlled via BOJ_LOG_LEVEL env. const LOG_LEVELS = { debug: 0, info: 1, warn: 2, error: 3, silent: 4 }; -const currentLevel = LOG_LEVELS[process.env.BOJ_LOG_LEVEL || "info"] ?? LOG_LEVELS.info; +let currentLevel = LOG_LEVELS[process.env.BOJ_LOG_LEVEL || "info"] ?? LOG_LEVELS.info; + +/** + * Update the minimum log level at runtime. Used by the MCP + * `logging/setLevel` handler to honour client-requested verbosity. + * Unknown levels are ignored (no-op). + * @param {"debug"|"info"|"warn"|"error"|"silent"} level + * @returns {boolean} true if the level was recognised and applied + */ +function setLevel(level) { + if (level in LOG_LEVELS) { + currentLevel = LOG_LEVELS[level]; + return true; + } + return false; +} /** * Emit a structured log entry to stderr. @@ -38,4 +53,4 @@ function warn(msg, fields) { log("warn", msg, fields); } /** @param {string} msg @param {Record} [fields] */ function error(msg, fields) { log("error", msg, fields); } -export { debug, error, info, log, warn }; +export { debug, error, info, log, setLevel, warn }; diff --git a/mcp-bridge/lib/version.js b/mcp-bridge/lib/version.js index 089db0d4..704696c6 100644 --- a/mcp-bridge/lib/version.js +++ b/mcp-bridge/lib/version.js @@ -4,4 +4,4 @@ // Single source of truth for server version and name. export const SERVER_NAME = "boj-server"; -export const SERVER_VERSION = "0.4.0"; +export const SERVER_VERSION = "0.4.2"; diff --git a/mcp-bridge/main.js b/mcp-bridge/main.js index 40b65d3c..00aaaa27 100755 --- a/mcp-bridge/main.js +++ b/mcp-bridge/main.js @@ -35,7 +35,7 @@ import { tryParseEnvelope, validateEnvelope, } from "./lib/nickel-validator.js"; -import { info, warn, error as logError } from "./lib/logger.js"; +import { info, warn, error as logError, setLevel as setLogLevel } from "./lib/logger.js"; const BOJ_BASE = process.env.BOJ_URL || "http://localhost:7700"; const SERVER_NAME = "boj-server"; @@ -338,7 +338,10 @@ async function handleMessage(line) { info("MCP initialize", { client: params?.clientInfo?.name }); sendResult(id, { protocolVersion: "2024-11-05", - capabilities: { tools: { listChanged: false } }, + capabilities: { + tools: { listChanged: false }, + logging: {}, + }, serverInfo: { name: SERVER_NAME, version: SERVER_VERSION }, }); break; @@ -347,6 +350,18 @@ async function handleMessage(line) { case "notifications/initialized": break; + case "logging/setLevel": { + const level = params?.level; + const applied = setLogLevel(level); + if (!applied) { + sendError(id, -32602, `Unknown log level: ${level}. Expected debug|info|warn|error|silent.`); + } else { + info("MCP logging/setLevel", { level }); + sendResult(id, {}); + } + break; + } + case "tools/list": { const tools = buildToolList(); sendResult(id, { tools }); diff --git a/mcp-bridge/package.json b/mcp-bridge/package.json index 5abce67d..8dad7a4c 100644 --- a/mcp-bridge/package.json +++ b/mcp-bridge/package.json @@ -1,6 +1,6 @@ { "name": "@hyperpolymath/boj-server", - "version": "0.4.1", + "version": "0.4.2", "description": "Bundle of Joy (BoJ) MCP Server — cartridge-based DevOps + multi-agent coordination toolkit with 100 domain cartridges (database, container, git, k8s, observability, secrets, IaC, multi-instance AI coord, and more). Formally verified (Idris2) core; MPL-2.0.", "license": "MPL-2.0", "author": "Jonathan D.A. Jewell ", diff --git a/package.json b/package.json index 4a3ee68d..f339e7cb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hyperpolymath/boj-server", - "version": "0.4.1", + "version": "0.4.2", "description": "Bundle of Joy (BoJ) MCP Server — cartridge-based DevOps + multi-agent coordination toolkit with 100 domain cartridges (database, container, git, k8s, observability, secrets, IaC, multi-instance AI coord, and more). Formally verified (Idris2) core; MPL-2.0.", "license": "MPL-2.0", "author": "Jonathan D.A. Jewell ",