Skip to main content
Glama

Match Calendar Attendees To Prospects

li_match_contacts
Read-only

Match booking attendees you read from the user's calendar (Google Calendar, Calendly, Cal.com, or booking-confirmation emails) to prospects — deterministic, read-only, no LLM. Pass what the event shows: name, email if any, the calendar's eventId, startsAt, and ALSO createdAt (when the event was created/booked) and the raw description whenever the event has them — the timing and time-zone signals are read from those two.

The pool: people with a booking in play (link sent, agreed, cancelled), everyone in an active campaign, anyone messaged in the last 60 days, and anyone our booking link went to in the last 30 days — only on accounts you can see. Names are normalised (case, accents, punctuation, titles like Dr/PhD, middle names and initials, "Last, First", a small nickname table: Bob=Robert, Bill=William…); a prospect's name is cleaned the same way as the name prefilled into the booking link.

Rules, in order: (1) exact full name among people sent the booking link in the last 30 days → match (full_name_recent_link); two such namesakes → the one who booked within 15 minutes of their own LinkedIn message, else ambiguous. (2) email's company domain equals the prospect's companyDomain AND first or last name matches → strong; full name matches exactly → strong; first and last each within one typo → WEAK; exactly one strong → match. Personal email domains (gmail, outlook, hotmail, yahoo, icloud, proton…) never count as a company domain. (3) Scoring (score): first_name +2 (or first_name_typo +1), last_name_in_email +3 (prospect's surname in the email's local part), recent_link +2, booked_after_message +3 (event created 0–15 min after their inbound LinkedIn message), timezone_fits +1 (a zone in the description fits theirs). A conflicting surname excludes a prospect. Match only with a first-name signal, a surname (on the booking or in the email), score ≥ 7 and a lead ≥ 3.

Per candidate: match (safe to li_mark_booked), ambiguous (NEVER mark it — list the candidates in others, best first, for a human to pick), none, or ignored (marked not from LinkedIn with li_ignore_calendar_event — skip it, never mark it). Each carries the rule, the chosen prospect's signals/score, a one-sentence reason, and the other candidates.

Input Schema

NameRequiredDescriptionDefault
sessionIdNoLimit to one account by id (li_list_accounts). Omit to cover every account you can see.
candidatesYes1-200 calendar bookings to match, one per event, as read from the calendar
sessionLabelNoMatch only against one account

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedInput schema / properties / candidates / description
      Added value: +"1-200 calendar bookings to match, one per event, as read from the calendar"
    • addedInput schema / properties / sessionId / description
      Added value: +"Limit to one account by id (li_list_accounts). Omit to cover every account you can see."
  2. First observed

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/destructiveHint=false, and the description is consistent, adding 'deterministic, read-only, no LLM' plus the candidate pool it searches and the strong constraint that ambiguous results must never be auto-marked. This is useful operational context beyond the annotations, though it stops short of stating any limits or failure behavior.

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

Conciseness3/5

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

Front-loads the input guidance well, but the middle section is a dense wall of internal scoring rules (first_name +2, last_name_in_email +3, score ≥ 7 and lead ≥ 3) that the agent cannot act on, since the output already carries signals/score. Much of that text does not earn its place from the caller's perspective.

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

Completeness4/5

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

With no output schema, the description carries the return-value burden and does so: it enumerates the four outcomes (match, ambiguous, none, ignored) and the per-candidate payload (rule, signals, score, reason, others). Coverage of inputs, outputs, and follow-up routing is solid for this complexity.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it explains that createdAt and description are required to derive the timing and time-zone signals, and clarifies that name/email/eventId/startsAt should reflect what the event shows. This goes beyond the schema's field-level docs.

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?

States a specific verb and resource ('Match booking attendees you read from the user's calendar ... to prospects') and immediately qualifies it as deterministic, read-only, no LLM. It is clearly distinguishable from siblings like li_mark_booked and li_ignore_calendar_event, which it explicitly feeds into.

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

Usage Guidelines4/5

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

Tells the agent what to pass and why (createdAt and description carry timing/time-zone signals), describes the candidate pool, and routes the agent to the right follow-up tools per outcome ('safe to li_mark_booked', 'NEVER mark it', 'marked not from LinkedIn with li_ignore_calendar_event'). It does not explicitly frame when to prefer this over any competing tool, but the workflow context is unambiguous.

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