Documentation
Working with Lumnis

Lumnis MCP

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

Reviewed 2026-09-09

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 62 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

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, new Account Intelligence runs, new Person Intelligence research, Audience Research, 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, evidence flag, 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.

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 or account research 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.

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, evidence flags, comparing two saved assessments by hand, and the questions a monitor cannot answer. 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 your sending inboxes and sender identity in the selected organization without reading email messages.

Inputs

organization_slug.

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. 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 provides a high-level stage and 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, or a Sales Navigator source.

Inputs

organization_slug, name, search_query, and search_type; search_limit defaults to 50 (1–200). 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.
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. First-degree network search is not exposed by this tool.

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.

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. 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.

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 (1–50, 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 (1–50). 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.

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. 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. Optional competitors, engagement_activities, and exec_titles refine signals. Omitted competitors use the organization's known sales-Persona competitors; an empty list explicitly requests no competitor targets. Activity overrides (reactions, comments, authored_posts) require an explicit competitors list. Executive title overrides replace the defaults.

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 includes engagement, recently joined, and hiring signals. 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. 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. Eight 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. Six 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. Optional settings.crmSource (provider, fields, ownerField — the same object search-crm-companies takes) keeps the monitor topped up: before each scheduled run the search is rerun and new matches are added, never removed.

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 run pays 1 credit per person per search before any assessment, 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.

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.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. Retries eligible work using frozen inputs and existing successor, credit and refund rules. Eligible work is a failed assessment or a finished one with no usable score, up to the same retry limit. 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 latest scheduled run's weekly email 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. 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, and latestRun with its status, evidence window, and item counts. 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, plus bounded progressItems (unfinished, failed, or skipped) and awaitingMembers (never assessed). Each item carries rank, priority, score, level, topReason, evidenceFlag (limited or warnings), ownerLabel, tier, completedAt, targetAccountId, and the assessment id. rank is a global ordinal over the whole run and does not change with filters. rank: null means unranked: validation warnings can exclude a usable score, so inspect score, assessmentStatus, and validationStatus. 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

For a monitor with signalSearch, the response also carries signalRunBudget (searchCredits, assessCount, assessCredits, total): the most one run can cost, computed the same way as the dashboard. A run with status searching lists each search in signal.searches[] with its status, a coarse stage while running (the same stage words as get-project), 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: open searches fail with "Search failed" and unfinished matching with "Matching did not finish". 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 include adds evidence (every cited record) and/or markdown (the prose report); optional evidence_ids returns just the records behind one section, signal, or finding.

Returns

The item row, the run window, the frozen context the assessment used (owner, tier, committee people, scoring guide, depth), and report.analysis as the monitor page presents it: score, level, assessment and validation status, the account-analysis bullets, why-now sections with evidenceIds, the recommendation, every signal judgment, the company analysis (company: news and hiring narratives with findings), the committee analysis (synthesis: patterns, findings, questions) and caveats. About 80 KB for a deep account. report.peopleIndex and peopleTotal list every committee member cheaply; evidenceTotal counts cited records. Caveats collapse per-person coverage lines into their aggregate. Evidence records and person reports are omitted unless requested; a deep account can carry 400 KB of evidence and 50 person reports. 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, summary, reasoning, coverage statement, nothingInWindow, and dated claims with evidenceIds), the full peopleIndex (name, title, URL, activeInWindow, failed) 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 has 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.

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).

Returns

One brief as 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. A whole brief is large; pass sections to take only the part that answers the question.

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. Read-only and free.

Usage notes

Inputs. organization_slug, brief_id; optional sections, include_drafts (default true), and feed_limit (default 10, range 0–100). Sections are theRead, howAttentionMoved, themeTrends, takeaways, painPoints, openOpportunities, topVoices, postIdeas, topPosts, competitors, and seeds.

Returns. briefId, status, and the requested digest sections when ready; otherwise progress/error information. painPoints includes audience language, while postIdeas can include drafts and grounding judgments. Competitor and seed sections depend on what that run requested. feed_limit caps a preview, not a pageable archive of every collected post. Select only the sections needed for the question to reduce response size.

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. 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, and playbook_version.
  • Controls: optional guardrails and approval_settings, set in this call.
  • executing_user_email — only for an explicitly requested organization teammate.

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.

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. 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.

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, and meeting_booked.

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.

Returns

Pending-approval actions, totalMatched, and the result window. 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.

Returns

bulk per-sender group results, individual results, and a summary. Subject 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 creating, enrolling accounts in, pausing, or running 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.