Skip to main content
Glama
mail.ts4.59 kB
import { LiaraClient } from '../api/client.js'; import { MailServer, SendEmailRequest, PaginationOptions, paginationToParams, } from '../api/types.js'; import { validateRequired, unwrapApiResponse } from '../utils/errors.js'; /** * Create a specialized Mail service client with the Mail API base URL */ function createMailClient(client: LiaraClient): LiaraClient { // Access the internal client to get the API token const internalClient = (client as any).client; const apiToken = internalClient?.defaults?.headers?.Authorization?.replace('Bearer ', '') || process.env.LIARA_API_TOKEN; const teamId = (client as any).teamId || process.env.LIARA_TEAM_ID; if (!apiToken) { throw new Error('API token is required for Mail operations'); } // Create new client with Mail service base URL return new LiaraClient({ apiToken, teamId, baseURL: 'https://mail-service.liara.ir/api', }); } /** * List all mail servers */ export async function listMailServers( client: LiaraClient, pagination?: PaginationOptions ): Promise<MailServer[]> { const mailClient = createMailClient(client); const params = paginationToParams(pagination); const response = await mailClient.get<any>('/v1/mails', params); return unwrapApiResponse<MailServer[]>(response, ['mails', 'mailServers', 'data', 'items']); } /** * Get details of a specific mail server */ export async function getMailServer( client: LiaraClient, mailId: string ): Promise<MailServer> { validateRequired(mailId, 'Mail server ID'); const mailClient = createMailClient(client); return await mailClient.get<MailServer>(`/v1/mails/${mailId}`); } /** * Create a new mail server */ export async function createMailServer( client: LiaraClient, _name: string, mode?: 'DEV' | 'LIVE', planID?: string, domain?: string ): Promise<MailServer> { // Note: '_name' parameter is kept for backward compatibility but not sent to API validateRequired(planID, 'Plan ID'); validateRequired(domain, 'Domain'); const requestBody: { mode?: 'DEV' | 'LIVE'; plan?: string; planID?: string; domain?: string } = { domain: domain!, }; if (mode) { requestBody.mode = mode; } else { // Default to 'DEV' if mode is not provided requestBody.mode = 'DEV'; } if (planID) { requestBody.plan = planID; requestBody.planID = planID; } const mailClient = createMailClient(client); const response = await mailClient.post<any>('/v1/mails', requestBody); return unwrapApiResponse<MailServer>(response, ['mail', 'mailServer', 'data']); } /** * Delete a mail server */ export async function deleteMailServer( client: LiaraClient, mailId: string ): Promise<void> { validateRequired(mailId, 'Mail server ID'); const mailClient = createMailClient(client); await mailClient.delete(`/v1/mails/${mailId}`); } /** * Send an email */ export async function sendEmail( client: LiaraClient, mailId: string, request: SendEmailRequest ): Promise<{ message: string; messageId?: string }> { validateRequired(mailId, 'Mail server ID'); validateRequired(request.from, 'From address'); validateRequired(request.to, 'To address'); validateRequired(request.subject, 'Subject'); if (!request.html && !request.text) { throw new Error('Either html or text content is required'); } const mailClient = createMailClient(client); return await mailClient.post<{ message: string; messageId?: string }>( `/v1/mails/${mailId}/send`, request ); } /** * Start a mail server */ export async function startMailServer( client: LiaraClient, mailId: string ): Promise<void> { validateRequired(mailId, 'Mail server ID'); const mailClient = createMailClient(client); await mailClient.post(`/v1/mails/${mailId}/actions/start`); } /** * Stop a mail server */ export async function stopMailServer( client: LiaraClient, mailId: string ): Promise<void> { validateRequired(mailId, 'Mail server ID'); const mailClient = createMailClient(client); await mailClient.post(`/v1/mails/${mailId}/actions/stop`); } /** * Restart a mail server */ export async function restartMailServer( client: LiaraClient, mailId: string ): Promise<void> { validateRequired(mailId, 'Mail server ID'); const mailClient = createMailClient(client); await mailClient.post(`/v1/mails/${mailId}/actions/restart`); }

Implementation Reference

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/razavioo/liara-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server