home / skills / toilahuongg / shopify-agents-kit / misoapps
This skill helps you manage Miso Apps email and shop integrations in Shopify apps, sending emails, configuring SMTP, and retrieving logs efficiently.
npx playbooks add skill toilahuongg/shopify-agents-kit --skill misoappsReview the files below or copy the command above to add this skill to your agents.
---
name: misoapps
description: 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.
---
# Miso Apps SDK
SDKs for email services and shop management in Shopify applications.
## Installation
```bash
npm install @misoapps/mail-sdk @misoapps/shop-sdk
```
## Mail SDK (`@misoapps/mail-sdk`)
### Setup
```typescript
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
});
```
### Send Email (User SMTP)
```typescript
const result = await mailClient.sendEmail({
to: '[email protected]',
fromEmail: '[email protected]',
fromName: 'My Shop', // optional
replyTo: ['[email protected]'], // optional
subject: 'Hello!',
html: '<h1>Welcome!</h1>',
text: 'Welcome!', // optional
});
// { success: true, messageId: '...', logId: '...' }
```
### Send Email (System SMTP - AWS SES)
`fromEmail` is fixed from server's `AWS_SMTP_FROM_EMAIL` env:
```typescript
const result = await mailClient.sendSystemEmail({
to: '[email protected]',
fromName: 'Miso Apps', // optional
replyTo: ['[email protected]'], // optional
subject: 'Hello!',
html: '<h1>Welcome!</h1>',
text: 'Welcome!', // optional
});
```
### Get Email Logs
```typescript
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 }
```
### SMTP Configuration
```typescript
// Create/Update (upsert)
const config = await mailClient.upsertSmtpConfig({
host: 'smtp.gmail.com',
port: 587, // optional, default: 587
secure: false, // optional, default: false
username: '[email protected]',
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: '...' }
```
### Mail SDK Types
```typescript
import type {
MailClientConfig, MailClient,
SendEmailRequest, SendSystemEmailRequest, SendEmailResponse,
EmailLog, GetEmailLogsParams, GetEmailLogsResponse,
EmailStatus, EmailType,
SmtpConfig, CreateSmtpConfigRequest, UpdateSmtpConfigRequest, TestSmtpResponse,
} from '@misoapps/mail-sdk';
```
## Shop SDK (`@misoapps/shop-sdk`)
### Setup
```typescript
import { createShopServices, Platform, AppID } from '@misoapps/shop-sdk';
const shopService = createShopServices(
'http://localhost:5000',
'shopify' // Platform: 'shopify' | 'shopline'
);
```
### Install App
```typescript
const result = await shopService.installApp({
shop: 'example.myshopify.com',
shopName: 'Example Shop',
contactEmail: '[email protected]',
themeId: 'theme-123', // optional
app: {
appId: 'llmstxt', // AppID
plan: 'basic',
accessToken: 'token', // optional
},
});
// { message: 'App installed successfully', status: 'NEW' | 'INSTALLED' | 'REINSTALLED', shop: IShop }
```
### Uninstall App
```typescript
const result = await shopService.uninstallApp({
shop: 'example.myshopify.com',
appId: 'llmstxt',
});
// { message: 'App uninstalled successfully', shop: IShop }
```
### Get App
```typescript
const { shop, app } = await shopService.getApp('example.myshopify.com', 'llmstxt');
// shop: IShop (without apps array), app: IAppInfo
```
### Update App
```typescript
const { shop, app } = await shopService.updateApp(
'example.myshopify.com',
'llmstxt',
{
plan: 'premium', // optional
isReviewed: true, // optional
accessToken: 'new-token', // optional
}
);
```
### Shop Queries
```typescript
// 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 }
```
### Shop SDK Types
```typescript
import type {
Platform, AppID, Shop, AppInfo,
InstallAppPayload, InstallAppResponse,
UninstallAppPayload, UninstallAppResponse,
UpdateAppPayload, UpdateAppResponse,
GetAppResponse, GetShopResponse, GetShopAppsResponse,
ListShopsResponse, FindUninstalledShopsResponse, GetStatsResponse,
} from '@misoapps/shop-sdk';
```
## Environment Variables
```env
MAIL_SERVICE_ENDPOINT=https://mail-api.misoapps.com
SHOP_SERVICE_ENDPOINT=https://shop-api.misoapps.com
```
## Integration with Remix
See `references/remix-integration.md` for Remix loader/action patterns.
This skill guides developers to use the Miso Apps SDKs (@misoapps/mail-sdk and @misoapps/shop-sdk) inside Shopify apps. It explains installation, client setup, and the main APIs for sending email (user SMTP or system/AWS SES), managing SMTP configuration, retrieving email logs, and managing shop/app installations and data. Use it to integrate email delivery and centralized shop management quickly and consistently.
Initialize the Mail client with the mail service endpoint and shop domain to use user SMTP features, or call system email APIs which use server-side AWS SMTP configuration. The Shop client is created with the shop service endpoint and platform to manage installs, uninstalls, app records, and shop queries. Each client exposes typed methods for create/update/delete operations, tests, and paginated queries.
When should I use sendEmail vs sendSystemEmail?
Use sendEmail when sending from a merchant's SMTP account (requires shopDomain and merchant SMTP config). Use sendSystemEmail for server-controlled sending where the from address is set by the server (AWS SES).
How do I verify SMTP credentials work?
Call testSmtpConnection after upserting the SMTP config; it returns success/failure and an error message if any.