Case study · WorkZeal

Insider

AI agents that do the work, not just chat

A manager writes a job in plain words and picks a schedule. At that time an agent wakes up, researches the web, adds what it found to the CRM through MCP with that manager's rights, and reports back.

  • 2agents per job: one reads the web, one writes
  • 30minutes: life of the user's token per run
  • 5companies at most per run, checked in the database
  • 1log row and email report per run
WorkZeal Insider · scheduled AI agents · MCP

How a job runs

Each job is one plain-language instruction with a schedule and a responsible person. The run is split between two agents with different powers, and plain code sits between them: it removes duplicates, caps the volume and checks the result in the database.

PHASE 1 · SEARCH AGENT PHASE 2 · CRM AGENT Scheduler every 60 s · claims job Job in plain words schedule · responsible Search agent web on · no CRM tools Code filter in CRM? seen before? New candidates 5 at most · as data Search memory last 150 found due phase 1 text JSON list dedupe User's token minted now · 30 min CRM agent MCP on · web off short allow-list of tools must call a tool, never ask WorkZeal MCP with the user's rights CRM company DB Check & report re-read the DB log row email to the user candidates only: no web page text crosses DB triggers start the company's own rules a few seconds later insert_company
Two agents, two sets of powers. The one that reads the web never gets CRM tools, and the one with CRM tools never sees the web, so text planted on a web page can't turn into an action in the CRM.

Why two agents, not one

Search agentCan read the whole web. Can't touch the CRM. Its answer is only a list of candidates.
Code in betweenRemoves companies already in the CRM or found before, and keeps 5 at most. No model decides this.
CRM agentCan write to the CRM, as one user. Can't browse, so web pages can't give it orders.

How I built it

1Schedules and claiming

Once, daily, weekly or monthly, in the user's time zone. A 60-second timer claims a due job with one conditional UPDATE that also sets the next run, so two servers never take the same job and a crash can't make it loop.

2The user's rights, not admin

The job runs as its responsible person. Each run mints a fresh 30-minute token from that person's "AI Insider" API key. Switch the key off in Settings and the agent stops.

3One job, two phases

  • The manager writes one instruction
  • A marker splits it into search and CRM parts
  • OpenAI Responses API, provider set per region
  • MCP attached as a remote tool, with an allow-list

4Guards and a paper trail

  • No web search in phase 1: answer rejected
  • No tool call in phase 2: run marked ERROR
  • Result counted in the DB, not taken from the model
  • One log row and an email per run
  • In chat, Insider asks before mail, money or bulk edits

What testing changed

Invented IDsthe model reported companies it never created, until an "order of work" rule and the no-tool-call guard
Companies from memoryanswers came without a search, so phase 1 now fails unless the web search really ran
Same finds every daya search memory of the last 150 companies keeps each run new
Rate limits13k-token requests hit the per-minute cap; retries now wait as long as the API asks

Where it is today

Live in use

  • Find and add new potential customers on a schedule
  • Insider chat in the app, working through MCP
  • Ready-made questions: my day, my tasks, team KPI

Next soon

  • Tasks for stale deals and overdue invoices
  • Customers who stopped buying
  • Fill in missing emails from company websites