Tool Selection

GTM Tools has 30+ tools across four servers. Picking the cheapest tool that answers your question is the single biggest lever for keeping spend under control.

Decision flow

”I have a domain and want to know who works there”

  1. Qualify first. Run detect_signal (free dispatch + 5/detector). If nothing fires, stop.
  2. get_linkedin_company_url (2 tokens) — confirm the company has a LinkedIn page.
  3. list_linkedin_company_employees (30 tokens) with boolean title filters. Don’t run it without filters; the limit parameter doesn’t reduce cost.

”I have a name and a company”

  1. get_linkedin_profile_url (5 tokens) — resolves to a profile URL.
  2. get_linkedin_profile (4 tokens) — only if you need the full structured profile.

Don’t call list_linkedin_company_employees to find one specific named person — that’s 30 tokens vs. 5.

”I need this person’s email”

  1. get_email (5 tokens) — pass name + domain.
  2. Check is_catch_all in the response. If true, cross-check against LinkedIn before relying on it.

”I want to know what tech a company uses”

  1. signal_technologies_identified (5 tokens) with the specific techs array.
  2. Don’t run detect_signal if this is the only signal you care about — the dispatch will run other detectors too.

”I want to read posts from a company”

You wantUseTokens
Recent official postslist_linkedin_company_posts5
One specific postget_linkedin_post2
Posts from one employeelist_user_posts5
Posts from many employeeslist_linkedin_company_employees_posts80

list_linkedin_company_employees_posts is by far the most expensive socials tool. Only use it when you actually need the fanout — otherwise scope to specific profile URLs with list_user_posts.

Free tools to lean on

ToolServerWhy
pingAllHealth check — useful to verify auth wiring before spending tokens
get_token_balanceAdminCheck before launching a batch
list_invoicesAdminReview historical spend
connect_linkedinSocialsSet up the session before write tools
list_connected_linkedin_accountsSocialsConfirm session is alive
detect_signalSignalsDispatcher — only the detectors that run are charged
get_signals_order / set_signals_orderSignalsTune order to short-circuit on first hit

Server selection

QuestionServer
”How much will this cost?” / “Top up” / “Get a key”admin-tools
”Find a company / person / post / job on LinkedIn”socials-tools
”Verify an email address”data-tools
”Is this company in buying mode?”signals-tools

Only point your MCP client at the servers you actually need. Adding all four is fine, but it grows your agent’s tool list and risks the model picking the wrong one.

Filter early, hydrate late

A common mistake is fetching full profiles for everyone in a list, then filtering in code:

1// Bad — 4 tokens × 25 = 100 tokens
2const profiles = await Promise.all(
3 employeeUrls.map(url => call("socials", "get_linkedin_profile", { profile_url: url }))
4);
5const decisionMakers = profiles.filter(p => /VP|Director|Head/.test(p.title));

Use list_linkedin_company_employees with title_filters instead — one 30-token call gets you the filtered list directly:

1// Good — 30 tokens
2const { results } = await call("socials", "list_linkedin_company_employees", {
3 domain: "gymshark.com",
4 title_filters: "(VP OR Director OR Head) AND Sales NOT intern",
5 limit: 25,
6});

Then hydrate only the candidates you actually want to message.

Next steps