Agents & MCP
MCP server
The Lead Scorer MCP endpoint, how it authenticates, which clients it works with, and the full list of capabilities grouped by family.
Last updated
On this page
Lead Scorer was built AI-first: every feature ships as an MCP tool rather than as a bolted-on integration. Anything you can do in the app, an agent you control can do over the protocol — with the same credits, the same billing and the same approval gate before anything sends.
Endpoint and authentication
https://mcp.lead-scorer.com/mcp
- OAuth 2.1 is the recommended authentication, with a setup screen in the app that walks you through it.
- An Authorization: Bearer header with an MCP API key works as a manual fallback for clients without OAuth support.
- Included on every plan, free CRM included.
Supported clients
Claude (custom connectors), Claude Code, ChatGPT (developer mode), Codex, Cursor, or any MCP client you write yourself. Per-client setup instructions, with the exact commands and JSON, live on the MCP page — they are kept in one place on purpose.
MCP updates do not require reinstalling Lead Scorer or changing its server URL. Clients discover the current tool list when they open or reconnect. If an already-open conversation still exposes an older cached list, start a new conversation or refresh/reconnect the connector. Reauthorize only when the client reports an expired or revoked authorization.
Daily event invitation campaigns
From Campaigns → Invite to event, or Event campaign on a lead list, choose your list, LinkedIn event, connected account, daily limit, sending days and timezone. Creation takes a fixed snapshot of accessible leads and leaves every invitation for review. Activate in the campaign page to start the daily queue; pause and resume there. No invitations or credits are spent at creation.
With MCP, discover IDs using get_lead_lists and list_sender_accounts, then call create_event_invite_campaign with list_id, linkedin_account_id, event_url and a stable idempotency_key. The default is up to 100 event invitations daily, seven days a week, 09:00–18:00 Europe/Paris. Use update_campaign_sending to change daily_event_invite_limit, days or hours. Human activation remains in the app. Inspect results with get_campaign and list_campaign_actions.
Event invitations have their own budget, independent of connection requests and messages. The account ceiling is shared with manual invitations and other campaigns and resets at midnight UTC; send windows use your chosen timezone. Already invited members are skipped across URL/ID variants, campaigns and manual sends. Missing member IDs are skipped with a reason. The daily limit is a maximum: available contacts, sender availability and the sending window can reduce actual sends.
Recruitment signals and company associations
Discover companies with search_companies or get_companies_from_list and create only missing companies. Associate each lead using company_id at creation, or enrich and read get_lead.positions before set_lead_primary_company. The company must belong to that person's career; never guess IDs or treat a parent as the recruiting subsidiary. Pinning survives later enrichment.
First read list_hiring_taxonomy (kind=role, skill or seniority; paginate until has_more=false) to discover the global canonical vocabulary. Reuse its slugs; ensure_hiring_term registers a genuinely missing generic term or reuses an existing label/alias, case-insensitively. The catalog exposes no companies or usage counts. Record a verified public vacancy with upsert_company_hiring_signal (job title, location, URL, open/closed/unknown status and observed_at). Use details to retain salary (currency and period only when stated), work mode, remote policy, profile criteria, stack, responsibilities, benefits, interview stages and dated sources. These appear in the company’s existing Open Positions section and full vacancy dossier. Omitted detail fields survive later refreshes; explicit null clears a field. posted_at is optional: do not confuse verification and publication dates; keep relative dates in details.publication_label. Repeated company + source URL updates the same signal, and older observations cannot replace fresher evidence. Read back get_company_signals and get_lead to verify the company page and CRM association. Pass normalized.roles, normalized.skills and normalized.seniorities as arrays of {slug,evidence}, quoting the title or relevant saved details verbatim. Unknown slugs and absent evidence are rejected; duplicate references collapse to one canonical tag. All arrays replace the selection; empty arrays mean none, omission keeps an existing selection, and normalized=null restores automatic extraction. Legacy/provider imports also resolve their tags through the global catalog. Original source text can retain its original casing. Seniority is separate from role and is never inferred from years of experience alone. Use search_hiring_companies or the Companies hiring filters for role + skills + seniority + location; every criterion must match one vacancy. Open unexpired offers are the default; status=all includes historical needs, and observed_since filters verification freshness. The index preserves source evidence and groups aliases such as Postgres/PostgreSQL. These are detected vacancy needs, not proof of company-wide technology adoption. These operations are free and neither enroll nor contact anyone; keep private candidate and outreach details in private memory.
Freelance talent pool
Freelancers remain normal CRM leads, so lists, tags, contact details, experiences and relationship memory continue to work. A structured freelance profile adds availability and its verification date, available-from date, daily-rate range and currency, years of experience, notice period, work modes, contract preferences, locations, languages, industry experience, portfolio or CV links, a recruiter summary, normalized roles/skills/seniorities, and dated public source observations. The same global vocabulary prevents Python/python duplicates across vacancies and candidates.
Use search_freelancers before new research and filter by canonical role, all required skills, seniority, availability date, maximum rate, currency, work mode, location, source or owned lead list. Pass lead_id to upsert_freelance_profile for an existing CRM contact. If a named platform profile has no LinkedIn or public email, pass identity instead: the exact source URL creates or reuses the lead and source-list membership atomically, without merging on name alone. Each normalized term needs a verbatim excerpt from the lead or supplied source. Availability, rates and experience stay unknown unless explicitly published. Older observations remain visible but cannot overwrite fresher facts. Read get_freelance_profile to audit every source. These operations are free and send nothing.
Contacts without LinkedIn
Create a contact with an email, a verified LinkedIn identity, or a full name and an authorized company_id. An email-only company mailbox can omit full_name; contact_kind=company keeps personalization neutral. In Imports, Contacts CSV accepts email, company_name, company_website, country, preferred_language and optional full_name or LinkedIn identity. Preview errors and retry completed batches safely: normalized email deduplication is scoped to your account.
In a mixed campaign with an email branch, recipients without LinkedIn start with the reachable email step once approved, paced by the sending schedule. No invitation is recorded as sent. Recipients with LinkedIn retain the normal invitation and acceptance deadline. Follow-ups wait for the preceding email to send, and the two connection branches remain exclusive. LinkedIn enrichment without a usable identity and without cached profile data makes no provider call and consumes no credits; the run records the non-applicable reason.
Capabilities by family
The surface is grouped by capability family. Tool names are stable and are what your agent will see when it lists the server.
Audience capture accepts LinkedIn post links, including shared links and embed URLs. Shared posts are resolved through LinkedIn's public embed metadata. If that lookup fails, capture uses one of your connected LinkedIn accounts to resolve the post; linkedin_account_id can select the account. The fallback requires an active connection and available LinkedIn read quota. Reactions and comments are then collected using the resolved activity ID. Large post audiences continue automatically in batches of up to 1,000 profiles, saving reaction and comment progress separately. Re-sync resumes an unfinished capture; after completion, it starts a fresh scan for new engagers.
- CRM read
- get_lead · get_leads_from_list · get_lead_lists · get_company_info · get_company_signals · list_hiring_taxonomy · search_hiring_companies · search_freelancers · get_freelance_profile · get_companies_from_list · get_company_lists · search_companies · list_tags · list_products · list_sender_accounts
- CRM write
- create_lead · update_lead · set_lead_primary_company · ensure_hiring_term · upsert_company_hiring_signal · upsert_freelance_profile · remove_lead_access · create_company · create_list · create_product · update_product · delete_product · add_leads_to_list · add_companies_to_list · add_tags_to_lead · add_lead_email · add_lead_phone · update_lead_linkedin · update_company_linkedin
- Sourcing & audiences
- create_audience_source · list_audience_sources · sync_audience_source · fetch_profile_posts · get_lead_posts
- Contact lookup estimates
- Use find_lead_contact_info with dry_run: true to check access, eligible lead data, active-run limits and provider configuration before spending. No mailbox connection is required for discovery. A successful estimate does not guarantee live provider availability. Launch once, then poll get_contact_enrichment_run; only contacts found are billed.
- Verify emails already in your CRM
- Discover the lead with get_lead_lists and get_leads_from_list, then call verify_lead_emails with lead_id and dry_run: true. This checks access, visible emails and provider configuration for free. Execution costs 1 credit per successful lead verification, regardless of email count; failures are refunded. Respect the confirmation threshold. It does not search for new contacts. Read verification_status, verification_provider and verified_at with get_lead; re-running verification is a new paid operation. Missing email access, no visible emails, insufficient credits and provider failures are reported explicitly.
- Enrichment & scoring
- enrich_leads · enrich_company · find_lead_contact_info · verify_lead_emails · create_scoring_config · submit_lead_score · submit_lead_ai_enrichment · submit_company_classification · submit_company_research · get_leads_pending_scoring · get_leads_pending_ai_enrichment · get_companies_pending_classification · get_companies_pending_research
- Campaigns & outreach
- list_sender_accounts · update_sender_account · list_campaigns · create_campaign · create_event_invite_campaign · update_campaign_sending · update_campaign_senders · get_campaign · get_campaign_authoring_context · add_leads_to_campaign · list_campaign_leads · remove_lead_from_campaign · add_campaign_step · update_campaign_step · generate_campaign_drafts · write_campaign_drafts · list_campaign_actions · update_campaign_action_draft · upload_campaign_action_attachment · delete_campaign_action_attachment · invite_list_to_linkedin_event
- Remove a campaign lead
- In a campaign's Leads tab, choose Remove and confirm. From MCP, discover the campaign with list_campaigns and the lead with list_campaign_leads, then confirm remove_lead_from_campaign using lead_id. Removal deletes the enrollment, drafts, actions and replies while keeping the CRM lead. Removing CRM access, individually or in bulk, also clears the lead from your campaigns. Sends already in progress or with an unknown outcome must be resolved first.
- Content Studio
- create_content_post · update_content_post · schedule_content_post · archive_content_post · mark_content_post_published · list_content_posts · get_content_calendar · list_content_items · get_content_item · upsert_content_item · update_content_item · list_content_shows · upload_content_media
- Agent workflows
- list_workflows · get_workflow_run · list_workflow_runs
- Personal memory & Context Packs
- get_my_memory · get_my_workspace_context · update_my_memory · list_relationship_memories · get_relationship_memory · update_relationship_memory · remember_relationship_fact · archive_relationship_memory · list_company_memories · get_company_memory · update_company_memory · remember_company_fact · archive_company_memory · list_memory_revisions · list_memory_sources · get_memory_source · archive_memory_source · estimate_memory_source_reprocessing · start_memory_source_reprocessing · compile_context_pack · estimate_memory_ingestion · start_memory_ingestion · get_memory_ingestion_run · list_memory_proposals · review_memory_proposal · review_memory_proposals
Direct Markdown reads, writes and selected sourced facts are free. Importing or reprocessing ChatGPT, Claude, transcript or note context uses Lead Scorer's AI: the estimate is reserved from that user's AI budget, actual model tokens are settled, unused budget is refunded, and all grounded facts are added in one reversible canonical revision after the user confirms the import.
Current imports need one confirmation for the full source and AI estimate, not one approval per fact. review_memory_proposals remains available to resolve up to 100 pending facts left by older runs in one free, atomic revision.
Campaign attachments are limited to one genuine PDF of at most 2,000,000 decoded bytes on one exact email draft. They stay in private storage, never belong globally to a prospect, and every upload or deletion invalidates the previous approval until a human explicitly approves that revision.
Credits over MCP
AI-powered tool calls consume the same credits and the same AI budget they would in the app. There is no cheaper back door and no separate quota to track.
Sending stays behind your approval even when an agent orchestrates the whole run. An agent can create a campaign, append a step with add_campaign_step, write every draft and queue it — it cannot launch it for you. Appended messages always require fresh human review.