Documentation
Working with Lumnis

Lumnis MCP

Research people, companies, and audiences, inspect the evidence, and continue approved work from your AI assistant.

Reviewed 2026-11-05

Lumnis MCP brings your people, company, and audience intelligence into an AI assistant. Find the right people, inspect their evidence and available CRM context, research a company or person, and continue approved work using the same Projects and campaigns you see in Lumnis.

This guide covers connecting to Lumnis's hosted MCP endpoint and every registered tool, not configuring external MCP servers for SDK-driven agents. You do not need to install an SDK or create your own server to use this connector.

Jump to a tool 66 tools

Connect your assistant

Use an MCP client that supports a remote HTTP server with OAuth authentication. The server URL is:

https://app.lumnis.ai/mcp
  1. Add that URL as a remote MCP server in your client.
  2. Complete the Lumnis OAuth sign-in and authorization in your browser.
  3. Ask your assistant to call get-my-account. Choose the organization you want to work in from the returned organizations list.
  4. Before planning a people search or named-company map, load get-lumnis-skill with skill: "prospecting" or skill: "account_research". It returns an authored guide, not a generated plan or a research run.

Client menus vary. Use your client's remote-server setup instructions instead of assuming that every client has the same connector screen. A configured URL is not proof that authentication succeeded: check the account response.

No Lumnis API key is pasted into the conversation. Never share passwords, session cookies, or verification codes in chat. Connecting a LinkedIn or email sending account is a separate browser authorization flow, described below.

Scope, IDs, and returned data

Organization-scoped tools require organization_slug; get-my-account and get-lumnis-skill do not. Use an exact slug returned by get-my-account, not an organization name. Requests run under the signed-in user's access; supplying a different slug does not grant access to another organization.

list-projects, list-pipelines, and list-campaign-pending-actions default to the caller's own work. Their member_emails filter selects specific organization members; all_members: true selects the whole organization and takes precedence over member_emails. Discover teammate emails from get-my-account; do not guess them. These filters select whose work to read, not which account to authenticate as.

Tool inputs generally use snake_case, while many result fields use camelCase. Keep the returned names intact. Results are generally JSON inside MCP text content; get-lumnis-skill returns the authored Markdown string directly, not a JSON-encoded document. Check both the MCP isError flag and fields such as failed, partialFailure, pending, and error; a response can preserve useful successes alongside failures. Null, unavailable, and an empty list do not all mean the same thing.

IdentifierWhere to obtain itWhere it is used
Organization slugget-my-account → organizations[].slugorganization_slug
Project IDlist-projects or a launch resultProject-scoped reads and writes
Local prospect IDlist-prospects, get-project, or add-prospects-to-projectProspect detail, research, enrichment, and enrollment
Local campaign IDget-project → campaigns[].id or soleLiveAiCampaign.id; launch → localCampaignIdCampaign stats, settings, and adding prospects
Backend AI campaign IDLaunch → campaignId; a local campaign's aiCampaignIdOptional campaign filter on the pending-action tool
Action IDlist-campaign-pending-actionsApproval decisions
Account sluglist-account-intelligence → accounts[].slug; launch → accountSlugget-account-intelligence.account_slug
Audience brief IDlist-audience-briefs → runs[].id; launch → briefIdget-audience-brief.brief_id
Monitor IDlist-monitors → monitors[].id; create-monitor → monitorIdmonitor_id on the monitor tools
Assessment IDget-monitor-rankings or get-monitor-account-timeline → items[].idassessment_id on the monitor tools
Target account IDget-monitor-rankings → items[].targetAccountIdAccount timeline and owner changes
Intro link IDlist-intro-links → link.id; add-prospects-to-intro-link → linkIdlink_id when removing people or turning a link off

An approval action's backend prospectId is not interchangeable with the local Prospect ID accepted by get-prospect-timeline. Use the timeline already attached to that pending action when reviewing it.

Read first, confirm before spending or acting

Searches, committee searches, new Account Intelligence runs, new Person Intelligence research, Audience Research, account monitors, and contact enrichment can spend credits. Confirm the targets, scope, and credits before launch. Phone enrichment is opt-in and materially more expensive than email-only lookup. A refresh can buy new research; it is not just a page reload.

Creating or editing Personas and playbooks changes saved configuration. Changing campaign settings can enable channels or automatic actions. Adding people to an active campaign can make them eligible for real outreach. Approving an action can send its message or connection request. Review and confirm those changes before calling their tools.

Not every action requires routine approval by default. Campaign guardrails and approval settings decide what can run. Report the settings returned by the campaign rather than promising that every message or action will wait. An autonomous pipeline can still have actions requiring human review.

Read-oriented tools can also reconcile status or warm a cache. For example, get-action-history verifies unfinished actions, research polling refreshes run state, live CRM matching can populate cached matches, and LinkedIn status checking may repair connection setup. These are not new outreach launches.

Practical workflows

Research a company and the people who matter

  1. Check existing research. Use list-account-intelligence and read a matching account before buying another run.
  2. Draft and review. For a new focus, use draft-account-intelligence. Review its company, literal roles, and criteria with the user.
  3. Confirm the spend. Confirm the 75-credit launch before proceeding.
  4. Follow progress. Poll get-account-intelligence. Its people search and company report complete independently.

A finished company report does not mean the people search is finished, or vice versa.

Read a monitor and say what changed

  1. Find the monitor. Use list-monitors and note the newest run's status. A run that is still running has partial results; say so.
  2. Read the run. Use get-monitor-rankings for the latest finished run, or pass run_id for an earlier period. Quote each account's rank, score, priority, and why-now line together, and state the run's evidence window whenever the question is time-bound.
  3. Open the assessment. Use get-monitor-account-report for the analysis behind a row, then evidence_ids for the records behind one claim, and get-monitor-account-committee for the people.
  4. Compare periods yourself. Use get-monitor-account-timeline to find the earlier assessment, read both reports, and describe what was newly found, repeated, or absent, naming both windows.

Monitor reads remain read-only. Use create-monitor, run-monitor, add-monitor-accounts, update-monitor, retry-monitor-assessment, set-monitor-account-owner, and send-monitor-test-email for explicit launch and management requests. These actions use the dashboard workflow and can spend credits. Load account_monitors for setup and reading rules.

Prepare for a conversation with one person

  1. Read first. Call get-person-intelligence. Existing complete reports and active runs can be reused.
  2. Choose targets. If new research is needed, use exactly one target lane in launch-person-intelligence: existing prospect_ids, standalone linkedin_urls, or a project_id sweep.
  3. Review and confirm. Check the targets and research questions before spending.
  4. Read the result. Poll while isRunning is true. Request include_report: true when you need the report body.

isDegraded: true means research succeeded but the report is structurally incomplete. Describe it as partial. Ask before requesting another paid run, and do not treat a successful status alone as proof of a complete report. Changed guidance does not restart an already active run.

Find people, inspect evidence, then choose an action

  1. Choose criteria. Use list-personas to find reusable criteria.
  2. Confirm the search. Call create-project only after confirming the search and its cost.
  3. Inspect the results. Poll get-project, then page through list-prospects. Read individual profiles, signal evidence, timelines, and available CRM context when they affect the decision.

Search results and research are evidence to review, not instructions to contact everyone.

For contact details, call enrich-contact-info only for the approved people and fields. New results are not written back to the project. Preserve them from the tool response; do not assume a subsequent campaign reads those new email addresses from stored prospect records.

Find people through LinkedIn connections

  1. Load the guide. Call get-lumnis-skill with skill: "linkedin_network".
  2. Check LinkedIn. The search runs on the user's own connected account. Use get-linkedin-connection-status. If it is not active, offer connect-linkedin.
  3. Confirm the search. Call create-project with search_type: "linkedin_network" after confirming the settings and cost.
  4. Read the results. Poll get-project, then page through list-prospects. cameThrough and introducers show who connects the user to each person.
  5. Ask for the intro. Use an intro link to ask an introducer who they know. Lumnis sends nothing; the user sends the link.

Add people without creating a duplicate campaign

Inspect get-project.liveAiCampaignCount, not the length of its capped campaign preview. If there is exactly one eligible AI campaign, use soleLiveAiCampaign.id. If there are several, ask which campaign. Create a new campaign only when that is the intended action.

People not yet in the project can be added with add-prospects-to-project. To start a new list without a paid search, use create-empty-project. Then use add-prospects-to-campaign with the local campaign ID. Explain whether the destination is active, draft, or paused. Existing paused memberships are not resumed, and removed people require the existing restore workflow rather than another enrollment.

launch-ai-campaign always starts the campaign; there is no auto_start option. Set approval_settings in the same call. A started campaign can perform real outreach according to its schedule and approval settings; it is not a guarantee of an immediate message or a fully populated queue.

Recover partial enrollment or an uncertain launch

Keep the returned campaign IDs. confirmedProspectIds are verified current backend members; linkedProspectIds are confirmed local links. Check localLinkPendingProspectIds, unresolvedProspectIds, historicalProspectIds, and notAttemptedProspectIds separately. Aggregate CRM skips do not identify which individual people were excluded.

For incomplete enrollment, follow the returned recovery call for the same campaign using add-prospects-to-campaign with reconcile_only: true. This checks membership and repairs confirmed local links without reenrolling. An empty readback immediately after a timeout does not prove a delayed write will never complete. Do not repeat normal enrollment or create another campaign as a blanket retry.

Launch withholds automatic start when enrollment or local linking needs attention. A creation timeout can return created: null and creationOutcomeUnknown: true; a start timeout can return started: null and startOutcomeUnknown: true. These mean unknown, not false. Local DRAFT status does not prove the backend is stopped. The local status in get-campaign-stats alone cannot settle an uncertain start; verify live backend status in the existing dashboard campaign view before another write. When a deadline prevents a start request from being sent at all, the result instead says started: false and startOutcomeUnknown: false.

Enrollment has a bounded HTTP time budget and paginated membership readback. Exhausting either returns unresolved work instead of silently treating every requested person as enrolled. These checks do not make multiple systems one atomic transaction; read the recovery result before deciding the next action.

Review pending actions with their conversation context

Read list-campaign-pending-actions, including the attached timeline before approving a reply. decide-campaign-actions supports different decisions in one call and returns per-sender and individual results. An approval executes as the campaign's sender, not automatically as the manager reviewing it. Keep successful results if another item fails; do not reapprove the whole batch blindly.

Account and sender tools

The shared organization_slug input is required below unless a section says otherwise. Input summaries highlight the supported controls; your connected client's tool schema provides the complete validation rules.

get-my-account

Read & inspect

Finds your profile, organizations, roles, and teammates so your assistant can choose the correct workspace.

Inputs

None. No organization_slug is needed. Use this tool to find your organizations.

Returns

  • The signed-in user's profile.
  • organizations, each with its slug, role, and member roster. Use these to choose the workspace and discover teammate emails.
  • Account and team information visible to the connected assistant.

get-lumnis-skill

Read & inspect

Returns an authored prospecting, account research, account monitor, campaign setup or LinkedIn network guide as plain text without model calls, research, or credit spend.

Inputs

Only skill is required. Choose:

  • "prospecting" — guidance for finding and reviewing the right people.
  • "account_research" — guidance for researching a named company.
  • "account_monitors" — guidance for answering from a monitor's saved runs.
  • "campaigns" — guidance for setting up campaigns: how many, which playbook, and who is copied on emails.
  • "linkedin_network" — guidance for finding people through LinkedIn connections and asking for an intro.
  • "account_focus" — guidance for finding one team, function or product at a named company.

No organization_slug, ICP, context, or objective is required. Authentication is still required.

Returns

The selected human-authored Markdown string directly in MCP text content, including its version and review date. The result is not a generated plan or JSON document. The endpoint makes no model calls, database reads, provider requests, or credit charges, and does not launch or change anything.

Usage notes

The prospecting guide explains conditional search selection, seed quality, criteria versus configuration, evidence review, and recovery from weak results. The account research guide covers company identity, reviewed buying roles, existing research, independent people/report progress, evidence gaps, and a reviewable account brief. The account monitors guide covers evidence windows, unscored rows, comparing two saved assessments by hand, and the questions a monitor cannot answer. The LinkedIn network guide covers whose network to search, how close to look, reading introducers, and asking for an intro. The calling assistant applies the text using context already in the conversation. Guidance never substitutes for user consent, tool authorization, or the current input schema.

get-linkedin-connection-status

Account setup

Checks your LinkedIn connection and may repair setup state, with only an active result confirming a completed connection.

Inputs

organization_slug.

Returns

The authenticated user's LinkedIn connection state. Only status: "active" confirms an active connection. Checking can repair setup or initiate playbook preparation; it does not send outreach.

connect-linkedin

Account setup

Returns a browser sign-in link for LinkedIn or reuses your active connection unless you explicitly request reconnection.

Inputs

organization_slug; optional reconnect defaults to false. Use true only for an explicitly requested reconnection.

Returns

An existing active connection, or status: "authentication_required", authorizationUrl, and nextStep. The user completes sign-in in their browser. Verify afterwards with get-linkedin-connection-status; receiving a URL is not a completed connection.

list-email-inboxes

Read & inspect

Lists sending inboxes for you or a selected org member, including stable mailbox IDs, without reading messages.

Inputs

organization_slug; optional executing_user_email for another member of the organization.

Returns

The caller's sender identity, sending inboxes in the selected organization, and setupRequired. Includes connected Gmail, Outlook, and IMAP inboxes and Lumnis-provisioned inboxes where available. Each inbox has a mailboxId and its email address. Lumnis creates the mailboxId, so it works the same for every provider. It does not read email message contents. A sync error is not evidence that no inbox exists.

setup-email-sender

Account setup

Creates or reuses your email sender identity from supplied personal details and a mailing address without provisioning domains or mailboxes.

Inputs

organization_slug, first_name, last_name, and the user's confirmed physical_address; optional title.

Returns

The created or reused email sender identity. This is separate from a search Persona and does not provision a domain or mailbox. Use the user's real details, then call connect-email-inbox.

connect-email-inbox

Account setup

Returns a browser sign-in link to connect your Gmail, Outlook, or IMAP sending inbox after sender setup.

Inputs

  • organization_slug — your selected organization.
  • provider — gmail, outlook, or imap.
  • daily_send_cap — optional; defaults to 20 and accepts 10–40.

Check list-email-inboxes and complete sender setup first if required.

Returns

A hosted authorizationUrl and browser sign-in instructions. The inbox belongs to the authenticated caller's sender in this organization. After sign-in, call list-email-inboxes again and verify the inbox appears. Connecting does not send email or launch a campaign. If the result is sender_setup_required, complete the returned setup step before requesting another authorization link.

Projects, prospects, and contact details

list-projects

Read & inspect

Lists your prospect search projects with filters and pagination, with options to include teammates and pipeline projects.

Inputs

  • Required: organization_slug.
  • Scope: optional all_members or member_emails.
  • Filters: optional name_contains, updated_since, and updated_before.
  • include_pipeline_projects — optional; defaults to false.
  • limit — defaults to 50; maximum 200.
  • offset — defaults to 0.

Returns

projects, totalCount, limit, and offset. Rows contain compact metadata, statuses, counts, and pipeline links, not the full search description. The default is the caller's standalone projects. Increment offset by limit until the returned window reaches totalCount.

get-project

Read & inspect

Shows search progress, judgment-filtered prospect previews, full prospect and campaign counts, and the sole live AI campaign when exactly one exists.

Inputs

  • Required: organization_slug and project_id.
  • prospect_limit — defaults to 20; accepts 0–50.
  • judgment_status — optional: verified, needs_review, or flagged; filters the non-excluded prospect preview.
  • campaign_limit — defaults to 10; accepts 0–20.

Returns

Project details, prospect and campaign previews, complete campaignCount and liveAiCampaignCount, campaignsTruncated, and soleLiveAiCampaign when exactly one eligible AI campaign exists. Prospects include judgmentStatus and judgmentLabel. prospectCount counts all matching non-excluded people; prospectsTruncated indicates a capped preview. prospectStats supplies full saved-project counts, even with prospect_limit: 0 or a judgment filter (see judgment and counts). While a search runs, liveSearch gives the current step, a percent from the steps finished, and a partial candidate preview, not a raw agent trace. Use list-prospects for full pagination; increasing a preview limit does not make the preview an unlimited list.

get-action-history

Read & inspect

Reads a project’s recent search actions and refreshes unfinished action statuses.

Inputs

organization_slug, project_id.

Returns

The latest 50 project search, rerun, and expansion actions. There is no offset parameter. Unfinished actions are checked against live state, and their stored status may be updated.

create-project

Can spend credits

Spends credits to start a prospect search using profile criteria, buying signals, engagement, lookalikes, a LinkedIn network, a public web list, or a Sales Navigator source.

Inputs

organization_slug, name, search_query, and search_type; search_limit defaults to 50 (1–5000). Supported search types and their important companion fields are:

search_typePurpose and additional inputs
autoSelect a discovery lane from the audience description; optional competitor/company and profile seeds.
generalMatch people by profile and audience criteria.
job_signalFind people at hiring companies; optional job_signal_date_range.
sales_navigatorUse a people-search or lead-list sales_navigator_url. A suitable connected LinkedIn subscription is required.
linkedin_networkFind people through LinkedIn connections. Optional network_distance, connections_of, and target_accounts. Needs your LinkedIn connected.
web_listPull the people named on a public page, such as an event, customer stories, an award list, or podcast guests. Name the page in search_query. Unused credits are refunded.
post_discoveryFind people around topic-matching posts; optional post_topics, posts_date_range, and author/reactor/commenter controls.
competitor_engagementFind people engaging with competitor posts; engagement_types plus competitor targeting.
competitor_rep_engagementFind authors of posts competitor sales reps engage with; competitor targeting, engagement_types, and optional rep/crawl controls.
influencer_engagementFind qualified engagers around named experts; requires seed_profiles and engagement_types.
lookalikesExpand through shared engagement; minimum search_limit 50, optional source_brand_run_id from a finished audience run.

For competitor targeting, competitor_mode: "strict_only" takes a competitor_list; "auto_find" takes your company website plus optional anchor competitors. Do not mix incompatible modes. Advanced schemas include company/executive post selection, title replacements, and per-source limits.

Other controls include an explicitly selected persona_id and optional source_persona_version_id, delegated owner_email, overlap exclusions, max_candidates_per_company, verification/ranking options, stacked signals or auto_select_signals, and intent_scoring_instructions. Optional template fields do not constitute a general sequence-management API.

For linkedin_network, leave out connections_of to search the user's own network. network_distance accepts 1, 2, and 3 and defaults to [2]: 1 is people the user knows, 2 is people the user's connections know, and 3 is further out. To search someone else's network, put their LinkedIn profile URLs in connections_of. Each must be the user's direct connection; anyone else is skipped. There, network_distance accepts only 1 or 2: 2 is people they know that the user does not, and 1 is people both know. target_accounts takes company names, websites, or LinkedIn company URLs, and returns only people now at those companies.

Do not combine explicit signals with auto_select_signals. Available signals are engagement, hiring, recently_joined, funding, and events; job-change evidence is recently_joined, not a separate search type. posts_extract_commenters defaults to false on this tool, and executive title overrides replace the default list rather than extending it. Ranking and backfill options can surface lower-fit candidates; review their evidence instead of assuming every returned result passed every criterion.

Returns

A project identifier and initial search state, with creditsUsed and creditsRemaining. Creation starts paid asynchronous research; poll get-project, then inspect the results. Cost depends on the lane, selected signals, and target count. Auto selection uses a flat per-prospect rate; manual signal selections can increase the lane's base cost. Confirm the actual configuration instead of assuming all searches cost one credit per person. Search-start failure and later partial results are different outcomes; follow the returned error and credit state.

Prospect judgment and counts

The MCP uses the same judgment classifier as the project detail table:

judgmentStatusjudgmentLabelMeaning
verifiedVerifiedMeets must-have criteria under the current evaluation, with no outstanding review signal.
needs_reviewNeeds reviewMissing or uncertain evaluation evidence, an explicit geography mismatch, a partial/weak relevance assessment, or a failure that cannot be confirmed from its criteria.
flaggedFlaggedOne or more must-have criteria were not met under the current evaluation.

These judgments are independent of score, lifecycle status, campaign membership, human review, and isExcluded. Verified does not mean the person's email or phone is verified, or that a human approved outreach. Flagged does not mean excluded. Missing evaluation data stays in Needs review. The shared classifier also handles legacy field names and preference-only criteria failures; avoid reconstructing these groups from score thresholds or one raw boolean.

get-project and list-prospects return prospectStats:

{
  "scope": "all_saved_prospects",
  "deduplicatedBy": "normalized_linkedin_url_per_exclusion_list",
  "totalCount": 120,
  "included": {
    "totalCount": 100,
    "judgmentCounts": { "verified": 70, "needs_review": 20, "flagged": 10 },
    "statusCounts": { "NEW": 80, "CONTACTED": 15, "REPLIED": 5 },
    "inCampaignCount": 20
  },
  "excluded": {
    "totalCount": 20,
    "judgmentCounts": { "verified": 2, "needs_review": 8, "flagged": 10 },
    "statusCounts": { "NEW": 20 },
    "inCampaignCount": 0
  }
}

Counts cover all saved people, independent of pagination, judgment filters, and preview limits. Each exclusion list keeps the oldest row per normalized LinkedIn URL; rows without URLs remain separate. A URL present in both lists counts once in each. Each list's judgment counts sum to its totalCount. statusCounts reflects stored lifecycle statuses (absent statuses count as zero); campaign membership counts overlap those statuses and judgments.

These are saved-record counts, not live search preview counts or UI counts after contactability, campaign, geography, or display-limit filters. During a search, newly discovered candidates may not yet be saved. Use the full counts when summarizing project quality and the filtered totalCount when paging results.

For example, review uncertain people with:

{
  "organization_slug": "your-org",
  "project_id": "project-id",
  "judgment_status": "needs_review",
  "limit": 50,
  "offset": 0
}

Pass this to list-prospects; use the same judgment_status with get-project for a preview. Add include_excluded: true to list-prospects only to inspect excluded people in that judgment group.

list-prospects

Read & inspect

Filters project prospects by Verified, Needs review, or Flagged with full project counts, compact profiles, signals, and optional CRM context.

Inputs

  • Required: organization_slug and project_id.
  • Pagination: limit defaults to 50 (maximum 200); offset defaults to 0.
  • include_excluded: true selects only excluded prospects, not active and excluded combined.
  • judgment_status — optional: verified, needs_review, or flagged. Omit for all groups. Combines with include_excluded and filters before pagination.
  • include_summary — defaults to true.
  • crm_match_mode — optional; none (default), cached, or live.
  • include_crm_account_context — defaults to false.

Returns

prospects, totalCount, limit, offset, and prospectStats. totalCount counts all matches for the exclusion and judgment filters before pagination. prospectStats stays unfiltered. Each row has judgmentStatus, judgmentLabel, compact profile, fit, campaign, pause/exclusion, intent, intentSignals, and signalEvidence fields. Heavy rawData is omitted. Page with limit/offset. CRM matching can add contact links and account/deal context; live matching adds latency. Failures appear in crmEnrichment.errors without suppressing the prospect page. A missing match is not proof that the person is absent from every CRM. These controls inspect CRM context; they do not write CRM contacts or deals.

Usage notes

People found through a LinkedIn network search can also carry cameThrough, the names of the people they are connected to, and introducers, the people who can introduce the user to them.

get-prospect

Read & inspect

Reads a prospect’s judgment, full profile, research, signals, and outreach history with optional CRM context.

Inputs

organization_slug, project_id, prospect_id; optional crm_match_mode and include_crm_account_context as above.

Returns

Full local prospect detail, including judgmentStatus, judgmentLabel, rawData, experience, signal evidence, sequence state, and outreach history, plus cameThrough and introducers where available. The prospect must belong to the specified project. Optional CRM failures remain non-fatal and are reported alongside the core record.

get-prospect-timeline

Read & inspect

Shows a prospect’s outbound actions, inbound replies, and pending next action in chronological order.

Inputs

organization_slug, project_id, and a local prospect_id; optional limit accepts 1–500 and keeps the most recent actions.

Returns

prospect, chronological actions, and the current pendingAction. Actions include content, channel, timestamps, and reasoning where available. Inbound replies can appear as cancelled records whose agentReasoning contains inbound_reply_received; interpret these as the prospect's replies, not cancelled outbound messages. Omit limit for full history; there is no offset pagination.

Usage notes

Timeline resolution requires an attached AI campaign and a stored LinkedIn URL, so this tool cannot resolve every email-only or manually added person. Its identity lookup currently inspects only the first 500 backend campaign prospects. A lookup failure does not prove there is no membership or prior history, particularly in a larger campaign. For approval review, use the timeline attached to the pending action where available.

find-linkedin-profiles

Read & inspect

Finds possible LinkedIn profiles from names and companies without saving prospects or charging customer credits.

Inputs

organization_slug and people (1–50), each with name, company, and optional title.

Returns

results, one per row in the order given. Each has a status (matched, not_found, or error) and up to three candidates with their LinkedIn URL, name, current title, and current company. A match is a possible identity, not a confirmed person, so ask the user to choose when it is unclear. Nothing is saved or researched, and no credits are charged. Do not repeat a timed-out lookup automatically. To save a confirmed person, use add-prospects-to-project.

search-account-committee

Can spend credits

Finds an account’s committee for a fixed credit charge using live search and reviewed criteria, and reads saved results for free.

Inputs

organization_slug, then one of two forms.

  • New search: request_id, account, and criteria_definitions, with optional titles, criteria_classification, max_candidates_per_account, and limit_per_account. request_id is a UUID you make. Reuse it on any retry, because a new ID starts new paid work.
  • Read a search: response_id alone, from the responseId a new search returns.

account needs an id, a name, and a domain or linkedinUrl. Titles only narrow discovery.

Returns

Ranked people with criterion scores, evidence, and accepted, unresolved, or rejected status. A new search costs 10 credits, so confirm the account and criteria first. Reading a search is free. selected: true means a recommended committee member, not verified eligibility. A finished search can still be partial, so check result.outcome and coverage before calling the committee complete. Nothing is saved, and no monitor changes.

enrich-contact-info

Can spend credits

Finds emails and optional phone numbers with provider verification status, spending credits for new lookups without saving results to the project.

Inputs

  • Required: organization_slug.
  • Targets: exactly one of prospect_ids or linkedin_urls, up to 100 targets.
  • include_email — defaults to true.
  • include_phone — defaults to false.
  • refresh — defaults to false.

At least one contact field is required. Contacts are not filtered by verification.

Returns

Per-person results, requestedFields, target and deduplication counts, totalCost, costComplete, unknownCostLookups, and persisted: false. Stored project values are reused unless refreshed, and are returned as-is rather than newly verified. Standalone URLs require a provider lookup. New results are not written back to the project. Optional deepWebFindings are separate research evidence, not automatically verified primary contact values.

Usage notes

Each requested contact field includes its source, raw provider status (emailStatus / phoneStatus), and a normalized emailVerification / phoneVerification label: verified, unverified, or unknown. These are provider-reported claims, not independently verified by Lumnis. Present the status alongside the contact instead of treating every enriched value as verified.

For email, VERIFIED, DELIVERABLE, and VALID map to verified; HIGH_PROBABILITY, CATCH_ALL, RISKY, INVALID, and UNVERIFIED map to unverified. For phone, VERIFIED maps to verified, while RISKY, INVALID, and UNVERIFIED map to unverified. Matching is case-insensitive. Stored contacts, absent contacts, missing statuses, and unrecognized statuses are unknown; the raw status remains available when supplied for a returned provider value. An unverified result is still returned, not discarded.

On partial failure, retain successful fields and inspect unresolvedTargets and failures. totalCost is only reported cost. If costComplete is false, the final charge is unknown, including for timed-out lookups. Confirm any targeted retry with the user; do not retry the entire paid batch.

create-empty-project

Changes saved data

Creates a free project with no search, optionally adding people by LinkedIn URL, without enrolling anyone in outreach.

Inputs

organization_slug, name, and optional prospects (one or more, same shape as add-prospects-to-project).

Returns

projectId, projectSlug, name, and, when people were supplied, the same fields as add-prospects-to-project. It is free: no search runs and no credits are used. A taken name gets a numbered variant, so to add more people later use add-prospects-to-project with the returned projectId. If adding people fails, the error names the project that was already created.

add-prospects-to-project

Changes saved data

Adds manually supplied people to an existing project without search credits, identifying duplicates without enrolling them in outreach.

Inputs

organization_slug, project_id, and prospects (one or more; there is no upper limit). Each person needs a valid linkedin_url or email. name is optional with a LinkedIn URL (read from the URL when missing) and required with an email only; optional title, company, and location provide useful context.

Returns

created, duplicateInputsRemoved, optional duplicatesSkipped, resolved prospects[].prospectId, and unresolvedTargets. This is a free, synchronous saved-record write, not a search or campaign launch. If target IDs cannot be read back after creation, inspect existing project rows rather than repeating creation.

add-prospects-to-crm

Changes saved data

Writes up to 50 people to the organization’s connected Attio or HubSpot, linking existing CRM records by LinkedIn, email or name and company and creating only when nothing matches; free.

Inputs

organization_slug, optional provider (attio or hubspot; optional when exactly one CRM is connected, required when both are), and people (1–50). Each person needs a linkedin_url, or a prospect_id whose saved prospect has one; the saved prospect fills in name, email, title, company and company domain, and values you pass win. Optional name, email, title, company, company_domain, location, and custom_fields (CRM property names mapped to text values). company_linkedin_url is accepted but not used yet.

Returns

provider, totals (requested, created, linkedExisting, failed), partialFailure, and results[] with each person's action (created, linked_existing, or failed), crmRecordId, crmUrl, matchedBy (linkedin, email, name_company, created, or already_linked), and errorCode/error on failure. This WRITES to the organization's own CRM and is free. People are matched by LinkedIn URL, then email, then name and company, and a new record is created only when nothing matches. The company is matched by company_domain when given, otherwise by name. custom_fields are written on create and only fill empty fields on an existing record. Repeating a call links the same records again rather than duplicating them.

An intro link is a page an introducer opens to tick who they know, after a LinkedIn network search shows who came through them. All four tools are free. Lumnis sends nothing: the user sends the link themselves. Anyone with the link can see public profile facts of the people on it.

Read & inspect

Shows who can introduce you to people in a project, each introducer’s link, who is on it and who they ticked.

Inputs

organization_slug and project_id.

Returns

introducers[], each with name, linkedinUrl, peopleFound, peopleIds, tickedPeopleIds, and link (null when none was made): id, url (null unless live), live, mine, ownerName, expiresAt, answeredAt, and people[] with ticked on anyone the introducer knows. Read only.

Changes saved data

Makes an introducer’s link or adds people to their live one for free, returning the link and a message for you to send yourself.

Inputs

organization_slug, project_id, introducer_linkedin_url, and prospect_ids (at least one).

Returns

linkId, url, mine, ownerName, expiresAt, total, added, alreadyOn, skipped, and message, the suggested text to send. It makes a link if there is no live one, otherwise it adds to that link and the URL stays the same. It never replaces anyone. Only people found through this introducer are added; anyone else comes back in skipped. A new link lasts 30 days. If a teammate owns the live link, nobody is added and message is null.

Changes saved data

Takes people off your intro link, except anyone the introducer already ticked and the last person on it.

Inputs

organization_slug, project_id, link_id, and prospect_ids.

Returns

removed, kept, skipped (not on the link), and total. Only the person who made the link can remove people. Someone the introducer already ticked stays and comes back in kept, because the tick is their answer. The last person can't be removed, because an empty link means everyone found through the introducer: turn the link off instead. A link for everyone becomes a fixed list after a removal, so people found later aren't added.

Changes saved data

Stops an intro link’s URL working for good while keeping the introducer’s ticks and drafted emails.

Inputs

organization_slug, project_id, and link_id.

Returns

turnedOff and linkId. The URL stops working for good. The introducer's ticks and any drafted emails stay. Any teammate can do this.

Company and person research

list-account-intelligence

Read & inspect

Lists researched company accounts with research status, run history, and deduplicated people counts.

Inputs

organization_slug; include_archived defaults to false.

Returns

Organization accounts ordered by recent activity, including company information, durable slugs, report/people state, runs, and deduplicated people counts. No tool-level limit or offset is exposed. Check for an existing account before buying another run.

get-account-intelligence

Read & inspect

Reads a company’s facts, research report, buying committee, candidate people, campaigns, and run progress.

Inputs

organization_slug, account_slug.

Returns

Account facts, company report, buying committee, candidates, campaigns, and runs. Poll while people.isRunning or report.isRunning is true. While a part runs, its progress gives the current step and a percent from the steps finished, and progressSummary describes both parts in one line. Treat their completion states independently and check the research date and source evidence before acting on a claim.

draft-account-intelligence

Read & inspect

Researches a company and proposes buyer criteria for review without creating an account or starting the paid people search.

Inputs

organization_slug, company with a public domain, and roles (1–30 literal roles/functions). Company name, logo, employee count, and location are optional. Optional instructions guide the draft.

Returns

Normalized company, roles, and editable criteria, plus nextStep. This researches and drafts review criteria but does not create the account, launch the people search, or spend the 75 launch credits.

launch-account-intelligence

Can spend credits

Uses reviewed buyer criteria to start paid company research and a people search, creating a project and creating or reusing its company account.

Inputs

organization_slug, the reviewed company, roles, and criteria from drafting. Criteria include name, target_audience, must_haves, exclusions, and post_topics, with outreach, seniority, and extra context where relevant. competitors, engagement_activities, and exec_titles are refused. Use the reviewed roles and criteria instead.

Returns

Account/project identifiers, launch state, credit information, and polling guidance. A run costs a flat 75 credits and creates or reuses the durable account while creating run-specific research records. It finds the committee with live company search and the reviewed criteria. It does not collect engagement, hiring, or job-change signals, and required post or web evidence stays unresolved. It intentionally maps the account without excluding everyone already found, contacted, or in CRM. Confirm the reviewed criteria and spend first.

launch-person-intelligence

Can spend credits

Starts paid public-source research for selected people or a project, always reusing active runs and reusing complete reports unless fresh research is requested.

Inputs

  • Required: organization_slug.
  • Targets: exactly one of prospect_ids, linkedin_urls, or project_id. Explicit lists accept up to 50 targets.
  • limit — for a project sweep; defaults to 25, maximum 50.
  • Research guidance: optional company_context, research_instructions, and up to 10 questions.
  • refresh — defaults to false.

Returns

Separate launched and failed arrays, with target identifiers, run IDs, responseId, and reused where applicable. A successful HTTP response can still contain failed targets. Project sweeps choose top-scoring non-excluded prospects; explicit IDs must be visible in the selected organization. Standalone LinkedIn research needs no project. Each new run costs 7 credits per person and is refunded if it fails; a reused report or active run is free.

Usage notes

New research is paid per person. Complete reports and active runs are reused by default; incomplete reports may require new paid work. refresh: true bypasses a completed report, but still reuses an active run. Guidance is research direction, not evidence establishing a fact. Poll with get-person-intelligence; do not relaunch the full batch because one target failed or a report has not arrived yet.

get-person-intelligence

Read & inspect

Checks research by LinkedIn URL or project, showing running and partial-result flags with full reports available on request.

Inputs

  • Required: organization_slug.
  • Target: exactly one of linkedin_url, project_id, or run_id (the exact report's id returned by an earlier read).
  • include_sections — defaults to false. Set it to true to discover section IDs, titles, availability, and sizes without retrieving their text.
  • section_ids — up to 20 exact IDs from that report's sectionIndex. Retrieves selected text for one linkedin_url or run_id; not a project.
  • report_version — optional reportVersion from the index. Use with section_ids to detect a report that changed between discovery and reading.
  • cursor — optional sectionPage.nextCursor from the previous response. Repeat the same target, section IDs, and order to continue reading.
  • include_report — defaults to false. Set it to true for the full original report response. Cannot be combined with section_ids.
  • include_drafts — defaults to false. Set it to true to add outreachDrafts to each run: emails, connectionNotes and linkedinMessages, each variant opening with a different personal detail (hook, optional subject, body). null when the report has none. Combines with any other option and does not return the report body.

Returns

runs with camelCase fields including prospectId, linkedinUrl, status, isRunning, isDegraded, error, startedAt, completedAt, and report. With include_report: false, report: null is returned rather than the report body. A running run also carries progress: the current step and a percent from the steps finished. Reads reconcile run state and are organization-scoped. The current read is capped at 200 runs with no MCP offset input; a project response is not an unlimited research archive. A degraded success is a partial report, not a complete answer or permission to buy a refresh automatically.

Usage notes

Read only what you need.

  1. Call with include_sections: true. Each run adds reportVersion, generatedAt, writer, sectionsAvailable, and sectionIndex. Index entries contain id, title, available, byteCount, and charCount.
  2. Choose relevant IDs from that index, then call with section_ids and report_version. Use the returned run id as run_id when choosing from a project or when a profile has multiple historical reports.
  3. Read sectionPage.sections. Each entry contains the original markdown, its charOffset, total charCount, and hasMore, along with the section's ID, title, availability, and byte count. Full report JSON and visual annotations are not included.
  4. If sectionPage.nextCursor is not null, request the next page. Each page contains at most 12,000 characters of section text in total. Join fragments for each section in offset order before interpreting Markdown, tables, or citations that may cross a page boundary. Character counts and offsets use JavaScript UTF-16 units; pagination preserves surrogate pairs.

For example, to prepare for a call, discover the report's sections and select the IDs for “What they care about” and “Relevant to your context,” if present. Do not assume section numbers or IDs stay the same across reports.

sectionPage.isPartialSelection means you requested only part of the report; it does not mean the source is degraded. Continue to check isDegraded. Unknown section IDs return an error with the available index; a changed report returns report_changed and requires a fresh index. A cursor cannot be reused for a different run or selection.

Older or malformed reports may return sectionsAvailable: false with sectionsUnavailableReason; they remain readable with include_report: true. Reports with document-wide reference-style citation definitions require that full-report mode to preserve citation context. Inline citation links travel with their original section text. Section retrieval does not launch research or spend credits on a new run.

Account monitors

A monitor is a named list of accounts that Lumnis assesses every 7, 14, or 30 days over a fixed evidence window. Every run and every account assessment is saved, so earlier periods stay readable. Seven read tools show the same saved results as the dashboard without spending credits, including two that read the organization's connected HubSpot or Attio so a monitor can be built from a CRM segment. Seven write tools use the same dashboard APIs, permissions, scheduling and credit rules. CRM identity is selected automatically for the organization; saved CRM coverage describes the assessment, not the current connection.

Write actions can spend credits. Review setup and credit impact before launch, while honoring authorization already given. After an unconfirmed write, read saved state before retrying. Legacy CRM connections allow public-only runs; Integrations offers reconnect recovery for future assessments.

create-monitor

Can spend credits

Creates a monitor from reviewed settings and accounts, or starts from an existing monitor’s settings; the first assessments start on the next worker tick or on a chosen first-run date.

Inputs

organization_slug, reviewed settings matching dashboard setup, including account members, depth, cadence, committee criteria and scoring instructions. Each settings.competitors entry must be a website, not a company name. Leave out settings.competitorTitles to use the default titles; send [] for no titles.

Optional settings.crmSource (provider, fields, ownerField — the same object search-crm-companies takes) keeps the list up to date: before each scheduled run the search is rerun and new matches are added. Mark the members you fetched from that search with crmManaged: true. A complete refresh removes those accounts when they stop matching. Accounts added by hand and past reports stay.

Optional settings.crmWriteField (provider, label) writes each finished account's "Why now" and a link to its report to a CRM company field after every run, replacing the last value. The field is found by label or API name, or created as multi-line text. Omit it to write nothing.

Optional settings.signalSearch assesses only accounts where a people search finds a signal this period. Fields: personaId (from list-personas), searches (job_signal, competitor_engagement, competitor_rep_engagement, high_intent; default all four), topics for high_intent (default the persona's post topics), peoplePerSearch (1–1000, default 250) and maxAccountsPerRun (default 100; null assesses every matched account). Each job signal or high intent search costs 1 credit per person, paid before any assessment. With at least one named competitor, the two competitor searches come from the organization's shared weekly search and are free, so the defaults cost 500 credits a run. With no named competitors, the monitor runs those two searches itself at the same price, so the defaults cost 1,000 credits a run. Empty or failed searches are refunded. Accounts present at creation wait for a signal instead of being assessed at once. Omit it to assess every account. The persona must belong to the organization (otherwise a 400, "Choose a persona from this organization"). The two competitor searches need the organization's website or at least one competitor; without both they fail with "Add competitors or your website" and are not charged.

Weekly email: settings.digestRecipients is who gets a short email after each scheduled run (any address; no Lumnis account needed). Omit it to send to every member of the organization, as the dashboard prefills; send [] for no email. settings.digestInstructions (optional) shapes only the email, never what the monitor checks or how it scores.

Optional settings.nextRunAt (ISO date-time with its offset, in the future and at most 365 days ahead) chooses when the first run happens; nothing is assessed or charged before it, and later runs repeat every intervalDays from it.

Optional copy_settings_from (a monitor id from list-monitors) starts from an existing monitor, for example to split it by a CRM field: its depth, cadence, competitors and titles, committee roles, notes and criteria, scoring guide, signal search, CRM source and email settings are copied once, then anything in settings replaces them. Only name and members are then required. Accounts that already have a committee found with the same committee settings in the organization reuse it instead of searching again.

Returns

monitorId and account outcomes. Creates the monitor and schedules its first run; do not also call Run now.

run-monitor

Can spend credits

Requests Run now using the monitor’s saved settings and dashboard credit policy.

Inputs

organization_slug, monitor_id.

Returns

The run id. Requests Run now with existing settings and cadence, using the same running-run conflict and credit rules as the dashboard. On a monitor with signalSearch, Run now starts a sweep: it pays for its searches first, then assesses matched accounts up to the per-run limit. While a sweep is searching, Run now is refused as already running.

add-monitor-accounts

Can spend credits

Adds accounts and queues first assessments for active monitors using dashboard deduplication.

Inputs

organization_slug, monitor_id, members.

Returns

Per-account outcomes and runId when queued. Adds and deduplicates accounts; active monitors queue initial assessments, paused monitors wait for resume. On a monitor with signalSearch, added accounts are still assessed right away at the per-account price; they do not wait for a signal. Adding an account that was removed restores it. These accounts are not removed by a CRM refresh.

update-monitor

Can spend credits

Updates settings, the weekly email and its list, or pauses/resumes a monitor; resuming can queue assessments and spend credits.

Inputs

organization_slug, monitor_id, changes including latest updatedAt from get-monitor-rankings.

Returns

Updated monitor settings or a stale-edit conflict. Supports settings changes and pause/resume, and changes.crmSource replaces the saved CRM search (null stops the refresh). changes.intentScoringInstructions replaces the scoring guide (null clears it). changes.nextRunAt sets when the next scheduled run starts, with its offset, in the future and at most 365 days ahead; later runs repeat every intervalDays from it. changes.committeeRoles and changes.committeeNotes guide only accounts whose committee has not been searched yet, and only when the monitor has no saved committee criteria. changes.crmWriteField picks the CRM field written after each run; null stops writing, and the field and its text stay in the CRM. changes.signalSearch replaces the signal-search settings (same fields as create-monitor); null returns to assessing every account. A run in progress keeps the settings it started with. Turning signal mode off assesses accounts waiting for a signal right away at the usual price (after any searching sweep finishes); turning it on assesses only accounts with a signal from the next run, and saved results stay. Pausing does not cancel queued work, and a searching sweep still finishes and assesses its matched accounts; resuming can spend credits.

Usage notes

Weekly email: changes.digestEnabled turns it off or on (off keeps the list), changes.digestRecipients replaces the whole list, and changes.digestInstructions replaces the email instructions (null clears them). People added to the list get the next scheduled run's email; pass send_latest_email_to_added: true to also send them the latest one now (only the added addresses). The response's latestEmail is then the sent and failed counts, noEmail: true when the latest run had failures and nothing stood out, or null when nothing was sent.

retry-monitor-assessment

Can spend credits

Retries a failed assessment with its original inputs, or re-runs a scored one with the current monitor settings, under dashboard credit/refund rules.

Inputs

organization_slug, monitor_id, assessment_id.

Returns

Saved item/run identifiers and pending state. A failed assessment, or a finished one with no usable score, is retried with its original inputs. A scored assessment is re-run with the current monitor settings over the same window, and is charged like a new one. Each account allows up to 3 retries or re-runs. Signal searches cannot be retried by hand: they run again next period, and a failed or empty search is refunded on its own.

set-monitor-account-owner

Changes saved data

Changes one account’s owner label in a monitor, or clears it; spends no credits.

Inputs

organization_slug, monitor_id, target_account_id (from a rankings row), owner_label (free text; an empty string clears it and the row reads as Unassigned).

Returns

targetAccountId, ownerLabel, and syncedItemId. Changes the owner the way the monitor page does and updates the account's newest saved assessment, so the owner filter in get-monitor-rankings matches right away. Spends no credits.

send-monitor-test-email

Changes saved data

Sends the latest weekly email of a monitor to you only, as a test; spends no credits.

Inputs

organization_slug, monitor_id.

Returns

sentTo. Sends the weekly email of the latest scheduled or Run now run to you only, as the settings' "Send me a test" does, with "[Test]" in the subject and the monitor's saved email instructions. Refused before a scheduled run has finished, or when the latest run had failures and nothing stood out. It writes a fresh summary, so it can take a few minutes. Spends no credits.

list-monitors

Read & inspect

Lists the organization’s account monitors with depth, cadence, account count, schedule, and the newest run’s status.

Inputs

organization_slug.

Returns

monitors[] with id, name, defaultDepth (light assesses the company; deep also reads the buying committee found once when the account joined), intervalDays, status (active or paused), memberCount, nextRunAt, lastRunAt, url (the monitor's page in Lumnis), and latestRun with its status, evidence window, and progress. A searching run is a signal sweep whose searches are still running; it has no accounts yet and shows even on a paused monitor, because a started sweep finishes. Its signal object is the sweep's progress. Pass monitors[].id as monitor_id to the other monitor tools.

get-monitor-rankings

Read & inspect

Reads one monitor run as the page shows it, with global ranks, priorities, scores, why-now reasons, owners, evidence flags, facets, and its evidence window.

Inputs

organization_slug, monitor_id. Optional run_id reads an earlier saved run instead of the latest finished one; priority filters to act, look, or keep (default all); owner filters by an exact owner label from the response's owners list (case-insensitive, not a partial match), or "__unassigned__" for accounts without one; search matches an account name or domain; page selects a 50-row page (default 1); awaiting_page and progress_page page through awaitingMembers and progressItems 50 rows at a time.

Returns

monitor settings, the selected run with windowStart and windowEnd, latestRun for current activity, items[] of 50, pagination, facets counts per priority, hasOwner, monitorUrl, plus bounded progressItems (still running or not scored) and awaitingMembers (never assessed). Each item carries rank, priority, score, level, topReason, ownerLabel, tier, state, completedAt, targetAccountId, url, and the assessment id. rank is a global ordinal over the whole run and does not change with filters. rank: null means unranked. state is the page's label for an account that is not scored, such as Failed or Needs committee. Pages group by priority before rank; follow pagination when needed to identify the global top accounts. A weekly run does not prove coverage of the last 72 hours; state the window.

Usage notes

monitor also holds the weekly email settings (digestEnabled, digestRecipients, digestInstructions), crmWriteField, and crmWriteStatus, one plain line on the latest CRM write. hasLatestEmail: true means a scheduled or Run now run has finished, so there is an email to test or send.

For a monitor with signalSearch, the response also carries signalRunBudget (searchCredits, assessCount, assessCredits, total), the same figures the dashboard shows. searchCredits leaves out the monitor's own competitor searches when it has no named competitors, so add those when you quote a cost. Rows can also say why a search selected the account: signals, evidence, matchedBy, and runWindowEnd. latestSignalRun is the newest sweep. A run with status searching lists each search in signal.searches[] with its status, its current step while running, people when done, and error when failed; signal.checked, matched, and assessed are the run's counts. matched: 0 means no account showed a signal that period, not a failure. A sweep still searching when its period ends is closed, and its open searches count as failed. In awaitingMembers, hasSignal: true means a search found someone there but the run hit its limit; waitForSignal: true means no search has found anyone there yet.

get-monitor-account-report

Read & inspect

Reads one account’s saved analysis from a run: verdict, why-now sections, next step, signal judgments, company and committee analysis, with cited evidence records on request.

Inputs

organization_slug, monitor_id, assessment_id (an items[].id from get-monitor-rankings or get-monitor-account-timeline). Optional sections names the parts to return whole, with evidence ids: verdict, whyNow, nextStep, news, hiring, committee, signals, and report. Optional include adds evidence (every cited record, which is large) or markdown (the same as the report section). Optional evidence_ids returns just the records behind one section, signal, or finding.

Returns

Always assessmentId, account, window, whyNow, followUps (next questions to offer), and reportUrl. With no sections, a short summary: the verdict, why now, the next step, and news, hiring, and committee findings as dated lines. A section with nothing in it reads "No information found". The score shows how strongly this period's activity matches the scoring guide. It does not measure how complete the data is. Current settings do not rewrite a saved assessment.

get-monitor-account-committee

Read & inspect

Reads the committee synthesis and bounded per-person reports for one saved assessment, active people first.

Inputs

organization_slug, monitor_id, assessment_id. Optional people_limit (default 10, max 50) or people (names or LinkedIn URLs) to choose which person reports to return.

Returns

people (each person's name, title, url, activeInWindow, summary, reasoning, and groups of dated claims with evidence ids), the full peopleIndex (name, title, url, activeInWindow) and peopleTotal. People are ordered active-in-window first, then by number of claims, then roster order. The committee synthesis is part of get-monitor-account-report. Light monitors have no committee. A person with nothing in the window reads "No information found". That means no observed activity there, not a negative signal.

get-monitor-account-timeline

Read & inspect

Lists one account’s saved assessments across runs and monitors with scores, statuses, evidence windows and the monitor each came from, for period-to-period comparison.

Inputs

organization_slug, monitor_id, target_account_id (from a rankings row). Optional cursor from a previous nextCursor.

Returns

items[] of up to 25 assessments for that account, newest run first, each with id, runId, score, level, status, completedAt, windowStart, windowEnd, monitor (id, name) and comparable, plus hasMore and nextCursor. History follows the account across every monitor of the organization; comparable marks results that count as an earlier check for this monitor (its own, or a same-depth monitor's from before the account joined). Read an entry with get-monitor-account-report using its monitor.id. The first page also returns signals: one entry per signal sweep that matched the account, newest first, with runId, windowEnd, assessed, searches (type, people, projectSlug), evidence, and matchedBy, even for an account never assessed. The tool does not compute differences or repeated findings; read two assessments with get-monitor-account-report and compare them, naming both windows.

list-crm-company-fields

Read & inspect

Lists the connected HubSpot or Attio company fields with their pick-list choices and flags the field that identifies the CRM owner.

Inputs

organization_slug, provider (hubspot or attio; the organization must have it connected). Optional property_name reads one field in full — required to get Attio select/status choices, which the full listing omits.

Returns

properties[] with name, label, type, the operators the field accepts and, for pick-lists, options[] of { value, label }. A definition with references: "owner" is the field that identifies the CRM user (HubSpot hubspot_owner_id; on Attio only an actor-reference whose name says owner). Read-only and free; no organization data is written.

search-crm-companies

Read & inspect

Reads one page of CRM companies matching ticked pick-list values, with website domains and resolved owner names; the same filter can be saved as a monitor’s CRM source.

Inputs

organization_slug, provider, fields[] — up to five { property, propertyLabel, filterField?, values: [{ value, label }] } taken from list-crm-company-fields; within a field the values OR together, across fields they AND, and an empty list means every company. Attio select/status fields need filterField "option" or "status". Optional owner_field (the field flagged references: "owner") and cursor from a previous page.

Returns

One page of up to 100 companies[] with id, name, domain (the website the monitor keys on) and, when owner_field was passed and the CRM resolved it, ownerLabel; plus nextCursor and, on HubSpot's first page, total. Pass nextCursor back as cursor with the same fields for the next page. The fields/owner_field you searched with is exactly what create-monitor accepts as settings.crmSource. Mark members you fetch from this search with crmManaged: true. Read-only and free.

Audience research

list-audience-briefs

Read & inspect

Lists existing audience research briefs so you can find useful research before paying for another run.

Inputs

organization_slug.

Returns

The newest 25 non-archived organization audience run/brief summaries, so you can find an ID and inspect recent research before launching. No tool-level pagination or archive controls are exposed; a missing older brief is not proof that no previous research exists.

get-audience-brief

Read & inspect

Reads an audience brief’s engagement trends, pain points, audience language, top voices, curated posts, and ranked ideas with optional drafts.

Inputs

organization_slug, brief_id (from list-audience-briefs). Optional sections to return only some parts, include_drafts (default true; affects post ideas only), and feed_limit (0–100, default 10; how many top engaged posts to include). Sections are theRead, howAttentionMoved, themeTrends, takeaways, painPoints, openOpportunities, topVoices, postIdeas, topPosts, competitors, and seeds.

Returns

briefId, status, and the requested sections when ready; otherwise progress or error information. A brief is a readable digest: the headline finding, the engagement analysis (period shifts, theme trends, takeaways, pain points, the audience's own language, top voices), and ranked post ideas with drafts and grounding verdicts. Competitor and seed sections depend on what that run requested. feed_limit caps a preview, not a pageable archive of every collected post. A whole brief is large; pass sections to take only the part that answers the question.

launch-audience-research

Can spend credits

Spends credits to analyze audience engagement and optionally competitor or expert publishing, producing research and content ideas without posting or contacting anyone.

Inputs

organization_slug, audience; optional name, selected persona_id, tier, company_context, content_direction, posts_date_range, competitors, and seed_profiles. Competitor controls include own_company, company/executive post toggles, exec_titles, and max_execs_per_target.

Returns

briefId, initial status, tier, peopleRead, timeframe, source selections, creditsUsed, creditsRemaining, and viewAt. Poll get-audience-brief; the run continues server-side. The audience portion is typically described as 20–40 minutes, not a completion guarantee, and extra sources add time.

Usage notes

Current tiers are light (150 credits, 50 people), standard (default; 300 credits, 100 people), deep (600 credits, 200 people), and max (1,200 credits, 400 people). Confirm the selected tier before spending. Supported windows are past-week, past-2-weeks, past-3-weeks, and past-month (default). Up to five competitors and 25 personal LinkedIn seed profiles can add separate reports. Reading expert seed posts is listen-only; it is different from finding their engagers through a prospect search.

company_context and content_direction also become organization steering defaults for later runs. Do not supply invented company details or save a temporary direction without making that persistence clear.

Personas and playbooks

list-personas

Read & inspect

Lists saved audience definitions, including roles, seniority, industries, locations, requirements, and exclusions.

Inputs

organization_slug.

Returns

Reusable organization Personas and targeting criteria. No tool-level pagination is exposed. Select an existing Persona with the user, or use freeform search criteria when no saved Persona fits.

create-persona

Changes saved data

Saves reviewed targeting criteria as a reusable persona with an initial version, without launching research or a prospect search.

Inputs

organization_slug, name, use_case, and target_audience. Optional structured fields include outreach_reason, must_haves, nice_to_haves, exclusions, seniority bounds, geographies, company_attributes, competitors, post_topics, additional_context, and equal-preference flags. Company attributes cover industries, funding stages, and employee-count bounds. Supported use_case values are sales, recruiting, vc_investor, partnerships, community, fundraising, market_research, and other.

Returns

A saved Persona and initial version whose ID can be used in search or audience workflows. This saves reviewed criteria; it does not run the UI research wizard or launch a prospect search. Recruiting Personas do not retain sales competitor criteria.

update-persona

Changes saved data

Updates selected persona fields or list sections while preserving omitted fields and creating a reversible history version.

Inputs

organization_slug, exact persona_id, and updates and/or section_changes; optional change_note. updates replaces supplied fields or lists. Ordered section operations are add, remove, replace, and clear, for targeting lists and company industry/funding lists.

Returns

The updated Persona with a new reversible history version. Omitted fields stay unchanged; empty lists clear lists, and supported null values clear optional fields. add deduplicates values; remove matches exact strings. Confirm the patch before writing.

list-playbooks

Read & inspect

Lists available outbound playbooks, with an option to include archived playbooks.

Inputs

organization_slug; active_only defaults to true.

Returns

Playbooks available for campaign selection. Set active_only: false to include archived/historical ones. No tool-level limit or offset is exposed. Find a suitable playbook before creating one.

get-playbook

Read & inspect

Reads a playbook’s full text and parsed sections before you choose or edit its messaging strategy.

Inputs

organization_slug, playbook_id.

Returns

A playbook containing full markdown, parsed sections, and sectionFormat (legacy or sectioned). Read it before editing, especially when preserving existing strategy matters.

create-playbook

Changes saved data

Creates an outbound playbook from supplied content or generates one from a goal for use in an AI campaign.

Inputs

organization_slug, name, and a content source. Use content_mode: "provided" with either content or sections, or content_mode: "generate" with a goal. Mode can be inferred when only one source is supplied; make it explicit when ambiguous. Generation also accepts organization_context, up to 20 sample_prospects, and warm_intro_context.

Returns

playbookId, name, and source. Provided markdown is saved verbatim; structured sections produce the canonical headings used by the section editor. Supported sections are sequencing, message_tone, positioning, constraints, cta_strategy, follow_up_logic, objection_handling, and approval_safe. Creating a playbook does not launch outreach, but it creates usable saved campaign strategy.

Usage notes

Structured section bodies are checked before saving. Section-like headings inside examples can confuse the editor, so ambiguous bodies are rejected without creating a playbook. Remove those headings or use complete reviewed content, which is saved verbatim.

update-playbook

Changes saved data

Changes a playbook’s name, complete text, or selected sections while preserving omitted sections and recording a new version.

Inputs

organization_slug, playbook_id, and the requested name, content, or section_updates; optional change_reason. Full content and section_updates are alternatives, not simultaneous sources.

Returns

Updated playbook data with a new version. Full markdown replaces the old text verbatim. A section patch preserves omitted sections and an empty string removes that section. Both the existing document and the proposed merged sections are checked before saving. Unsafe legacy, custom, duplicate, or fenced-heading structures are rejected by section editing rather than silently rewritten. Read the existing text and supply a complete reviewed content replacement when a safe section patch is not possible.

Campaigns, approvals, and pipeline visibility

get-campaign-stats

Read & inspect

Reads one campaign’s counts and status breakdowns, plus pending approvals and funnel stages for AI campaigns.

Inputs

organization_slug and local campaign_id; project_id is optional and is resolved from the campaign when it is omitted. Campaign IDs are unique, and the lookup is scoped to the caller's organization, so a campaign in another organization is reported as not found.

Returns

Campaign metadata and engagement, prospect, execution, and pause breakdowns, and, for AI campaigns when metrics load, metrics.pendingApproval (actions waiting for approval) and metrics.funnel (funnel stages with counts and rates). Failure to fetch metrics does not suppress the local detail. emailMailboxId is the saved inbox, and null means automatic distribution. emailInboxPolicyUnavailable means the saved inbox could not be read. Supports AI and sequence campaign detail, but does not expose sequence lifecycle controls. Local status alone is not proof of backend start/stop state after an uncertain request.

pause-ai-campaign

Changes saved data

Pauses a running AI campaign without removing anyone or deleting anything.

Pauses an active AI campaign, like the Pause button on the campaign page.

Inputs

organization_slug, project_id, campaign_id (the local id from get-project).

Returns

{ localCampaignId, campaignId, name, status: "paused" }. A campaign that is not active is refused with its current status.

resume-ai-campaign

Can affect outreach

Resumes a paused AI campaign, so its agent starts working its people again.

Resumes a paused AI campaign. Its agent starts working its people again.

Inputs

organization_slug, project_id, campaign_id.

Returns

{ localCampaignId, campaignId, name, status: "active" }. A campaign that is not paused is refused with its current status.

remove-prospects-from-campaign

Changes saved data

Takes people out of an AI campaign while keeping them and their history in their project.

Takes people out of an AI campaign. They stay in their project and keep their history. Confirm with the user before calling.

Inputs

organization_slug, project_id, campaign_id, prospect_ids (local ids from list-prospects).

Returns

{ removed, notInCampaign, failed }. People not currently in this campaign are listed in notInCampaign and left alone.

delete-ai-campaign

Changes saved data

Stops an AI campaign and then hides it and frees its people, deleting nothing if the stop fails.

Stops the campaign, then hides it from the dashboard and frees its people. Works on active, paused, draft, and completed campaigns. If the stop fails, nothing is deleted. Confirm with the user before calling.

Inputs

organization_slug, project_id, campaign_id.

Returns

{ deleted: true, localCampaignId, name }, or the error when the stop failed.

launch-ai-campaign

Can affect outreach

Creates an AI campaign from LinkedIn URLs or project prospects and always starts real outreach, naming anyone the backend skips.

Inputs

  • Required: organization_slug, name, playbook_id, and either linkedin_urls or project_id + prospect_ids (exactly one source).
  • linkedin_urls — LinkedIn profile URLs. A free project named after the campaign is created, the people are added (names read from the URLs), then the campaign launches on it.
  • Context: optional goal, company_context, max_prospects, playbook_version, and crm_company_fields (CRM company field names the AI reads, from list-crm-company-fields).
  • Controls: optional guardrails and approval_settings, set in this call.
  • guardrails.person_intelligence — researches each person before outreach. Off by default. Costs 7 credits per person; people already researched are free, and a failed report is refunded. Each person's next message waits for their report; replies never wait.
  • guardrails.cc_emails — addresses copied on every email the campaign sends.
  • executing_user_email — only for an explicitly requested organization teammate.
  • email_mailbox_id — optional exact mailboxId from list-email-inboxes for the same sender. Omit it for automatic distribution.

Returns

Backend campaignId, localCampaignId, projectId, created, mirrored, skippedPeople ({ name, reason }), unresolvedUrls, enrollment counts and exact membership/link IDs, started, actual approvalSettings where available, and nextStep. Partial enrollment returns recovery instructions rather than starting. Read the earlier recovery section for unknown creation/start outcomes.

Usage notes

The campaign is mirrored into the project before enrollment. The backend decides who can be enrolled: anyone already in another active campaign of the same sender (or excluded) is skipped and named with a reason. If everyone is skipped, the empty campaign is deleted and nothing starts (with URLs, the new project still keeps the people). Two rows for the same person in one request are enrolled once. Defaults are seeded from the launch wizard and individual requested overrides are applied. Do not assume every action is approval-gated, change sending hours or approval modes by guesswork, or infer a colleague's sender identity. guardrails.channel: "email_only" avoids LinkedIn outreach but requires the executing sender's email setup. Email sender identity is resolved server-side.

With email_mailbox_id, every email uses that inbox, waits, or pauses for repair; it never switches address. The inbox cannot change after creation, so a different inbox needs a new campaign. The result returns the saved emailMailboxId, and nothing is enrolled or started if it does not match.

add-prospects-to-campaign

Can affect outreach

Enrolls project prospects or LinkedIn URLs into an existing AI campaign that may contact them, naming anyone the backend skips, with reconciliation available for uncertain previous outcomes.

Inputs

organization_slug, project_id, local campaign_id, and either prospect_ids or linkedin_urls (added to project_id, the campaign's home project, free, then enrolled); preview and reconcile_only both default to false. project_id is the campaign's home project. prospect_ids may name people from any project in the same organization: the campaign stays where it is, each person stays in their own project, and the campaign is mirrored into each other source project so those people appear in their own project's campaign view.

Preview. With preview: true nobody is enrolled, nothing is linked and no mirror row is created. The backend runs every overlap check and the tool returns wouldAdd, wouldSkip, per-person findings (for example active_campaign, previously_contacted, active_sequence, CRM matches) and named skips, so the user can choose whom to enroll before anything is written. Findings are warnings, not refusals; a normal call still enrolls people who carry them. A preview is only trusted when the backend confirms it: if a response does not echo the dry run, the tool stops there, reports previewConfirmed: false and lists notPreviewedProspectIds, because that batch may have been enrolled for real.

Returns

Campaign IDs and name, known counts, skippedPeople, unresolvedUrls, enrollmentCountKnown, confirmed and linked prospect IDs, linkedByProject, mirroredProjectIds, unresolved/local-link-pending/historical/not-attempted IDs, warnings, and nextStep. personIntelligenceReused counts people whose existing report was attached for free. Only verified current backend members are linked locally. A source project whose mirror or link fails is named in the error and its people stay link-pending; the other projects are still linked. An active destination may act on new people under its existing settings. This tool does not create a campaign, start a draft, resume paused memberships, or restore removed people.

Usage notes

After a partial or uncertain write, set reconcile_only: true to verify and repair without enrolling again. Existing local links are not proof of current backend membership; reconciliation can report a mismatch without automatically deleting those links. Already-enrolled local rows can be a normal no-op outside reconciliation mode.

update-ai-campaign-settings

Can affect outreach

Updates campaign sending rules, channels, and approval requirements, which can enable automatic outreach or social actions.

Inputs

organization_slug, project_id, local campaign_id, and nonempty guardrails and/or approval_settings. Guardrails cover channel, daily and follow-up caps, likes/comments, active hours/timezone, allowed weekdays (0 is Sunday), and pacing. Approval fields use auto or require per action type. guardrails.person_intelligence turns person research on or off; turning it on mid-campaign also researches, and charges for, people already contacted. guardrails.cc_emails replaces the CC list, and [] turns CC off. Optional crm_company_fields replaces the CRM company fields the AI reads, and [] clears them.

Returns

updated, local and backend campaign IDs, status, guardrails, and approvalSettings. Omitted fields remain unchanged. Completed campaigns cannot be changed. Confirm edits because enabling an action or changing a gate to auto changes real outreach behavior.

list-campaign-pending-actions

Read & inspect

Lists AI campaign actions awaiting review, including phone calls for the rep to make, with prospect details, category filters, and optional prior-interaction timelines.

Inputs

  • Required: organization_slug.
  • Scope: optional all_members, member_emails, and backend campaign_id.
  • Filters: optional filter_category and action_type. action_type takes precedence over the category.
  • Pagination: limit defaults to 100 (maximum 500); offset defaults to 0.
  • include_prospect_details and include_timeline — both default to true.
  • timeline_limit — optional; caps each history at 1–500 recent actions.

Categories are replies, calls, initial, follow_ups, inmails, comments, likes, connections, stop, complete, and meeting_booked. complete means planned outreach is finished; approving it sends nothing.

A call_phone action asks the rep to phone the person; nothing is sent. The number is prospectData.phone. While it is missing and generatorMetadata.phone_lookup.state is queued or running, Lumnis is still finding it; not_found means no number was found. agentReasoning says why to call now. generatorMetadata.callBrief, when present, is short call prep: who, topics, opener, avoid, and reasoning. Show it to the user before they call. A topic marked as an internal source is context for the rep, not something to say to the person.

Returns

Pending-approval actions, totalMatched, and the result window. Each action has prospectLocation and prospectTimezone, or null when unknown. Email cards also have recipientEmail and ccEmails, the exact addresses approving sends to and copies. Results are merged across in-scope campaigns, filtered, then paged; compare the returned count plus offset with totalMatched. Timelines add per-person live reads, so disable them for count-only scans. A timeline may be unavailable; inspect its reason instead of assuming no prior contact. Setting include_prospect_details: false also bypasses timeline enrichment. Read context before approving replies, including on autonomous pipelines.

decide-campaign-actions

Can affect outreach

Approves, rejects, or skips pending actions with optional message edits, executing approved actions from each campaign’s own sender account or recording a rep’s call with its outcome note.

Inputs

organization_slug and 1–100 decisions, each with action_id and decision (approve, reject, or skip). Rejection needs a reason. Approvals can include notes, modified_content, and, for email/InMail, modified_subject. Email approvals can also include recipient_email, which changes who it goes to, including later emails to that person, and cc_emails, which sets who is copied on this email only. [] copies no one. Pass them only when the user asks to change the To or CC.

Returns

bulk per-sender group results, individual results, and a summary. Subject, recipient, and CC edits use individual calls; other decisions are grouped by campaign sender. Approving can execute real outreach from that sender's account. Check each result rather than treating a mixed batch as all-or-none.

Usage notes

For a call, approve means the rep made the call. Put the outcome in notes (spoke, voicemail, no answer, or more detail); the campaign AI reads it when it plans the next step. Skip means don't call now. Put why in reason if the user gives one ("call again in 2 days", "wrong number"); the campaign AI reads it with the playbook to choose the next step. The note and the reason are both optional, and a call can be skipped while Lumnis is still finding the number. Approve a call only after the user says they called.

list-pipelines

Read & inspect

Lists your or your teammates’ pipelines and summary metrics, with local contacted counts treated as a lower bound.

Inputs

organization_slug; optional all_members and member_emails, with caller-only default scope.

Returns

Pipelines and top-level prospect/contact/reply/booking metrics. No tool-level pagination controls are exposed. Local totalContacted can undercount autonomous AI sends, so zero does not establish that nobody was contacted. Pipeline replyMode is not a substitute for checking approvals. This tool reads pipelines; it does not create, pause, or edit them.

get-pipeline-stats

Read & inspect

Reads one pipeline’s project and persona breakdowns alongside live outreach funnel counts for contacted people, replies, and booked meetings.

Inputs

organization_slug, pipeline_id.

Returns

Aggregate metrics, per-project and per-Persona breakdowns, and funnelMetrics from live backend campaign funnels when available. Prefer the funnel for outreach-volume questions over the local contacted counter. If the live funnel is unavailable, describe that limitation instead of presenting the local lower bound as the complete sending total.

Limits of the connector

Tool availability is the registered reference above, not every action in the Lumnis interface. There is no general MCP tool here for pausing a prospect, creating or editing a recurring pipeline, deleting arbitrary records, reading mailbox messages, controlling sequence lifecycles, or deleting an account monitor. Use the appropriate dashboard workflow for operations the connector does not expose.

Research can be incomplete, stale, or missing a source. Provider reads can fail independently of the core Lumnis record. Async launches and paid writes can outlive a client timeout. Preserve IDs and successful results, surface uncertainty, and confirm any additional spend or outreach rather than turning a missing result into an automatic retry.