diff --git a/app.js b/app.js index 104d33b..c0b96aa 100644 --- a/app.js +++ b/app.js @@ -48,6 +48,10 @@ var console = { if (this._muted) return; if (typeof WScript !== "undefined") { + if (this._muted) { + WScript.StdErr.WriteLine("[*] " + params.message); + return; + } WScript.StdOut.WriteLine("[*] " + params.message); } }, diff --git a/lib/jsonrpc2.js b/lib/jsonrpc2.js index 6186e3e..d1d2f8e 100644 --- a/lib/jsonrpc2.js +++ b/lib/jsonrpc2.js @@ -39,52 +39,52 @@ function JsonRpc2(url) { } function extract(message, callback) { - var data; - - if (typeof callback !== "function") { - throw new Error("Invalid callback"); - } - - try { - data = JSON.parse(message); - } catch (e) { - throw new Error("Invalid JSON: " + e.message); - } - - if (!data || typeof data !== "object") { - throw new Error("Invalid request object"); - } - - if (data.jsonrpc !== "2.0") { - throw new Error("Invalid JSON-RPC version"); - } - - if (!data.method || typeof data.method !== "string") { - throw new Error("Missing or invalid method"); - } - - var params = data.params !== undefined ? data.params : null; - var id = data.id !== undefined ? data.id : null; - - try { - var result = callback(data.method, params, id); - - return { - jsonrpc: "2.0", - result: result === undefined ? null : result, - id: id - }; - - } catch (e) { - return { - jsonrpc: "2.0", - error: { - code: -32603, - message: e && e.message ? e.message : "Internal error" - }, - id: id - }; - } + var data; + + if (typeof callback !== "function") { + throw new Error("Invalid callback"); + } + + try { + data = JSON.parse(message); + } catch (e) { + throw new Error("Invalid JSON: " + e.message); + } + + if (!data || typeof data !== "object") { + throw new Error("Invalid request object"); + } + + if (data.jsonrpc !== "2.0") { + throw new Error("Invalid JSON-RPC version"); + } + + if (!data.method || typeof data.method !== "string") { + throw new Error("Missing or invalid method"); + } + + var params = data.params !== undefined ? data.params : null; + var id = data.id !== undefined ? data.id : null; + + try { + var result = callback(data.method, params, id); + + return { + jsonrpc: "2.0", + result: result === undefined ? null : result, + id: id + }; + + } catch (e) { + return { + jsonrpc: "2.0", + error: { + code: -32603, + message: e && e.message ? e.message : "Internal error" + }, + id: id + }; + } } function wrap(method, params, id) { @@ -108,7 +108,7 @@ exports.create = create; exports.DEFAULT_JSONRPC2_URL = DEFAULT_JSONRPC2_URL; -exports.VERSIONINFO = "JSON-RPC 2.0 wrapper (jsonrpc2.js) version 0.1.6"; +exports.VERSIONINFO = "JSON-RPC 2.0 wrapper (jsonrpc2.js) version 0.1.7"; exports.AUTHOR = "gnh1201@catswords.re.kr"; exports.global = global; exports.require = global.require; diff --git a/lib/stdio-server.js b/lib/stdio-server.js index 54faf96..2f05d90 100644 --- a/lib/stdio-server.js +++ b/lib/stdio-server.js @@ -16,6 +16,13 @@ function StdioServer() { }; this.send = function (message) { + if (typeof message === "object") { + try { + var _serialized = JSON.stringify(message); + message = _serialized; + } catch (e) { /* ignore */ }; + } + WScript.StdOut.WriteLine(message); }; diff --git a/mcploader.js b/mcploader.js index 05b37d8..13e5055 100644 --- a/mcploader.js +++ b/mcploader.js @@ -7,24 +7,78 @@ var StdioServer = require("lib/stdio-server"); var JsonRpc2 = require("lib/jsonrpc2"); function main(args) { - var server = StdioServer.create(); + var server = StdioServer.create(); - server.addEventListener("message", function(e) { - var message = e.target.receive(); - - try { - JsonRpc2.extract(message, function(method, params, id) { - console.log("Received method: " + method); - }); - } catch (e) { - console.log("Ignored"); - } - - // send message - e.target.send("Hello world"); - }); + server.addEventListener("message", function(e) { + var message = e.target.receive(); - server.listen(); + e.target.send( + JsonRpc2.extract(message, function (method, params, id) { + if (method == "initialize") { + return { + "protocolVersion": "2025-11-25", + "capabilities": { + "extensions": { + "io.modelcontextprotocol/ui": { + "mimeTypes": ["text/html;profile=mcp-app"] + } + } + }, + "serverInfo": { + "name": "WelsonJS MCP", + "version": "1.0.0" + } + }; + } + + if (method == "tools/list") { + return { + "tools": [ + { + "name": "add_both_numbers", + "title": "add both_numbers (add A and B)", + "description": "add two numbers (add A and B)", + "inputSchema": { + "type": "object", + "properties": { + "a": { + "type": "number" + }, + "b": { + "type": "number" + } + }, + "required": ["a", "b"] + } + } + ] + }; + } + + if (method == "tools/call") { + var function_calling_name = params.name; + + if (function_calling_name == "add_both_numbers") { + return { + "content": [ + { + "type": "text", + "text": "Result is " + (parseFloat(params.arguments.a) + parseFloat(params.arguments.b)) + } + ], + "isError": false + }; + } + } + + return { + "isError": true + }; + }) + ); + }); + + server.listen(); } exports.main = main;