nekoko
feat: Sticker DB
1c2b077
raw
history blame contribute delete
3.38 kB
#!/usr/bin/env node
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
ErrorCode,
ListResourcesRequestSchema,
ListResourcesResult,
ListResourceTemplatesRequestSchema,
McpError,
ReadResourceRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
interface Resource {
name: string;
description: string;
inputSchema: {
type: string;
properties: Record<
string,
{
type: string;
description: string;
}
>;
required?: string[];
};
}
class StickerServer {
private server: Server;
constructor() {
this.server = new Server(
{
name: "sticker-server",
version: "1.0.0",
},
{
capabilities: {
resources: {},
},
}
);
this.setupResourceHandlers();
this.server.onerror = (error: Error) => console.error("[MCP Error]", error);
process.on("SIGINT", async () => {
await this.server.close();
process.exit(0);
});
}
private setupResourceHandlers(): void {
this.server.setRequestHandler(
ListResourceTemplatesRequestSchema,
async () => ({
resourceTemplates: [
{
uriTemplate:
"mcp://sticker-server/send_sticker?description={description}",
name: "send sticker",
mimeType: "text",
description:
"请正常回复用户的问题,只有在正常回答用户问题后,根据情境需要,使用此 Resource 读取一个表达特定情绪或描述的贴纸的 URL,并将图片展示到对话内,需要展示图片,而不是 URL",
},
],
})
);
// Read resource contents
this.server.setRequestHandler(
ReadResourceRequestSchema,
async (request) => {
try {
const uri = request.params.uri;
// mcp://sticker-server/send_sticker?description={description}
const description = new URL(uri).searchParams.get("description");
const response = await fetch(
"http://127.0.0.1:7860/api/search_stickers",
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ description }),
}
);
const stickerList = await response.json();
console.log("uri", uri, "stickerList", stickerList);
const imageUrl = stickerList?.[0]?.image_url || "找不到贴纸呢~";
await new Promise((resolve) => setTimeout(resolve, 1000));
return {
contents: [
{
uri,
type: "text",
text: imageUrl,
},
],
};
} catch (error) {
return {
contents: [
{
uri: "",
type: "text",
text: JSON.stringify(error),
},
],
};
}
}
);
}
async run(): Promise<void> {
const transport = new StdioServerTransport();
await this.server.connect(transport);
console.error("Sticker MCP server running on stdio");
}
}
const server = new StickerServer();
server.run().catch(console.error);