MCP HeartbeatTHE MCP OBSERVATORY
Public workspace

Explore

Evidence for your next connection.

Independent measurements of remote MCP servers. Every observation has a timestamp.

Read-only probes

MCP server · Data access / search

Nock

Brazilian B2B prospecting: buying signals, company and people search, enrichment and outreach.

Checks passed
13 / 22

1 failed · 8 not measured

Median response
2546 ms

Median of successful probes over 7 days

30-day uptime
Not measured

Share of countable probes over 30 days, including daily rollups. Auth challenges are excluded.

Discovered tools
99

Tool definitions returned by this server

Independent monitoring

Health & checks

Status history

Responded

The server completed its last measured handshake. This is an observation, not a guarantee.

Last checked . Not enough checks yet
Check summary by test group
Test areaPassedFailedUnmeasured
ConnectionCan a client connect and discover tools?
500
Reliability & speedDoes it respond consistently and quickly?
004
Access & authenticationWhat is required to use this server?
102
Tool qualityAre the tool definitions usable by an agent?
310
Publisher identityCan the publisher be traced to its source?
402

Unmeasured means there is not enough evidence to decide. How these checks work

Inspect individual checks 22 recorded

Core

  • Pass
    Reachable

    Latest probe returned HTTP 200 in 2546 ms.

  • Pass
    Valid handshake

    protocolVersion 2025-11-25, serverInfo.name nock-agent.

  • Pass
    Lists tools

    tools/list returned 99 tools.

  • Pass
    Current protocol

    Negotiated 2025-11-25. The bar is 2025-06-18 or newer.

  • Pass
    HTTPS

    The endpoint URL is https.

Performance

  • Not measured
    Fast (p50)

    Median latency 2546 ms over 1 samples in 7 days. The bar is 1000 ms. Need at least 5 samples.

  • Not measured
    Consistent (p95)

    95th percentile 2546 ms over 1 samples in 7 days. The bar is 3000 ms. Need at least 20 samples.

  • Not measured
    Reliable (uptime)

    1 of 1 attempts returned a tool list in 30 days (100%). The bar is 99%. Need at least 30 samples.

  • Not measured
    Stable tool list

    Fewer than two successful probes in 30 days, so tool-list stability is not measured.

Access

  • Pass
    Open access

    tools/list succeeded with no credential, and the record declares none.

  • Not measured
    Standard auth

    Auth is not required, so the OAuth metadata check does not apply.

  • Not measured
    Free tier cited

    No publisher quote has been checked.

Tools

  • Pass
    Tools described

    Every tool description is at least 20 characters.

  • Pass
    Valid input schemas

    Every inputSchema is a JSON Schema object.

  • Fail
    Parameters documented

    321 of 442 parameters have a description (73%). The bar is 80%.

  • Pass
    Safety hints

    Every tool sets readOnlyHint or destructiveHint.

Publisher

  • Pass
    Verified namespace

    Listed in the Official MCP Registry.

  • Pass
    Website matches publisher

    The website host matches the reverse-domain namespace.

  • Pass
    Source repo linked

    A repository URL is on file.

  • Not measured
    Repo owner matches

    This namespace is not an io.github login, so the owner comparison does not apply.

  • Pass
    Recently updated

    Updated 2026-11-12T15:37:10.151367Z, within 180 days.

  • Not measured
    Open-source licence

    The GitHub licence lookup has not returned an OSI result yet.

Start using Nock

Connect to this server

Choose your client, copy the configuration, then enable the server in your client’s MCP settings.

Run this command in your terminal, then restart Claude Code.

Claude Code

claude mcp add --transport http nock https://api.usenock.com/mcp

Capabilities

Tools 99

accept_received_invitation

Accept ONE LinkedIn connection request the user's connected account received (id from list_received_invitations). It acts on the user's own LinkedIn account: first show who it is and ask, with ask_user, whether to accept; call this only after an explicit yes, with confirmed true. Never accept several at once without asking for each or for the group.

Discovered
activate_outreach_campaign

Activate the automatic cadence for ONE draft campaign. This fills the campaign cadence template with each person's name, company, role and signals into its steps (by default a LinkedIn connection and message first, then email, alternating), then sends them through the selected connected Gmail and/or LinkedIn channels. When more than one account is connected on a channel, pass the exact id from list_outreach_senders. Replies stop the remaining steps. Activating can send immediately in the business window, so obtain explicit user confirmation before calling this tool. When the campaign has people whose messages are from an earlier version of the template (messagesOutdated in an edit result or in list_outreach_campaigns), say in one line that activating first writes those N people's messages again, then call it: it rewrites them and activates (rewrittenBeforeActivation).

Discovered
activate_prospect_channel

Find the missing contact that opens a channel for ONE person in a campaign (email for Gmail, LinkedIn profile, phone for WhatsApp) and turn that channel on in their cadence. Consumes enrichment credits only when a contact is found.

Discovered
add_cadence_rule

Save one rule for how the workspace's messages read, in the user's words: tone, wording, language, what never to claim, price, links, what to say first. Call it when the user states such a rule ("nunca fale de preço na primeira mensagem", "sempre em português", "não cite concorrentes"), without asking. Every cadence written afterwards follows it; cadences that exist change only when rewritten. The number of steps, their days and channels are campaign settings (update_campaign_settings, update_outreach_cadence), not a rule. Free.

Discovered
add_enrichment_to_sheet

Add and configure one field-specific enrichment column in an owned sheet. Use the active sheet id when the web context supplies one. The tool binds inputs to stable column ids, automatically matching exact labels/source keys. If no safe binding exists it returns the available columns; ask the user which column to use, then retry with inputBindings. This configures the column but does not run it.

Discovered
add_knowledge_document

Add a text document to the workspace (a pitch, a case, a price list) so campaigns can use it.

Discovered
add_prospects_to_campaign

Add people from a people sheet to an existing campaign. Fills the campaign cadence template with each person's name, company, role, and signals. Rows already in the campaign are skipped, and so are people the user's connected CRM already has: when the result has crmKnown, say crmKnownReason (how many and why) to the user. People the user removed from this campaign before are skipped too: when the result has removedBefore, say removedBeforeReason (how many and who) and ask whether to add them anyway; only when the user says yes, call again with the same rowIds and includeRemoved true. Every row asked for is added in this one call (up to 1000, in batches of 25); a campaign has no size limit. This only adds people already in a sheet: to find NEW people for a campaign ("add 40 more people"), use find_people_for_campaign. Prefer the open campaign from dashboard context when the user says 'this campaign'. Omit rowIds to add the sheet's people rows not yet in the campaign. Never guess ids.

Discovered
add_rows_to_sheet

Add rows to ONE specific enrichment sheet owned by the authenticated user. Pass the exact sheetId from list_sheets and the row objects. search_people and search_companies results can be passed exactly as returned; nested objects become flat columns. Keys may be stable column ids, semantic keys such as fullName/companyDomain, exact renamed column labels, or new field names. New fields become referenceable columns; matching people/companies keep their existing values while empty cells are completed from the new payload. Unchanged duplicates are skipped. The result includes the exact ids and labeled values of every newly added row so they can be used immediately.

Discovered
adjust_outreach_cadence

Change how ONE campaign's messages read from one sentence of the user ('não fala de preço na primeira mensagem', 'mais curto', 'sem link na primeira', 'muda o tom para mais direto') and write its template again in the same shape, now (it takes a few seconds). The people's steps not sent yet take the new template, and nobody's messages are written again until the user says yes (follow messagesNext in the result); sent messages and hand-edited ones stay. What the user teaches about how messages read is kept by default (02/11/2026): pass rules, the style part of the instruction as one to three short imperative sentences in the user's words that hold for any campaign ('Abra com uma pergunta de sondagem.', 'E-mails com até cinco frases.'), and they are saved as workspace cadence rules (de-duplicated) so every campaign written afterwards follows them; the result's keptRules says which. Then say in one line "Guardei isso nas regras de cadência" with the rules, and that you take them out if they were only for this campaign (remove_cadence_rule). campaignOnly true when the instruction is only about this campaign's own content (its offer, a subject line, a case, its audience): nothing is kept beyond it. forAll true saves it only as a workspace rule, not on the campaign. Free. Nothing is sent. Afterwards say in one line what changes and where it applies. Never while a campaign is being created in the chat with its draft beside it: there the flow's draft tool (campaign_draft_cadence; onboarding_draft_cadence in the onboarding) with adjustments rewrites the draft the person is looking at.

Discovered
ai_column

Generate ONE terse value (a few words / one line) for a row, given that row's known fields and a natural-language instruction — the same "Usar IA" column available in Nock. Use for classification/extraction/summarization into a single cell.

Discovered
approve_inbox_message

Approve and send the step waiting for approval in one Inbox conversation (campaigns set to approve before sending). This sends a real message: show the user the text, call it only after they confirmed this send, and pass confirmed: true. stepIndex comes from pendingApproval.

Discovered
brain_lookup

Searches the user's own Nock workspace (not the web) for a company, a person or a subject, read-only. Look up a company, a person or a subject across everything in the workspace at once:people in campaigns (status, last send, reply), campaigns, sheets (by name or a row that mentions it), signals, the company documents and your memories. Use it first when the user asks about something by name ("tudo sobre a Acme", "o que aconteceu com o Marcos", "o que a gente já falou de escolas") instead of listing campaigns or sheets one by one. Free.

Discovered
brief_lead

The platform's person and company brief for one lead: who they are now (LinkedIn read today), their role at the company, what they post about, and their company (what it sells, customers, size, funding, open roles, key points, news, its posts, competitors). Pass what the user gave: an email, the person's LinkedIn URL, a company domain or the company's LinkedIn URL (any one is enough; more make it surer). Costs 22 credits when it finds something and takes about a minute; the same lookup is kept for 24 hours at no charge. Use it whenever the user asks for a brief, a summary or 'who is' a lead.

Discovered
check_whatsapp

For B2B outreach: tell which Brazilian business mobile numbers the user already has (a company's or a decision maker's, from a sheet or a search) have WhatsApp, so a campaign only writes on WhatsApp to numbers that can receive it. It returns only yes, no or unknown per number: no name, profile or message. Up to 100 numbers per call, in any format. Charged 3 credits per number that has WhatsApp, once per number; nothing for the others. has_whatsapp is null when the number is not Brazilian or could not be checked (never read null as no).

Discovered
clean_phone

Fix the format of Brazilian business phone numbers the user already has (a company's or a contact's, e.g. from a sheet) for free: puts them as (DD) NNNNN-NNNN, adds the missing ninth digit of a mobile, and marks a number that cannot exist (an unknown area code, too short). kind is mobile or landline. Up to 500 numbers per call. Formatting only: nothing is looked up outside, and no owner, name or other data comes back.

Discovered
company_group

The economic group of a Brazilian company by its CNPJ: the companies that control it (its partners that are companies, up to two levels) and the companies its group's head controls (subsidiaries and acquired companies that keep their own CNPJ), each with its CNPJ, legal name, main activity (CNAE) and status at the Receita (inactive ones flagged), plus the group's active factories. Free: registry lookups only. Also: how many active branches (filiais) the company has and in which states, and the companies that share partners with it (sócios em comum; linked, not necessarily controlled; the partner is never named). Use it when the user asks for the head office CNPJ, a group's companies, "as filhas", "as compradas", the branches, or whether a company is still active. Without the CNPJ, find it first (identify_business or search_companies). The registry shows what the Receita has: foreign controllers and shareholders of an S.A. are not listed.

Discovered
company_products

What a Brazilian company sells and how much of it: products registered at the Anvisa across its economic group (registered foods such as supplements, and cleaning products) and the product pages of its own site (pass domain), the product kinds with their usual packaging, and a volume tier (alto, médio, baixo) with why. Free. Use it when the user asks how many SKUs or products a company has, what kinds, or to tier brand owners by volume. The open data leaves out notified cosmetics, beverages and meat; then, without a site sitemap, the count is partial and the answer says so: say it too, never a guessed tier.

Discovered
confirm_decision_maker

Tell us whether a decision maker identify_business returned is right, wrong, or has left the business. Free. Your word weighs on the confidence everyone sees and, for 'left', the person is no longer offered; the evidence is kept. Use it when the user says a name is wrong or that someone left.

Discovered
create_outreach_campaign

Generate one personalized outreach message per people-sheet row and save them as a new prospecting campaign. Pass the exact sheetId from list_sheets. Omit rowIds to use every people row in that sheet (up to 1000, added in batches of 25 within this one call). Only pass templateId when list_outreach_templates returned that exact id — prefer inline name, offering, goal and a concrete cta, or use generate_outreach_campaign. Set goal from existing campaigns: conversion first when they have none and the company sells to businesses, with a concrete commercial next step in cta. Every sheet column is used as labeled context. Campaign generation does not consume credits. Confirm the selection with the user before calling it for a large batch.

Discovered
create_routine

Schedule something the Nock Agent does on its own, every week or every day ("toda segunda, ache 50 decisores novos e coloque na campanha X"), Brasília time. Actions: campaign_add_people (find count new people for a campaign from its search or signal), campaign_refill_from_signal (run the campaign's signal and add count people), campaign_status (pause or resume a campaign), sheet_enrichment (run an enrichment column on the rows that do not have it yet). Each run spends at most creditCap credits, doing fewer people or rows to fit; leave creditCap empty to use the full price of one run. What a run does depends on the workspace's autonomy level for that action (set_autonomy_level): 1 only tells, 2 (default) suggests with a one-tap approval, 3 does it and tells after. Creating spends nothing. Use it only when the user asked for a recurring task; never pick the campaign or sheet yourself. Say in one line what will run, when, and the cap.

Discovered
create_sheet

Create a NEW empty enrichment sheet owned by the authenticated user, then call add_rows_to_sheet with the returned sheetId to fill it. Use mode 'people' for contacts and 'company' for organizations. A sheet the user already has with the same name and mode is returned instead of creating a duplicate. Never tell the user that sheets can only be created in the dashboard.

Discovered
create_signal_monitor

Create a signal monitor. Default: a MARKET monitor, with no source sheet: { mode: 'market', name, market: { category, ...filters }, dailyLimit }. Every day (or week) it searches the signal over that market (hiring needs hiringTitle, and industry keeps it to the ICP's sector in plain words; funding and cnpj need periodDays (cnpj.event as in explore_signals); news needs categories and periodDays; location narrows it; tech is online stores by what their sites run, market.stores with platforms, crms, withoutCrms, noCrm, trafficTiers, states, city, companySizes, withDecisionMaker, only on workspaces that have the store search; custom is a very specific ask checked company by company: market { category: 'custom', source, rules } with the same source and rules find_companies_with_rules sampled, every company checked once, job_change is people new in a role, delivered into a people sheet (market { category: 'job_change', jobTitle, periodDays 30/60/90, location, industry, companySizes, domains, move }, 4 credits per person, no contact), growth is companies whose team grew (market { category: 'growth', minGrowthPct, months 6 or 12, location, industry, companySizes }, 2 credits per company), ads is companies running ads (market { category: 'ads', query } for a theme on Meta, or { category: 'ads', domains } for up to 10 accounts on Google; with start "future" only the ones that start advertising arrive; 4 credits per company), 2 credits per company checked plus 2 per company that passed) and saves only companies it has not delivered yet into a companies sheet, created with the monitor's name unless destinationSheetId is given. contact: { jobTitle, withEmail } also finds one person with that title at each company (hiring, funding, news, growth, ads and custom; jobTitles adds titles tried in order, location narrows the person, excludeTitles leaves titles out) and, with withEmail, their work e-mail: +2 credits per person found, +3 per e-mail found. Charged per company delivered (4 credits; 2 for cnpj; a store 6, +2 with its owner, +3 with a contact e-mail), at most dailyLimit (default 10, up to 25) a day; a search with nothing new is free. start: { past: N } makes the first run bring up to N companies the market already has (charged as usual), "future" brings only what appears from now on; without it the first run brings up to dailyLimit. Tell the user the cost per company and per day before creating. Only when the user asks to follow companies of an existing sheet, send the list form instead: category plus sheetId (from list_sheets) and that signal's fields (hiring, news, funding, tech, cnpj, crm, job_change; social watches a topic), spending up to the monthly credit limit you set. A cnpj list with events (branch, mei_exit, simples_exit, new_partner, gov_contract, debt_new, capital_up, address_change, cnae_change) follows those Registry events of the sheet's companies (a portfolio of CNPJs), free; without events it checks openings, charged per CNPJ. A social topic signal (category social, mode "topic", query, sources, maxItems) finds every day who posts about the topic: sources linkedin and reddit, plus x, instagram and tiktok for creators, small businesses and consumers (those three cost 2 credits per person found; instagram reads the words as a hashtag or keyword, keep them short). An engagement signal (category social, mode "engagement", watch "own", "competitors" with competitors by name, or "people" with people: up to 10 LinkedIn profile URLs or { linkedinUrl, name, company }; jobTitle, maxItems, monthlyCreditLimit) finds every day who reacted to or commented on the user's own posts (the company page, the founders and the connected LinkedIn accounts), the competitors' posts (pages and founders; people adds profiles), or the named people's posts (e.g. a competitor's CEO: given only a name, find the profile URL first); never their colleagues; 12 credits per new person. activate: true runs it once right away; a market monitor's run goes on in the background (finding people takes minutes), so say its first companies land in its sheet shortly instead of reporting a count.

Discovered
delete_outreach_template

Delete ONE saved outreach template owned by the authenticated user. Campaigns already created from it are not affected.

Discovered
delete_prospect

Delete ONE prospect owned by the authenticated user, including its message and history. The campaign remains even if it has no people left. This cannot be undone: confirm with the user first.

Discovered
delete_routine

Delete a routine for good. Deleting always needs the user's yes: call first with confirmed false, tell them which routine, and only after they agree call again with confirmed true. To stop it for a while, use set_routine_status paused instead. Ids from list_routines.

Discovered
delete_sheet

Delete one owned sheet and all its rows. This cannot be undone: name the sheet to the user, call it only after they confirmed, and pass confirmed: true.

Discovered
discover_decision_makers

Discover a specific decision-maker profile for company rows in an owned company sheet and save them into a people sheet. This is a dedicated multi-company action, not an enrichment field: call it directly instead of list_enrichment_fields. It uses all available company context (name, trade/legal name, domain, corporate email, CNPJ, partners, industry and location), can target selected rowIds or the whole sheet, and can also enrich requested contact fields. The owners profile uses CNPJ partners; functional profiles such as sales search matching job titles instead.

Discovered
disqualify_prospect

Take ONE person out: scope "campaign" removes them from this campaign's cadence; scope "list" also removes them from the people sheet they came from. Unsent steps stop. Confirm with the user first.

Discovered
duplicate_sheet

Copy one owned sheet, rows and columns, under a new name.

Discovered
edit_sheet

Edit an owned enrichment sheet using the same persistent operations as the dashboard: add custom/AI columns, rename/delete/hide/show/reorder/resize columns, update cells, or delete rows. Read the sheet first whenever exact row or column ids are not already supplied by the active-sheet context. Never delete rows or columns without an explicit user request.

Discovered
enrich_field

Enrich ONE specific sheet field for one person/company row. Uses the same field catalogue and provider cascade as the dashboard, stops as soon as that field is found, and returns found/not_found/error deterministically. Use list_enrichment_fields to discover valid field ids and inputs. First it looks the lead up in this workspace (people sheets, campaigns and kept briefs, by email, LinkedIn, or full name with the company): a value already saved comes back free with savedIn saying where; answer with it and name that place. Only a found value is charged: creditsCharged is what this call cost, 0 when nothing was found, the lookup failed or the value was saved. not_found with sourcesUnanswered means the sources that answered had nothing but that many others did not answer in time: say it may be tried again later; error means no source answered at all. Every result names the person it was looked up for (person: name, LinkedIn, company): when you call it for several people at once, tell the results apart by person, never by their order, and say whose each value is. A mobile is checked against the registry's owner of the number before it is kept: phoneOwner is confirmed (the owner has the person's name) or unconfirmed (the registry has no name for it; say so); a number of someone else is dropped and never charged (phonesDiscarded counts them). A mobile found for a person of this workspace's campaigns or people sheets is saved there (pass prospectId, or sheetId and rowId, when you have them; the LinkedIn profile also matches): savedTo says where.

Discovered
enrich_field_batch

Enrich ONE field for up to 25 people in one call: the same lookup as enrich_field for each person, run on Nock's side 5 at a time, so a list does not wait for one person after another (a mobile can take over a minute a person, so 10 mobiles take about 2 to 3 minutes and 25 about 6). Use it instead of several enrich_field calls whenever there is more than one person. results has one entry per person, in the order sent (index), each with the same fields as enrich_field: person (whose it is), status found/not_found/error, value, phoneOwner, phonesDiscarded, creditsCharged, savedIn, savedTo, sourcesUnanswered (not_found while some sources did not answer in time: that person may be tried again later; error only when no source answered). Tell the results apart by person and say whose each value is. Only found values are charged, each at the field's price, as in enrich_field; creditsCharged at the top is the sum. The same person sent twice is looked up once (sameAsIndex, creditsCharged 0).

Discovered
explore_signals

Search a buying signal like the Sinais screen: companies hiring a role (hiring), Search a buying signal like the Sinais screen: companies hiring a role (hiring), recent funding rounds (funding), company news (news), companies showing a technology (tech), Brazilian company registry events (cnpj), closed-lost CRM deals (crm) or people new in a role (job_change: jobTitle, periodDays 30/60/90, location, industry, companySizes; domains narrows to the user's accounts for "decisor novo na conta"; move new_company or promotion; each result is a person with the company they joined, the title and the month), companies whose team grew (growth: minGrowthPct, months 6 or 12, location, industry, companySizes; only companies with a LinkedIn page) or companies running ads now (ads: query, a theme in the advertisers' words, read in Meta's Ad Library in Brazil; or domains, up to 10 of the user's accounts checked on Google's Ads Transparency Center). cnpj.event picks what happened: opening (new CNPJ, the default), branch (opened a branch), mei_exit (left the MEI; stayedInSimples = became an ME), simples_exit (left the Simples Nacional), new_partner (a partner joined the QSA), gov_contract (signed a public contract, PNCP), debt_new (new federal active debt, PGFN), and from the Receita edition comparison capital_up, address_change, cnae_change. Every event but opening needs location with a state ("Curitiba, PR", "SC") or industry. The title already says the fact with its date; cite the public source (facts.sourceProvider), never a vendor. Up to 25 results; pass limit (without it: 2 for hiring, funding, news, tech and cnpj, 10 for the others). Charged per result returned: 4 credits each (8 for a hiring company found by the wider job-board search), 2 for cnpj, 24 for tech, 4 per person for job_change, 2 for growth, 4 for ads, CRM free. Tell the user the maximum (limit × price) before a paid search they did not size. For proof that a company uses a technology today, use find_tech_accounts instead. Leave provider out unless the user asks for one source: funding takes company_data (the default, filters by location and size) or announcements (round announcements only); tech takes job_posts (the default, tools named in job posts) or website (the company's own pages). A free signal: news takes what (what happened, in the user's words, e.g. "lançou produto em refil") instead of categories, searched in the Brazilian press. Hiring, news and cnpj take rules ("quem serve", up to three, e.g. "é fabricante de bens de consumo embalados"): twice the number asked is searched and each company is checked against them before it is delivered, 2 credits per company checked on top of the result price.

Discovered
export_sheet_csv

Export an owned enrichment sheet to deterministic UTF-8 CSV in its visible column order. In the dashboard the returned CSV is downloaded automatically.

Discovered
export_signal_events

Save events of one monitor into a company or people sheet (ids from list_signal_events). Repeated events are skipped.

Discovered
feed_campaign_with_signal

Make a campaign take, every day, the companies a signal finds (for example a custom signal from find_companies_with_rules turned into create_signal_monitor with market.category "custom"). The person at each company is the jobTitle given (or the campaign's). Charged as any campaign person when each one enters; linking is free. Ask before linking: from then on the campaign enrolls from the signal on its own. When the user did not name the campaign, call ask_user with their campaigns as options; never pick one yourself.

Discovered
find_companies_with_rules

Find companies that meet very specific rules, checked one by one with evidence: e.g. "revendas de peças agrícolas no RS" (source: web search "revenda de peças agrícolas" in RS cities, or the Receita by CNAE 4661300; rules: "vende peças agrícolas, não só máquinas", "é revenda, não fabricante"). Each company's own site (or a web search on it) is read and every rule is judged as met, not met or no evidence. Every verified row costs 2 credits, passed or not; a sample is 20 rows by default (30 at most). Returns the funnel (verified, passed, which rule removed the most, credits per company that passed), the companies that passed with each rule's reason and evidence, and a new company sheet with every row and verdict. Sources: the Receita (registry) for an activity the CNAE names; Google Maps (maps: query and cities with the state) for local and small businesses, shops, clinics, resellers; the web when the trait is how the company describes itself; a company sheet the user already has. Manufacturers or brand owners of a kind of product ("fabricantes de bebidas, cosméticos, pet food") come from the Receita by the manufacturing CNAEs, never from a web search, which returns articles, associations and fairs about the theme. A rule about the CNAE or the Receita is checked against the company's registration, found from its CNPJ, site or exact name. Each rule is one short sentence, 300 characters at most, with one condition. Rules filter: a company missing one is out. A hot signal that makes a company better but not wrong (a recent launch, an ESG or recycling initiative, a hiring, growth) goes in rankBy, never in rules: it orders the companies that passed, in the same read, at no extra cost. Not for a list the user already gave when nothing in it is to be filtered out ("nenhum critério é eliminatório", enrich, score or fill a table about each company): put the list in a company sheet and add one web research column per field (edit_sheet action add_ai_column with aiKind "web" and the field as instruction), then run_sheet_ai_column. A rule about running ads (on Meta or Google), the Google rating, the Reclame Aqui reputation, site traffic or having an app is checked against that source itself (the ad libraries, Maps, the Reclame Aqui record, a traffic estimate, the app stores). Never pad the list with rows that did not pass.

Discovered
find_lead

Where a lead already is in this workspace and what is known about them: the people sheets whose rows match (with that row's fields, so you can answer a question about the lead without enriching), the campaigns they are in and the briefs already made about them (who they are, title, LinkedIn, company). Pass an email, a LinkedIn URL, a name or a company. Free. Use it before enriching: answer from the row when the field is there; when it is missing, call enrich_field for it and, if the lead is in a sheet, offer to save it there.

Discovered
find_people_for_campaign

Find NEW people for an existing campaign now and add them to it ("add 40 more people to this campaign"), from the campaign's saved search or its signal, the same search its daily additions run. People already in the campaign are skipped; each person found goes into the cadence and the campaign's sheet. At most 50 per call, and a campaign has no size limit. It spends credits, so it takes two calls: first with confirmed false, which returns the price per person and the most it can cost; tell the person and ask; only after they say yes, call again with confirmed true. status no_audience means the campaign has no saved search nor signal: offer to search people for it instead. When the campaign's signal has nothing new, the confirmed call runs the signal now and waits up to two minutes for it: call notify_user first. The result's note says what to tell the person when fewer people came in. To add people already in a sheet, use add_prospects_to_campaign.

Discovered
forget_memory

Forget memories the user asks you to drop ("esquece isso"). Pass the ids from get_knowledge_base's memories.

Discovered
generate_outreach_campaign

Create a new outreach campaign in one go, the dashboard's 'Criar com um clique': without sheetId it follows the onboarding's steps with no questions (the best campaign that does not repeat the workspace's, its first 10 people found and saved in a new sheet, billed like any search, and its cadence), and leaves it as a draft to review and activate; it says its phases in the chat while it works. Afterwards, tell the person in a few sentences which campaign you chose and why (the result's why), that it does not repeat their campaigns, how many people you found and that the cadence is written and waits for their review; it is a first look at 10 people, more come once they like it. When sheetId is set, it drafts name, offering, goal, CTA and cadence from the workspace profile plus the instruction and attaches people from that people sheet after the draft (omit rowIds to use every row, up to 1000). The sheet is only the audience list unless useSheetContext is true — a list of founders must not turn the campaign into a founder campaign; a campaign from a sheet never claims a buying signal the request did not state, and is named after the sheet. Its channels follow what the list can receive (LinkedIn connections have no e-mail: a LinkedIn-only campaign); pass channels when the user names them ("no LinkedIn" = ["linkedin"]). Prefer this when the user asks to create a campaign from an existing sheet or to offer a demo. A COMPANY sheet works the same (15/10/2026): pass it as sheetId, never discover_decision_makers first. The same sheet becomes the campaign's people: the decision makers of each company take its place, each row keeping the company's columns; a company where nobody is found stays, marked, out of the campaign. The first call only quotes (status needs_confirmation, with maxCredits for the first batch of up to 25 people): tell the user in one ask_user how many companies, whom you will look for and that maxCredits, and only after they agree call again with acceptedCredits = that maxCredits. The other companies are converted by the campaign itself, a few a day, once it is active. When the result has areasNote, say it in one line as it is and that those people can come out of the list, or stay with that version ("Tirar da lista" on the campaign's Template tab). Do not pass a templateId.

Discovered
get_credit_balance

The workspace's credits now: how many are available to spend, how many are held by operations still running, and the plan. Free and read-only. Use it when the person asks how many credits they have, or whether an action fits their balance.

Discovered
get_customer_list

Read the workspace's customer list: companies that are already customers. Nobody at them gets a first message and searches leave them out.

Discovered
get_inbox_conversation

Read one Inbox conversation (every message both ways) with a campaign person on one channel.

Discovered
get_knowledge_base

Read the workspace's company profile (what it sells, ICP, persona, pains, competitors, exclusions), its documents, and what you learned in earlier conversations (memories, each with its id).

Discovered
get_prospect

Get ONE prospect owned by the authenticated user: the full LinkedIn connection note, the email subject and body, the captured sheet context and the activity history (generation, edits, status changes).

Discovered
get_sheet_rows

Read rows from ONE enrichment sheet owned by the authenticated user. Returns each exact row id plus non-empty cell values with their visible column labels and stable column ids. Use this after list_sheets whenever another tool needs a subset of rowIds. For a whole small people sheet, create_outreach_campaign and generate_outreach_campaign can omit rowIds. Read up to 25 rows at a time with offset/limit, or request known rowIds directly.

Discovered
identify_business

Find who decides in a SMALL business (a school, a market, a clinic) and how to reach them: name, role, the public origin of each fact (company site, Google Maps, Receita Federal, Instagram…), a work e-mail, the owner's mobile when it can be confirmed. Give a name and city (and state), or a CNPJ, or a website. Charged only for what is found: 8 credits for a decision maker our search found (site, Maps, web, gazette, LinkedIn), free when the only source is the Receita's list of partners; 8 for the person's e-mail, 15 for the owner's mobile; nothing when nothing is found. A business already in our base answers at once at the same price. Use it for one business at a time; for a list, call it per row. When the business is looked up for a person of a campaign or a sheet row, pass prospectId (or sheetId and rowId): the decision makers with evidence and the numbers, with whose they are, are saved to that person (the mobile goes to their phone only when it is theirs); savedTo says where. Each result names the business it is about: with several calls at once, tell them apart by the business, never by their order.

Discovered
import_linkedin_connections

Warm campaign: read the user's own LinkedIn first-degree connections (free, from the LinkedIn account the user connected to Nock; never anyone else's network) into a new people sheet in the user's workspace, newest first, keeping those whose headline has any of the keywords (their ICP's titles or sectors). Only the professional profile LinkedIn shows a connection (name, headline, profile URL), at most 1000 per call. Use when the user asks for a campaign with people who already know them, their connections or their network; call it first, without checking the senders before: it says itself when no LinkedIn is connected or which account to pick. Returns how many were read and kept, a sample and the sheet; then offer, with ask_user, a LinkedIn message campaign from that sheet (create_outreach_campaign): a message to someone already connected needs no invite and gets more replies. LinkedIn does not share who viewed the profile through this account, so do not offer that.

Discovered
list_cadence_versions

List the earlier versions of a campaign's cadence template, newest first: when each was replaced and the start of each step. Every change to the template keeps the version it replaced (up to 30). Use it when the user wants an earlier version back or asks what changed.

Discovered
list_enrichment_fields

List the enrichment fields currently available in Nock, using the same catalogue, configured-provider filtering, input definitions, provider order and credit prices shown in the dashboard's Tools drawer. Call this before enrich_field when the requested field id is unknown.

Discovered
list_inbox_conversations

List the Inbox conversations with campaign people, newest first: who replied, the last message preview and any step waiting for approval (pendingApproval). Optional filters narrow to replies, pending approvals or one campaign.

Discovered
list_outreach_campaigns

List the authenticated user's prospecting campaigns with their pipeline totals per status, including each campaign's objective (goal) and CTA. Call this before creating a new campaign so you pick an objective that fills a gap instead of repeating what they already run. With campaignId it also returns abTests: each cadence step under an A/B test with sends, replies and reply rate per version and the rule that picks the winner. Archived campaigns (status archived: kept with their history, sending nothing) are left out unless archived is "include" or "only"; campaignId finds one either way.

Discovered
list_outreach_senders

List the authenticated user's connected outreach senders: Gmail mailboxes, LinkedIn accounts and WhatsApp accounts. Call this before update_outreach_campaign or activate_outreach_campaign whenever more than one account could send, or when the user asks which inbox/profile is connected. Pass mailboxId / linkedinAccountId / whatsappAccountId exactly as returned. Each LinkedIn account sends at most 30 invites and messages a day, shared by every campaign that sends from it, and each campaign at most its own linkedinDailyLimit (20 by default, update_campaign_settings); both count LinkedIn only, never the cadence's e-mails. sentToday and sentTodayByCampaign say how much of today's quota is used and by which campaign. When a campaign's account is full, its LinkedIn steps wait for tomorrow: say which campaigns used it and offer to move the campaign to another account of the workspace with room (update_outreach_campaign with linkedinAccountId). The 30 is fixed; it cannot be raised. If a needed channel is missing, tell the user to connect it in Settings → Integrations instead of inventing an id.

Discovered
list_outreach_templates

List the authenticated user's saved outreach templates. Each template carries the reusable campaign configuration: offer, sender name, tone, business/company context and language. Only call this when the user asked to reuse a saved template, or before updating/deleting one. Do not invent a templateId — omit it and pass name + offering, or use generate_outreach_campaign.

Discovered
list_prospects

List the authenticated user's prospects (people with a generated message) with their pipeline status, optionally filtered by campaign or status. Returns a compact summary; use get_prospect for the full message and history.

Discovered
list_received_invitations

List the LinkedIn connection requests the user's connected account received: who asked to connect, their headline and what they wrote. Someone from the ICP who asked to connect is a warm lead. Read only and free; accepting a request is not done by this tool. If the workspace has several LinkedIn accounts, pass accountId.

Discovered
list_routines

List the workspace's routines (what runs, when, the credit cap, active or paused, next run), the autonomy level of each action type, and the last actions the Nock Agent took or suggested. Free.

Discovered
list_sheets

List the authenticated user's enrichment sheets. Returns each exact sheet id, name, people/company mode, row count, and referenceable columns. Call this before add_rows_to_sheet whenever the target sheet id is not already known.

Discovered
list_signal_events

Read saved signal events, from one monitor or the whole workspace, newest first.

Discovered
list_signal_monitors

List the workspace's signal monitors: category, filters, status, schedule and monthly credit limit.

Discovered
motor_report

Reports the results of each outreach campaign in the workspace (people contacted, replies, meetings, credits spent); Nock calls each campaign with its signals a "motor", a prospecting playbook. Read-only. How the motors are doing ("como estão os motores?"): every campaign of the workspace as a motor, for the last 7, 30 or 90 days. Per motor: people added, people first contacted in the period, replies, positive replies (null while replies are not classified), meetings (null when the workspace never recorded one), credits spent, credits per positive reply, and the reply rate by channel (e-mail vs LinkedIn). Rates are percentages of the people first contacted in the period. Also the reply and positive rates by signal family and by the most common signal combinations for people that came from compound signals; with fewer than 20 people a rate is left out and marked "amostra pequena" (never present it as a result). Targets: 5% replies, 2% positive; below 2% replies after 150 first touches the motor should be rewritten or turned off. When the weekly learning is on, `learning` has last week's verdict per motor and weight suggestions for compound blocks (never applied: only the user changes a weight). Free, reads only.

Discovered
phone_owner

For B2B outreach: confirm that a Brazilian mobile number found for a decision maker (in a sheet or a search) really belongs to that person, before a campaign writes to it, from the owner's name and e-mails the registry has for it. One number per call; use it only for a business contact the user is already prospecting, never to identify a private individual. Charged 10 credits only when a name comes back. Never returns a document number.

Discovered
preview_campaign_messages

Not read-only: writes ONE example person's messages again from the campaign's current template, SAVES them over that person's unsent messages (sent and hand-edited messages are kept) and returns them; nothing is sent to anyone. Use it after you changed ONE campaign's template (update_outreach_cadence, update_cadence_ai_field, adjust_outreach_cadence, restore_cadence_version or a new give): it picks the person itself (one with a buying signal when there is one) and keeps the saved messages, so they are not paid twice. Call it once per turn, after every change the user asked for; a second call in the same turn returns the first. Then show the changed step(s) and this person's version, and ask once with ask_user whether to rewrite the other people (messagesOutdated). Free. Nothing is sent.

Discovered
qualify_sheet_leads

Score people in one owned sheet against the workspace ICP or an explicitly linked campaign audience, using the data and signals Nock already has. Returns fit, priority, coverage, status, evidence gaps and concise explanations per row. Use the active selected rowIds when present; omit rowIds only when the user means the whole sheet. This does not search LinkedIn, Reddit or the open web.

Discovered
read_learn_article

Read Nock's own tutorials (the Aprender page). Use it when the user asks how something in Nock works, what it costs or where to find it, or asks about a tutorial they are reading. With slug: the whole tutorial. With query (or nothing): the tutorials that match, with their slugs. Answer from the text and give the tutorial's path /aprender/<slug>.

Discovered
regenerate_outreach_cadence

Regenerate open cadence copy with the AI writer for people in ONE campaign. It takes no instructions and does not change the template: to change how the cadence reads ('reescreve mais direto', 'deixa mais curto', 'não fala de preço na primeira'), use adjust_outreach_cadence; to change one step's text or day by hand, update_outreach_cadence. Never this for either. Steps that already sent, failed, or are mid-dispatch are kept. Optional prospectIds limit the rewrite to those people; omit them to refresh everyone with unsent steps. This does not consume credits. Confirm with the user first when they did not explicitly ask to rewrite the messages.

Discovered
remove_cadence_rule

Take one rule out of the workspace's cadence rules: the undo after a rule was kept (adjust_outreach_cadence's or the draft's keptRules) when the user says it was only for that campaign or no longer holds, or when they ask to drop a rule. Pass the rule's text as it was kept. Campaigns already written keep their text; the next ones stop following it. Free.

Discovered
remove_knowledge_document

Remove one workspace document (id from get_knowledge_base). Confirm with the user first.

Discovered
rename_sheet

Rename one owned sheet.

Discovered
research_web

Answer a free-form natural-language QUESTION about a single lead/company (e.g. "what does this company sell?", "recent funding?"). Grounds the answer in the company's website when one can be resolved. Use it only after the user explicitly requests web/Google/internet research or confirms a prior offer that disclosed its cost and AI uncertainty. Returns a concise answer plus the source URL used.

Discovered
restore_cadence_version

Put an earlier cadence template back ("volta pro template que tava antes"). Without versionId it restores the most recent earlier version; pass a versionId from list_cadence_versions to pick another. Steps already sent stay; people who have not received a step get the restored template, written for each of them only after the user says yes (follow messagesNext in the result). The restore itself is kept, so it can be undone. Never say an earlier version cannot be restored without calling list_cadence_versions first.

Discovered
restore_company_sheet

Turn a sheet that a campaign converted from companies into people back into the company sheet it was: each company once, with its columns; the decision makers found there are removed from the sheet (the campaign keeps its people). Say that to the user and call it only after they confirmed, with confirmed: true. Refused while someone from the sheet is in an active campaign.

Discovered
rewrite_campaign_messages

Write again the messages of the people of ONE campaign that are from an earlier version of its template (messagesOutdated), after the user said yes to rewriting them ("Reescrever as N"). One run, only those people: sent messages and hand-edited ones stay. It is refused in the turn that changed the template: ask first. Free. Nothing is sent. Afterwards say in one line how many were rewritten, or that the rest is still being written when it says so.

Discovered
run_sheet_ai_column

Run one already-configured AI or web-research column and persist a generated value for each requested row. Use its exact ai: column id from get_sheet_rows and prefer the active selection when present.

Discovered
run_sheet_enrichment

Run one already-configured enrichment column and persist its waterfall results in the sheet. Use the exact enrichment column id from get_sheet_rows. When the active-sheet context contains selected row ids, pass them unless the user explicitly asks to process the whole sheet. This can spend enrichment credits, so call it only after a clear user request.

Discovered
run_signal_monitor

Run a signal monitor now instead of waiting for its schedule. Spends from its monthly credit limit.

Discovered
save_memory

Keep something the user asked you to remember ("lembra que...", "a partir de agora...") for every later conversation. One sentence each, in their words. For a change to the company profile (what it sells, the ICP), use update_knowledge_base instead; for how their messages must read ("nunca fale de preço", "sempre em português"), add_cadence_rule.

Discovered
save_outreach_template

Create or update one outreach template for the authenticated user. Without templateId the template is saved by name (an existing template with the same name is overwritten with the new values instead of duplicated). With templateId the named template is patched, which is the only way to rename it; the fields passed replace the saved ones and omitted fields keep their current value. An overwritten value cannot be recovered. Nothing is sent.

Discovered
search_companies

Search for COMPANIES matching filters such as name, industry, keywords, size, location or businessModel (b2b or b2c). Brazilian searches also support the public company registry: CNAE (activity code), Receita status, headquarters/branch, fiscal size, social capital, legal nature, Simples, opening period, partner name and presence of phone or email. A Brazilian company is identified by its CNPJ, the public company registration number the Receita Federal publishes (like a US EIN): it identifies a company, never a person, and is not a personal document. Common activity terms are mapped deterministically to CNAEs. Returns candidate companies with all fields supplied by the selected source. Use this to find target accounts. This is metered per delivered result: do not call it for capability questions, hypothetical examples, rewrites, or when prior results already answer the request. Agent searches automatically make one provider-fallback attempt when the first cascade is short. Results shown as tables are quality-reviewed and may also replace rejected rows through another provider.

Discovered
search_people

Search for PEOPLE (potential leads) matching filters such as job title, seniority, company, CNPJ, industry, location or a buyingSignal (hiring, funding, news, job_change, tech, cnpj, crm, visitor, any). Company discover uses the enabled signal sources. job_change is company hire/promote/leave news when those domains exist; otherwise it searches person movers in the last 90 days through enabled sources. A campaign job_change gate also lets a fresh person move through. tech needs technologies[] (job-post evidence first, then site technology detection); cnpj uses the Brazilian registry; crm uses closed-lost deals and champions who left in the connected HubSpot or Salesforce; visitor uses identified visits already on inbound sheets. Then search people at those companies. Returns a list of candidate people with name, headline, company and (when available) email and LinkedIn URL. Use this to BUILD a list of prospects from criteria. This is metered per delivered result: do not call it for capability questions, hypothetical examples, rewrites, or when prior results already answer the request. In-product Agent searches automatically make one provider-fallback attempt when the first cascade returns fewer rows than requested. Searches shown as tables are quality-reviewed and may also replace rejected rows through another provider. For an explicit exhaustive/Deep Mode goal, increment page while keeping hard filters unchanged; stop when a page is empty and deduplicate across pages.

Discovered
select_sheet_rows

Select up to 25 exact rows in the currently open sheet so the dashboard shows them selected and a later create_outreach_campaign can use the same row ids. This changes web UI selection only; it does not delete or modify data.

Discovered
send_feedback

Share feedback about Nock with the Nock team. Submit when the user gives product feedback (praise, a complaint, something missing) or you observe something concrete in Nock that worked or failed (a tool returned wrong or empty data, a step was confusing, a result was great). Do not report model behavior, the user's local environment, an unclear prompt, or a tool error you recovered from. Use actor "human" for the user's own words; "agent" for your observations. Write message and context in the user's language. Free, no credits. Not a support channel: no ticket and no reply.

Discovered
send_prospect_step_now

Send ONE step of ONE person's cadence right now, ahead of its schedule. This sends a real message: call it only after the user explicitly confirmed this send in the conversation (ask_user first), and pass confirmed: true. stepIndex is the 0-based position in that person's cadence (get_prospect).

Discovered
send_to_webhook

POST JSON to a webhook SAVED in this workspace (n8n, Make, Zapier or the user's own system), once, now. It only sends to webhooks saved in Integrações e MCP → API e webhooks: pass the saved webhook's name or id, never a URL; an address that is not saved is refused, and so is one that is not public https. Send exactly one of: payload (a JSON object you build), sheetId (optionally with rowIds) to send that sheet's rows, or campaignId to send that campaign's people; a sheet or a campaign sends at most 500 rows. The receiver gets {id, type: "send_to_webhook", createdAt, workspaceId, data}, signed like the workspace's event webhooks (X-Nock-Signature). Returns the HTTP status and the start of the response. Only when the user asked to send to that webhook. Free.

Discovered
set_autonomy_level

Set how much the Nock Agent does alone for one action type in this workspace: 1 only tells, 2 suggests and does it with one tap (default), 3 does it and tells after. Whatever the level, it always asks before spending above a routine's credit cap, deleting, messaging leads with a cadence nobody approved, or touching billing. Use it only when the user asks to change how much you may do alone.

Discovered
set_campaign_daily_people

Change how many new people an active campaign adds each day (0 turns daily additions off; at most 30). It authorizes spending every day, so it takes two calls: first with confirm false, which returns the new monthly credit ceiling; tell the person that ceiling and ask them to confirm; only after they say yes, call again with confirm true and that same monthlyCredits. Only a workspace owner or admin can change it. This is people added per day, not the LinkedIn sending limit (30 a day per account, fixed).

Discovered
set_campaign_signal_monitor

Feed a campaign from a market signal monitor (from list_signal_monitors), or stop it with monitorId null. Each day the campaign's daily additions take the companies the monitor delivered and write to one person at each: the person the monitor already found, a store's owner, or jobTitle searched at the company (required unless the monitor is about online stores or the campaign already has a job title). It spends nothing by itself: people are added at the campaign's daily limit (set_campaign_daily_people). Only a workspace owner or admin can change it. When the user did not name the campaign, never pick one: call ask_user first with their campaigns as options (09/10/2026: "Alimente uma campanha com o sinal X" linked one on its own).

Discovered
set_prospect_closure_reason

Record why a conversation with ONE person ended (interested, not_interested, bad_timing, has_solution, wrong_person, opt_out), or null to clear it. Kept as history; it does not send anything.

Discovered
set_routine_status

Pause a routine, or resume it (it runs again at its next slot, never the ones it missed). Ids from list_routines.

Discovered
update_cadence_ai_field

Change the instruction of one sentence the Agent writes for each person in ONE campaign's cadence (a field marked {{ia:key}} in the bodies, shown on screen by its label, such as 'a vaga aberta' or 'a retomada'), for everyone on the list. Use it when the user asks how that sentence should read for all people ('na abertura, começa com "vi que vocês abriram vaga de X"', 'na vaga aberta, cita o cargo da vaga', 'a retomada não pode falar de preço'), or when they edited it in one person's messages and want it for everyone. Read the campaign first with list_outreach_campaigns and campaignId: its aiFields list each field's day, key, label, instruction and example. instruction is the whole instruction the field follows from now on: the current one with the user's request worked in, keeping what it says, from which fact, and what it leads into, unless the user asked to change that. Pass an example when the request changes how the sentence reads: the current example rewritten to follow it, with the same facts. The instruction changes now, without writing anyone: in steps not sent yet, a sentence written from the old instruction goes back to the field, and nobody's messages are written again until the user says yes (follow messagesNext in the result); messages edited by hand and sent ones stay; people not written yet follow it when written. Free. Nothing is sent. Not for fixed text (update_outreach_cadence), not for how the whole cadence reads (adjust_outreach_cadence), and never while a campaign is being created in the chat with its draft beside it: there the flow's draft tool (campaign_draft_cadence; onboarding_draft_cadence in the onboarding) with adjustments changes the draft and its fields the person is looking at.

Discovered
update_campaign_settings

Change a campaign's sending rules. Only the fields sent change. approveBeforeSending can only be turned ON here (every step then waits for approval in the Inbox); turning it off, and the daily enrollment, are authorizations the user gives in the campaign's Settings screen.

Discovered
update_customer_list

Change the workspace's customer list. mode add puts companies on it, remove takes them off, replace swaps the whole list (only when the user sends their full list). lines: one company name or site per line, or "Name, site".

Discovered
update_knowledge_base

Change the workspace's company profile. Only the fields sent change; send the full new text of a section you rewrite. Campaigns written afterwards use it.

Discovered
update_outreach_cadence

Change the cadence of ONE campaign: the shared template every person gets (when you write the new text yourself: Clarity before brevity: someone who never heard of the sender reads each message once and knows exactly what it means. Every verb carries its object: say who they look for and what they start ('encontrar novos clientes', 'as empresas para quem vocês vendem', 'os decisores dessas empresas', 'começar a prospectar'), never 'abrir conversas', 'começar', 'testar uma forma' or 'isso' on their own. The give says what it is for ('1.000 créditos para encontrar empresas e decisores e começar essas conversas'). Add the few words that make it clear even if the message passes the word range. Each fact about the product is a reason this reader would buy: what they get (new clients, the right decision makers, hours back, contacts that work). Never build a message on a mechanic every outreach tool has (pausing when someone replies, sending through Gmail, scheduling, templates, a review step); at most half a sentence, and only when it answers their worry.) A change of form or tone (lowercase, more formal, shorter, another greeting, no emoji) goes to every step. When the edit follows a style instruction that holds for any campaign ("não anuncie o que vai fazer", "e-mails curtos", "abra com uma pergunta"), also call add_cadence_rule with it as one short imperative line, and say "Guardei isso nas regras de cadência" with the undo (remove_cadence_rule). A change of content or structure (add a question, mention something, change the argument) goes to the step the person means, not to every step, unless they say every message: the step their words point to (a day, a channel, a sentence only that step has); when nothing in them says which, the cadence step open on their screen (in your context); when none is open, ask which with ask_user, the steps as options. Either way each follow-up keeps its own new reason to reply (a case, how the work is done, a resource, what changes for the reader), and the last step keeps closing the subject. Before writing a step, read the others: no phrase, opening or ask they already use, and never change a step the person did not ask about (requestedDays). (and people added later). This is the default for any wording change the user asks for, including 'the template', 'every day' or 'everyone'. To change one or a few steps, pass `edits` (day or "last", optional channel, new body; op add/remove/move to insert, delete or reschedule a step, op condition to change what lets a step go: no reply in N days, the invite accepted, or the e-mail before it opened) and the other steps stay as they are; pass `steps` only to replace the whole cadence, and never both: the call carries every text twice and a long one is cut off. Leave prospectId out unless scope is "one_person". scope is "template" (the default) for every such request, even while the screen shows one example person; "one_person" with prospectId ONLY when the user names one person and asks to change just that person's messages. A prospectId without scope "one_person" is ignored. Call list_outreach_campaigns with campaignId first to read the current cadence. Does not activate sending. A template change saves the template only: the people's steps not sent yet take it with its fields to write, and nobody is written again until the user says yes (follow messagesNext in the result).

Discovered
update_outreach_campaign

Edit the settings of ONE outreach campaign the authenticated user owns, by campaignId. It changes only the fields you pass: the campaign name, the offering (what the company sells), the give (value offered before asking), sender name, company, role and URL, tone, goal, call to action, message length, constraints (what the copy must never say), company/product context and which connected mailbox, LinkedIn or WhatsApp account sends; omitted or empty fields keep their current value. It sends nothing, adds or removes no people and does not start, pause or resume the campaign. Use this when the user asks to edit the open campaign or a named campaign. "O que a campanha oferece" (the activation item) and "O que você dá antes de pedir" are the give, never the offering; the offering ("Oferta") is what the company sells. A new give on a campaign that already has a cadence writes the cadence's template again from it, now; the people's messages are written again only after the user says yes (follow messagesNext in the result). Does not pause, resume, activate the cadence, or rewrite cadence copy — use update_outreach_cadence / regenerate_outreach_cadence / update_outreach_campaign_status / activate_outreach_campaign for those.

Discovered
update_outreach_campaign_status

Pause or resume ONE campaign cadence, or archive it. Pausing prevents new sends and freezes the schedule. Resuming may send the next due step in the business window, so obtain explicit user confirmation before resuming. "archived" keeps the people, the sends, the replies and the reports, stops everything and takes it out of the campaign list; "paused" on an archived campaign unarchives it (paused, or a draft when it never ran). Archiving is the way to put away a campaign: deleting erases its send history.

Discovered
update_prospect

Update ONE prospect owned by the authenticated user: move it through the pipeline and/or rewrite its message. Editing a message never regenerates it and never costs credits. Statuses: ready, sending, awaiting_reply, replied, paused, failed. Setting awaiting_reply stamps the sent time; replied stamps the reply time.

Discovered
update_signal_monitor

Change a signal monitor: its filters, name, schedule, monthly credit limit, destination sheet, or pause/resume it. Only the fields sent change. A market monitor also takes dailyLimit and market (its whole filter set, same signal). An engagement signal takes addPeople and removePeople (LinkedIn profile URLs; a founder found on its own can be removed too); its watchedProfiles say whose posts it reads.

Discovered

Recent measurements

Probe history

View status
Latest stored probes. Raw probe rows are kept for 90 days.
CheckedResultResponseTools
Connected2546 ms99