Support NDJSON input and stub MCP resource lists
This commit is contained in:
parent
5112693089
commit
2c59e576f3
1 changed files with 50 additions and 1 deletions
|
|
@ -68,9 +68,12 @@ const tools = [
|
||||||
];
|
];
|
||||||
|
|
||||||
let input = Buffer.alloc(0);
|
let input = Buffer.alloc(0);
|
||||||
|
let responseMode = "lsp";
|
||||||
|
|
||||||
process.stdin.on("data", (chunk) => {
|
process.stdin.on("data", (chunk) => {
|
||||||
log(`stdin bytes=${chunk.length}`);
|
log(`stdin bytes=${chunk.length}`);
|
||||||
|
log(`stdin utf8=${JSON.stringify(chunk.toString("utf8"))}`);
|
||||||
|
log(`stdin hex=${chunk.toString("hex")}`);
|
||||||
input = Buffer.concat([input, chunk]);
|
input = Buffer.concat([input, chunk]);
|
||||||
readMessages();
|
readMessages();
|
||||||
});
|
});
|
||||||
|
|
@ -80,6 +83,33 @@ process.on("uncaughtException", (error) => log(`uncaught ${error.stack || error.
|
||||||
|
|
||||||
function readMessages() {
|
function readMessages() {
|
||||||
while (true) {
|
while (true) {
|
||||||
|
let firstNonWhitespace = 0;
|
||||||
|
while (
|
||||||
|
firstNonWhitespace < input.length &&
|
||||||
|
[9, 10, 13, 32].includes(input[firstNonWhitespace])
|
||||||
|
) {
|
||||||
|
firstNonWhitespace += 1;
|
||||||
|
}
|
||||||
|
if (firstNonWhitespace > 0) input = input.slice(firstNonWhitespace);
|
||||||
|
if (input.length === 0) return;
|
||||||
|
|
||||||
|
if (input[0] === 123) {
|
||||||
|
responseMode = "ndjson";
|
||||||
|
const lineEnd = input.indexOf("\n");
|
||||||
|
if (lineEnd < 0) return;
|
||||||
|
const body = input.slice(0, lineEnd).toString("utf8").trim();
|
||||||
|
input = input.slice(lineEnd + 1);
|
||||||
|
if (!body) continue;
|
||||||
|
log(`message ${body}`);
|
||||||
|
handle(JSON.parse(body)).catch((error) => {
|
||||||
|
respond(JSON.parse(body).id, null, {
|
||||||
|
code: -32603,
|
||||||
|
message: error && error.message ? error.message : String(error),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
let headerEnd = input.indexOf("\r\n\r\n");
|
let headerEnd = input.indexOf("\r\n\r\n");
|
||||||
let separatorLength = 4;
|
let separatorLength = 4;
|
||||||
if (headerEnd < 0) {
|
if (headerEnd < 0) {
|
||||||
|
|
@ -131,6 +161,21 @@ async function handle(message) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (message.method === "resources/list") {
|
||||||
|
respond(message.id, { resources: [] });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (message.method === "resources/templates/list") {
|
||||||
|
respond(message.id, { resourceTemplates: [] });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (message.method === "prompts/list") {
|
||||||
|
respond(message.id, { prompts: [] });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (message.method === "tools/call") {
|
if (message.method === "tools/call") {
|
||||||
const name = message.params?.name;
|
const name = message.params?.name;
|
||||||
const args = message.params?.arguments || {};
|
const args = message.params?.arguments || {};
|
||||||
|
|
@ -210,5 +255,9 @@ function respond(id, result, error) {
|
||||||
: { jsonrpc: "2.0", id, result };
|
: { jsonrpc: "2.0", id, result };
|
||||||
const body = JSON.stringify(payload);
|
const body = JSON.stringify(payload);
|
||||||
log(`respond id=${id} bytes=${Buffer.byteLength(body, "utf8")} error=${Boolean(error)}`);
|
log(`respond id=${id} bytes=${Buffer.byteLength(body, "utf8")} error=${Boolean(error)}`);
|
||||||
process.stdout.write(`Content-Length: ${Buffer.byteLength(body, "utf8")}\r\n\r\n${body}`);
|
if (responseMode === "ndjson") {
|
||||||
|
process.stdout.write(`${body}\n`);
|
||||||
|
} else {
|
||||||
|
process.stdout.write(`Content-Length: ${Buffer.byteLength(body, "utf8")}\r\n\r\n${body}`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue