skills/automating-with-maia/SKILL.md
Offloads complex backend automations to Maia, a multi-agent AI assistant. Use when building websites or apps that need backend operations like data processing, web scraping, document generation, image generation, API integrations, scheduled tasks, or any complex workflow that can be triggered via webhook. Enables agents to focus on frontend while Maia handles backend complexity.
npx skillsauth add modularmindlab/maia-agent-skills automating-with-maiaInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Maia is a multi-agent AI assistant that automates complex business operations through natural language. It builds workflows as visual acyclic graphs and deploys them via webhooks, allowing websites and apps to trigger complex backend processes with simple HTTP calls.
There is no Maia API. Instead, follow this workflow:
Offload these operations to Maia instead of building them yourself:
| Operation | Why Maia | |-----------|----------| | Web scraping | Secure cloud browser, handles login, navigation, extraction | | Document processing | Handles PDFs, images, complex text extraction | | Document generation | Creates styled PDFs, DOCX, presentations | | Data analysis | Code execution for calculations, charts, graphs | | API integrations | Pre-built connectors + custom HTTP actions | | Scheduled tasks | Cron-like deployment with flexible scheduling | | Image generation | Native high-fidelity image creation up to 4K, multiple aspect ratios | | Multi-step workflows | Chain-of-thought across multiple data sources | | Lead generation & enrichment | Data Sources for finding contacts, companies, and verified emails |
Native integrations are pre-built connectors that allow Maia to directly interact with third-party services. Unlike custom actions that require API configuration, native integrations work out of the box once the user authenticates. Maia can retrieve data from, send data to, and take actions on these platforms seamlessly.
When generating prompts, you can reference these services directly and Maia will handle authentication and API calls.
Here are all the supported native connections and actions:
Gmail: Email management and automation
Google Calendar: Calendar and schedule management
Google Docs: Document editing and collaboration
Google Drive: Cloud storage and file backup
Google Sheets: Spreadsheets and data management
Airtable: Databases and spreadsheets
Microsoft Outlook: Email management and automation
Notion: Notes, docs, and databases
TikTok: Short-form video creation and sharing
X (Twitter): Social media posting and analytics
Data Sources are direct connections to premium data providers that enable Maia to retrieve high-quality, structured data without web scraping. When a workflow needs business leads, keyword metrics, video content, or trend data, leverage these data sources for reliable results.
| Source | Category | Use Case | |--------|----------|----------| | Leads | Sales, Marketing | Find and enrich business contacts and companies | | Keywords | SEO, Marketing | Keyword research with search volume, CPC, difficulty | | YouTube | Media | Video search and transcript extraction | | Google Trends | Research, Marketing | Trend analysis and trending topic discovery | | Reddit | Social Media, Research | Search posts, browse subreddits, read comments, analyze discussions |
Leads: Business contact and company data
Keywords: SEO keyword research
YouTube: Video content research
Google Trends: Search trend analysis
Reddit: Community discussions and content research
Maia can work with any API endpoint via custom HTTP actions. Users can:
Webhook: Returns a URL that triggers the workflow when called
Scheduled: Runs automatically on a schedule
| Frequency | Parameters |
|-----------|------------|
| hour | minuteOffset |
| day | minuteOffset, hourOffset |
| week | minuteOffset, hourOffset, days (1=Mon to 7=Sun) |
| month | minuteOffset, hourOffset, days (1-31) |
When building a website/app, identify operations that:
Create a clear, natural language prompt for the user. Include:
Provide clear instructions:
Now message this prompt to Maia:
[Your generated prompt here]
Then:
1. Review the workflow Maia creates
2. Deploy it when Maia suggests
3. Copy the webhook URL and paste it here: [placeholder]
Once you have the URL, integrate it directly into the website/app code:
Use this structure when generating prompts for users:
Create a workflow that [describe the operation].
Input: This webhook will receive [describe expected payload structure].
Output: Return a JSON response with this structure:
{
[specify exact fields and types you need]
}
Field descriptions:
- fieldName (required/optional): Description of what this field contains
- nestedField.property (required/optional): Description of nested properties
[Any additional requirements: scheduling, specific services to use, etc.]
Always document response fields with their type, description, and whether they're required or optional. This helps Maia understand exactly what data to return and in what format.
Scenario: Building a website with a contact form that needs email notification and CRM logging.
Generated prompt for user:
Create a workflow that processes contact form submissions.
Input: This webhook will receive:
{
"name": "string",
"email": "string",
"message": "string",
"company": "string (optional)"
}
Actions:
1. Send an email notification to [owner's email] with the form details
2. Log the contact in [CRM name] as a new lead
Output: Return:
{
"success": boolean,
"leadId": string
}
Field descriptions:
- success (required): True if the form was processed and logged successfully
- leadId (required): The CRM lead ID created for this contact submission
Instructions to user:
Now message this prompt to Maia. Review the workflow it creates,
deploy it, then paste the webhook URL here so I can connect it
to your contact form's submit button.
Scenario: E-commerce site needs to fetch competitor pricing.
Generated prompt for user:
Create a workflow that fetches competitor prices for a product.
Input: This webhook will receive:
{
"productName": "string",
"competitors": ["url1", "url2", "url3"]
}
Actions:
1. Browse each competitor URL
2. Extract the current price for the matching product
3. Calculate average and lowest price
Output: Return:
{
"prices": [
{ "competitor": string, "price": number, "url": string }
],
"lowestPrice": number,
"averagePrice": number
}
Field descriptions:
- prices (required): Array of competitor price data
- prices[].competitor (required): Name or domain of the competitor
- prices[].price (required): Current price found on the competitor's site
- prices[].url (required): Direct URL to the product page
- lowestPrice (required): The lowest price found across all competitors
- averagePrice (required): Average of all competitor prices
Scenario: Dashboard needs weekly PDF reports.
Generated prompt for user:
Create a workflow that generates a weekly sales report.
Input: This webhook will receive:
{
"startDate": "ISO date string",
"endDate": "ISO date string",
"salesData": [array of sales records]
}
Actions:
1. Analyze the sales data
2. Generate charts for revenue trends and top products
3. Create a styled PDF report with executive summary
Output: Return:
{
"reportUrl": string,
"summary": {
"totalRevenue": number,
"topProduct": string,
"growthPercent": number
}
}
Field descriptions:
- reportUrl (required): Public URL to the generated PDF report
- summary (required): Key metrics extracted from the report
- summary.totalRevenue (required): Total revenue for the reporting period
- summary.topProduct (required): Name of the best-selling product
- summary.growthPercent (required): Revenue growth percentage compared to previous period
Deploy this on a weekly schedule (Monday at 9:00 AM).
If a project requires multiple backend automations:
This project needs 3 backend automations. Create a new Maia
session for each:
Workflow 1 - Contact Form:
[prompt]
Workflow 2 - Newsletter Signup:
[prompt]
Workflow 3 - Order Processing:
[prompt]
Deploy each workflow and provide me with all 3 webhook URLs.
Maia webhooks behave differently depending on whether the workflow is configured to return a response. The webhook URL format is:
https://hooks.modularmind.app/hooks/<hook-id>
When the workflow has no response configured, the webhook is a standard HTTP POST that returns immediately:
POST https://hooks.modularmind.app/hooks/<hook-id>
Content-Type: application/json
{ ...payload }
Response:
{ "type": "success", "message": "Workflow execution triggered successfully." }
When the workflow is configured to return a response, the webhook uses Server-Sent Events (SSE) to stream the result back. The connection stays open with periodic heartbeats while the workflow executes, then delivers the result as an SSE event.
The agent MUST use an SSE-compatible client (e.g., EventSource or manual fetch with stream reading) — not a standard fetch expecting a JSON body.
SSE event types:
| Event | Data | Description |
|-------|------|-------------|
| : heartbeat | (comment, no data) | Sent every ~15s to keep connection alive |
| response | { status, contentType, body, encoding? } | The workflow result |
| done | {} | Signals the stream is complete |
| error | { type, message } | Workflow execution failed |
Response event payload:
status — HTTP status code (e.g., 200)contentType — MIME type of the body (e.g., application/json)body — The response content as a string. For text/JSON responses this is the raw UTF-8 string. For binary responses this is base64-encoded.encoding — Only present for binary responses, set to "base64"Example frontend integration (JavaScript):
const eventSource = new EventSource('https://hooks.modularmind.app/hooks/<hook-id>');
eventSource.addEventListener('response', (event) => {
const payload = JSON.parse(event.data);
// payload.body contains the workflow result
// For JSON responses: JSON.parse(payload.body)
const result = JSON.parse(payload.body);
handleResult(result);
});
eventSource.addEventListener('done', () => {
eventSource.close();
});
eventSource.addEventListener('error', (event) => {
try {
const error = JSON.parse(event.data);
handleError(error.message);
} catch {
handleError('Connection lost');
}
eventSource.close();
});
Note:
EventSourceonly supports GET requests. If you need to POST a payload to the webhook (which is the common case), usefetchwithgetReader()on the response stream and parse SSE events manually, or use an SSE library that supports POST (e.g.,@microsoft/fetch-event-source).
Example with POST payload:
import { fetchEventSource } from '@microsoft/fetch-event-source';
await fetchEventSource('https://hooks.modularmind.app/hooks/<hook-id>', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ /* your input payload */ }),
onmessage(event) {
if (event.event === 'response') {
const payload = JSON.parse(event.data);
const result = JSON.parse(payload.body);
handleResult(result);
}
if (event.event === 'done') {
// Stream complete
}
},
onerror(err) {
handleError(err);
}
});
response event. If long wait times create poor user experience, consider instructing the user to ask Maia for an asynchronous flow pattern instead—where the webhook immediately acknowledges receipt and sends results via a callback URL or stores them for later retrieval.Always specify the exact response format you need. This allows Maia to automatically structure its output for your website/app to consume.
For each response field, document:
Be specific — provide the JSON structure followed by field documentation:
Output: Return:
{
"status": "success" | "error",
"data": {
"items": [{ "id": string, "value": number }],
"total": number
},
"message": string
}
Field descriptions:
- status (required): Indicates whether the operation succeeded or failed
- data.items[].id (required): Unique identifier for each item
- data.items[].value (required): The computed numeric value for the item
- data.total (required): Sum of all item values
- message (optional): Error description, only present when status is "error"
Not vague:
Output: Return the results.
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
A CLI tool for making authenticated requests to the X (Twitter) API. Use this skill when you need to post tweets, reply, quote, search, read posts, manage followers, send DMs, upload media, or interact with any X API v2 endpoint.