About mcp-gtm-job-discovery
An MCP server that searches job postings for role keywords and enriches each posting with company firmographics and a LinkedIn URL. It is a thin Apify actor client for teams identifying companies hiring for target roles.
Key features
- 01Search postings by role keywords
- 02Search across configurable job sources
- 03Filter by country, date, size, and remote status
- 04Exclude staffing agencies and freelance marketplaces
- 05Enrich companies with firmographics and LinkedIn URLs
Use cases
- 01Find companies hiring for target roles
- 02Build company lists for sales prospecting
- 03Track new postings between runs
MCP support
Exposes the `monitor_job_postings` tool to MCP clients. It forwards inputs to an Apify actor and returns its output.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
npx -y @mambalabsdev/mcp-gtm-job-discoveryAPIFY_TOKENSecretApify API token from https://console.apify.com/account/integrationsLocal servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.
Tools
1Saved tool list · updated 2w ago
| Parameter | Type | Required | Description |
|---|---|---|---|
| country | string | No | Geographic filter, e.g. United States, United Kingdom, Canada. Default: "United States". |
| sources | array | No | Which job boards to search, run as an ordered chain. Tier 0 needs no key and runs every keyword: jobicy, remotive, arbeitnow, themuse, remoteok, weworkremotely, himalayas. Tier 1 is adzuna (needs adzuna_app_id and adzuna_app_key). Tier 2 runs only on keywords the earlier tiers left short: jobspipe and theirstack (each needs its key, billed by the provider per job returned) and google_jobs (needs serpapi_key). A posting on two boards is deduplicated and counted once. Default: ["google_jobs"]. |
| keywords | array | Yes | Role titles to search for across job boards, one per entry, for example ["account executive", "revops manager"]. Each keyword runs through the source chain separately. |
| countries | array | No | Loop these countries inside one run; overrides country when set. Metered sources query each country separately; keyless remote boards are global and run once. Use the names Google Jobs accepts, for example United States, United Kingdom, Canada. |
| max_results | integer | No | Upper bound on raw postings pulled from the discovery source before filtering. Higher values cost more. Default: 100. |
| remote_only | boolean | No | Only return remote / work-from-home postings. Default: false. |
| serpapi_key | string | No | SerpAPI key used for Google Jobs discovery (get a free key at serpapi.com, 250 searches/month, no card). Required to produce results unless a SERPAPI_KEY environment variable is set on the actor. |
| jobspipe_key | string | No | Your JobsPipe Bearer key (jp_live_...) for the jobspipe source. JobsPipe bills one credit per job returned. The actor's JOBSPIPE_KEY environment variable is used when this is empty. |
| adzuna_app_id | string | No | Your Adzuna application id for the adzuna source. It travels in the tool call; the actor's ADZUNA_APP_ID environment variable is used when this is empty. |
| lookback_days | integer | No | Only return postings newer than this many days. Default: 30. |
| max_companies | integer | No | Cap on unique companies enriched per run (firmographics + LinkedIn). Bounds sub-actor cost. Default: 40. |
| adzuna_app_key | string | No | Your Adzuna application key for the adzuna source. The actor's ADZUNA_APP_KEY environment variable is used when this is empty. |
| theirstack_key | string | No | Your TheirStack API key for the theirstack source. TheirStack bills one credit per job returned. The actor's THEIRSTACK_KEY environment variable is used when this is empty. |
| metered_run_cap | integer | No | Ceiling per metered source per country per run: searches for SerpAPI, calls for Adzuna, jobs for JobsPipe and TheirStack. Default: 50. |
| company_size_max | integer | No | Optional. Drop companies larger than this (only applied when company size is known). |
| company_size_min | integer | No | Optional. Drop companies with fewer employees than this (only applied when company size is known). |
| previous_run_date | string | No | Optional ISO date (e.g. 2026-06-01) of your last run. Only postings newer than this are emitted, on top of the built-in cross-run delta cache. |
| metered_window_days | integer | No | Only ask the metered sources (jobspipe, theirstack) for postings this many days old or newer. They bill per job returned, seen before or not, so a narrow window is the biggest credit saver. 1 to 7. Default: 2. |
| freelance_marketplaces | array | No | Company names treated as freelance marketplaces and excluded when the toggle above is on. Defaults shown; override or extend as needed. Default: ["Upwork", "Fiverr", "Freelancer", "Toptal", "PeoplePerHour", "Guru", "99designs"]. |
| exclude_staffing_agencies | boolean | No | Filter out staffing and recruitment agency postings using name and job-description heuristics. Default: true. |
| exclude_freelance_marketplaces | boolean | No | Filter out postings where the company is a freelance marketplace (Upwork, Fiverr, etc.), which are noise for direct outreach. Default: true. |
| enough_new_companies_per_keyword | integer | No | Stop the source chain for a keyword once this many distinct new companies have been found for it this run. Later, metered tiers run only on keywords still below this. Default: 3. |
Details
From the project READMEJob Posting Monitor MCP Server
MCP server for the Mamba Labs Job Posting Monitor actor on Apify.
Give it a list of role keywords and it returns the companies currently advertising those roles, one flat row per posting, each enriched with firmographics and the company LinkedIn URL.
Install
npx -y @mambalabsdev/mcp-gtm-job-discovery
Claude Desktop
{
"mcpServers": {
"mamba-gtm-job-discovery": {
"command": "npx",
"args": ["-y", "@mambalabsdev/mcp-gtm-job-discovery"],
"env": { "APIFY_TOKEN": "your-apify-token" }
}
}
}
Get an Apify token at console.apify.com/account/integrations.
Tool
monitor_job_postings
Give it a list of role keywords and it returns the companies currently advertising those roles, one flat row per posting, each enriched with firmographics and the company LinkedIn URL.
| Input | Type | Required | Notes |
|---|---|---|---|
keywords | array | yes | Role titles to search for, one per entry. Each keyword runs through the source chain separately. |
sources | array | no | Job boards, run as an ordered chain. Tier 0, no key: jobicy, remotive, arbeitnow, themuse, remoteok, weworkremotely, himalayas. Tier 1: adzuna (needs adzuna_app_id and adzuna_app_key). Tier 2, only for keywords still short: jobspipe, theirstack (each needs its key) and google_jobs (needs serpapi_key). A posting on two boards is counted once. Default ["google_jobs"]. |
country | string | no | Geographic filter, for example United States, United Kingdom, Canada. Default United States. |
countries | array | no | Loop these countries in one run. Overrides country when set. |
lookback_days | integer | no | Only return postings newer than this many days. Default 30. |
company_size_min | integer | no | Drop companies with fewer employees than this (applied only when company size is known). |
company_size_max | integer | no | Drop companies larger than this (applied only when company size is known). |
exclude_staffing_agencies | boolean | no | Filter out staffing and recruitment agency postings. Default true. |
exclude_freelance_marketplaces | boolean | no | Filter out postings where the company is a freelance marketplace (Upwork, Fiverr, and others). Default true. |
freelance_marketplaces | array | no | Company names treated as freelance marketplaces. Default ["Upwork", "Fiverr", "Freelancer", "Toptal", "PeoplePerHour", "Guru", "99designs"]. |
remote_only | boolean | no | Only return remote postings. Default false. |
previous_run_date | string | no | ISO date of your last run, for example 2026-06-01. Only newer postings are emitted, on top of the built in cross run delta cache. |
max_results | integer | no | Upper bound on raw postings pulled before filtering. Higher values cost more. Default 100. |
max_companies | integer | no | Cap on unique companies enriched per run (firmographics and LinkedIn). Default 40. |
serpapi_key | string | no | Your SerpAPI key for the google_jobs source (free key at serpapi.com, 250 searches a month). |
adzuna_app_id | string | no | Your Adzuna application id for the adzuna source. |
adzuna_app_key | string | no | Your Adzuna application key for the adzuna source. |
jobspipe_key | string | no | Your JobsPipe key for the jobspipe source. Billed by JobsPipe per job returned. |
theirstack_key | string | no | Your TheirStack key for the theirstack source. Billed by TheirStack per job returned. |
metered_window_days | integer | no | Ask the metered sources only for postings this many days old or newer, 1 to 7. Default 2. |
enough_new_companies_per_keyword | integer | no | Stop the chain for a keyword once this many new companies are found. Default 3. |
metered_run_cap | integer | no | Ceiling per metered source per country per run. Default 50. |
max_charge_usd | number | no | Optional cost cap in USD for this run. The actor stops before an item that could take its charges past this amount. Omit to rely on the maximum cost per run set in Apify. |
Keys passed as inputs travel in the tool call and stay in the chat transcript.
Billing
You are charged per result row returned, plus a small actor start fee. Filtered postings are free.
Price per event on the Apify FREE plan, from the live pricing record; paid Apify plans pay less per event.
| Event | Price (USD) |
|---|---|
Actor Start (apify-actor-start) | 0.00005 |
result (apify-default-dataset-item) | 0.02 |
Pricing is on the actor's Apify page. Running this server consumes Apify credits.
What this server does and does not do
It is a thin client for the Apify actor. It passes your input through and returns the actor's output unchanged. Every behavior described above lives in the actor, not here.
Errors are surfaced, never swallowed. An invalid input, an invalid token, an exhausted balance, a timeout, or a run that returns anything other than a dataset all come back as an explicit tool error rather than as an empty result.
Source
The actor is on the Apify Store. This wrapper is MIT licensed.
Built by Mamba Labs
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.