import {
McpServer,
ResourceTemplate,
} from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
import { generateImage } from "./api.js";
/**
* Creates and configures a JiMeng MCP server
* with one resource, one prompt, and one tool
*/
export function createServer() {
// Create an MCP server
const server = new McpServer({
name: "jimeng",
version: "1.0.0",
// Debug handler for incoming method calls
debug: true,
});
server.tool(
"generateImage",
"调用即梦AI生成图像",
{
prompt: z.string().describe("生成图像的文本描述"),
req_key: z.string().default("jimeng_high_aes_general_v21_L").describe("取固定值: jimeng_high_aes_general_v21_L"),
width: z.number().optional().default(512).describe("图像宽度,默认值:512"),
height: z.number().optional().default(512).describe("图像高度,默认值:512"),
seed: z.number().optional().default(-1).describe("随机种子,默认值:-1"),
use_sr: z.boolean().optional().default(true).describe("文生图+AIGC超分"),
use_pre_llm: z.boolean().optional().default(true).describe("开启文本扩写,针对输入prompt进行扩写优化,如果输入prompt较短建议开启,如果输入prompt较长建议关闭"),
return_url: z.boolean().optional().default(true).describe("输出是否返回图片链接(链接有效期为24小时)"),
logo_info: z.object({
add_logo: z.boolean().optional().describe("是否添加水印,默认不添加"),
position: z.number().optional().describe("水印位置:0-右下角 1-左下角 2-左上角 3-右上角"),
language: z.number().optional().describe("水印语言:0-中文(AI生成) 1-英文(Generated by AI)"),
opacity: z.number().optional().describe("水印透明度:0-1,默认0.3"),
logo_text_content: z.string().optional().describe("水印文字内容")
}).optional().describe("水印信息")
},
async (params) => {
try {
const imageUrls = await generateImage(params);
// 如果没有返回URL数组,返回错误信息
if (!imageUrls || (Array.isArray(imageUrls) && imageUrls.length === 0)) {
return {
content: [{ type: "text", text: "图像生成失败:未能获取图像URL" }],
isError: true
};
}
// 定义正确的类型
type ContentItem = { type: "resource"; resource: { uri: string; blob: string; mimeType: string } }
// 将返回的图像URL转换为MCP响应格式
const responseContent: ContentItem[] = []
if (typeof imageUrls === 'string') {
// 单个URL的情况
responseContent.push({
type: "resource",
resource: {
uri: imageUrls,
blob: '',
mimeType: ''
}
});
} else if (Array.isArray(imageUrls)) {
// URL数组的情况
for (const url of imageUrls) {
responseContent.push({
type: "resource",
resource: {
uri: url,
mimeType: '',
blob: ''
}
});
}
}
return {
content: responseContent
};
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
return {
content: [{ type: "text", text: `图像生成失败: ${errorMessage}` }],
isError: true
};
}
}
);
return server;
}