Guide for using Miso Apps SDKs (@misoapps/mail-sdk and @misoapps/shop-sdk) in Shopify apps. Use this skill when the user needs to send emails via SMTP or AWS SES, manage SMTP configurations, retrieve email logs, manage shop installations, or access shop/app data through Miso Apps services.
SDKs for email services and shop management in Shopify applications.
npm install @misoapps/mail-sdk @misoapps/shop-sdk
@misoapps/mail-sdk)import { createMailClient } from '@misoapps/mail-sdk';
const mailClient = createMailClient({
endpoint: 'https://mail-service.example.com',
shopDomain: 'my-shop.myshopify.com', // Required for User SMTP APIs
});
const result = await mailClient.sendEmail({
to: 'customer@example.com',
fromEmail: 'shop@example.com',
fromName: 'My Shop', // optional
replyTo: ['support@example.com'], // optional
subject: 'Hello!',
html: '<h1>Welcome!</h1>',
text: 'Welcome!', // optional
});
// { success: true, messageId: '...', logId: '...' }
fromEmail is fixed from server's AWS_SMTP_FROM_EMAIL env:
const result = await mailClient.sendSystemEmail({
to: 'customer@example.com',
fromName: 'Miso Apps', // optional
replyTo: ['support@example.com'], // optional
subject: 'Hello!',
html: '<h1>Welcome!</h1>',
text: 'Welcome!', // optional
});
const logs = await mailClient.getEmailLogs({
status: 'sent', // optional: 'pending' | 'sent' | 'failed'
type: 'user', // optional: 'user' | 'system'
page: 1, // optional
limit: 20, // optional
});
// { logs: [...], total: 100, page: 1, pages: 5 }
// Create/Update (upsert)
const config = await mailClient.upsertSmtpConfig({
host: 'smtp.gmail.com',
port: 587, // optional, default: 587
secure: false, // optional, default: false
username: 'user@gmail.com',
password: 'app-password',
});
// Get
const config = await mailClient.getSmtpConfig(); // SmtpConfig | null
// Update (partial)
await mailClient.updateSmtpConfig({
port: 465,
secure: true,
isActive: true,
});
// Delete
await mailClient.deleteSmtpConfig();
// { success: true, message: '...' }
// Test connection
const result = await mailClient.testSmtpConnection();
// { success: true, message: 'SMTP connection successful' }
// or { success: false, message: '...', error: '...' }
import type {
MailClientConfig, MailClient,
SendEmailRequest, SendSystemEmailRequest, SendEmailResponse,
EmailLog, GetEmailLogsParams, GetEmailLogsResponse,
EmailStatus, EmailType,
SmtpConfig, CreateSmtpConfigRequest, UpdateSmtpConfigRequest, TestSmtpResponse,
} from '@misoapps/mail-sdk';
@misoapps/shop-sdk)import { createShopServices, Platform, AppID } from '@misoapps/shop-sdk';
const shopService = createShopServices(
'http://localhost:5000',
'shopify' // Platform: 'shopify' | 'shopline'
);
const result = await shopService.installApp({
shop: 'example.myshopify.com',
shopName: 'Example Shop',
contactEmail: 'contact@example.com',
themeId: 'theme-123', // optional
app: {
appId: 'llmstxt', // AppID
plan: 'basic',
accessToken: 'token', // optional
},
});
// { message: 'App installed successfully', status: 'NEW' | 'INSTALLED' | 'REINSTALLED', shop: IShop }
const result = await shopService.uninstallApp({
shop: 'example.myshopify.com',
appId: 'llmstxt',
});
// { message: 'App uninstalled successfully', shop: IShop }
const { shop, app } = await shopService.getApp('example.myshopify.com', 'llmstxt');
// shop: IShop (without apps array), app: IAppInfo
const { shop, app } = await shopService.updateApp(
'example.myshopify.com',
'llmstxt',
{
plan: 'premium', // optional
isReviewed: true, // optional
accessToken: 'new-token', // optional
}
);
// Get single shop
const { shop } = await shopService.getShop('example.myshopify.com');
// Get shop's apps
const { apps } = await shopService.getShopApps('example.myshopify.com');
// List shops (paginated)
const { shops, total, page, pages } = await shopService.listShops({
page: 1, // default: 1
limit: 10, // default: 10
platform: 'shopify', // optional filter
});
// Find recently uninstalled (last 10 days)
const { shops } = await shopService.findUninstalledShops('llmstxt');
// Get stats
const stats = await shopService.getStats();
// { totalShops, totalInstalls, activeInstalls }
import type {
Platform, AppID, Shop, AppInfo,
InstallAppPayload, InstallAppResponse,
UninstallAppPayload, UninstallAppResponse,
UpdateAppPayload, UpdateAppResponse,
GetAppResponse, GetShopResponse, GetShopAppsResponse,
ListShopsResponse, FindUninstalledShopsResponse, GetStatsResponse,
} from '@misoapps/shop-sdk';
MAIL_SERVICE_ENDPOINT=https://mail-api.misoapps.com
SHOP_SERVICE_ENDPOINT=https://shop-api.misoapps.com
See references/remix-integration.md for Remix loader/action patterns.
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer