The existing Adding Integrations guide covers the technical structure — three files, register, done. This guide is about the bigger picture: using AI coding tools to design and build entirely new apps that plug into mOperator.
You don't need to be a developer. If you can describe what you want, you can build it.
mOperator ships with Salesforce, Linear, and GitHub integrations. But the real power is building your own. Think of each integration as a small app that teaches mOperator a new skill.
Some examples from real marketing ops teams:
None of these exist out of the box. They're custom to your team's workflow. That's the point.
You don't need to write code from scratch. Use an AI coding tool — Claude, Cursor, GitHub Copilot, whatever you prefer — and describe what you want.
Start with a clear prompt to your AI coding tool. Here's a template:
I'm building an integration for mOperator (a Next.js app using the Vercel AI SDK).
- The integration should:
- [What it does in plain English]
- [What external API or data source it connects to]
- [What actions the AI agent should be able to take]
- The integration needs three files:
- client.ts — handles API calls to [service]
- tools.ts — defines AI SDK tools using the tool() function from 'ai' with zod schemas
- index.ts — exports the integration manifest (name, description, capabilities, isConfigured)
Here's an example of an existing integration for reference:
[paste the weather example from adding-integrations.md]
The more context you give, the better the result. Share:
.env.example file (so it knows the pattern for env vars)src/lib/integrations/types.ts file (so it knows the Integration interface)src/lib/integrations/github/) as a referenceYour first version won't be perfect. That's fine. Test it:
npm run dev
npm run cli
Ask mOperator to use the new tool. If it doesn't work, paste the error back into your AI coding tool and ask it to fix it. This loop — describe → generate → test → fix — is how vibecoding works.
Once the three files work, register the integration in src/lib/integrations/index.ts:
import { myIntegration } from './myservice'
const ALL_INTEGRATIONS: Integration[] = [
// existing integrations...
myIntegration,
]
Set the env vars, restart the app, and you're live.
Here's how a team built a list import agent using this approach.
Marketing ops needed to import contact lists into Salesforce from Slack. The old process: download CSV → open in Excel → clean it up → upload to Salesforce → wait → check for errors. Took 30 minutes per list.
Build a mOperator integration called "list-import" that:
- Accepts a CSV file uploaded to Slack (mOperator already handles file downloads)
- Parses the CSV and validates:
- Email format is valid
- Required fields (FirstName, LastName, Email) are present
- No duplicate emails in the file
- Checks each email against Salesforce to find existing contacts
- Returns a summary: "X new contacts, Y already exist, Z have errors"
- If the user confirms, creates the new contacts in Salesforce
- The client.ts should:
- Parse CSV content into records
- Validate email format with a regex
- Check for required fields
- Dedupe by email
- The tools.ts should have two tools:
- validateImportList: takes CSV content, returns validation summary
- executeImport: takes validated records, creates them in Salesforce
Use the existing Salesforce client for creating records.
The AI coding tool generated the three files. After two rounds of fixes (a CSV parsing edge case and a Salesforce field mapping issue), it worked. The team went from 30 minutes per import to 2 minutes — upload the CSV, confirm, done.
mOperator kept writing bad SOQL queries because it didn't understand custom fields. Account.MQL_Score__c isn't obvious.
Build a mOperator integration called "data-dictionary" that:
- Reads a CSV from a URL (our internal data dictionary spreadsheet)
- The CSV has columns: Object, API_Name, Label, Description, Type
- Provides a tool that the AI can call to look up field definitions
- The tool should support searching by object name, field label, or description
This is read-only — no writes needed. The CSV URL comes from an env var:
DATA_DICTIONARY_URL=https://docs.google.com/spreadsheets/d/.../export?format=csv
Now when someone asks "show me accounts with high MQL scores," mOperator looks up the data dictionary, finds MQL_Score__c, and writes the correct SOQL. The team maintains the dictionary in Google Sheets and mOperator always has the latest version.
You can also build completely separate apps that mOperator connects to via API. This is useful when:
The pattern:
Your integration's client.ts just makes HTTP calls to your standalone app:
const API_URL = process.env.MY_APP_API_URL
export async function processData(input: string): Promise<Result> {
const response = await fetch(${API_URL}/api/process, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ input }),
})
return response.json()
}
This way your custom app can be as complex as it needs to be, and mOperator just knows how to talk to it.
src/lib/integrations/ for referencenpm run cliThe best integrations come from real pain points. If you find yourself doing something manually more than twice, it's probably a good candidate for a mOperator integration.