Skip to main content
Glama

lemlist_watchlist

Watch lists: standing alerts on buying signals (hiring, funding, job change, tech move, website visit…), and the signals they catch. oto_guide op=read slug="lemlist-playbook": build order, where each id comes from, and the doc↔API gaps.

⚠️ A list created with signal_processing_type="push_to_campaign" and activate=True feeds a campaign ON ITS OWN — the one configuration here that can end in messages being sent without a further call.

Args by op:

  • list: watch_type, status, page, limit.

  • create: name + watch_type (companyIsHiring, companyRaisedFunds, jobChange, newHire, technologyChange, buyingIntent, companyEmployeeVisitedMyWebsite…), then filters. Read op="filters" for that type FIRST: each type has its own REQUIRED filters (companyIsHiring needs title, location and maxIdentificationsPerDay), the values must be the canonical ones op="filter_values" returns — a free string is rejected — and numbers travel as STRINGS ({"filterId": "maxIdentificationsPerDay", "in": ["5"]}). Optional emoji, signal_processing_type (manual, create_opportunity, push_to_campaign), activate (default False — the list is created as a draft), segment_type, opportunity_template (what create_opportunity builds: owner, channel, priority), and with push_to_campaign only: campaign_id (the campaign fed) and persona_id (pdp_…, from lemlist_database op="personas": who to push when a signal names a company and no person).

  • update: watch_list_id + settings (raw PATCH body). delete: watch_list_id.

  • filters (optional watch_type) / filter_values (filter_id, optional query) / library: what a list can be built from.

  • history: watch_list_id. signals: the catches, filterable by watch_list_id, watch_type, status, received_from/received_to (ISO bounds), and sorted by sort_by/sort_order.

  • push_signals: watch_list_id + contact (needs linkedinUrl) + company (needs domain and name), optional custom_fields — feed a signal detected OUTSIDE lemlist.

Website visitors (companyEmployeeVisitedMyWebsite), lemlist's own visitor identification:

  • Needs lemlist's tracking script on the site, installed from the lemlist app (Signal agents ▸ Create ▸ Website visitors) — no API call installs it.

  • ⚠️ An ACTIVE list spends 20 lemlist credits per visit caught: set the maxIdentificationsPerDay filter, and confirm before activate.

  • Filters: website, pagesTracked, minVisitDuration, minPageViewed, visitLocation, internalTraffic, excludedVisitorIps, maxIdentificationsPerDay.

  • Each signal carries company (name, domain, linkedinUrl, industry) and signalData (websiteVisited = the page, visitorWebsite, visitorCountry, visitorDuration in seconds); contact only when lemlist could name the visitor (some US traffic).

  • Read them on a schedule: op="signals", watch_type="companyEmployeeVisitedMyWebsite", received_from. Or on each visit: lemlist_webhook op="add" with event_type="signalRegistered" (fires for EVERY watch list — check the type).

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "op": "<op>"
    },
    "name": "lemlist_watchlist"
  }
}

Input Schema

NameRequiredDescriptionDefault
opYes
_orgNoOrg (id) de CET APPEL. `oto_list_orgs()`.
nameNo
pageNo
emojiNo
limitNo
queryNo
_groupNoÉquipe (id) de CET APPEL, sous son org parente.
statusNo
_run_idNoOBLIGATOIRE à chaque appel dès `run_start` ou `data_claim_next` : sans lui, l'écriture sur une ligne réservée est refusée. Hérité seulement si le serveur tient un run actif — n'y compte pas.
companyNo
contactNo
filtersNo
sort_byNo
_projectNoProjet (id) de CET APPEL — jeton PRIMAIRE. `oto_project(op='list')`.
activateNo
settingsNo
_instanceNoInstance de connecteur PRÉCISE (un credential exact). `oto_instance(op='list')`.
filter_idNo
persona_idNo
sort_orderNo
watch_typeNo
campaign_idNo
received_toNo
segment_typeNo
custom_fieldsNo
received_fromNo
watch_list_idNo
opportunity_templateNo
signal_processing_typeNo

Schema Changelog

Changes observed during successful MCP inspections.

No schema history has been recorded yet.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden and does so: it flags the one dangerous configuration (push_to_campaign + activate=True can send messages with no further call), the credit cost (20 credits per visit caught), the manual prerequisite (tracking script installed from the app, no API installs it), and the draft-by-default behavior of activate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the highest-risk warning, then organizes by op with bullets and a dedicated deep-dive section for website visitors. It is long, but the length is justified by 10 ops and 30 parameters; a few items (segment_type, emoji) are named without explanation, which is minor slack rather than waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description still documents the signal payload shape (company fields, signalData keys like websiteVisited and visitorDuration, contact only for some US traffic). Combined with the per-op argument map and the playbook pointer, an agent has everything needed to call any op correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 30 parameters at only 17% schema coverage, the description compensates heavily: it maps parameters to each op, names the required filters per watch_type, warns that values must be canonical (free strings rejected) and that numbers travel as STRINGS with a literal example, and explains persona_id provenance and the linkedinUrl/domain+name requirements for push_signals.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource: 'Watch lists: standing alerts on buying signals (hiring, funding, job change, tech move, website visit…), and the signals they catch.' It clearly separates the two objects managed (lists vs. caught signals) and is distinguishable from siblings like lemlist_webhook or lemlist_database, which it explicitly cross-references.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives per-op routing ('Args by op' for all 10 ops), an explicit ordering rule ('Read op="filters" for that type FIRST'), and a named alternative for the polling case ('Or on each visit: lemlist_webhook op="add" with event_type="signalRegistered"'). It also states when push_signals applies (signals detected OUTSIDE lemlist).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources