Files
tinyusdz/web/demo/mcp-client.js
2025-07-25 12:03:48 +09:00

72 lines
1.7 KiB
JavaScript

import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
import { createCanvas } from "canvas";
//await Bun.write("bun.png", canvas.toBuffer());
const url = "http://localhost:8085/mcp"
function genImage() {
const canvas = createCanvas(50, 50);
const ctx = canvas.getContext('2d');
ctx.fillStyle = "black";
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = "white";
ctx.fillText("bora", 0, 30);
const dataurl = canvas.toDataURL('image/jpeg', /* quality */0.8 );
// strip mime prefix
return dataurl.replace(/^.*,/, '');
}
console.log(genImage());
async function sendScreenshot(client) {
const dataURI = genImage();
await client.callTool({
name: "save_screenshot",
arguments: {
"uri" : dataURI
}
});
}
let client = null;
const baseUrl = new URL(url);
try {
client = new Client({
name: 'streamable-http-client',
version: '1.0.0'
});
const transport = new StreamableHTTPClientTransport(
new URL(baseUrl)
);
await client.connect(transport);
console.log("Connected using Streamable HTTP transport");
} catch (error) {
// If that fails with a 4xx error, try the older SSE transport
console.log("Streamable HTTP connection failed, falling back to SSE transport");
client = new Client({
name: 'sse-client',
version: '1.0.0'
});
const sseTransport = new SSEClientTransport(baseUrl);
await client.connect(sseTransport);
console.log("Connected using SSE transport");
}
const tools = await client.listTools();
console.log(tools);
//sendScreenshot(client)