UNPKG

mcp-server-tempmail

Version:

MCP server for temporary email management using ChatTempMail API

401 lines 16.7 kB
#!/usr/bin/env node "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js"); const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js"); const types_js_1 = require("@modelcontextprotocol/sdk/types.js"); const axios_1 = __importDefault(require("axios")); const SERVER_NAME = "mcp-server-tempmail"; const SERVER_VERSION = "1.0.0"; const DEFAULT_BASE_URL = "https://chat-tempmail.com"; class TempMailMCPServer { constructor() { this.apiKey = process.env.TEMPMAIL_API_KEY || ''; if (!this.apiKey) { throw new Error('TEMPMAIL_API_KEY环境变量未设置'); } this.baseUrl = process.env.TEMPMAIL_BASE_URL || DEFAULT_BASE_URL; console.error(`[DEBUG] API Key loaded: ${this.apiKey.substring(0, 8)}...`); console.error(`[DEBUG] Base URL: ${this.baseUrl}`); this.server = new index_js_1.Server({ name: SERVER_NAME, version: SERVER_VERSION, }, { capabilities: { tools: {}, }, }); this.setupToolHandlers(); this.setupErrorHandling(); } setupErrorHandling() { this.server.onerror = (error) => console.error('[MCP Error]', error); process.on('SIGINT', async () => { await this.server.close(); process.exit(0); }); } setupToolHandlers() { this.server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => { return { tools: [ // 邮箱管理工具 { name: "get_email_domains", description: "获取系统中所有可用的邮箱域名", inputSchema: { type: "object", properties: {}, required: [] } }, { name: "create_email", description: "创建新的临时邮箱地址", inputSchema: { type: "object", properties: { name: { type: "string", description: "邮箱前缀名称" }, domain: { type: "string", description: "邮箱域名" }, expiryTime: { type: "number", description: "过期时间(毫秒)。可选值:3600000(1小时),86400000(1天),259200000(3天),0(永久)", enum: [3600000, 86400000, 259200000, 0] } }, required: ["name", "domain", "expiryTime"] } }, { name: "list_emails", description: "获取账户下的所有邮箱地址", inputSchema: { type: "object", properties: { cursor: { type: "string", description: "分页游标,可选" } }, required: [] } }, { name: "delete_email", description: "删除指定的邮箱地址", inputSchema: { type: "object", properties: { emailId: { type: "string", description: "邮箱ID" } }, required: ["emailId"] } }, // 消息管理工具 { name: "get_messages", description: "获取指定邮箱中的所有消息", inputSchema: { type: "object", properties: { emailId: { type: "string", description: "邮箱ID" }, cursor: { type: "string", description: "分页游标,可选" } }, required: ["emailId"] } }, { name: "get_message_detail", description: "获取指定消息的详细内容", inputSchema: { type: "object", properties: { emailId: { type: "string", description: "邮箱ID" }, messageId: { type: "string", description: "消息ID" } }, required: ["emailId", "messageId"] } }, { name: "delete_message", description: "删除指定的消息", inputSchema: { type: "object", properties: { emailId: { type: "string", description: "邮箱ID" }, messageId: { type: "string", description: "消息ID" } }, required: ["emailId", "messageId"] } }, // Webhook配置工具 { name: "get_webhook_config", description: "获取当前的webhook配置信息", inputSchema: { type: "object", properties: {}, required: [] } }, { name: "set_webhook_config", description: "设置或更新webhook配置", inputSchema: { type: "object", properties: { url: { type: "string", description: "Webhook URL地址(必须是有效的HTTP/HTTPS URL)" }, enabled: { type: "boolean", description: "是否启用webhook" } }, required: ["url", "enabled"] } } ] }; }); this.server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; try { if (!args) { throw new Error('缺少必需的参数'); } const typedArgs = args; switch (name) { case "get_email_domains": return await this.getEmailDomains(); case "create_email": return await this.createEmail(typedArgs.name, typedArgs.domain, typedArgs.expiryTime); case "list_emails": return await this.listEmails(typedArgs.cursor); case "delete_email": return await this.deleteEmail(typedArgs.emailId); case "get_messages": return await this.getMessages(typedArgs.emailId, typedArgs.cursor); case "get_message_detail": return await this.getMessageDetail(typedArgs.emailId, typedArgs.messageId); case "delete_message": return await this.deleteMessage(typedArgs.emailId, typedArgs.messageId); case "get_webhook_config": return await this.getWebhookConfig(); case "set_webhook_config": return await this.setWebhookConfig(typedArgs.url, typedArgs.enabled); default: throw new Error(`未知的工具: ${name}`); } } catch (error) { return { content: [ { type: "text", text: `错误: ${error instanceof Error ? error.message : String(error)}` } ], isError: true }; } }); } getAuthHeaders() { return { 'X-API-Key': this.apiKey, 'Content-Type': 'application/json' }; } async makeRequest(method, endpoint, data) { try { const url = `${this.baseUrl}${endpoint}`; const headers = this.getAuthHeaders(); console.error(`[DEBUG] Making request to: ${url}`); console.error(`[DEBUG] Headers:`, headers); const response = await (0, axios_1.default)({ method, url, headers, data }); return response.data; } catch (error) { if (axios_1.default.isAxiosError(error)) { console.error(`[DEBUG] Error response:`, error.response?.data); throw new Error(`API请求失败: ${error.response?.status} ${error.response?.statusText} - ${JSON.stringify(error.response?.data)}`); } throw error; } } // 邮箱管理方法 async getEmailDomains() { const response = await this.makeRequest('GET', '/api/email/domains'); return { content: [ { type: "text", text: `可用域名:\n${response.domains.map(domain => `- ${domain}`).join('\n')}` } ] }; } async createEmail(name, domain, expiryTime) { const response = await this.makeRequest('POST', '/api/emails/generate', { name, domain, expiryTime }); const expiryText = expiryTime === 0 ? '永久' : expiryTime === 3600000 ? '1小时' : expiryTime === 86400000 ? '1天' : expiryTime === 259200000 ? '3天' : `${expiryTime}毫秒`; return { content: [ { type: "text", text: `成功创建临时邮箱:\n邮箱地址: ${response.email}\n邮箱ID: ${response.id}\n有效期: ${expiryText}` } ] }; } async listEmails(cursor) { const endpoint = cursor ? `/api/emails?cursor=${cursor}` : '/api/emails'; const response = await this.makeRequest('GET', endpoint); const emailList = response.emails.map(email => `- ${email.address} (ID: ${email.id})\n 创建时间: ${new Date(email.createdAt).toLocaleString('zh-CN')}\n 过期时间: ${new Date(email.expiresAt).toLocaleString('zh-CN')}`).join('\n\n'); return { content: [ { type: "text", text: `邮箱列表 (共 ${response.total} 个):\n\n${emailList}${response.nextCursor ? `\n\n下页游标: ${response.nextCursor}` : ''}` } ] }; } async deleteEmail(emailId) { const response = await this.makeRequest('DELETE', `/api/emails/${emailId}`); return { content: [ { type: "text", text: response.success ? `成功删除邮箱 ${emailId}` : `删除邮箱失败` } ] }; } // 消息管理方法 async getMessages(emailId, cursor) { const endpoint = cursor ? `/api/emails/${emailId}?cursor=${cursor}` : `/api/emails/${emailId}`; const response = await this.makeRequest('GET', endpoint); if (response.messages.length === 0) { return { content: [ { type: "text", text: "该邮箱暂无消息" } ] }; } const messageList = response.messages.map(msg => `- 消息ID: ${msg.id}\n 发件人: ${msg.from_address}\n 主题: ${msg.subject}\n 接收时间: ${new Date(msg.received_at).toLocaleString('zh-CN')}`).join('\n\n'); return { content: [ { type: "text", text: `邮箱消息列表 (共 ${response.total} 条):\n\n${messageList}${response.nextCursor ? `\n\n下页游标: ${response.nextCursor}` : ''}` } ] }; } async getMessageDetail(emailId, messageId) { const response = await this.makeRequest('GET', `/api/emails/${emailId}/${messageId}`); const msg = response.message; return { content: [ { type: "text", text: `消息详情:\n\n消息ID: ${msg.id}\n发件人: ${msg.from_address}\n主题: ${msg.subject}\n接收时间: ${new Date(msg.received_at).toLocaleString('zh-CN')}\n\n纯文本内容:\n${msg.content || '(无内容)'}\n\nHTML内容:\n${msg.html || '(无HTML内容)'}` } ] }; } async deleteMessage(emailId, messageId) { const response = await this.makeRequest('DELETE', `/api/emails/${emailId}/${messageId}`); return { content: [ { type: "text", text: response.success ? `成功删除消息 ${messageId}` : `删除消息失败` } ] }; } // Webhook配置方法 async getWebhookConfig() { const response = await this.makeRequest('GET', '/api/webhook'); return { content: [ { type: "text", text: `Webhook配置:\nURL: ${response.url || '(未设置)'}\n状态: ${response.enabled ? '已启用' : '已禁用'}` } ] }; } async setWebhookConfig(url, enabled) { const response = await this.makeRequest('POST', '/api/webhook', { url, enabled }); return { content: [ { type: "text", text: response.success ? `成功设置Webhook配置:\nURL: ${url}\n状态: ${enabled ? '已启用' : '已禁用'}` : 'Webhook配置设置失败' } ] }; } async run() { const transport = new stdio_js_1.StdioServerTransport(); await this.server.connect(transport); console.error(`${SERVER_NAME} v${SERVER_VERSION} 运行中...`); } } const server = new TempMailMCPServer(); server.run().catch(console.error); //# sourceMappingURL=index.js.map