┌┬┐┌─┐┌─┐┬─┐┌─┐┌┬┐┌─┐┬─┐
││││ │├─┘├┤ ├┬┘├─┤ │ │ │├┬┘
┴ ┴└─┘┴  └─┘┴└─┴ ┴ ┴ └─┘┴└─

Marketing Operations AI Agent

Open Source · github.com/joe-reitz/oss-moperator

$ cat README.md

mOperator is a marketing operations agent you fork. It lives in your Slack, works in your CRM and ad accounts, and every rule it follows is a file you can edit — the prompt, the playbooks, the approval policies, the naming conventions.

Built on eve, Vercel's framework for durable agents, and deployed as a single Next.js project. Turns are durable, so an approval can wait days and resume exactly where it paused — across a redeploy.

Marketing ops is not a generic problem. Your segment field is not their segment field, and your approval chain is specific. A closed product has to average over all of that. A fork does not.

SalesforceHubSpotMarketoProject ManagementGitHubSlack+ Your Own

$ ./quickstart.sh

# Clone the repo

git clone https://github.com/joe-reitz/oss-moperator.git

# Install dependencies

cd oss-moperator && npm install

# Copy environment template

cp .env.example .env.local

# Add your API keys to .env.local (see setup guides below)

open .env.local

# Start the dev server

npm run dev

# Or talk to the agent in your terminal — no Slack setup needed

npm run agent

# See exactly which integrations, tools, and skills are active

npm run agent:info

$ cat .env.example

# ─── Model (required) ────────────────────────────────────────
# One key, any model, through the Vercel AI Gateway.
AI_GATEWAY_API_KEY=
# AI_MODEL=anthropic/claude-opus-4.8    # optional override

# ─── Who can approve writes (required) ───────────────────────
# Gates the admin pages, and lets these people write to the CRM
# without waiting for approval. Empty means every write waits.
AUTHORIZED_USER_EMAILS=
# GROWTH_MARKETING_APPROVERS=           # who may approve ad spend

# ─── Browser sign-in (required for /chat, /console) ──────────
SLACK_CLIENT_ID=
SLACK_CLIENT_SECRET=
MOPERATOR_SESSION_SECRET=               # openssl rand -hex 32

# ─── Slack ───────────────────────────────────────────────────
# Recommended: npx eve add channel/slack, then set the connector.
# MOPERATOR_SLACK_CONNECTOR=slack/moperator
SLACK_BOT_TOKEN=
SLACK_SIGNING_SECRET=

# ─── Your conventions (optional, high value) ─────────────────
MOPERATOR_ORG_NAME=Acme
MOPERATOR_TIMEZONE=America/New_York
MOPERATOR_CAMPAIGN_NAME_EXAMPLE=NAM-FY26Q1-webinar-launch

# ─── Integrations: set the keys, the tools appear ────────────
SALESFORCE_ACCESS_TOKEN=
SALESFORCE_INSTANCE_URL=
HUBSPOT_API_TOKEN=
LINEAR_API_KEY=
GOOGLE_ADS_CUSTOMER_ID=
LUMA_API_KEY=

$ ls docs/

$ ./extend.sh

mOperator is designed to be extended. The real power comes from building your own integrations — small modules that teach mOperator about your internal tools and APIs.

List Import Agent

Upload a CSV to Slack, have mOperator parse it, validate emails, and import contacts into your CRM or MAP automatically.

Data Dictionary

Connect mOperator to your internal docs so it understands your field mappings, lifecycle stages, and scoring models.

Campaign Ops Bot

Build a module that checks campaign naming conventions, UTM parameters, and audience sizing before launch.

Reporting Agent

Connect your BI tool and generate weekly marketing reports posted to Slack on a schedule.

$ moperator --examples

@mOperator What campaigns are active, and how many members each?
@mOperator Export every contact at Acme Corp as a CSV
@mOperator Which campaigns had the worst cost per conversion last month?
@mOperator Here's a list from the conference — dedupe it against Salesforce
@mOperator Build tracked links for LinkedIn and the newsletter
@mOperator Add these 400 contacts to campaign 701xx000000ABCD
@mOperator Raise the brand campaign budget to $300/day
@mOperator Bug: the pricing form drops UTM parameters
@mOperator Create a Luma event for our NYC launch party on March 15

$ cat architecture.txt

Slack (@mOperator)     Browser (/chat)      Cron (schedules)
        |                     |                    |
        v                     v                    v
 /eve/v1/slack        /eve/v1/session      agent/schedules/*
        |                     |                    |
        +----------+----------+--------------------+
                   |
                   v
            the agent runtime  (durable turns: an approval
                   |            can wait days and resume)
   +---------------+---------------+---------------+
   v               v               v               v
tools/          skills/       subagents/        sandbox
env-gated    load on demand  read-only      /workspace + pandas
   |
   v
Salesforce  HubSpot  Marketo  Google Ads  Linear  GitHub  Luma
        (only the ones you configure)

$ cat SECURITY.md

mOperator is an admin-level integration — once deployed it can query your CRM, send Slack messages, and write campaign data. Treat it like a production service.

  • + Every write gated by a policy in code, not a prompt instruction
  • + Bulk writes reviewed above a threshold, refused above a hard cap — splitting the batch does not help
  • + Deletions and sends always need a human, and can never fire from a schedule
  • + Ad spend verified twice — at the gate and at the moment of effect, so nobody approves their own budget
  • + A read-only analyst subagent with no write tools in its tool set at all
  • + SOQL validated against DML, statement stacking, and comment-hidden mutations
  • + Slack signature verification handled by the channel; admin pages gated by AUTHORIZED_USER_EMAILS
  • + Per-user Salesforce OAuth, so writes name the person — AES-256-GCM tokens, 90-day sliding expiry

$ moperator --features

+ Answers from the full result set — CSVs analyzed with pandas in a sandbox, not 50 rows in a prompt
+ Durable approvals — a pending write survives a redeploy and never expires
+ Browser chat at /chat with the same tools and rules as Slack
+ Seven playbooks the agent loads on demand — SOQL, audiences, launches, list hygiene
+ A read-only analyst subagent for “go find out” work
+ Scheduled digests — campaign activity, ad spend anomalies, weekly triage
+ UTM builder and auditor enforcing your conventions
+ Campaign name checker, so quarter-over-quarter reporting still works
+ Attach a list in Slack and it gets deduped against your CRM
+ SOQL console at /console — natural language to SOQL to CSV
+ Usage analytics at /analytics
+ Audience vocabulary at /audience-vocab — teach it what “segment” means, no deploy
+ Integrations activate from env vars; the prompt updates itself
+ Per-user Salesforce OAuth for real write attribution
+ Evals — verify your own fork with npm run eval
+ Add Teams, Discord, or SMS with one command