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.
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- Add that URL as a remote MCP server in your client.
- Complete the Lumnis OAuth sign-in and authorization in your browser.
- Ask your assistant to call
get-my-account. Choose the organization you want to work in from the returnedorganizationslist. - Before planning a people search or named-company map, load
get-lumnis-skillwithskill: "prospecting"orskill: "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.
| Identifier | Where to obtain it | Where it is used |
|---|---|---|
| Organization slug | get-my-account → organizations[].slug | organization_slug |
| Project ID | list-projects or a launch result | Project-scoped reads and writes |
| Local prospect ID | list-prospects, get-project, or add-prospects-to-project | Prospect detail, research, enrichment, and enrollment |
| Local campaign ID | get-project → campaigns[].id or soleLiveAiCampaign.id; launch → localCampaignId | Campaign stats, settings, and adding prospects |
| Backend AI campaign ID | Launch → campaignId; a local campaign's aiCampaignId | Optional campaign filter on the pending-action tool |
| Action ID | list-campaign-pending-actions | Approval decisions |
| Account slug | list-account-intelligence → accounts[].slug; launch → accountSlug | get-account-intelligence.account_slug |
| Audience brief ID | list-audience-briefs → runs[].id; launch → briefId | get-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
- Check existing research. Use
list-account-intelligenceand read a matching account before buying another run. - Draft and review. For a new focus, use
draft-account-intelligence. Review its company, literal roles, and criteria with the user. - Confirm the spend. Confirm the 75-credit launch before proceeding.
- 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
- Find the monitor. Use
list-monitorsand note the newest run's status. A run that is still running has partial results; say so. - Read the run. Use
get-monitor-rankingsfor the latest finished run, or passrun_idfor 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. - Open the assessment. Use
get-monitor-account-reportfor the analysis behind a row, thenevidence_idsfor the records behind one claim, andget-monitor-account-committeefor the people. - Compare periods yourself. Use
get-monitor-account-timelineto 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
- Read first. Call
get-person-intelligence. Existing complete reports and active runs can be reused. - Choose targets. If new research is needed, use exactly one target
lane in
launch-person-intelligence: existingprospect_ids, standalonelinkedin_urls, or aproject_idsweep. - Review and confirm. Check the targets and research questions before spending.
- Read the result. Poll while
isRunningis true. Requestinclude_report: truewhen 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
- Choose criteria. Use
list-personasto find reusable criteria. - Confirm the search. Call
create-projectonly after confirming the search and its cost. - Inspect the results. Poll
get-project, then page throughlist-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 & inspectFinds 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 & inspectReturns 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 setupChecks 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 setupReturns 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 & inspectLists 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 setupCreates 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 setupReturns 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, orimap.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 & inspectLists your prospect search projects with filters and pagination, with options to include teammates and pipeline projects.
Inputs
- Required:
organization_slug. - Scope: optional
all_membersormember_emails. - Filters: optional
name_contains,updated_since, andupdated_before. include_pipeline_projects— optional; defaults tofalse.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 & inspectShows search progress, judgment-filtered prospect previews, full prospect and campaign counts, and the sole live AI campaign when exactly one exists.
Inputs
- Required:
organization_slugandproject_id. prospect_limit— defaults to 20; accepts 0–50.judgment_status— optional:verified,needs_review, orflagged; 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 & inspectReads 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 creditsSpends 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_type | Purpose and additional inputs |
|---|---|
auto | Select a discovery lane from the audience description; optional competitor/company and profile seeds. |
general | Match people by profile and audience criteria. |
job_signal | Find people at hiring companies; optional job_signal_date_range. |
sales_navigator | Use a people-search or lead-list sales_navigator_url. A suitable connected LinkedIn subscription is required. |
post_discovery | Find people around topic-matching posts; optional post_topics, posts_date_range, and author/reactor/commenter controls. |
competitor_engagement | Find people engaging with competitor posts; engagement_types plus competitor targeting. |
competitor_rep_engagement | Find authors of posts competitor sales reps engage with; competitor targeting, engagement_types, and optional rep/crawl controls. |
influencer_engagement | Find qualified engagers around named experts; requires seed_profiles and engagement_types. |
lookalikes | Expand 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:
judgmentStatus | judgmentLabel | Meaning |
|---|---|---|
verified | Verified | Meets must-have criteria under the current evaluation, with no outstanding review signal. |
needs_review | Needs review | Missing or uncertain evaluation evidence, an explicit geography mismatch, a partial/weak relevance assessment, or a failure that cannot be confirmed from its criteria. |
flagged | Flagged | One 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 & inspectFilters project prospects by Verified, Needs review, or Flagged with full project counts, compact profiles, signals, and optional CRM context.
Inputs
- Required:
organization_slugandproject_id. - Pagination:
limitdefaults to 50 (maximum 200);offsetdefaults to 0. include_excluded: trueselects only excluded prospects, not active and excluded combined.judgment_status— optional:verified,needs_review, orflagged. Omit for all groups. Combines withinclude_excludedand filters before pagination.include_summary— defaults totrue.crm_match_mode— optional;none(default),cached, orlive.include_crm_account_context— defaults tofalse.
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 & inspectReads 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 & inspectShows 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 creditsFinds 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_idsorlinkedin_urls, up to 100 targets. include_email— defaults totrue.include_phone— defaults tofalse.refresh— defaults tofalse.
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 dataCreates 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 dataAdds 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 dataWrites 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 & inspectLists 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 & inspectReads 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 & inspectResearches 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 creditsUses 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 creditsStarts 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, orproject_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 10questions. refresh— defaults tofalse.
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 & inspectChecks 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, orrun_id(the exact report'sidreturned by an earlier read). include_sections— defaults tofalse. Set it totrueto discover section IDs, titles, availability, and sizes without retrieving their text.section_ids— up to 20 exact IDs from that report'ssectionIndex. Retrieves selected text for onelinkedin_urlorrun_id; not a project.report_version— optionalreportVersionfrom the index. Use withsection_idsto detect a report that changed between discovery and reading.cursor— optionalsectionPage.nextCursorfrom the previous response. Repeat the same target, section IDs, and order to continue reading.include_report— defaults tofalse. Set it totruefor the full original report response. Cannot be combined withsection_ids.include_drafts— defaults tofalse. Set it totrueto addoutreachDraftsto each run:emails,connectionNotesandlinkedinMessages, each variant opening with a different personal detail (hook, optionalsubject,body).nullwhen 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.
- Call with
include_sections: true. Each run addsreportVersion,generatedAt,writer,sectionsAvailable, andsectionIndex. Index entries containid,title,available,byteCount, andcharCount. - Choose relevant IDs from that index, then call with
section_idsandreport_version. Use the returned runidasrun_idwhen choosing from a project or when a profile has multiple historical reports. - Read
sectionPage.sections. Each entry contains the originalmarkdown, itscharOffset, totalcharCount, andhasMore, along with the section's ID, title, availability, and byte count. Full report JSON and visual annotations are not included. - If
sectionPage.nextCursoris notnull, 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 creditsCreates 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 creditsRequests 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 creditsAdds 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 creditsUpdates 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 creditsRetries 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 dataChanges 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 dataSends 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 & inspectLists 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 & inspectReads 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 & inspectReads 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 & inspectReads 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 & inspectLists 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 & inspectLists 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 & inspectReads 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 & inspectLists 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 & inspectReads 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 creditsSpends 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 & inspectLists 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 dataSaves 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 dataUpdates 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 & inspectLists 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 & inspectReads 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 dataCreates 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 dataChanges 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 & inspectReads 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 dataPauses 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 outreachResumes 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 dataTakes 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 dataStops 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 outreachCreates 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 eitherlinkedin_urlsorproject_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, andplaybook_version. - Controls: optional
guardrailsandapproval_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 outreachEnrolls 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 outreachUpdates 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 & inspectLists 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 backendcampaign_id. - Filters: optional
filter_categoryandaction_type.action_typetakes precedence over the category. - Pagination:
limitdefaults to 100 (maximum 500);offsetdefaults to 0. include_prospect_detailsandinclude_timeline— both default totrue.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 outreachApproves, 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 & inspectLists 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 & inspectReads 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.