@mambalabsdev/mcp-job-board-keyword-signal-scanner 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Mamba Labs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,69 @@
1
+ # Job Board Keyword Signal Scanner MCP Server
2
+
3
+ An MCP server that scans a company's job board for the roles you care about. It wraps the Mamba Labs Job Board Keyword Signal Scanner actor on Apify and returns a Clay-ready flat JSON row to any MCP client.
4
+
5
+ ## What it does
6
+
7
+ Give it a company domain and a set of role categories, and it scans Greenhouse, Lever, Ashby, Workday, and Rippling for matching open roles. Pick from GTM, Engineering, Finance, Operations, Executive, or pass your own custom keywords. You get back a flat row of matched role counts and titles per category, ready for Clay, a CRM, or an AI agent workflow. All of the scanning runs on Apify. This package is a thin client that calls the actor and hands back the result.
8
+
9
+ ## Quick start
10
+
11
+ You need Node.js 18 or newer and an Apify account with an API token.
12
+
13
+ Add this to your Claude Desktop config:
14
+
15
+ ```json
16
+ {
17
+ "mcpServers": {
18
+ "mamba-job-board-scanner": {
19
+ "command": "npx",
20
+ "args": ["-y", "@mambalabsdev/mcp-job-board-keyword-signal-scanner"],
21
+ "env": {
22
+ "APIFY_TOKEN": "your-apify-token"
23
+ }
24
+ }
25
+ }
26
+ }
27
+ ```
28
+
29
+ Get your token at https://console.apify.com/account/integrations, paste it in, and restart Claude Desktop. The `scan_job_board_keywords` tool will be available.
30
+
31
+ ## Prerequisites
32
+
33
+ - Node.js 18 or newer
34
+ - An Apify account with an API token
35
+
36
+ ## Example prompts
37
+
38
+ - "Is stripe.com hiring engineers? Scan their job board for Engineering roles."
39
+ - "Check openai.com for GTM and Executive openings."
40
+ - "Scan figma.com for Finance and Operations roles."
41
+ - "Look for roles matching 'machine learning' and 'platform' at datadoghq.com using custom keywords."
42
+
43
+ ## Inputs
44
+
45
+ - `company_domain` (required): the bare company domain, no `https://` and no trailing slash. Example: `stripe.com`
46
+ - `role_categories` (required): one or more of GTM, Engineering, Finance, Operations, Executive, Custom.
47
+ - `custom_keywords` (optional): keyword strings to match when Custom is included.
48
+ - `enable_fallback` (optional): fall back to a pre-indexed job database when the live ATS cascade finds nothing.
49
+ - `previous_roles_detected` and `previous_run_date` (optional): pass a prior run's results to compute newly added or removed roles over time.
50
+
51
+ ## Output
52
+
53
+ The tool returns the actor's flat JSON row for the scanned company, including matched role counts and titles per requested category, the ATS platform detected, and optional change tracking. See the Apify Store page for the full output schema.
54
+
55
+ ## Full actor documentation
56
+
57
+ This server is a thin client and holds no scanning logic. For the complete input and output reference, pricing, and run history, see the Apify Store page:
58
+
59
+ https://apify.com/mambalabs/job-board-keyword-signal-scanner
60
+
61
+ ## Mamba Labs GTM Suite
62
+
63
+ This is one of six actors in the Mamba Labs GTM Suite, covering hiring signals, tech stack detection, signal aggregation, job board keyword scanning, LinkedIn URL resolution, and ICP scoring. See them all at https://apify.com/mambalabs.
64
+
65
+ ## License
66
+
67
+ MIT
68
+
69
+ Built by Mamba Labs. https://apify.com/mambalabs
package/build/index.js ADDED
@@ -0,0 +1,110 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from "node:fs";
3
+ import { fileURLToPath } from "node:url";
4
+ import { dirname, join } from "node:path";
5
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
7
+ import { z } from "zod";
8
+ const here = dirname(fileURLToPath(import.meta.url));
9
+ const pkg = JSON.parse(readFileSync(join(here, "..", "package.json"), "utf8"));
10
+ const APIFY_TOKEN = process.env.APIFY_TOKEN;
11
+ if (!APIFY_TOKEN) {
12
+ console.error([
13
+ "APIFY_TOKEN is not set.",
14
+ "This server needs an Apify API token to run the Job Board Keyword Signal Scanner actor.",
15
+ "Create a token at https://console.apify.com/account/integrations and pass it as the APIFY_TOKEN environment variable.",
16
+ ].join("\n"));
17
+ process.exit(1);
18
+ }
19
+ // The tilde between the org name and the actor name is Apify's required separator.
20
+ const ACTOR_ENDPOINT = "https://api.apify.com/v2/acts/mambalabs~job-board-keyword-signal-scanner/run-sync-get-dataset-items?timeout=300";
21
+ const server = new McpServer({
22
+ name: "mamba-job-board-keyword-signal-scanner",
23
+ version: pkg.version,
24
+ });
25
+ server.tool("scan_job_board_keywords", "Scan a company's job board for roles in chosen categories across Greenhouse, Lever, Ashby, Workday, and Rippling. Pick from GTM, Engineering, Finance, Operations, Executive, or supply custom keywords. Returns a flat, Clay-ready JSON row of matched role counts and titles per category.", {
26
+ company_domain: z
27
+ .string()
28
+ .describe("Bare company domain without https:// and without a trailing slash. Example: stripe.com"),
29
+ role_categories: z
30
+ .array(z.string())
31
+ .describe("One or more role categories to scan for. Valid values: GTM, Engineering, Finance, Operations, Executive, Custom. Use Custom together with custom_keywords."),
32
+ custom_keywords: z
33
+ .array(z.string())
34
+ .optional()
35
+ .describe("Keyword strings to match when Custom is included in role_categories. Required only if Custom is requested."),
36
+ enable_fallback: z
37
+ .boolean()
38
+ .optional()
39
+ .describe("If true, falls back to a pre-indexed job database when the live ATS cascade finds nothing."),
40
+ previous_roles_detected: z
41
+ .string()
42
+ .optional()
43
+ .describe("Comma-separated matched role titles from a previous run, used to compute newly added or removed roles."),
44
+ previous_run_date: z
45
+ .string()
46
+ .optional()
47
+ .describe("ISO date of the previous run, e.g. 2026-03-15. Used for tracking changes over time."),
48
+ }, async ({ company_domain, role_categories, custom_keywords, enable_fallback, previous_roles_detected, previous_run_date, }) => {
49
+ const input = { company_domain, role_categories };
50
+ if (custom_keywords !== undefined)
51
+ input.custom_keywords = custom_keywords;
52
+ if (enable_fallback !== undefined)
53
+ input.enable_fallback = enable_fallback;
54
+ if (previous_roles_detected !== undefined)
55
+ input.previous_roles_detected = previous_roles_detected;
56
+ if (previous_run_date !== undefined)
57
+ input.previous_run_date = previous_run_date;
58
+ let response;
59
+ try {
60
+ response = await fetch(ACTOR_ENDPOINT, {
61
+ method: "POST",
62
+ headers: {
63
+ Authorization: `Bearer ${APIFY_TOKEN}`,
64
+ "Content-Type": "application/json",
65
+ },
66
+ body: JSON.stringify(input),
67
+ });
68
+ }
69
+ catch (err) {
70
+ const message = err instanceof Error ? err.message : String(err);
71
+ return {
72
+ isError: true,
73
+ content: [{ type: "text", text: `Could not reach the Apify API: ${message}` }],
74
+ };
75
+ }
76
+ if (!response.ok) {
77
+ let detail = "";
78
+ try {
79
+ const body = (await response.json());
80
+ if (body?.error?.message)
81
+ detail = ` ${body.error.message}`;
82
+ }
83
+ catch {
84
+ detail = "";
85
+ }
86
+ let message;
87
+ switch (response.status) {
88
+ case 401:
89
+ message = "Invalid Apify token. Check your APIFY_TOKEN environment variable.";
90
+ break;
91
+ case 402:
92
+ message =
93
+ "Insufficient Apify credits. Check your account balance at https://console.apify.com/billing";
94
+ break;
95
+ case 408:
96
+ message =
97
+ "Actor run timed out after 300 seconds. Try again, or run the actor on Apify directly for longer jobs.";
98
+ break;
99
+ default:
100
+ message = `Apify request failed with status ${response.status}.${detail}`;
101
+ }
102
+ return { isError: true, content: [{ type: "text", text: message }] };
103
+ }
104
+ const items = await response.json();
105
+ return {
106
+ content: [{ type: "text", text: JSON.stringify(items, null, 2) }],
107
+ };
108
+ });
109
+ const transport = new StdioServerTransport();
110
+ await server.connect(transport);
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@mambalabsdev/mcp-job-board-keyword-signal-scanner",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for Job Board Keyword Signal Scanner. Scans Greenhouse, Lever, Ashby, Workday, and Rippling for roles in any category via Apify. Clay-ready output.",
5
+ "type": "module",
6
+ "bin": {
7
+ "mcp-job-board-keyword-signal-scanner": "./build/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc && chmod +x build/index.js",
11
+ "prepublishOnly": "npm run build"
12
+ },
13
+ "keywords": [
14
+ "mcp",
15
+ "model-context-protocol",
16
+ "gtm",
17
+ "job-board",
18
+ "hiring",
19
+ "ats",
20
+ "apify",
21
+ "clay",
22
+ "lead-generation"
23
+ ],
24
+ "author": "Mamba Labs <labs@mambamindsetgrowth.com>",
25
+ "license": "MIT",
26
+ "homepage": "https://apify.com/mambalabs/job-board-keyword-signal-scanner",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "https://github.com/mambalabsdev/mcp-job-board-keyword-signal-scanner"
30
+ },
31
+ "engines": {
32
+ "node": ">=18"
33
+ },
34
+ "dependencies": {
35
+ "@modelcontextprotocol/sdk": "^1.12.0",
36
+ "zod": "^3.23.8"
37
+ },
38
+ "devDependencies": {
39
+ "@types/node": "^20.14.0",
40
+ "typescript": "^5.6.0"
41
+ }
42
+ }