Scrupp MCP server
OfficialScrupp MCP server lets an agent prospect and enrich contacts through Scrupp's Jobs API, covering exports, company/people research, email finding/verification, and job/credit management.
Export people from Sales Navigator, LinkedIn people-search, and Apollo search URLs, with optional work emails and record limits.
Enrich LinkedIn profile URLs with full profile data, optionally finding and verifying emails.
Look up company data (size, industry, location, website, LinkedIn) by domain, LinkedIn URL, or name.
Find decision makers at companies by domain, LinkedIn URL, or name, with optional emails.
Find and verify work emails from first name, last name, and company domain; unverifiable addresses are marked, not guessed.
Verify deliverability of existing email addresses, up to 100 per call, at one credit each.
Check status and collect records for long-running jobs via job ID.
Check remaining credits and current plan before large exports.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Scrupp MCP serverFind decision makers at Stripe and verify their work emails"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Scrupp MCP server
An MCP server over the Scrupp Jobs API, so an agent can export LinkedIn, Sales
Navigator and Apollo searches, find decision makers, and find and verify work emails
without anyone writing HTTP calls. Ships as scrupp-mcp-server on npm and in the
official MCP registry as io.github.wismhero-maker/scrupp. Overview:
https://scrupp.com/email-finder-mcp
In Claude (no install)
Add https://mcp.scrupp.com/mcp as a custom connector in Claude and sign in to Scrupp.
It finds and verifies work emails on any Scrupp plan, including the free one. Scrupp
customers who want the full tool set use the private connector described in the
setup guide. Setup steps, what each tool needs and troubleshooting:
https://scrupp.com/docs/api/claude
Related MCP server: MCP LinkedIn Sales Navigator
In Claude Code (plugin)
/plugin install scrupp --marketplace Wism-Corp/scrupp-mcp-serverOn Claude Code older than 2.1.275, in two steps:
/plugin marketplace add Wism-Corp/scrupp-mcp-server
/plugin install scrupp@scruppThe plugin connects Claude Code to Scrupp's private hosted connector, with the same
full tool set as the private Claude connector, so nothing is installed
locally. The first time a tool runs, open /mcp, pick scrupp and sign in to Scrupp.
The plugin carries two things:
.mcp.json— the hosted connector above, signed in with OAuth.skills/scrupp-prospecting— how Claude should use the tools: check credits first, pick the tool from what the user has, export five records as a sample before the whole search, collect long jobs withscrupp_get_job, and what to say when a tool refuses.
Check it before a release with claude plugin validate ..
Using it
{
"mcpServers": {
"scrupp": {
"command": "npx",
"args": ["-y", "scrupp-mcp-server"],
"env": { "SCRUPP_API_KEY": "sk_live_..." }
}
}
}SCRUPP_WAIT_SECONDS (default 120) caps how long a tool blocks. A job that outruns it
comes back as { status: "running", job_id } with a note telling the agent to call
scrupp_get_job — better than holding a conversation open for twenty minutes on a
2,500-record export.
Tools
Tool | What it does |
| People out of a Sales Navigator search URL |
| People out of a LinkedIn people-search URL |
| People out of an Apollo search URL (needs a connected account) |
| Full profile data for profile URLs |
| Company data by domain, LinkedIn URL or name |
| Who to write to at a company |
| Verified work emails from name + domain |
| Deliverability check for addresses you already have (1 credit each) |
| Status and records for a job that was still running |
| Remaining credits and plan |
Every tool carries a title and readOnlyHint / destructiveHint annotations — the
Claude connectors directory rejects a server without them.
Hosted connector (Streamable HTTP)
node src/http.js (or scrupp-mcp-http) serves the same server over Streamable HTTP
at POST /mcp, stateless, with GET /health for a load balancer. PORT defaults to
8787. Each request authenticates with the caller's own key as
Authorization: Bearer sk_live_...; the key is scoped to that request, so one process
serves many accounts without mixing them up.
The hosted connector exposes a narrower tool set than the local server: email finding, email verification, job status and credits. The tools that gather data from LinkedIn (Sales Navigator, LinkedIn search, profile enrichment) or answer from the shared lead base (company lookup, decision makers), and the Apollo export, stay local-only — they run through accounts that are not the caller's, which is not something to put in a public directory listing.
Try it in Claude Code against a deployed instance:
claude mcp add --transport http scrupp https://mcp.scrupp.com/mcp \
--header "Authorization: Bearer sk_live_..."Private connector with the full API
A second endpoint serves a fuller tool set for Scrupp customers who add it by URL
(Claude.ai: Settings → Connectors → Add custom connector; the address is in the
setup guide at https://scrupp.com/docs/api/claude). It is not listed in the directory and works on
every Scrupp plan. On top of the core tools it has the rest of the API:
scrupp_build_sales_navigator_search (audience in words → a Sales Navigator
search URL with the size Sales Navigator reports, no credits),
scrupp_export_sales_navigator_search, scrupp_export_linkedin_search,
scrupp_run_apollo_search, scrupp_enrich_linkedin_profiles (optionally with
emails), scrupp_lookup_company and scrupp_find_decision_makers.
When the caller has a LinkedIn account with Sales Navigator connected with the Scrupp extension, all of them run only on that account. Without one, they run on Scrupp's shared account pool, which is open to paid plans. The Scrupp API decides this, not this server.
The OAuth resource is what tells the two apart: each endpoint's protected-resource
metadata names its own resource, and app.scrupp.com issues the private connector's
key (connector:claude-sn) only for the private resource. A key from the /mcp
connector gets 403 on everything beyond email finding even if it is sent to the
private endpoint.
Connecting with OAuth
Users of Claude.ai, Claude Desktop and Claude Code don't paste a key: they press
Connect, sign in to Scrupp and allow access. The server advertises its
authorization server at /.well-known/oauth-protected-resource (RFC 9728) and answers
an unauthenticated request with 401 and a WWW-Authenticate header pointing there.
The authorization server itself lives in the Scrupp app at app.scrupp.com
(/oauth/register, /oauth/authorize, /oauth/token); the access token it issues is
an ordinary Scrupp API key marked connector:claude, which the API restricts to the
four tools above. Access tokens last an hour, so the server checks the token before
each request (cached for a minute) and answers 401 invalid_token when it has expired,
which is what makes the client refresh it.
Variable | Default | Meaning |
|
| Listen port |
|
| Public URL of this server, used in the metadata |
|
| Where OAuth tokens are issued |
|
| Scrupp API the tools call |
Tool descriptions are written for a model, not a human: they say when to reach for the tool, not just what it does. That is the whole ranking signal in a registry — a listed server with vague descriptions gets picked and then misused.
Publishing
Move this directory to its own repo,
Wism-Corp/scrupp-mcp-server— the MCP registry validates ownership from the repository and themcpNameinpackage.json.npm publish --access publicwith provenance from GitHub Actions, the same workflow shape asn8n-nodes-scrupp.Publish the registry entry:
npx @modelcontextprotocol/publisher login github npx @modelcontextprotocol/publisher publishIt reads
server.json, checks the npm package carries the matchingmcpName, and lists the server.Then the downstream directories, which read from the registry or take a form: Smithery, Glama, mcp.so, PulseMCP, and Anthropic's connectors directory.
Testing before publishing
npm install
SCRUPP_API_KEY=... npx @modelcontextprotocol/inspector node src/index.jsRun scrupp_credits first (free), then scrupp_find_emails with two people — the
cheapest call that exercises create → poll → result.
Available Tools
10 toolsscrupp_creditsCredit balanceARead-only
Remaining Scrupp credits and the current plan. Worth checking before starting a large export — one credit is one record requested.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, non-destructive and closed-world, so safety is covered. The description adds non-obvious behavioral context: the credit accounting rule that one credit equals one record requested, which helps the agent reason about cost before invoking export tools.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the return value first, then the practical usage tip. Every clause earns its place and nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema and safety fully covered by annotations, the description only needs purpose plus useful context, which it delivers. A brief note on the shape of the response (credit count vs. plan identifier) would make it fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies per the rubric for a no-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource precisely — remaining credits plus current plan — which no sibling tool reports (all siblings are find/verify/export/enrich actions). It lacks an explicit verb like 'Returns', relying on a noun phrase, but the intent is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete usage cue: check before starting a large export. There are no real alternatives among the siblings to route against, so the absence of exclusions is not a gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scrupp_enrich_linkedin_profilesEnrich LinkedIn profilesCIdempotent
Full profile data for LinkedIn profile URLs: current title, company, location, experience.
| Name | Required | Description | Default |
|---|---|---|---|
| with_emails | No | Also find and verify work emails (billed per enriched profile plus per email found). Defaults to false. | |
| profile_urls | Yes | LinkedIn profile URLs. | |
| wait_seconds | No | How long to wait for the job before returning its id instead (default 120). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a non-read-only, open-world, idempotent, non-destructive operation, so the safety profile is covered. But the description omits the operationally important traits: this consumes credits (the schema notes emails are billed), and wait_seconds implies an asynchronous job that may return a job id rather than results — neither is mentioned in the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence that front-loads the returned data. Nothing is wasted, but it is sparse enough that it reads more like a field list than a definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a credit-consuming, open-world, potentially asynchronous enrichment call with no output schema, the description should say something about cost, job/id return behavior, and result shape. Instead it only lists four output fields, leaving the agent without the context needed to call it responsibly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear per-parameter docs for with_emails (billing), profile_urls, and wait_seconds (async fallback). The description adds no parameter meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (LinkedIn profiles, keyed by profile URLs) and enumerates the returned fields (current title, company, location, experience), so an agent knows what it gets. It does not differentiate itself from siblings such as scrupp_find_decision_makers or scrupp_lookup_company, which also return people/company data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus the nine siblings, no prerequisites, and no exclusion criteria. An agent must infer from the name alone that this is the profile-enrichment path rather than the email-finding or search-export path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scrupp_export_linkedin_searchExport a LinkedIn searchAIdempotent
Extract the people from a regular LinkedIn people-search URL. Use this for linkedin.com/search/results/people URLs; use the Sales Navigator tool for linkedin.com/sales URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Upper bound on records. Drives the credit hold; unused credits are refunded. Defaults to 100. | |
| url | Yes | The search URL, copied from the platform after building the filters. | |
| account | No | Connected account email to run the search with. | |
| with_emails | No | Also find work email addresses. Defaults to true. | |
| wait_seconds | No | How long to wait for the job before returning its id instead (default 120). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds no behavioral context of its own: it does not mention that the run consumes credits (or that unused credits are refunded), that it may return a job id instead of results, or that it is a scraping operation subject to account/latency constraints — all of which are only hinted at in the parameter schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both earning their place: the first states the action, the second handles disambiguation. Routing information is front-loaded rather than buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter extraction tool with no output schema, the routing guidance is complete and the parameters are fully documented in the schema. The only gap is that the description never signals the async/credit-consuming nature of the run, which matters for an agent deciding whether to call it now.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains url, max, account, with_emails, and wait_seconds, including the credit-hold and job-id behavior. The description adds no parameter meaning beyond what structured data provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Extract the people from a regular LinkedIn people-search URL'), and immediately scopes it against the Sales Navigator variant. An agent can distinguish it from scrupp_export_sales_navigator_search without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the URL pattern this tool handles (linkedin.com/search/results/people) and the pattern that should route elsewhere (linkedin.com/sales, Sales Navigator tool). Both the when and the when-not are stated in one sentence, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scrupp_find_decision_makersFind decision makers at a companyAIdempotent
The people worth writing to at a company you only know the domain, LinkedIn URL or name of. Returns names, titles and (where found) work emails.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Decision makers per company. Defaults to 10. | |
| find_by | Yes | What the values in `companies` are. | |
| companies | Yes | Domains, LinkedIn URLs or names. | |
| wait_seconds | No | How long to wait for the job before returning its id instead (default 120). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint, idempotentHint, non-destructive and non-read-only, so the safety profile is covered. The description adds the return contents (names, titles, emails), but omits notable behavior: the async job model suggested by wait_seconds and the likely credit cost implied by scrupp_credits/scrupp_get_job siblings. The not-read-only hint also goes unexplained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core purpose and then the return shape. No filler, no repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and a non-read-only, externally-facing profile, the description covers purpose and return fields adequately. It is still thin on the asynchronous job behavior, credit consumption, and result limits (max up to 2500) that an agent would want before invoking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented in the schema. The description adds only the 'where found' caveat on emails and no extra syntax or format detail for find_by/companies, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (decision makers) and the three lookup identifiers (domain, LinkedIn URL, name), plus what it returns. It is clear what the tool does, but it does not explicitly distinguish itself from close siblings like scrupp_find_emails or scrupp_lookup_company.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'a company you only know the domain, LinkedIn URL or name of' implies the eligibility condition for using it, but there is no explicit when-to-use vs when-not, and no sibling is named as an alternative for other cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scrupp_find_emailsFind work emailsBIdempotent
Find and verify work email addresses from first name, last name and company domain. Addresses that cannot be verified come back marked rather than guessed.
| Name | Required | Description | Default |
|---|---|---|---|
| people | Yes | ||
| wait_seconds | No | How long to wait for the job before returning its id instead (default 120). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description usefully discloses an output-quality behavior: unresolvable addresses are returned marked rather than guessed. But it is silent on the operational realities implied by readOnlyHint=false and the wait_seconds parameter — that this submits an asynchronous job, may consume credits, and that results may come back as a job id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, zero filler, with the core purpose front-loaded and the caveat about unverifiable addresses placed second where it belongs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining returns; it does partially (marked results) but omits the async job model and how to retrieve results, despite wait_seconds implying a job id may be returned instead of data. Sibling scrupp_get_job exists and is never referenced.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 50% schema coverage, the description names the three nested person fields (first name, last name, domain) but adds no format or constraint detail beyond the schema's domain example. It says nothing about the wait_seconds parameter or about passing multiple people in the array.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb pair and resource ('find and verify work email addresses') plus the required inputs (first name, last name, company domain). However it does not distinguish itself from the sibling scrupp_verify_emails, which also deals with verification, so an agent can't tell them apart from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance is given. The presence of 'verify' in the description while a sibling tool is literally named scrupp_verify_emails creates ambiguity that the description does nothing to resolve, and no alternative (e.g., scrupp_find_decision_makers) is mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scrupp_get_jobCheck or collect a Scrupp jobARead-only
Status of a job, and its records once it has finished. Use this for a job that was still running when the tool that started it returned.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The job id returned by an extraction tool. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, non-destructive, and closed-world behavior. The description adds useful behavioral context beyond that: it indicates the tool returns job status, and records only after completion, implying a polling pattern.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences with zero waste. The core purpose and usage condition are front-loaded, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description adequately explains what is returned (status and records once finished) and when to call it. It could say more about status values or whether the call blocks, but it is complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single job_id parameter is fully documented in the schema. The description adds no additional parameter semantics, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource and scope: a job's status and its records once finished. It clearly distinguishes this tool from the sibling extraction/search tools that start jobs, without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: 'Use this for a job that was still running when the tool that started it returned.' This tells the agent the tool is for polling async jobs, though it does not mention when-not or alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scrupp_lookup_companyLook up a companyBIdempotent
Company data — size, industry, location, website, LinkedIn — from a domain, a company LinkedIn URL, or a name.
| Name | Required | Description | Default |
|---|---|---|---|
| companies | Yes | Domains, LinkedIn URLs or names. | |
| lookup_by | Yes | What the values in `companies` are. | |
| wait_seconds | No | How long to wait for the job before returning its id instead (default 120). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. However, the readOnlyHint=false combined with the schema's wait_seconds parameter signals asynchronous job creation that the description never mentions — it does not say results may come back as a job id rather than data, nor how batching across the companies array behaves. That is a meaningful behavioral gap for a lookup tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the returned data and then the accepted input forms. No filler or repetition. It is a fragment rather than a full sentence, but nothing wasteful is included.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the returned fields, which compensates partly. But it omits the asynchronous job semantics implied by wait_seconds and the id-return behavior, which an agent calling a batch lookup tool would need to handle responses correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter is documented (including the enum for lookup_by and the default for wait_seconds), so the schema carries the weight. The description's listing of domain/LinkedIn/name mirrors the enum values already in the schema, adding no syntax or format detail beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (company data) and enumerates the specific fields returned (size, industry, location, website, LinkedIn), so an agent knows exactly what it gets back. It also states the three accepted input key types. It stops short of explicitly distinguishing itself from siblings like enrich_linkedin_profiles or find_decision_makers, but the resource is different enough to be distinguishable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the accepted lookup keys (domain, LinkedIn URL, name), which tells the agent what inputs are valid, but there is no explicit when-to-use guidance and no mention of when to prefer a sibling such as enrich_linkedin_profiles. Adequate but leaves routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scrupp_run_apollo_searchRun an Apollo searchBIdempotent
Extract the people from an Apollo search URL. Requires a connected Apollo account, passed as account.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Upper bound on records. Drives the credit hold; unused credits are refunded. Defaults to 100. | |
| url | Yes | The search URL, copied from the platform after building the filters. | |
| account | Yes | Connected Apollo account email. Required. | |
| with_emails | No | Also find work email addresses. Defaults to true. | |
| wait_seconds | No | How long to wait for the job before returning its id instead (default 120). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is largely covered. The description adds the auth prerequisite (connected Apollo account), which is genuine extra context, but omits credit consumption, the credit hold, and the async/job-id behavior that the schema's wait_seconds hints at.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and minimized on filler. The second sentence is mildly redundant with the schema's own 'Required.' marking on `account`, but it is brief enough that it still earns its place as an auth caveat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists and the tool is asynchronous with a credit cost, yet the description says nothing about the return shape (people records vs. a job id when wait_seconds elapses) or that scrupp_get_job is needed to retrieve results after a timeout. For a five-parameter, credit-consuming, potentially async tool, this leaves material gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters including `max`, `with_emails`, and `wait_seconds` are already documented inline. The description only restates that `account` is required, adding no syntax, format, or defaults beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Extract the people from an Apollo search URL.' An agent knows this is an Apollo-sourced people extraction rather than a LinkedIn/Sales Navigator export, but the description never names a sibling tool, so the differentiation is implicit rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage context is the prerequisite 'Requires a connected Apollo account,' which is really an auth note. There is no when-to-use versus when-not, and no pointer to alternatives such as scrupp_export_sales_navigator_search or scrupp_find_decision_makers for other sources.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scrupp_verify_emailsVerify email addressesA
Check whether email addresses are deliverable before sending to them. Costs one credit per address; use it on addresses you already have, not on ones scrupp_find_emails just returned (those are verified already).
| Name | Required | Description | Default |
|---|---|---|---|
| emails | Yes | Addresses to verify, at most 100 per call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety hints, but the description adds information they do not carry: the credit cost per address and the fact that find_emails output is already verified, which prevents redundant spend. It stops short of describing what the verification result looks like (status values, per-address outcome), leaving a modest gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, with the purpose front-loaded and the cost/alternative caveat immediately after. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers cost, eligibility, and avoidance of redundant calls for a paid, non-idempotent operation, and annotations carry the safety profile. With no output schema, it could still say what a verify call returns, but for a one-parameter tool this is close to sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single emails parameter is fully documented with min/max items and format, so the baseline is 3. The description's 'one credit per address' is a billing note rather than added parameter syntax or semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check whether email addresses are deliverable') and explicitly frames the outcome (before sending to them). It also names the sibling tool scrupp_find_emails and explains the distinction, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('addresses you already have') and when-not ('not on ones scrupp_find_emails just returned'), with the reason (those are verified already). This is exactly the alternative-routing guidance the dimension rewards.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.2.3- First observed
scrupp_credits - First observed
scrupp_enrich_linkedin_profiles - First observed
scrupp_export_linkedin_search - First observed
scrupp_export_sales_navigator_search - First observed
scrupp_find_decision_makers - First observed
scrupp_find_emails - First observed
scrupp_get_job - First observed
scrupp_lookup_company - First observed
scrupp_run_apollo_search - First observed
scrupp_verify_emails
TDQS
Scored across 10 tools
Most tools are clearly separated by input source and action: the export_* tools map to distinct URL types, and find_emails vs verify_emails have different intents. Some overlap remains among tools that return people/emails (find_emails, find_decision_makers, export_*), but the descriptions reduce confusion.
All names use the scrupp_ prefix with snake_case and generally follow an action_object pattern. The main deviation is scrupp_credits, which is a noun rather than a verb, and the verb set varies (find, verify, export, run, enrich, lookup, get), though still readably consistent.
10 tools is well-scoped for a contact/company data enrichment and export service. Each tool earns its place by covering a distinct source, action, or operational need (credits, async job status, find/verify, LinkedIn/Sales Navigator/Apollo exports, enrichment, company lookup, decision makers).
The surface covers the key workflows for the domain: finding and verifying emails, exporting people from LinkedIn, Sales Navigator, and Apollo searches, enriching LinkedIn profiles, looking up companies, finding decision makers, and checking credits and job status. No obvious retrieval or lifecycle gaps stand out for the stated purpose.
Maintenance
Related MCP Connectors
Search companies, enrich contacts, and reveal emails and phones from your AI agent.
Give AI agents the LinkedIn tools to find, qualify, engage, and follow up with prospects.
Run B2B outreach from your AI agent: 250+ tools for campaigns, leads, LinkedIn and email workflows.
Live LinkedIn data for AI agents: profiles, companies, jobs, posts, email finding. No account risk.
Related MCP Servers
AlicenseAqualityDmaintenanceEnables AI tools to search and enrich B2B leads, including finding professional emails, company profiles, and filtering people and companies by various criteria.5283 npmMIT- AlicenseAqualityAmaintenanceEnables AI assistants to search leads, view profiles, manage lists, send InMails, and export data from LinkedIn Sales Navigator through browser automation.810 npm15MIT
- AlicenseNot gradedqualityDmaintenanceGives AI assistants the power to find verified emails, phone numbers, and rich contact data from 575M+ professionals across 30M+ companies via GrowthToolkit's API.MIT
- AlicenseAqualityCmaintenanceEnables AI assistants to search leads, view profiles, manage lists, send InMails, and export data by automating LinkedIn Sales Navigator through a logged-in browser session.710 npmMIT