@datalayer-sh/mcp 0.1.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.
Files changed (44) hide show
  1. package/README.md +231 -0
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.js +45 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/lib/api.d.ts +2 -0
  6. package/dist/lib/api.js +36 -0
  7. package/dist/lib/api.js.map +1 -0
  8. package/dist/lib/format.d.ts +8 -0
  9. package/dist/lib/format.js +259 -0
  10. package/dist/lib/format.js.map +1 -0
  11. package/dist/tools/company-employees.d.ts +2 -0
  12. package/dist/tools/company-employees.js +33 -0
  13. package/dist/tools/company-employees.js.map +1 -0
  14. package/dist/tools/company-headcount.d.ts +2 -0
  15. package/dist/tools/company-headcount.js +17 -0
  16. package/dist/tools/company-headcount.js.map +1 -0
  17. package/dist/tools/company-jobs.d.ts +2 -0
  18. package/dist/tools/company-jobs.js +17 -0
  19. package/dist/tools/company-jobs.js.map +1 -0
  20. package/dist/tools/company-technographics.d.ts +2 -0
  21. package/dist/tools/company-technographics.js +17 -0
  22. package/dist/tools/company-technographics.js.map +1 -0
  23. package/dist/tools/enrich-company.d.ts +2 -0
  24. package/dist/tools/enrich-company.js +20 -0
  25. package/dist/tools/enrich-company.js.map +1 -0
  26. package/dist/tools/enrich-person.d.ts +2 -0
  27. package/dist/tools/enrich-person.js +21 -0
  28. package/dist/tools/enrich-person.js.map +1 -0
  29. package/dist/tools/intent-signals.d.ts +2 -0
  30. package/dist/tools/intent-signals.js +25 -0
  31. package/dist/tools/intent-signals.js.map +1 -0
  32. package/dist/tools/lookup-company.d.ts +2 -0
  33. package/dist/tools/lookup-company.js +29 -0
  34. package/dist/tools/lookup-company.js.map +1 -0
  35. package/dist/tools/lookup-person.d.ts +2 -0
  36. package/dist/tools/lookup-person.js +32 -0
  37. package/dist/tools/lookup-person.js.map +1 -0
  38. package/dist/tools/search-companies.d.ts +2 -0
  39. package/dist/tools/search-companies.js +27 -0
  40. package/dist/tools/search-companies.js.map +1 -0
  41. package/dist/tools/search-people.d.ts +2 -0
  42. package/dist/tools/search-people.js +27 -0
  43. package/dist/tools/search-people.js.map +1 -0
  44. package/package.json +43 -0
package/README.md ADDED
@@ -0,0 +1,231 @@
1
+ # DataLayer MCP Server
2
+
3
+ **Give your AI agent access to 60M+ companies and 300M+ verified contacts.** Enrich leads, find work emails, discover tech stacks, and identify buying intent — directly from Claude, Cursor, Windsurf, or any MCP-compatible AI agent.
4
+
5
+ [![npm version](https://img.shields.io/npm/v/@datalayer-sh/mcp.svg)](https://www.npmjs.com/package/@datalayer-sh/mcp)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
+
8
+ ---
9
+
10
+ ## What is this?
11
+
12
+ DataLayer is a B2B data enrichment API. This MCP server lets AI agents call it directly — no code, no HTTP requests, just natural language.
13
+
14
+ Ask your agent:
15
+
16
+ > "Find the VP of Engineering at Stripe and get their verified email"
17
+
18
+ > "Show me all SaaS companies in the US using Salesforce with 50+ employees that are actively hiring"
19
+
20
+ > "What's the tech stack at HubSpot? Do they use AWS or GCP?"
21
+
22
+ > "Find companies spending $10K+/mo on Google Ads with employee growth above 15%"
23
+
24
+ The agent calls the right DataLayer tool, gets structured data back, and reasons about it.
25
+
26
+ ---
27
+
28
+ ## Install
29
+
30
+ ### Claude Desktop
31
+
32
+ Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
33
+
34
+ ```json
35
+ {
36
+ "mcpServers": {
37
+ "datalayer": {
38
+ "command": "npx",
39
+ "args": ["-y", "@datalayer-sh/mcp"],
40
+ "env": {
41
+ "DATALAYER_API_KEY": "sk_live_your_key_here"
42
+ }
43
+ }
44
+ }
45
+ }
46
+ ```
47
+
48
+ ### Cursor
49
+
50
+ Add to `.cursor/mcp.json` in your project root:
51
+
52
+ ```json
53
+ {
54
+ "mcpServers": {
55
+ "datalayer": {
56
+ "command": "npx",
57
+ "args": ["-y", "@datalayer-sh/mcp"],
58
+ "env": {
59
+ "DATALAYER_API_KEY": "sk_live_your_key_here"
60
+ }
61
+ }
62
+ }
63
+ }
64
+ ```
65
+
66
+ ### Windsurf / Other MCP Clients
67
+
68
+ Same config pattern. Set the `DATALAYER_API_KEY` environment variable and run `npx -y @datalayer-sh/mcp` via stdio.
69
+
70
+ ### Get your API key
71
+
72
+ 1. Sign up at [datalayer.sh](https://datalayer.sh) (free, no credit card)
73
+ 2. Go to Dashboard → API Keys → Create key
74
+ 3. Copy the `sk_live_...` key into your config
75
+
76
+ **100 free credits included** — enough to test every tool.
77
+
78
+ ---
79
+
80
+ ## What Can You Do?
81
+
82
+ ### Find People & Emails
83
+
84
+ | Tool | What it does | Credits |
85
+ |------|-------------|---------|
86
+ | `enrich_person` | Get name, verified email, phone, job title, seniority, LinkedIn URL for any contact | 1 |
87
+ | `lookup_person` | Find a person by email, phone number, LinkedIn URL, or name + company | 1 |
88
+ | `search_people` | Search 300M+ contacts by title, seniority, function, company, location | 1/result |
89
+ | `company_employees` | List decision-makers at any company, filtered by role and seniority | 1 |
90
+
91
+ **Example**: *"Find all VPs of Engineering at Shopify with verified emails"*
92
+
93
+ ### Research Companies
94
+
95
+ | Tool | What it does | Credits |
96
+ |------|-------------|---------|
97
+ | `enrich_company` | Full company profile — industry, headcount, revenue, funding, tech stack, traffic, ad spend | 1 |
98
+ | `lookup_company` | Find a company by domain, LinkedIn URL, or name | 1 |
99
+ | `search_companies` | Search 60M+ companies by industry, size, tech stack, funding, traffic, growth | 1/result |
100
+
101
+ **Example**: *"Show me Series A fintech companies in the US with 50-200 employees"*
102
+
103
+ ### Company Intelligence
104
+
105
+ | Tool | What it does | Credits |
106
+ |------|-------------|---------|
107
+ | `company_technographics` | Full tech stack across 16 categories — CRM, cloud, marketing automation, analytics, etc. | 1 |
108
+ | `company_headcount` | Department breakdown (engineering, sales, marketing, etc. — 15 departments) | 1 |
109
+ | `company_jobs` | Open roles by department — a hiring intent signal | 1 |
110
+
111
+ **Example**: *"What CRM does Notion use? What about their marketing automation stack?"*
112
+
113
+ ### Buying Intent Signals
114
+
115
+ | Tool | What it does | Credits |
116
+ |------|-------------|---------|
117
+ | `find_intent_signals` | Companies ranked by buying intent — web traffic, Google ad spend, hiring velocity, employee growth, recent funding | 5/result |
118
+
119
+ **Example**: *"Find companies in the SaaS industry that are spending heavily on Google Ads and growing fast"*
120
+
121
+ ---
122
+
123
+ ## Use Cases
124
+
125
+ ### For Sales & GTM Teams
126
+ - **Build targeted lead lists**: "Find CTOs at SaaS companies with 50-500 employees using AWS"
127
+ - **Enrich CRM data**: Pipe company + contact data into HubSpot or Salesforce
128
+ - **Identify buying intent**: Find companies actively hiring + spending on ads = ready to buy
129
+ - **Competitor analysis**: "What tech stack does [competitor] use? Who are their key hires?"
130
+
131
+ ### For Recruiters
132
+ - **Source candidates**: "Find senior engineers at companies using React and TypeScript in San Francisco"
133
+ - **Map org charts**: Get headcount by department for any company
134
+ - **Track hiring signals**: Companies with many open roles = growing = recruiting opportunities
135
+
136
+ ### For Investors & Analysts
137
+ - **Due diligence**: Full company profile with funding history, growth rate, tech stack
138
+ - **Deal sourcing**: "Find recently funded AI companies with high employee growth"
139
+ - **Market mapping**: Search by industry, size, technology, and geography
140
+
141
+ ### For Developers & AI Agents
142
+ - **Automate prospecting**: Build Claude Code pipelines that enrich leads automatically
143
+ - **n8n / Make workflows**: Trigger enrichment from any automation platform
144
+ - **CRM enrichment bots**: Agents that keep your CRM data fresh and complete
145
+
146
+ ---
147
+
148
+ ## Data Coverage
149
+
150
+ | Metric | Coverage |
151
+ |--------|---------|
152
+ | Companies | 60M+ worldwide |
153
+ | Contacts | 300M+ verified professionals |
154
+ | Emails | Verified with 90-day re-verification cycle |
155
+ | Phone numbers | Direct dials and mobile numbers |
156
+ | Tech stack | 16 categories (CRM, cloud, marketing, analytics, etc.) |
157
+ | Signals | Google Ad Spend, web traffic, employee growth, funding, hiring velocity |
158
+ | Geography | Global — US, EU, APAC, LATAM |
159
+
160
+ ---
161
+
162
+ ## How Credits Work
163
+
164
+ - **1 credit = 1 enrichment** (company or person)
165
+ - **Search results**: 1 credit per result returned
166
+ - **Intent signals**: 5 credits per result (premium data)
167
+ - **Failed lookups (404)**: Free — no credits consumed
168
+ - **Credits never expire** on top-up packs
169
+
170
+ 100 free credits on signup. Plans from $49/mo.
171
+
172
+ ---
173
+
174
+ ## Environment Variables
175
+
176
+ | Variable | Required | Description |
177
+ |----------|----------|-------------|
178
+ | `DATALAYER_API_KEY` | Yes | Your API key from [datalayer.sh](https://datalayer.sh) |
179
+ | `DATALAYER_API_URL` | No | Override API base URL (default: `https://api.datalayer.sh`) |
180
+
181
+ ---
182
+
183
+ ## Why DataLayer?
184
+
185
+ | | DataLayer | Apollo | Clay | ZoomInfo |
186
+ |---|---|---|---|---|
187
+ | MCP server | **Yes** | Limited | No | No |
188
+ | REST API | **Yes** | Limited | No | Limited |
189
+ | Intent signals | **Yes** (unique) | Some | No | Yes |
190
+ | Pricing | **From $49/mo** | $49+/user/mo | $185+/mo | $6K+/yr |
191
+ | Credits expire | **Never** | Monthly | Monthly | Annual |
192
+ | Legal risk | **Licensed data** | OK | Varies | OK |
193
+ | Failed lookups | **Free** | Charged | Charged | Charged |
194
+
195
+ ---
196
+
197
+ ## Links
198
+
199
+ - [Website](https://datalayer.sh)
200
+ - [Live Demo](https://datalayer.sh/playground) — try the data, no signup required
201
+ - [API Documentation](https://api.datalayer.sh/docs)
202
+ - [Dashboard & API Keys](https://datalayer.sh/signup)
203
+
204
+ ---
205
+
206
+ ## FAQ
207
+
208
+ **Do I need to write code to use this?**
209
+ No. Install the MCP server, add your API key, and talk to your AI agent in natural language. The agent handles everything.
210
+
211
+ **What AI tools does this work with?**
212
+ Any MCP-compatible client: Claude Desktop, Claude Code, Cursor, Windsurf, Cline, Continue, and more.
213
+
214
+ **Is the data scraped from LinkedIn?**
215
+ No. DataLayer uses licensed, GDPR/CCPA-compliant data. No scraping, no legal risk. (ProxyCurl was shut down for scraping — we don't have that problem.)
216
+
217
+ **How fresh is the data?**
218
+ Contacts are re-verified on a 90-day cycle. Company data is refreshed monthly.
219
+
220
+ **What happens if a lookup returns no results?**
221
+ You're not charged. Failed lookups (404s) are free.
222
+
223
+ ---
224
+
225
+ ## Contributing
226
+
227
+ Issues and pull requests are welcome. Please open an issue first to discuss what you'd like to change.
228
+
229
+ ## License
230
+
231
+ [MIT](LICENSE)
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { registerEnrichCompany } from './tools/enrich-company.js';
5
+ import { registerEnrichPerson } from './tools/enrich-person.js';
6
+ import { registerSearchCompanies } from './tools/search-companies.js';
7
+ import { registerSearchPeople } from './tools/search-people.js';
8
+ import { registerLookupPerson } from './tools/lookup-person.js';
9
+ import { registerLookupCompany } from './tools/lookup-company.js';
10
+ import { registerCompanyEmployees } from './tools/company-employees.js';
11
+ import { registerCompanyHeadcount } from './tools/company-headcount.js';
12
+ import { registerCompanyTechnographics } from './tools/company-technographics.js';
13
+ import { registerCompanyJobs } from './tools/company-jobs.js';
14
+ import { registerIntentSignals } from './tools/intent-signals.js';
15
+ const server = new McpServer({ name: 'datalayer', version: '0.1.0' }, {
16
+ capabilities: { logging: {} },
17
+ instructions: `DataLayer MCP Server — B2B enrichment for AI agents.
18
+
19
+ Available actions:
20
+ - Enrich any company by domain → full profile with signals (tech stack, funding, traffic, ad spend, growth)
21
+ - Enrich any person by email → name, title, phone, LinkedIn, employer
22
+ - Search 60M companies and 300M contacts with rich filters
23
+ - Get company intelligence: employees, headcount, tech stack, open jobs
24
+ - Find companies with buying intent scored by signal strength
25
+
26
+ Tips:
27
+ - Use enrich_company first to get company details, then company_employees to find decision makers.
28
+ - Use search_companies with tech stack filters to find companies using specific tools.
29
+ - Intent signals (find_intent_signals) cost 5 credits per result — use sparingly.
30
+ - All lookups that return 404 are free (no credits consumed).`,
31
+ });
32
+ registerEnrichCompany(server);
33
+ registerEnrichPerson(server);
34
+ registerSearchCompanies(server);
35
+ registerSearchPeople(server);
36
+ registerLookupPerson(server);
37
+ registerLookupCompany(server);
38
+ registerCompanyEmployees(server);
39
+ registerCompanyHeadcount(server);
40
+ registerCompanyTechnographics(server);
41
+ registerCompanyJobs(server);
42
+ registerIntentSignals(server);
43
+ const transport = new StdioServerTransport();
44
+ await server.connect(transport);
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,EACvC;IACE,YAAY,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;IAC7B,YAAY,EAAE;;;;;;;;;;;;;8DAa4C;CAC3D,CACF,CAAC;AAEF,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC7B,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAChC,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC7B,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC7B,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACjC,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACjC,6BAA6B,CAAC,MAAM,CAAC,CAAC;AACtC,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAE9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function apiGet(path: string, params?: Record<string, string>): Promise<any>;
2
+ export declare function apiPost(path: string, body: Record<string, unknown>): Promise<any>;
@@ -0,0 +1,36 @@
1
+ const BASE_URL = process.env.DATALAYER_API_URL ?? 'https://api.datalayer.sh';
2
+ const API_KEY = process.env.DATALAYER_API_KEY;
3
+ function assertKey() {
4
+ if (!API_KEY)
5
+ throw new Error('DATALAYER_API_KEY environment variable is not set. Get your key at https://app.datalayer.sh');
6
+ return API_KEY;
7
+ }
8
+ export async function apiGet(path, params) {
9
+ const key = assertKey();
10
+ const url = new URL(path, BASE_URL);
11
+ if (params)
12
+ Object.entries(params).forEach(([k, v]) => { if (v)
13
+ url.searchParams.set(k, v); });
14
+ const res = await fetch(url.toString(), {
15
+ headers: { 'X-API-Key': key, 'Content-Type': 'application/json' },
16
+ });
17
+ if (!res.ok) {
18
+ const body = await res.json().catch(() => ({}));
19
+ throw new Error(body.message ?? `API error: ${res.status}`);
20
+ }
21
+ return res.json();
22
+ }
23
+ export async function apiPost(path, body) {
24
+ const key = assertKey();
25
+ const res = await fetch(`${BASE_URL}${path}`, {
26
+ method: 'POST',
27
+ headers: { 'X-API-Key': key, 'Content-Type': 'application/json' },
28
+ body: JSON.stringify(body),
29
+ });
30
+ if (!res.ok) {
31
+ const data = await res.json().catch(() => ({}));
32
+ throw new Error(data.message ?? `API error: ${res.status}`);
33
+ }
34
+ return res.json();
35
+ }
36
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,0BAA0B,CAAC;AAC7E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAE9C,SAAS,SAAS;IAChB,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,6FAA6F,CAAC,CAAC;IAC7H,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAY,EAAE,MAA+B;IACxE,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpC,IAAI,MAAM;QAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/F,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;QACtC,OAAO,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,cAAc,EAAE,kBAAkB,EAAE;KAClE,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,cAAc,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAY,EAAE,IAA6B;IACvE,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IAExB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,GAAG,IAAI,EAAE,EAAE;QAC5C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,cAAc,EAAE,kBAAkB,EAAE;QACjE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,cAAc,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare function formatCompany(data: any): string;
2
+ export declare function formatPerson(data: any): string;
3
+ export declare function formatCompanyList(data: any[], pagination: any): string;
4
+ export declare function formatPeopleList(data: any[], pagination: any): string;
5
+ export declare function formatHeadcount(data: any): string;
6
+ export declare function formatTechnographics(data: any): string;
7
+ export declare function formatJobs(data: any): string;
8
+ export declare function formatIntentResults(data: any[], pagination: any): string;
@@ -0,0 +1,259 @@
1
+ const D = '—';
2
+ function num(v) {
3
+ if (v == null || v === '')
4
+ return D;
5
+ const n = Number(v);
6
+ if (isNaN(n))
7
+ return String(v);
8
+ if (n >= 1_000_000_000)
9
+ return `$${(n / 1_000_000_000).toFixed(1)}B`;
10
+ if (n >= 1_000_000)
11
+ return `${(n / 1_000_000).toFixed(1)}M`;
12
+ if (n >= 1_000)
13
+ return n.toLocaleString('en-US');
14
+ return String(n);
15
+ }
16
+ function money(v) {
17
+ if (v == null || v === '')
18
+ return D;
19
+ const n = Number(v);
20
+ if (isNaN(n))
21
+ return String(v);
22
+ if (n >= 1_000_000_000)
23
+ return `$${(n / 1_000_000_000).toFixed(1)}B`;
24
+ if (n >= 1_000_000)
25
+ return `$${(n / 1_000_000).toFixed(1)}M`;
26
+ if (n >= 1_000)
27
+ return `$${n.toLocaleString('en-US')}`;
28
+ return `$${n}`;
29
+ }
30
+ function pct(v) {
31
+ if (v == null || v === '')
32
+ return D;
33
+ const n = Number(v);
34
+ if (isNaN(n))
35
+ return String(v);
36
+ return `${n > 0 ? '+' : ''}${(n * 100).toFixed(1)}%`;
37
+ }
38
+ function s(v) {
39
+ if (v == null || v === '')
40
+ return D;
41
+ return String(v);
42
+ }
43
+ function loc(l) {
44
+ if (!l)
45
+ return D;
46
+ const parts = [l.city, l.state, l.country_code ?? l.country].filter(Boolean);
47
+ return parts.length ? parts.join(', ') : D;
48
+ }
49
+ // ── Company ───────────────────────────────────────────────────────────────────
50
+ export function formatCompany(data) {
51
+ if (!data)
52
+ return 'No company found.';
53
+ const lines = [];
54
+ lines.push(`## ${s(data.name)}`);
55
+ lines.push(`**Domain**: ${s(data.domain)} | **Industry**: ${s(data.industry)} | **Size**: ${s(data.employee_count_range)}`);
56
+ lines.push(`**Founded**: ${s(data.founded)} | **HQ**: ${loc(data.headquarters)} | **Revenue**: ${s(data.revenue_range)}`);
57
+ if (data.linkedin_url)
58
+ lines.push(`**LinkedIn**: ${data.linkedin_url}`);
59
+ if (data.description)
60
+ lines.push(`\n> ${String(data.description).slice(0, 300)}`);
61
+ if (data.signals) {
62
+ const sig = data.signals;
63
+ lines.push('');
64
+ lines.push('### Signals');
65
+ lines.push(`- Google Ad Spend: ${money(sig.google_adspend)}/mo`);
66
+ lines.push(`- Monthly Traffic: ${num(sig.monthly_traffic)} visits`);
67
+ lines.push(`- Employee Growth: ${pct(sig.employee_growth_rate)}/yr`);
68
+ lines.push(`- Total Funding: ${money(sig.total_funding)}${sig.last_funding_type ? ` (${sig.last_funding_type})` : ''}`);
69
+ if (sig.lead_investors)
70
+ lines.push(`- Lead Investors: ${sig.lead_investors}`);
71
+ const techEntries = [
72
+ ['CRM', sig.crm_tech],
73
+ ['Cloud', sig.cloud_provider],
74
+ ['Analytics', sig.analytics_tech],
75
+ ['Marketing', sig.marketing_automation],
76
+ ['Sales', sig.sales_automation],
77
+ ['CMS', sig.cms_tech],
78
+ ['E-commerce', sig.ecommerce_tech],
79
+ ].filter(([, v]) => v);
80
+ if (techEntries.length) {
81
+ lines.push('');
82
+ lines.push('### Tech Stack');
83
+ lines.push(techEntries.map(([k, v]) => `- ${k}: ${v}`).join('\n'));
84
+ }
85
+ }
86
+ return lines.join('\n');
87
+ }
88
+ // ── Person ────────────────────────────────────────────────────────────────────
89
+ export function formatPerson(data) {
90
+ if (!data)
91
+ return 'No person found.';
92
+ const lines = [];
93
+ lines.push(`## ${s(data.full_name)}`);
94
+ lines.push(`**Title**: ${s(data.job_title)} | **Level**: ${s(data.job_level)} | **Function**: ${s(data.job_function)}`);
95
+ const contactParts = [];
96
+ if (data.email)
97
+ contactParts.push(`**Email**: ${data.email}`);
98
+ if (data.phone)
99
+ contactParts.push(`**Phone**: ${data.phone}`);
100
+ if (contactParts.length)
101
+ lines.push(contactParts.join(' | '));
102
+ if (data.company) {
103
+ const c = data.company;
104
+ lines.push(`**Company**: ${s(c.name)}${c.domain ? ` (${c.domain})` : ''}`);
105
+ }
106
+ lines.push(`**Location**: ${loc(data.location)}`);
107
+ if (data.linkedin_url)
108
+ lines.push(`**LinkedIn**: ${data.linkedin_url}`);
109
+ if (data.headline)
110
+ lines.push(`> ${data.headline}`);
111
+ return lines.join('\n');
112
+ }
113
+ // ── Company List ──────────────────────────────────────────────────────────────
114
+ export function formatCompanyList(data, pagination) {
115
+ if (!data?.length)
116
+ return 'No companies found.';
117
+ const lines = [];
118
+ lines.push(`**${num(pagination.total)} companies** (page ${pagination.page}, ${data.length} shown)\n`);
119
+ lines.push('| Company | Domain | Industry | Size | HQ |');
120
+ lines.push('|---|---|---|---|---|');
121
+ for (const c of data) {
122
+ lines.push(`| ${s(c.name)} | ${s(c.domain)} | ${s(c.industry)} | ${s(c.employee_count_range)} | ${loc(c.headquarters)} |`);
123
+ }
124
+ if (pagination.has_more)
125
+ lines.push(`\n*More results available — request page ${pagination.page + 1}.*`);
126
+ return lines.join('\n');
127
+ }
128
+ // ── People List ───────────────────────────────────────────────────────────────
129
+ export function formatPeopleList(data, pagination) {
130
+ if (!data?.length)
131
+ return 'No people found.';
132
+ const lines = [];
133
+ lines.push(`**${num(pagination.total)} contacts** (page ${pagination.page}, ${data.length} shown)\n`);
134
+ lines.push('| Name | Title | Company | Email | Location |');
135
+ lines.push('|---|---|---|---|---|');
136
+ for (const p of data) {
137
+ const email = p.email ? p.email : D;
138
+ lines.push(`| ${s(p.full_name)} | ${s(p.job_title)} | ${s(p.company?.name)} | ${email} | ${loc(p.location)} |`);
139
+ }
140
+ if (pagination.has_more)
141
+ lines.push(`\n*More results available — request page ${pagination.page + 1}.*`);
142
+ return lines.join('\n');
143
+ }
144
+ // ── Headcount ─────────────────────────────────────────────────────────────────
145
+ export function formatHeadcount(data) {
146
+ if (!data)
147
+ return 'No headcount data found.';
148
+ const lines = [];
149
+ lines.push('## Headcount by Department\n');
150
+ lines.push('| Department | Count |');
151
+ lines.push('|---|---|');
152
+ const depts = [
153
+ ['Engineering', data.engineering],
154
+ ['Sales', data.sales],
155
+ ['Marketing', data.marketing],
156
+ ['Operations', data.operations],
157
+ ['IT', data.it],
158
+ ['DevOps', data.devops],
159
+ ['Customer Success', data.customer_success],
160
+ ['Business Development', data.business_development],
161
+ ['Android Dev', data.android_dev],
162
+ ['iOS Dev', data.ios_dev],
163
+ ['Mobile Dev', data.mobile_dev],
164
+ ['QA', data.qa],
165
+ ['Security', data.security],
166
+ ['GRC', data.grc],
167
+ ['Network Infrastructure', data.network_infrastructure],
168
+ ];
169
+ let total = 0;
170
+ for (const [name, count] of depts) {
171
+ const n = Number(count ?? 0);
172
+ if (n > 0) {
173
+ lines.push(`| ${name} | ${num(n)} |`);
174
+ total += n;
175
+ }
176
+ }
177
+ lines.push(`| **Total** | **${num(total)}** |`);
178
+ return lines.join('\n');
179
+ }
180
+ // ── Technographics ────────────────────────────────────────────────────────────
181
+ export function formatTechnographics(data) {
182
+ if (!data)
183
+ return 'No technographic data found.';
184
+ const lines = [];
185
+ lines.push('## Tech Stack\n');
186
+ const categories = [
187
+ ['CRM', data.crm],
188
+ ['Cloud Provider', data.cloud_provider],
189
+ ['CMS', data.cms],
190
+ ['Marketing Automation', data.marketing_automation],
191
+ ['Sales Automation', data.sales_automation],
192
+ ['Analytics', data.analytics],
193
+ ['E-commerce', data.ecommerce],
194
+ ['Email Hosting', data.email_hosting],
195
+ ['Email Security', data.email_security],
196
+ ['Cloud Security', data.cloud_security],
197
+ ['Application Security', data.application_security],
198
+ ['Conversation Intelligence', data.conversation_intelligence],
199
+ ['ABM', data.abm],
200
+ ['ERP', data.erp],
201
+ ['Development', data.development],
202
+ ['Martech Categories', data.martech_categories],
203
+ ];
204
+ for (const [name, value] of categories) {
205
+ if (value)
206
+ lines.push(`- **${name}**: ${value}`);
207
+ }
208
+ if (lines.length === 2)
209
+ return 'No tech stack data available.';
210
+ return lines.join('\n');
211
+ }
212
+ // ── Jobs ──────────────────────────────────────────────────────────────────────
213
+ export function formatJobs(data) {
214
+ if (!data)
215
+ return 'No open roles data found.';
216
+ const lines = [];
217
+ lines.push(`## Open Roles (${num(data.total_open_roles)} total)\n`);
218
+ if (!data.by_department)
219
+ return lines[0];
220
+ lines.push('| Department | Open Roles |');
221
+ lines.push('|---|---|');
222
+ const depts = [
223
+ ['Sales', data.by_department.sales],
224
+ ['DevOps', data.by_department.devops],
225
+ ['Marketing', data.by_department.marketing],
226
+ ['IT', data.by_department.it],
227
+ ['Security', data.by_department.security],
228
+ ['Customer Success', data.by_department.customer_success],
229
+ ['Business Development', data.by_department.business_development],
230
+ ['Demand Generation', data.by_department.demand_generation],
231
+ ['Operations', data.by_department.operations],
232
+ ['Network Infrastructure', data.by_department.network_infrastructure],
233
+ ['GRC', data.by_department.grc],
234
+ ['Account Executive', data.by_department.account_executive],
235
+ ];
236
+ for (const [name, count] of depts) {
237
+ const n = Number(count ?? 0);
238
+ if (n > 0)
239
+ lines.push(`| ${name} | ${n} |`);
240
+ }
241
+ return lines.join('\n');
242
+ }
243
+ // ── Intent Signals ────────────────────────────────────────────────────────────
244
+ export function formatIntentResults(data, pagination) {
245
+ if (!data?.length)
246
+ return 'No companies with matching intent signals found.';
247
+ const lines = [];
248
+ lines.push(`**${num(pagination.total)} companies with intent** (page ${pagination.page}, ${data.length} shown)\n`);
249
+ lines.push('| Company | Domain | Score | Signals | Industry | Size |');
250
+ lines.push('|---|---|---|---|---|---|');
251
+ for (const c of data) {
252
+ const signals = c.intent_signals?.join(', ') ?? D;
253
+ lines.push(`| ${s(c.name)} | ${s(c.domain)} | ${c.intent_score ?? 0} | ${signals} | ${s(c.industry)} | ${s(c.employee_count_range)} |`);
254
+ }
255
+ if (pagination.has_more)
256
+ lines.push(`\n*More results available — request page ${pagination.page + 1}.*`);
257
+ return lines.join('\n');
258
+ }
259
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerCompanyEmployees(server: McpServer): void;
@@ -0,0 +1,33 @@
1
+ import { z } from 'zod';
2
+ import { apiGet } from '../lib/api.js';
3
+ import { formatPeopleList } from '../lib/format.js';
4
+ export function registerCompanyEmployees(server) {
5
+ server.tool('company_employees', 'List employees at a company, filterable by seniority and function.', {
6
+ domain: z.string().describe('Company domain (e.g., stripe.com)'),
7
+ seniority: z.string().optional().describe('Filter by seniority (e.g., VP, Director, C-Suite)'),
8
+ function: z.string().optional().describe('Filter by function (e.g., Engineering, Sales)'),
9
+ has_email: z.boolean().optional().describe('Only return people with an email'),
10
+ page: z.number().optional().describe('Page number (default 1)'),
11
+ per_page: z.number().optional().describe('Results per page (max 100, default 25)'),
12
+ }, async (args) => {
13
+ try {
14
+ const params = {};
15
+ if (args.seniority)
16
+ params.seniority = args.seniority;
17
+ if (args.function)
18
+ params.function = args.function;
19
+ if (args.has_email)
20
+ params.has_email = 'true';
21
+ if (args.page)
22
+ params.page = String(args.page);
23
+ if (args.per_page)
24
+ params.per_page = String(args.per_page);
25
+ const data = await apiGet(`/v1/companies/${encodeURIComponent(args.domain)}/employees`, params);
26
+ return { content: [{ type: 'text', text: formatPeopleList(data.data, data.pagination) }] };
27
+ }
28
+ catch (e) {
29
+ return { content: [{ type: 'text', text: `Error: ${e.message}` }], isError: true };
30
+ }
31
+ });
32
+ }
33
+ //# sourceMappingURL=company-employees.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"company-employees.js","sourceRoot":"","sources":["../../src/tools/company-employees.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,oEAAoE,EACpE;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QAChE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;QAC9F,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;QACzF,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QAC9E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAC/D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACnF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAA2B,EAAE,CAAC;YAC1C,IAAI,IAAI,CAAC,SAAS;gBAAE,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YACtD,IAAI,IAAI,CAAC,QAAQ;gBAAE,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YACnD,IAAI,IAAI,CAAC,SAAS;gBAAE,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC;YAC9C,IAAI,IAAI,CAAC,IAAI;gBAAE,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,IAAI,CAAC,QAAQ;gBAAE,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE3D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,iBAAiB,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YAChG,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;QACtG,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC9F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerCompanyHeadcount(server: McpServer): void;
@@ -0,0 +1,17 @@
1
+ import { z } from 'zod';
2
+ import { apiGet } from '../lib/api.js';
3
+ import { formatHeadcount } from '../lib/format.js';
4
+ export function registerCompanyHeadcount(server) {
5
+ server.tool('company_headcount', 'Get headcount breakdown by department (15 departments) for a company.', {
6
+ domain: z.string().describe('Company domain (e.g., stripe.com)'),
7
+ }, async (args) => {
8
+ try {
9
+ const data = await apiGet(`/v1/companies/${encodeURIComponent(args.domain)}/headcount`);
10
+ return { content: [{ type: 'text', text: formatHeadcount(data.data) }] };
11
+ }
12
+ catch (e) {
13
+ return { content: [{ type: 'text', text: `Error: ${e.message}` }], isError: true };
14
+ }
15
+ });
16
+ }
17
+ //# sourceMappingURL=company-headcount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"company-headcount.js","sourceRoot":"","sources":["../../src/tools/company-headcount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,uEAAuE,EACvE;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;KACjE,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,iBAAiB,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YACxF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACpF,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC9F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerCompanyJobs(server: McpServer): void;
@@ -0,0 +1,17 @@
1
+ import { z } from 'zod';
2
+ import { apiGet } from '../lib/api.js';
3
+ import { formatJobs } from '../lib/format.js';
4
+ export function registerCompanyJobs(server) {
5
+ server.tool('company_jobs', 'Get open job counts by department — a hiring intent signal.', {
6
+ domain: z.string().describe('Company domain (e.g., stripe.com)'),
7
+ }, async (args) => {
8
+ try {
9
+ const data = await apiGet(`/v1/companies/${encodeURIComponent(args.domain)}/jobs`);
10
+ return { content: [{ type: 'text', text: formatJobs(data.data) }] };
11
+ }
12
+ catch (e) {
13
+ return { content: [{ type: 'text', text: `Error: ${e.message}` }], isError: true };
14
+ }
15
+ });
16
+ }
17
+ //# sourceMappingURL=company-jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"company-jobs.js","sourceRoot":"","sources":["../../src/tools/company-jobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACnD,MAAM,CAAC,IAAI,CACT,cAAc,EACd,6DAA6D,EAC7D;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;KACjE,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,iBAAiB,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACnF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/E,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC9F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerCompanyTechnographics(server: McpServer): void;
@@ -0,0 +1,17 @@
1
+ import { z } from 'zod';
2
+ import { apiGet } from '../lib/api.js';
3
+ import { formatTechnographics } from '../lib/format.js';
4
+ export function registerCompanyTechnographics(server) {
5
+ server.tool('company_technographics', 'Get the full tech stack of a company across 16 categories — CRM, cloud, marketing automation, analytics, and more.', {
6
+ domain: z.string().describe('Company domain (e.g., stripe.com)'),
7
+ }, async (args) => {
8
+ try {
9
+ const data = await apiGet(`/v1/companies/${encodeURIComponent(args.domain)}/technographics`);
10
+ return { content: [{ type: 'text', text: formatTechnographics(data.data) }] };
11
+ }
12
+ catch (e) {
13
+ return { content: [{ type: 'text', text: `Error: ${e.message}` }], isError: true };
14
+ }
15
+ });
16
+ }
17
+ //# sourceMappingURL=company-technographics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"company-technographics.js","sourceRoot":"","sources":["../../src/tools/company-technographics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,UAAU,6BAA6B,CAAC,MAAiB;IAC7D,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,oHAAoH,EACpH;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;KACjE,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,iBAAiB,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAC7F,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACzF,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC9F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerEnrichCompany(server: McpServer): void;
@@ -0,0 +1,20 @@
1
+ import { z } from 'zod';
2
+ import { apiPost } from '../lib/api.js';
3
+ import { formatCompany } from '../lib/format.js';
4
+ export function registerEnrichCompany(server) {
5
+ server.tool('enrich_company', 'Get a full company profile with signals — industry, headcount, revenue, tech stack, funding, traffic, Google ad spend, employee growth rate.', {
6
+ domain: z.string().optional().describe('Company domain (e.g., stripe.com)'),
7
+ linkedin_url: z.string().optional().describe('Company LinkedIn URL'),
8
+ name: z.string().optional().describe('Company name'),
9
+ location: z.string().optional().describe('City/country to disambiguate name lookup'),
10
+ }, async (args) => {
11
+ try {
12
+ const data = await apiPost('/v1/enrich/company', args);
13
+ return { content: [{ type: 'text', text: formatCompany(data.data) }] };
14
+ }
15
+ catch (e) {
16
+ return { content: [{ type: 'text', text: `Error: ${e.message}` }], isError: true };
17
+ }
18
+ });
19
+ }
20
+ //# sourceMappingURL=enrich-company.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enrich-company.js","sourceRoot":"","sources":["../../src/tools/enrich-company.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,8IAA8I,EAC9I;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QAC3E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACpE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QACpD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;KACrF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;YACvD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAClF,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC9F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerEnrichPerson(server: McpServer): void;
@@ -0,0 +1,21 @@
1
+ import { z } from 'zod';
2
+ import { apiPost } from '../lib/api.js';
3
+ import { formatPerson } from '../lib/format.js';
4
+ export function registerEnrichPerson(server) {
5
+ server.tool('enrich_person', 'Get a full contact profile — name, email, phone, job title, seniority, LinkedIn, current employer.', {
6
+ email: z.string().optional().describe('Email address'),
7
+ linkedin_url: z.string().optional().describe('LinkedIn profile URL'),
8
+ first_name: z.string().optional().describe('First name (combine with domain)'),
9
+ last_name: z.string().optional().describe('Last name'),
10
+ domain: z.string().optional().describe('Company domain (use with first_name)'),
11
+ }, async (args) => {
12
+ try {
13
+ const data = await apiPost('/v1/enrich/person', args);
14
+ return { content: [{ type: 'text', text: formatPerson(data.data) }] };
15
+ }
16
+ catch (e) {
17
+ return { content: [{ type: 'text', text: `Error: ${e.message}` }], isError: true };
18
+ }
19
+ });
20
+ }
21
+ //# sourceMappingURL=enrich-person.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enrich-person.js","sourceRoot":"","sources":["../../src/tools/enrich-person.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,eAAe,EACf,oGAAoG,EACpG;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QACtD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACpE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QAC9E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;QACtD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;KAC/E,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;YACtD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACjF,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC9F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerIntentSignals(server: McpServer): void;
@@ -0,0 +1,25 @@
1
+ import { z } from 'zod';
2
+ import { apiPost } from '../lib/api.js';
3
+ import { formatIntentResults } from '../lib/format.js';
4
+ export function registerIntentSignals(server) {
5
+ server.tool('find_intent_signals', 'Find companies showing buying intent — scored by web traffic, Google ad spend, hiring velocity, employee growth, and funding. Costs 5 credits per result.', {
6
+ min_monthly_traffic: z.number().optional().describe('Min monthly web traffic'),
7
+ min_google_adspend: z.number().optional().describe('Min monthly Google ad spend ($)'),
8
+ min_open_roles: z.number().optional().describe('Min total open roles across departments'),
9
+ min_employee_growth_rate: z.number().optional().describe('Min employee growth rate (0.1 = 10%)'),
10
+ min_total_funding: z.number().optional().describe('Min total funding ($)'),
11
+ industries: z.array(z.string()).optional().describe('Filter by industries'),
12
+ country_codes: z.array(z.string()).optional().describe('ISO country codes'),
13
+ page: z.number().optional().describe('Page number (default 1)'),
14
+ per_page: z.number().optional().describe('Results per page (max 100, default 25)'),
15
+ }, async (args) => {
16
+ try {
17
+ const data = await apiPost('/v1/signal/intent', args);
18
+ return { content: [{ type: 'text', text: formatIntentResults(data.data, data.pagination) }] };
19
+ }
20
+ catch (e) {
21
+ return { content: [{ type: 'text', text: `Error: ${e.message}` }], isError: true };
22
+ }
23
+ });
24
+ }
25
+ //# sourceMappingURL=intent-signals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent-signals.js","sourceRoot":"","sources":["../../src/tools/intent-signals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,2JAA2J,EAC3J;QACE,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAC9E,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QACrF,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;QACzF,wBAAwB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QAChG,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC1E,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAC3E,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAC3E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAC/D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACnF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;YACtD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;QACzG,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC9F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerLookupCompany(server: McpServer): void;
@@ -0,0 +1,29 @@
1
+ import { z } from 'zod';
2
+ import { apiGet } from '../lib/api.js';
3
+ import { formatCompany } from '../lib/format.js';
4
+ export function registerLookupCompany(server) {
5
+ server.tool('lookup_company', 'Find a specific company by domain, LinkedIn URL, or name.', {
6
+ domain: z.string().optional().describe('Company domain (e.g., stripe.com)'),
7
+ linkedin_url: z.string().optional().describe('Company LinkedIn URL'),
8
+ name: z.string().optional().describe('Company name'),
9
+ location: z.string().optional().describe('City/country to disambiguate name lookup'),
10
+ }, async (args) => {
11
+ try {
12
+ const params = {};
13
+ if (args.domain)
14
+ params.domain = args.domain;
15
+ if (args.linkedin_url)
16
+ params.linkedin_url = args.linkedin_url;
17
+ if (args.name)
18
+ params.name = args.name;
19
+ if (args.location)
20
+ params.location = args.location;
21
+ const data = await apiGet('/v1/companies/lookup', params);
22
+ return { content: [{ type: 'text', text: formatCompany(data.data) }] };
23
+ }
24
+ catch (e) {
25
+ return { content: [{ type: 'text', text: `Error: ${e.message}` }], isError: true };
26
+ }
27
+ });
28
+ }
29
+ //# sourceMappingURL=lookup-company.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lookup-company.js","sourceRoot":"","sources":["../../src/tools/lookup-company.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,2DAA2D,EAC3D;QACE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QAC3E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACpE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QACpD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;KACrF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAA2B,EAAE,CAAC;YAC1C,IAAI,IAAI,CAAC,MAAM;gBAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC7C,IAAI,IAAI,CAAC,YAAY;gBAAE,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;YAC/D,IAAI,IAAI,CAAC,IAAI;gBAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvC,IAAI,IAAI,CAAC,QAAQ;gBAAE,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAEnD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;YAC1D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAClF,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC9F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerLookupPerson(server: McpServer): void;
@@ -0,0 +1,32 @@
1
+ import { z } from 'zod';
2
+ import { apiGet } from '../lib/api.js';
3
+ import { formatPerson } from '../lib/format.js';
4
+ export function registerLookupPerson(server) {
5
+ server.tool('lookup_person', 'Find a specific person by email, phone, LinkedIn URL, or name + company domain.', {
6
+ email: z.string().optional().describe('Email address'),
7
+ phone: z.string().optional().describe('Phone number'),
8
+ linkedin_url: z.string().optional().describe('LinkedIn profile URL'),
9
+ name: z.string().optional().describe('Full name (combine with domain)'),
10
+ domain: z.string().optional().describe('Company domain (use with name)'),
11
+ }, async (args) => {
12
+ try {
13
+ const params = {};
14
+ if (args.email)
15
+ params.email = args.email;
16
+ if (args.phone)
17
+ params.phone = args.phone;
18
+ if (args.linkedin_url)
19
+ params.linkedin_url = args.linkedin_url;
20
+ if (args.name)
21
+ params.name = args.name;
22
+ if (args.domain)
23
+ params.domain = args.domain;
24
+ const data = await apiGet('/v1/people/lookup', params);
25
+ return { content: [{ type: 'text', text: formatPerson(data.data) }] };
26
+ }
27
+ catch (e) {
28
+ return { content: [{ type: 'text', text: `Error: ${e.message}` }], isError: true };
29
+ }
30
+ });
31
+ }
32
+ //# sourceMappingURL=lookup-person.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lookup-person.js","sourceRoot":"","sources":["../../src/tools/lookup-person.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,eAAe,EACf,iFAAiF,EACjF;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QACtD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QACrD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACpE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QACvE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;KACzE,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAA2B,EAAE,CAAC;YAC1C,IAAI,IAAI,CAAC,KAAK;gBAAE,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YAC1C,IAAI,IAAI,CAAC,KAAK;gBAAE,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YAC1C,IAAI,IAAI,CAAC,YAAY;gBAAE,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;YAC/D,IAAI,IAAI,CAAC,IAAI;gBAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvC,IAAI,IAAI,CAAC,MAAM;gBAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAE7C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;YACvD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACjF,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC9F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerSearchCompanies(server: McpServer): void;
@@ -0,0 +1,27 @@
1
+ import { z } from 'zod';
2
+ import { apiPost } from '../lib/api.js';
3
+ import { formatCompanyList } from '../lib/format.js';
4
+ export function registerSearchCompanies(server) {
5
+ server.tool('search_companies', 'Search 60M+ companies by industry, location, size, tech stack, funding, traffic, growth, and more. Returns paginated results.', {
6
+ industries: z.array(z.string()).optional().describe('Industry names (e.g., Computer Software, Financial Services)'),
7
+ country_codes: z.array(z.string()).optional().describe('ISO country codes (e.g., US, GB)'),
8
+ employee_ranges: z.array(z.string()).optional().describe('Size ranges (e.g., "11 to 50", "51 to 200")'),
9
+ crm_tech: z.array(z.string()).optional().describe('CRM tools (e.g., Salesforce, HubSpot)'),
10
+ cloud_provider: z.array(z.string()).optional().describe('Cloud providers (e.g., AWS, GCP)'),
11
+ min_monthly_traffic: z.number().optional().describe('Min monthly web traffic'),
12
+ min_google_adspend: z.number().optional().describe('Min monthly Google ad spend ($)'),
13
+ min_total_funding: z.number().optional().describe('Min total funding ($)'),
14
+ min_employee_growth_rate: z.number().optional().describe('Min employee growth rate (0.1 = 10%)'),
15
+ page: z.number().optional().describe('Page number (default 1)'),
16
+ per_page: z.number().optional().describe('Results per page (max 100, default 25)'),
17
+ }, async (args) => {
18
+ try {
19
+ const data = await apiPost('/v1/companies/search', args);
20
+ return { content: [{ type: 'text', text: formatCompanyList(data.data, data.pagination) }] };
21
+ }
22
+ catch (e) {
23
+ return { content: [{ type: 'text', text: `Error: ${e.message}` }], isError: true };
24
+ }
25
+ });
26
+ }
27
+ //# sourceMappingURL=search-companies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-companies.js","sourceRoot":"","sources":["../../src/tools/search-companies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,+HAA+H,EAC/H;QACE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8DAA8D,CAAC;QACnH,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QAC1F,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QACvG,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QAC1F,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QAC3F,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAC9E,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QACrF,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC1E,wBAAwB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QAChG,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAC/D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACnF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;YACzD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;QACvG,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC9F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerSearchPeople(server: McpServer): void;
@@ -0,0 +1,27 @@
1
+ import { z } from 'zod';
2
+ import { apiPost } from '../lib/api.js';
3
+ import { formatPeopleList } from '../lib/format.js';
4
+ export function registerSearchPeople(server) {
5
+ server.tool('search_people', 'Search 300M+ contacts by title, seniority, function, company, location, and more. Returns paginated results.', {
6
+ titles: z.array(z.string()).optional().describe('Job title keywords (e.g., VP Engineering, CTO)'),
7
+ seniorities: z.array(z.string()).optional().describe('Seniority levels: C-Suite, VP, Director, Manager, Staff, Entry, Intern'),
8
+ functions: z.array(z.string()).optional().describe('Job functions (e.g., Engineering, Sales)'),
9
+ company_domains: z.array(z.string()).optional().describe('Filter by employer domain'),
10
+ company_name: z.string().optional().describe('Company name (fuzzy match)'),
11
+ country_codes: z.array(z.string()).optional().describe('ISO country codes (e.g., US, GB)'),
12
+ has_email: z.boolean().optional().describe('Only return people with a verified email'),
13
+ has_phone: z.boolean().optional().describe('Only return people with a phone number'),
14
+ is_current: z.boolean().optional().describe('Only return people in their current role'),
15
+ page: z.number().optional().describe('Page number (default 1)'),
16
+ per_page: z.number().optional().describe('Results per page (max 100, default 25)'),
17
+ }, async (args) => {
18
+ try {
19
+ const data = await apiPost('/v1/people/search', args);
20
+ return { content: [{ type: 'text', text: formatPeopleList(data.data, data.pagination) }] };
21
+ }
22
+ catch (e) {
23
+ return { content: [{ type: 'text', text: `Error: ${e.message}` }], isError: true };
24
+ }
25
+ });
26
+ }
27
+ //# sourceMappingURL=search-people.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-people.js","sourceRoot":"","sources":["../../src/tools/search-people.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,eAAe,EACf,8GAA8G,EAC9G;QACE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;QACjG,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wEAAwE,CAAC;QAC9H,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;QAC9F,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QACrF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QAC1E,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QAC1F,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;QACtF,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;QACpF,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;QACvF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAC/D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;KACnF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;YACtD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;QACtG,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC9F,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@datalayer-sh/mcp",
3
+ "version": "0.1.0",
4
+ "description": "DataLayer MCP Server — B2B enrichment for AI agents. 60M companies, 300M contacts, intent signals.",
5
+ "bin": { "datalayer-mcp": "./dist/index.js" },
6
+ "main": "./dist/index.js",
7
+ "type": "module",
8
+ "files": ["dist"],
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "dev": "tsc --watch",
12
+ "start": "node dist/index.js",
13
+ "prepublishOnly": "npm run build"
14
+ },
15
+ "keywords": [
16
+ "mcp", "model-context-protocol", "mcp-server",
17
+ "b2b", "enrichment", "lead-enrichment", "data-enrichment",
18
+ "company-data", "contact-data", "people-search", "company-search",
19
+ "email-finder", "work-email", "phone-number", "linkedin",
20
+ "sales-intelligence", "lead-generation", "prospecting",
21
+ "technographics", "intent-signals", "buying-intent",
22
+ "ai-agent", "claude", "cursor", "windsurf",
23
+ "crm-enrichment", "sales-automation", "gtm"
24
+ ],
25
+ "license": "MIT",
26
+ "homepage": "https://datalayer.sh",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "https://github.com/datalayer-sh/mcp.git"
30
+ },
31
+ "bugs": {
32
+ "url": "https://github.com/datalayer-sh/mcp/issues"
33
+ },
34
+ "engines": { "node": ">=18" },
35
+ "dependencies": {
36
+ "@modelcontextprotocol/sdk": "^1.12.0",
37
+ "zod": "^3.24.0"
38
+ },
39
+ "devDependencies": {
40
+ "typescript": "^5.7.0",
41
+ "@types/node": "^22.0.0"
42
+ }
43
+ }