iflow-mcp_edwardchoh-apollo-io-mcp-server 0.1.0__tar.gz
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.
- iflow_mcp_edwardchoh_apollo_io_mcp_server-0.1.0/LICENSE +12 -0
- iflow_mcp_edwardchoh_apollo_io_mcp_server-0.1.0/PKG-INFO +82 -0
- iflow_mcp_edwardchoh_apollo_io_mcp_server-0.1.0/README.md +70 -0
- iflow_mcp_edwardchoh_apollo_io_mcp_server-0.1.0/apollo/__init__.py +5 -0
- iflow_mcp_edwardchoh_apollo_io_mcp_server-0.1.0/apollo/organization.py +141 -0
- iflow_mcp_edwardchoh_apollo_io_mcp_server-0.1.0/apollo/organization_job_postings.py +18 -0
- iflow_mcp_edwardchoh_apollo_io_mcp_server-0.1.0/apollo/organization_search.py +72 -0
- iflow_mcp_edwardchoh_apollo_io_mcp_server-0.1.0/apollo/people.py +194 -0
- iflow_mcp_edwardchoh_apollo_io_mcp_server-0.1.0/apollo/people_search.py +233 -0
- iflow_mcp_edwardchoh_apollo_io_mcp_server-0.1.0/iflow_mcp_edwardchoh_apollo_io_mcp_server.egg-info/PKG-INFO +82 -0
- iflow_mcp_edwardchoh_apollo_io_mcp_server-0.1.0/iflow_mcp_edwardchoh_apollo_io_mcp_server.egg-info/SOURCES.txt +15 -0
- iflow_mcp_edwardchoh_apollo_io_mcp_server-0.1.0/iflow_mcp_edwardchoh_apollo_io_mcp_server.egg-info/dependency_links.txt +1 -0
- iflow_mcp_edwardchoh_apollo_io_mcp_server-0.1.0/iflow_mcp_edwardchoh_apollo_io_mcp_server.egg-info/entry_points.txt +2 -0
- iflow_mcp_edwardchoh_apollo_io_mcp_server-0.1.0/iflow_mcp_edwardchoh_apollo_io_mcp_server.egg-info/requires.txt +3 -0
- iflow_mcp_edwardchoh_apollo_io_mcp_server-0.1.0/iflow_mcp_edwardchoh_apollo_io_mcp_server.egg-info/top_level.txt +1 -0
- iflow_mcp_edwardchoh_apollo_io_mcp_server-0.1.0/pyproject.toml +14 -0
- iflow_mcp_edwardchoh_apollo_io_mcp_server-0.1.0/setup.cfg +4 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
|
|
2
|
+
The MIT License (MIT)
|
|
3
|
+
|
|
4
|
+
Copyright © 2025 Edward Choh
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
7
|
+
|
|
8
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
9
|
+
|
|
10
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
11
|
+
|
|
12
|
+
Fork this project to create your own MIT license that you can always link to.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: iflow-mcp_edwardchoh-apollo-io-mcp-server
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: MCP server that exposes the Apollo.io API functionalities as tools
|
|
5
|
+
Requires-Python: >=3.10
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Requires-Dist: mcp[cli]>=1.6.0
|
|
9
|
+
Requires-Dist: python-dotenv
|
|
10
|
+
Requires-Dist: httpx
|
|
11
|
+
Dynamic: license-file
|
|
12
|
+
|
|
13
|
+
# Apollo.io MCP Server
|
|
14
|
+
|
|
15
|
+
This project provides an MCP server that exposes the Apollo.io API functionalities as tools. It allows you to interact with the Apollo.io API using the Model Context Protocol (MCP).
|
|
16
|
+
|
|
17
|
+
## Overview
|
|
18
|
+
|
|
19
|
+
The project consists of the following main components:
|
|
20
|
+
|
|
21
|
+
- `apollo_client.py`: Defines the `ApolloClient` class, which is used to interact with the Apollo.io API. It includes methods for people enrichment, organization enrichment, people search, organization search, and organization job postings.
|
|
22
|
+
- `server.py`: Defines the FastMCP server, which exposes the Apollo.io API functionalities as tools. It uses the `ApolloClient` class defined in `apollo_client.py` to interact with the API.
|
|
23
|
+
- `apollo/`: Contains the data models for the Apollo.io API, such as `PeopleEnrichmentQuery`, `OrganizationEnrichmentQuery`, `PeopleSearchQuery`, `OrganizationSearchQuery`, and `OrganizationJobPostingsQuery`.
|
|
24
|
+
|
|
25
|
+
## Functionalities
|
|
26
|
+
|
|
27
|
+
The following functionalities are exposed as MCP tools:
|
|
28
|
+
|
|
29
|
+
- `people_enrichment`: Use the People Enrichment endpoint to enrich data for 1 person.
|
|
30
|
+
- `organization_enrichment`: Use the Organization Enrichment endpoint to enrich data for 1 company.
|
|
31
|
+
- `people_search`: Use the People Search endpoint to find people.
|
|
32
|
+
- `organization_search`: Use the Organization Search endpoint to find organizations.
|
|
33
|
+
- `organization_job_postings`: Use the Organization Job Postings endpoint to find job postings for a specific organization.
|
|
34
|
+
|
|
35
|
+
## Usage
|
|
36
|
+
|
|
37
|
+
To use this MCP server, you need to:
|
|
38
|
+
|
|
39
|
+
1. Set the `APOLLO_IO_API_KEY` environment variable with your Apollo.io API key. Or create '.env' file in the project root with `APOLLO_IO_API_KEY`.
|
|
40
|
+
2. Get dependencies: `uv sync`
|
|
41
|
+
3. Run the `uv run mcp run server.py`
|
|
42
|
+
|
|
43
|
+
## Data Models
|
|
44
|
+
|
|
45
|
+
The `apollo/` directory contains the data models for the Apollo.io API. These models are used to define the input and output of the MCP tools.
|
|
46
|
+
|
|
47
|
+
- `apollo/people.py`: Defines the data models for the People Enrichment endpoint.
|
|
48
|
+
- `apollo/organization.py`: Defines the data models for the Organization Enrichment endpoint.
|
|
49
|
+
- `apollo/people_search.py`: Defines the data models for the People Search endpoint.
|
|
50
|
+
- `apollo/organization_search.py`: Defines the data models for the Organization Search endpoint.
|
|
51
|
+
- `apollo/organization_job_postings.py`: Defines the data models for the Organization Job Postings endpoint.
|
|
52
|
+
|
|
53
|
+
## Testing
|
|
54
|
+
|
|
55
|
+
To test, set `APOLLO_IO_API_KEY` environment variable and run `uv run apollo_client.py`.
|
|
56
|
+
|
|
57
|
+
## Usage with Claude for Desktop
|
|
58
|
+
|
|
59
|
+
1. Configure Claude for Desktop to use these MCP servers by adding them to your `claude_desktop_config.json` file:
|
|
60
|
+
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"mcpServers": {
|
|
64
|
+
"apollo-io-mcp-server": {
|
|
65
|
+
"type": "stdio",
|
|
66
|
+
"command": "uv",
|
|
67
|
+
"args": [
|
|
68
|
+
"run",
|
|
69
|
+
"mcp",
|
|
70
|
+
"run",
|
|
71
|
+
"path/to/apollo-io-mcp-server/server.py"
|
|
72
|
+
]
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Resources
|
|
79
|
+
|
|
80
|
+
- [Apollo.io API Documentation](https://docs.apollo.io/reference/)
|
|
81
|
+
- [MCP Protocol Documentation](https://github.com/modelcontextprotocol/mcp)
|
|
82
|
+
- [Claude for Desktop Documentation](https://claude.ai/docs)
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Apollo.io MCP Server
|
|
2
|
+
|
|
3
|
+
This project provides an MCP server that exposes the Apollo.io API functionalities as tools. It allows you to interact with the Apollo.io API using the Model Context Protocol (MCP).
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The project consists of the following main components:
|
|
8
|
+
|
|
9
|
+
- `apollo_client.py`: Defines the `ApolloClient` class, which is used to interact with the Apollo.io API. It includes methods for people enrichment, organization enrichment, people search, organization search, and organization job postings.
|
|
10
|
+
- `server.py`: Defines the FastMCP server, which exposes the Apollo.io API functionalities as tools. It uses the `ApolloClient` class defined in `apollo_client.py` to interact with the API.
|
|
11
|
+
- `apollo/`: Contains the data models for the Apollo.io API, such as `PeopleEnrichmentQuery`, `OrganizationEnrichmentQuery`, `PeopleSearchQuery`, `OrganizationSearchQuery`, and `OrganizationJobPostingsQuery`.
|
|
12
|
+
|
|
13
|
+
## Functionalities
|
|
14
|
+
|
|
15
|
+
The following functionalities are exposed as MCP tools:
|
|
16
|
+
|
|
17
|
+
- `people_enrichment`: Use the People Enrichment endpoint to enrich data for 1 person.
|
|
18
|
+
- `organization_enrichment`: Use the Organization Enrichment endpoint to enrich data for 1 company.
|
|
19
|
+
- `people_search`: Use the People Search endpoint to find people.
|
|
20
|
+
- `organization_search`: Use the Organization Search endpoint to find organizations.
|
|
21
|
+
- `organization_job_postings`: Use the Organization Job Postings endpoint to find job postings for a specific organization.
|
|
22
|
+
|
|
23
|
+
## Usage
|
|
24
|
+
|
|
25
|
+
To use this MCP server, you need to:
|
|
26
|
+
|
|
27
|
+
1. Set the `APOLLO_IO_API_KEY` environment variable with your Apollo.io API key. Or create '.env' file in the project root with `APOLLO_IO_API_KEY`.
|
|
28
|
+
2. Get dependencies: `uv sync`
|
|
29
|
+
3. Run the `uv run mcp run server.py`
|
|
30
|
+
|
|
31
|
+
## Data Models
|
|
32
|
+
|
|
33
|
+
The `apollo/` directory contains the data models for the Apollo.io API. These models are used to define the input and output of the MCP tools.
|
|
34
|
+
|
|
35
|
+
- `apollo/people.py`: Defines the data models for the People Enrichment endpoint.
|
|
36
|
+
- `apollo/organization.py`: Defines the data models for the Organization Enrichment endpoint.
|
|
37
|
+
- `apollo/people_search.py`: Defines the data models for the People Search endpoint.
|
|
38
|
+
- `apollo/organization_search.py`: Defines the data models for the Organization Search endpoint.
|
|
39
|
+
- `apollo/organization_job_postings.py`: Defines the data models for the Organization Job Postings endpoint.
|
|
40
|
+
|
|
41
|
+
## Testing
|
|
42
|
+
|
|
43
|
+
To test, set `APOLLO_IO_API_KEY` environment variable and run `uv run apollo_client.py`.
|
|
44
|
+
|
|
45
|
+
## Usage with Claude for Desktop
|
|
46
|
+
|
|
47
|
+
1. Configure Claude for Desktop to use these MCP servers by adding them to your `claude_desktop_config.json` file:
|
|
48
|
+
|
|
49
|
+
```json
|
|
50
|
+
{
|
|
51
|
+
"mcpServers": {
|
|
52
|
+
"apollo-io-mcp-server": {
|
|
53
|
+
"type": "stdio",
|
|
54
|
+
"command": "uv",
|
|
55
|
+
"args": [
|
|
56
|
+
"run",
|
|
57
|
+
"mcp",
|
|
58
|
+
"run",
|
|
59
|
+
"path/to/apollo-io-mcp-server/server.py"
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Resources
|
|
67
|
+
|
|
68
|
+
- [Apollo.io API Documentation](https://docs.apollo.io/reference/)
|
|
69
|
+
- [MCP Protocol Documentation](https://github.com/modelcontextprotocol/mcp)
|
|
70
|
+
- [Claude for Desktop Documentation](https://claude.ai/docs)
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
from typing import Optional, List, Dict, Any
|
|
2
|
+
from pydantic import BaseModel, Field
|
|
3
|
+
|
|
4
|
+
class OrganizationEnrichmentQuery(BaseModel):
|
|
5
|
+
domain: str = Field(description="The domain of the company that you want to enrich. Do not include `www.`, the `@` symbol, or similar. Example: `apollo.io` or `microsoft.com`")
|
|
6
|
+
|
|
7
|
+
class PrimaryPhone(BaseModel):
|
|
8
|
+
languages: Optional[List[str]] = Field(default=None, description="languages")
|
|
9
|
+
phone: Optional[str] = Field(default=None, description="phone")
|
|
10
|
+
|
|
11
|
+
class FundingEvent(BaseModel):
|
|
12
|
+
id: str = Field(description="id")
|
|
13
|
+
date: str = Field(description="date")
|
|
14
|
+
news_url: Optional[str] = Field(default=None, description="news_url")
|
|
15
|
+
type: str = Field(description="type")
|
|
16
|
+
investors: str = Field(description="investors")
|
|
17
|
+
amount: str = Field(description="amount")
|
|
18
|
+
currency: str = Field(description="currency")
|
|
19
|
+
|
|
20
|
+
class Account(BaseModel):
|
|
21
|
+
id: str = Field(description="id")
|
|
22
|
+
domain: str = Field(description="domain")
|
|
23
|
+
name: str = Field(description="name")
|
|
24
|
+
team_id: str = Field(description="team_id")
|
|
25
|
+
organization_id: str = Field(description="organization_id")
|
|
26
|
+
account_stage_id: Optional[str] = Field(default=None, description="account_stage_id")
|
|
27
|
+
source: str = Field(description="source")
|
|
28
|
+
original_source: str = Field(description="original_source")
|
|
29
|
+
creator_id: Optional[str] = Field(default=None, description="creator_id")
|
|
30
|
+
owner_id: str = Field(description="owner_id")
|
|
31
|
+
created_at: str = Field(description="created_at")
|
|
32
|
+
phone: str = Field(description="phone")
|
|
33
|
+
phone_status: str = Field(description="phone_status")
|
|
34
|
+
hubspot_id: Optional[str] = Field(default=None, description="hubspot_id")
|
|
35
|
+
salesforce_id: Optional[str] = Field(default=None, description="salesforce_id")
|
|
36
|
+
crm_owner_id: Optional[str] = Field(default=None, description="crm_owner_id")
|
|
37
|
+
parent_account_id: Optional[str] = Field(default=None, description="parent_account_id")
|
|
38
|
+
linkedin_url: Optional[str] = Field(default=None, description="linkedin_url")
|
|
39
|
+
sanitized_phone: str = Field(description="sanitized_phone")
|
|
40
|
+
account_playbook_statuses: List[Any] = Field(description="account_playbook_statuses")
|
|
41
|
+
account_rule_config_statuses: List[Any] = Field(description="account_rule_config_statuses")
|
|
42
|
+
existence_level: str = Field(description="existence_level")
|
|
43
|
+
label_ids: List[str] = Field(description="label_ids")
|
|
44
|
+
typed_custom_fields: Dict[str, Any] = Field(description="typed_custom_fields")
|
|
45
|
+
custom_field_errors: Dict[str, Any] = Field(description="custom_field_errors")
|
|
46
|
+
modality: str = Field(description="modality")
|
|
47
|
+
source_display_name: str = Field(description="source_display_name")
|
|
48
|
+
crm_record_url: Optional[str] = Field(default=None, description="crm_record_url")
|
|
49
|
+
intent_strength: Optional[str] = Field(default=None, description="intent_strength")
|
|
50
|
+
show_intent: bool = Field(description="show_intent")
|
|
51
|
+
has_intent_signal_account: bool = Field(description="has_intent_signal_account")
|
|
52
|
+
intent_signal_signal_account: Optional[str] = Field(default=None, description="intent_signal_signal_account")
|
|
53
|
+
|
|
54
|
+
class DepartmentalHeadCount(BaseModel):
|
|
55
|
+
engineering: Optional[int] = Field(default=None, description="engineering")
|
|
56
|
+
operations: Optional[int] = Field(default=None, description="operations")
|
|
57
|
+
support: Optional[int] = Field(default=None, description="support")
|
|
58
|
+
marketing: Optional[int] = Field(default=None, description="marketing")
|
|
59
|
+
human_resources: Optional[int] = Field(default=None, description="human_resources")
|
|
60
|
+
sales: Optional[int] = Field(default=None, description="sales")
|
|
61
|
+
finance: Optional[int] = Field(default=None, description="finance")
|
|
62
|
+
consulting: Optional[int] = Field(default=None, description="consulting")
|
|
63
|
+
legal: Optional[int] = Field(default=None, description="legal")
|
|
64
|
+
arts_and_design: Optional[int] = Field(default=None, description="arts_and_design")
|
|
65
|
+
accounting: Optional[int] = Field(default=None, description="accounting")
|
|
66
|
+
business_development: Optional[int] = Field(default=None, description="business_development")
|
|
67
|
+
information_technology: Optional[int] = Field(default=None, description="information_technology")
|
|
68
|
+
education: Optional[int] = Field(default=None, description="education")
|
|
69
|
+
media_and_commmunication: Optional[int] = Field(default=None, description="media_and_commmunication")
|
|
70
|
+
product_management: Optional[int] = Field(default=None, description="product_management")
|
|
71
|
+
entrepreneurship: Optional[int] = Field(default=None, description="entrepreneurship")
|
|
72
|
+
data_science: Optional[int] = Field(default=None, description="data_science")
|
|
73
|
+
administrative: Optional[int] = Field(default=None, description="administrative")
|
|
74
|
+
|
|
75
|
+
class CurrentTechnology(BaseModel):
|
|
76
|
+
uid: str = Field(description="uid")
|
|
77
|
+
name: str = Field(description="name")
|
|
78
|
+
category: str = Field(description="category")
|
|
79
|
+
|
|
80
|
+
class IndustryTagHash(BaseModel):
|
|
81
|
+
information_technology_services: Optional[str] = Field(default=None, description="information_technology_services")
|
|
82
|
+
|
|
83
|
+
class Organization(BaseModel):
|
|
84
|
+
id: Optional[str] = Field(default=None, description="id")
|
|
85
|
+
name: Optional[str] = Field(default=None, description="name")
|
|
86
|
+
website_url: Optional[str] = Field(default=None, description="website_url")
|
|
87
|
+
blog_url: Optional[str] = Field(default=None, description="blog_url")
|
|
88
|
+
angellist_url: Optional[str] = Field(default=None, description="angellist_url")
|
|
89
|
+
linkedin_url: Optional[str] = Field(default=None, description="linkedin_url")
|
|
90
|
+
twitter_url: Optional[str] = Field(default=None, description="twitter_url")
|
|
91
|
+
facebook_url: Optional[str] = Field(default=None, description="facebook_url")
|
|
92
|
+
primary_phone: Optional[PrimaryPhone] = Field(default=None, description="primary_phone")
|
|
93
|
+
languages: Optional[List[Any]] = Field(default=None, description="languages")
|
|
94
|
+
alexa_ranking: Optional[int] = Field(default=0, description="alexa_ranking")
|
|
95
|
+
phone: Optional[str] = Field(default=None, description="phone")
|
|
96
|
+
linkedin_uid: Optional[str] = Field(default=None, description="linkedin_uid")
|
|
97
|
+
founded_year: Optional[int] = Field(default=0, description="founded_year")
|
|
98
|
+
publicly_traded_symbol: Optional[str] = Field(default=None, description="publicly_traded_symbol")
|
|
99
|
+
publicly_traded_exchange: Optional[str] = Field(default=None, description="publicly_traded_exchange")
|
|
100
|
+
logo_url: Optional[str] = Field(default=None, description="logo_url")
|
|
101
|
+
crunchbase_url: Optional[str] = Field(default=None, description="crunchbase_url")
|
|
102
|
+
primary_domain: Optional[str] = Field(default=None, description="primary_domain")
|
|
103
|
+
industry: Optional[str] = Field(default=None, description="industry")
|
|
104
|
+
keywords: List[str] = Field(description="keywords")
|
|
105
|
+
estimated_num_employees: Optional[int] = Field(default=0, description="estimated_num_employees")
|
|
106
|
+
industries: List[str] = Field(description="industries")
|
|
107
|
+
secondary_industries: List[Any] = Field(description="secondary_industries")
|
|
108
|
+
snippets_loaded: bool = Field(default=True, description="snippets_loaded")
|
|
109
|
+
industry_tag_id: Optional[str] = Field(default=None, description="industry_tag_id")
|
|
110
|
+
industry_tag_hash: IndustryTagHash = Field(description="industry_tag_hash")
|
|
111
|
+
retail_location_count: Optional[int] = Field(default=0, description="retail_location_count")
|
|
112
|
+
raw_address: Optional[str] = Field(default=None, description="raw_address")
|
|
113
|
+
street_address: Optional[str] = Field(default=None, description="street_address")
|
|
114
|
+
city: Optional[str] = Field(default=None, description="city")
|
|
115
|
+
state: Optional[str] = Field(default=None, description="state")
|
|
116
|
+
postal_code: Optional[str] = Field(default=None, description="postal_code")
|
|
117
|
+
country: Optional[str] = Field(default=None, description="country")
|
|
118
|
+
owned_by_organization_id: Optional[str] = Field(default=None, description="owned_by_organization_id")
|
|
119
|
+
seo_description: Optional[str] = Field(default=None, description="seo_description")
|
|
120
|
+
short_description: Optional[str] = Field(default=None, description="short_description")
|
|
121
|
+
suborganizations: List[Any] = Field(description="suborganizations")
|
|
122
|
+
num_suborganizations: Optional[int] = Field(default=0, description="num_suborganizations")
|
|
123
|
+
annual_revenue_printed: Optional[str] = Field(default=None, description="annual_revenue_printed")
|
|
124
|
+
annual_revenue: Optional[int] = Field(default=0, description="annual_revenue")
|
|
125
|
+
total_funding: Optional[int] = Field(default=None, description="total_funding")
|
|
126
|
+
total_funding_printed: Optional[str] = Field(default=None, description="total_funding_printed")
|
|
127
|
+
latest_funding_round_date: Optional[str] = Field(default=None, description="latest_funding_round_date")
|
|
128
|
+
latest_funding_stage: Optional[str] = Field(default=None, description="latest_funding_stage")
|
|
129
|
+
funding_events: Optional[List[FundingEvent]] = Field(default=None, description="funding_events")
|
|
130
|
+
technology_names: List[str] = Field(description="technology_names")
|
|
131
|
+
current_technologies: List[CurrentTechnology] = Field(description="current_technologies")
|
|
132
|
+
org_chart_root_people_ids: List[str] = Field(description="org_chart_root_people_ids")
|
|
133
|
+
org_chart_sector: Optional[str] = Field(default=None, description="org_chart_sector")
|
|
134
|
+
org_chart_removed: bool = Field(default=True, description="org_chart_removed")
|
|
135
|
+
org_chart_show_department_filter: bool = Field(default=True, description="org_chart_show_department_filter")
|
|
136
|
+
account_id: Optional[str] = Field(default=None, description="account_id")
|
|
137
|
+
account: Optional[Account] = Field(default=None, description="account")
|
|
138
|
+
departmental_head_count: DepartmentalHeadCount = Field(description="departmental_head_count")
|
|
139
|
+
|
|
140
|
+
class OrganizationEnrichmentResponse(BaseModel):
|
|
141
|
+
organization: Organization = Field(description="organization")
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from typing import Optional, List
|
|
2
|
+
from pydantic import BaseModel, Field
|
|
3
|
+
|
|
4
|
+
class OrganizationJobPostingsQuery(BaseModel):
|
|
5
|
+
organization_id: str = Field(description="The organization ID of the company for which you want to find job postings. Each company in the Apollo database is assigned a unique ID. To find IDs, call the [Organization Search endpoint](/reference/organization-search) and identify the values for `organization_id`. Example: `5e66b6381e05b4008c8331b8`")
|
|
6
|
+
|
|
7
|
+
class OrganizationJobPosting(BaseModel):
|
|
8
|
+
id: str = Field(description="id")
|
|
9
|
+
title: str = Field(description="title")
|
|
10
|
+
url: str = Field(description="url")
|
|
11
|
+
city: Optional[str] = Field(default=None, description="city")
|
|
12
|
+
state: Optional[str] = Field(default=None, description="state")
|
|
13
|
+
country: str = Field(description="country")
|
|
14
|
+
last_seen_at: str = Field(description="last_seen_at")
|
|
15
|
+
posted_at: str = Field(description="posted_at")
|
|
16
|
+
|
|
17
|
+
class OrganizationJobPostingsResponse(BaseModel):
|
|
18
|
+
organization_job_postings: List[OrganizationJobPosting] = Field(description="organization_job_postings")
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
from typing import Optional, List, Dict, Any
|
|
2
|
+
from pydantic import BaseModel, Field
|
|
3
|
+
|
|
4
|
+
class OrganizationSearchQuery(BaseModel):
|
|
5
|
+
organization_num_employees_ranges: Optional[List[str]] = Field(default=None, description="The number range of employees working for the company. This enables you to find companies based on headcount. You can add multiple ranges to expand your search results. Each range you add needs to be a string, with the upper and lower numbers of the range separated only by a comma. Examples: `1,10`; `250,500`; `10000,20000`")
|
|
6
|
+
organization_locations: Optional[List[str]] = Field(default=None, description="The location of the company headquarters. You can search across cities, US states, and countries. If a company has several office locations, results are still based on the headquarters location. For example, if you search `chicago` but a company's HQ location is in `boston`, any Boston-based companies will not appearch in your search results, even if they match other parameters. To exclude companies based on location, use the `organization_not_locations` parameter. Examples: `texas`; `tokyo`; `spain`")
|
|
7
|
+
organization_not_locations: Optional[List[str]] = Field(default=None, description="Exclude companies from search results based on the location of the company headquarters. You can use cities, US states, and countries as locations to exclude. This parameter is useful for ensuring you do not prospect in an undesirable territory. For example, if you use `ireland` as a value, no Ireland-based companies will appear in your search results. Examples: `minnesota`; `ireland`; `seoul`")
|
|
8
|
+
revenue_range_min: Optional[int] = Field(default=None, description="Search for organizations based on their revenue. Use this parameter to set the lower range of organization revenue. Use the `revenue_range[max]` parameter to set the upper range of revenue. Do not enter currency symbols, commas, or decimal points in the figure. Example: `300000`")
|
|
9
|
+
revenue_range_max: Optional[int] = Field(default=None, description="Search for organizations based on their revenue. Use this parameter to set the upper range of organization revenue. Use the `revenue_range[min]` parameter to set the lower range of revenue. Do not enter currency symbols, commas, or decimal points in the figure. Example: `50000000`")
|
|
10
|
+
currently_using_any_of_technology_uids: Optional[List[str]] = Field(default=None, description="Find organizations based on the technologies they currently use. Apollo supports filtering by 1,500+ technologies. Apollo calculates technologies data from multiple sources. This data is updated regularly. Check out the full list of supported technologies by [downloading this CSV file](https://api.apollo.io/v1/auth/supported_technologies_csv). Use underscores (`_`) to replace spaces and periods for the technologies listed in the CSV file. Examples: `salesforce`; `google_analytics`; `wordpress_org`")
|
|
11
|
+
q_organization_keyword_tags: Optional[List[str]] = Field(default=None, description="Filter search results based on keywords associated with companies. For example, you can enter `mining` as a value to return only companies that have an association with the mining industry. Examples: `mining`; `sales strategy`; `consulting`")
|
|
12
|
+
q_organization_name: Optional[str] = Field(default=None, description="Filter search results to include a specific company name. If the value you enter for this parameter does not match with a company's name, the company will not appear in search results, even if it matches other parameters. Partial matches are accepted. For example, if you filter by the value `marketing`, a company called `NY Marketing Unlimited` would still be eligible as a search result, but `NY Market Analysis` would not be eligible. Example: `apollo` or `mining`")
|
|
13
|
+
organization_ids: Optional[List[str]] = Field(default=None, description="The Apollo IDs for the companies you want to include in your search results. Each company in the Apollo database is assigned a unique ID. To find IDs, identify the values for `organization_id` when you call this endpoint. Example: `5e66b6381e05b4008c8331b8`")
|
|
14
|
+
page: Optional[int] = Field(default=None, description="The page number of the Apollo data that you want to retrieve. Use this parameter in combination with the `per_page` parameter to make search results for navigable and improve the performance of the endpoint. Example: `4`")
|
|
15
|
+
per_page: Optional[int] = Field(default=None, description="The number of search results that should be returned for each page. Limited the number of results per page improves the endpoint's performance. Use the `page` parameter to search the different pages of data. Example: `10`")
|
|
16
|
+
|
|
17
|
+
class Breadcrumb(BaseModel):
|
|
18
|
+
label: str = Field(description="label")
|
|
19
|
+
signal_field_name: str = Field(description="signal_field_name")
|
|
20
|
+
value: str = Field(description="value")
|
|
21
|
+
display_name: str = Field(description="display_name")
|
|
22
|
+
|
|
23
|
+
class PrimaryPhone(BaseModel):
|
|
24
|
+
number: str = Field(description="number")
|
|
25
|
+
source: str = Field(description="source")
|
|
26
|
+
sanitized_number: str = Field(description="sanitized_number")
|
|
27
|
+
|
|
28
|
+
class Organization(BaseModel):
|
|
29
|
+
id: str = Field(description="id")
|
|
30
|
+
name: Optional[str] = Field(default=None, description="name")
|
|
31
|
+
website_url: Optional[str] = Field(default=None, description="website_url")
|
|
32
|
+
blog_url: Optional[str] = Field(default=None, description="blog_url")
|
|
33
|
+
angellist_url: Optional[str] = Field(default=None, description="angellist_url")
|
|
34
|
+
linkedin_url: Optional[str] = Field(default=None, description="linkedin_url")
|
|
35
|
+
twitter_url: Optional[str] = Field(default=None, description="twitter_url")
|
|
36
|
+
facebook_url: Optional[str] = Field(default=None, description="facebook_url")
|
|
37
|
+
primary_phone: Optional[PrimaryPhone] = Field(default=None, description="primary_phone")
|
|
38
|
+
languages: Optional[List[str]] = Field(default=None, description="languages")
|
|
39
|
+
alexa_ranking: Optional[int] = Field(default=0, description="alexa_ranking")
|
|
40
|
+
phone: Optional[str] = Field(default=None, description="phone")
|
|
41
|
+
linkedin_uid: Optional[str] = Field(default=None, description="linkedin_uid")
|
|
42
|
+
founded_year: Optional[int] = Field(default=0, description="founded_year")
|
|
43
|
+
publicly_traded_symbol: Optional[str] = Field(default=None, description="publicly_traded_symbol")
|
|
44
|
+
publicly_traded_exchange: Optional[str] = Field(default=None, description="publicly_traded_exchange")
|
|
45
|
+
logo_url: Optional[str] = Field(default=None, description="logo_url")
|
|
46
|
+
crunchbase_url: Optional[str] = Field(default=None, description="crunchbase_url")
|
|
47
|
+
primary_domain: Optional[str] = Field(default=None, description="primary_domain")
|
|
48
|
+
sanitized_phone: Optional[str] = Field(default=None, description="sanitized_phone")
|
|
49
|
+
owned_by_organization_id: Optional[str] = Field(default=None, description="owned_by_organization_id")
|
|
50
|
+
intent_strength: Optional[str] = Field(default=None, description="intent_strength")
|
|
51
|
+
show_intent: Optional[bool] = Field(default=None, description="show_intent")
|
|
52
|
+
has_intent_signal_account: Optional[bool] = Field(default=None, description="has_intent_signal_account")
|
|
53
|
+
intent_signal_account: Optional[str] = Field(default=None, description="intent_signal_account")
|
|
54
|
+
|
|
55
|
+
class Pagination(BaseModel):
|
|
56
|
+
page: int = Field(default=0, description="page")
|
|
57
|
+
per_page: int = Field(default=0, description="per_page")
|
|
58
|
+
total_entries: int = Field(default=0, description="total_entries")
|
|
59
|
+
total_pages: int = Field(default=0, description="total_pages")
|
|
60
|
+
|
|
61
|
+
class OrganizationSearchResponse(BaseModel):
|
|
62
|
+
breadcrumbs: Optional[List[Breadcrumb]] = Field(default=None, description="breadcrumbs")
|
|
63
|
+
partial_results_only: Optional[bool] = Field(default=True, description="partial_results_only")
|
|
64
|
+
has_join: Optional[bool] = Field(default=True, description="has_join")
|
|
65
|
+
disable_eu_prospecting: Optional[bool] = Field(default=True, description="disable_eu_prospecting")
|
|
66
|
+
partial_results_limit: Optional[int] = Field(default=0, description="partial_results_limit")
|
|
67
|
+
pagination: Optional[Pagination] = Field(default=None, description="pagination")
|
|
68
|
+
accounts: Optional[List[Any]] = Field(default=None, description="accounts")
|
|
69
|
+
organizations: Optional[List[Organization]] = Field(default=None, description="organizations")
|
|
70
|
+
model_ids: Optional[List[str]] = Field(default=None, description="model_ids")
|
|
71
|
+
num_fetch_result: Optional[str] = Field(default=None, description="num_fetch_result")
|
|
72
|
+
derived_params: Optional[str] = Field(default=None, description="derived_params")
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
from typing import Optional, List, Dict, Any
|
|
2
|
+
from pydantic import BaseModel, Field
|
|
3
|
+
|
|
4
|
+
class PeopleEnrichmentQuery(BaseModel):
|
|
5
|
+
first_name: Optional[str] = Field(default=None, description="The first name of the person. This is typically used in combination with the `last_name` parameter. Example: `tim`")
|
|
6
|
+
last_name: Optional[str] = Field(default=None, description="The last name of the person. This is typically used in combination with the `first_name` parameter. Example: `zheng`")
|
|
7
|
+
name: Optional[str] = Field(default=None, description="The full name of the person. This will typically be a first name and last name separated by a space. If you use this parameter, you do not need to use the `first_name` and `last_name` parameters. Example: `tim zheng`")
|
|
8
|
+
email: Optional[str] = Field(default=None, description="The email address of the person. Example: `example@email.com`")
|
|
9
|
+
hashed_email: Optional[str] = Field(default=None, description="The hashed email of the person. The email should adhere to either the MD5 or SHA-256 hash format. Example: `8d935115b9ff4489f2d1f9249503cadf` (MD5) or `97817c0c49994eb500ad0a5e7e2d8aed51977b26424d508f66e4e8887746a152` (SHA-256)")
|
|
10
|
+
organization_name: Optional[str] = Field(default=None, description="The name of the person's employer. This can be the current employer or a previous employer. Example: `apollo`")
|
|
11
|
+
domain: Optional[str] = Field(default=None, description="The domain name for the person's employer. This can be the current employer or a previous employer. Do not include `www.`, the `@` symbol, or similar. Example: `apollo.io` or `microsoft.com`")
|
|
12
|
+
id: Optional[str] = Field(default=None, description="The Apollo ID for the person. Each person in the Apollo database is assigned a unique ID. To find IDs, call the [People Search endpoint](/reference/people-search) and identify the values for `person_id`. Example: `587cf802f65125cad923a266`")
|
|
13
|
+
linkedin_url: Optional[str] = Field(default=None, description="The URL for the person's LinkedIn profile. Example: `http://www.linkedin.com/in/tim-zheng-677ba010`")
|
|
14
|
+
reveal_personal_emails: Optional[bool] = Field(default=False, description="Set to `true` if you want to enrich the person's data with personal emails. This potentially consumes credits as part of your [Apollo pricing plan](/docs/api-pricing). The default value is `false`. If a person resides in a [GDPR](https://knowledge.apollo.io/hc/en-us/articles/4409141087757)-compliant region, Apollo will not reveal their personal email.")
|
|
15
|
+
reveal_phone_number: Optional[bool] = Field(default=False, description="Set to `true` if you want to enrich the person's data with all available phone numbers, including mobile phone numbers. This potentially consumes credits as part of your [Apollo pricing plan](/docs/api-pricing). The default value is `false`. If this parameter is set to `true`, you must enter a webhook URL for the `webhook_url` parameter. Apollo will asynchronously verify phone numbers for you, then send a JSON response that includes only details about the person's phone numbers to the webhook URL you provide. It can take several minutes for the phone numbers to be delivered.")
|
|
16
|
+
webhook_url: Optional[str] = Field(default=None, description="If you set the `reveal_phone_number` parameter to `true`, this parameter becomes mandatory. Otherwise, do not use this parameter. Enter the webhook URL that specifies where Apollo should send a JSON response that includes the phone number you requested. Apollo suggests testing this flow to ensure you receive the separate response with the phone number. Example: `https://webhook.site/cc4cf44e-e047-4774-8dac-473d28474e40`")
|
|
17
|
+
|
|
18
|
+
class EmploymentHistory(BaseModel):
|
|
19
|
+
id: str = Field(description="id")
|
|
20
|
+
created_at: Optional[str] = Field(default=None, description="created_at")
|
|
21
|
+
current: bool = Field(default=True, description="current")
|
|
22
|
+
degree: Optional[str] = Field(default=None, description="degree")
|
|
23
|
+
description: Optional[str] = Field(default=None, description="description")
|
|
24
|
+
emails: Optional[str] = Field(default=None, description="emails")
|
|
25
|
+
end_date: Optional[str] = Field(default=None, description="end_date")
|
|
26
|
+
grade_level: Optional[str] = Field(default=None, description="grade_level")
|
|
27
|
+
kind: Optional[str] = Field(default=None, description="kind")
|
|
28
|
+
major: Optional[str] = Field(default=None, description="major")
|
|
29
|
+
organization_id: Optional[str] = Field(default=None, description="organization_id")
|
|
30
|
+
organization_name: str = Field(description="organization_name")
|
|
31
|
+
raw_address: Optional[str] = Field(default=None, description="raw_address")
|
|
32
|
+
start_date: str = Field(description="start_date")
|
|
33
|
+
title: str = Field(description="title")
|
|
34
|
+
updated_at: Optional[str] = Field(default=None, description="updated_at")
|
|
35
|
+
id: str = Field(description="id")
|
|
36
|
+
key: str = Field(description="key")
|
|
37
|
+
state: Optional[str] = Field(default=None, description="state")
|
|
38
|
+
city: Optional[str] = Field(default=None, description="city")
|
|
39
|
+
country: Optional[str] = Field(default=None, description="country")
|
|
40
|
+
contact_id: Optional[str] = Field(default=None, description="contact_id")
|
|
41
|
+
|
|
42
|
+
class Contact(BaseModel):
|
|
43
|
+
contact_roles: List[Any] = Field(description="contact_roles")
|
|
44
|
+
id: str = Field(description="id")
|
|
45
|
+
first_name: str = Field(description="first_name")
|
|
46
|
+
last_name: str = Field(description="last_name")
|
|
47
|
+
name: str = Field(description="name")
|
|
48
|
+
linkedin_url: str = Field(description="linkedin_url")
|
|
49
|
+
title: str = Field(description="title")
|
|
50
|
+
contact_stage_id: str = Field(description="contact_stage_id")
|
|
51
|
+
owner_id: Optional[str] = Field(default=None, description="owner_id")
|
|
52
|
+
creator_id: str = Field(description="creator_id")
|
|
53
|
+
person_id: str = Field(description="person_id")
|
|
54
|
+
email_needs_tickling: Optional[bool] = Field(default=None, description="email_needs_tickling")
|
|
55
|
+
organization_name: str = Field(description="organization_name")
|
|
56
|
+
source: str = Field(description="source")
|
|
57
|
+
original_source: str = Field(description="original_source")
|
|
58
|
+
organization_id: str = Field(description="organization_id")
|
|
59
|
+
headline: str = Field(description="headline")
|
|
60
|
+
photo_url: Optional[str] = Field(default=None, description="photo_url")
|
|
61
|
+
present_raw_address: str = Field(description="present_raw_address")
|
|
62
|
+
linkedin_uid: Optional[str] = Field(default=None, description="linkedin_uid")
|
|
63
|
+
extrapolated_email_confidence: Optional[str] = Field(default=None, description="extrapolated_email_confidence")
|
|
64
|
+
salesforce_id: Optional[str] = Field(default=None, description="salesforce_id")
|
|
65
|
+
salesforce_lead_id: Optional[str] = Field(default=None, description="salesforce_lead_id")
|
|
66
|
+
salesforce_contact_id: Optional[str] = Field(default=None, description="salesforce_contact_id")
|
|
67
|
+
salesforce_account_id: Optional[str] = Field(default=None, description="salesforce_account_id")
|
|
68
|
+
crm_owner_id: Optional[str] = Field(default=None, description="crm_owner_id")
|
|
69
|
+
created_at: str = Field(description="created_at")
|
|
70
|
+
emailer_campaign_ids: List[Any] = Field(description="emailer_campaign_ids")
|
|
71
|
+
direct_dial_status: Optional[str] = Field(default=None, description="direct_dial_status")
|
|
72
|
+
direct_dial_enrichment_failed_at: Optional[str] = Field(default=None, description="direct_dial_enrichment_failed_at")
|
|
73
|
+
email_status: str = Field(description="email_status")
|
|
74
|
+
email_source: Optional[str] = Field(default=None, description="email_source")
|
|
75
|
+
account_id: str = Field(description="account_id")
|
|
76
|
+
last_activity_date: Optional[str] = Field(default=None, description="last_activity_date")
|
|
77
|
+
hubspot_vid: Optional[str] = Field(default=None, description="hubspot_vid")
|
|
78
|
+
hubspot_company_id: Optional[str] = Field(default=None, description="hubspot_company_id")
|
|
79
|
+
crm_id: Optional[str] = Field(default=None, description="crm_id")
|
|
80
|
+
sanitized_phone: str = Field(description="sanitized_phone")
|
|
81
|
+
merged_crm_ids: Optional[str] = Field(default=None, description="merged_crm_ids")
|
|
82
|
+
updated_at: str = Field(description="updated_at")
|
|
83
|
+
queued_for_crm_push: Optional[str] = Field(default=None, description="queued_for_crm_push")
|
|
84
|
+
suggested_from_rule_engine_config_id: Optional[str] = Field(default=None, description="suggested_from_rule_engine_config_id")
|
|
85
|
+
email_unsubscribed: Optional[bool] = Field(default=None, description="email_unsubscribed")
|
|
86
|
+
label_ids: List[Any] = Field(description="label_ids")
|
|
87
|
+
has_pending_email_arcgate_request: bool = Field(description="has_pending_email_arcgate_request")
|
|
88
|
+
has_email_arcgate_request: bool = Field(description="has_email_arcgate_request")
|
|
89
|
+
existence_level: str = Field(description="existence_level")
|
|
90
|
+
email: str = Field(description="email")
|
|
91
|
+
email_from_customer: bool = Field(description="email_from_customer")
|
|
92
|
+
typed_custom_fields: Dict[str, Any] = Field(description="typed_custom_fields")
|
|
93
|
+
custom_field_errors: Optional[str] = Field(default=None, description="custom_field_errors")
|
|
94
|
+
crm_record_url: Optional[str] = Field(default=None, description="crm_record_url")
|
|
95
|
+
email_status_unavailable_reason: Optional[str] = Field(default=None, description="email_status_unavailable_reason")
|
|
96
|
+
email_true_status: str = Field(description="email_true_status")
|
|
97
|
+
updated_email_true_status: bool = Field(description="updated_email_true_status")
|
|
98
|
+
contact_rule_config_statuses: List[Any] = Field(description="contact_rule_config_statuses")
|
|
99
|
+
source_display_name: str = Field(description="source_display_name")
|
|
100
|
+
contact_emails: List[Dict[str, Any]] = Field(description="contact_emails")
|
|
101
|
+
time_zone: str = Field(description="time_zone")
|
|
102
|
+
phone_numbers: List[Dict[str, Any]] = Field(description="phone_numbers")
|
|
103
|
+
account_phone_note: Optional[str] = Field(default=None, description="account_phone_note")
|
|
104
|
+
free_domain: bool = Field(description="free_domain")
|
|
105
|
+
is_likely_to_engage: bool = Field(description="is_likely_to_engage")
|
|
106
|
+
|
|
107
|
+
class Organization(BaseModel):
|
|
108
|
+
id: str = Field(description="id")
|
|
109
|
+
name: str = Field(description="name")
|
|
110
|
+
website_url: str = Field(description="website_url")
|
|
111
|
+
blog_url: Optional[str] = Field(default=None, description="blog_url")
|
|
112
|
+
angellist_url: Optional[str] = Field(default=None, description="angellist_url")
|
|
113
|
+
linkedin_url: str = Field(description="linkedin_url")
|
|
114
|
+
twitter_url: str = Field(description="twitter_url")
|
|
115
|
+
facebook_url: str = Field(description="facebook_url")
|
|
116
|
+
primary_phone: Dict[str, Any] = Field(description="primary_phone")
|
|
117
|
+
languages: List[Any] = Field(description="languages")
|
|
118
|
+
alexa_ranking: int = Field(description="alexa_ranking")
|
|
119
|
+
phone: Optional[str] = Field(default=None, description="phone")
|
|
120
|
+
linkedin_uid: str = Field(description="linkedin_uid")
|
|
121
|
+
founded_year: int = Field(description="founded_year")
|
|
122
|
+
publicly_traded_symbol: Optional[str] = Field(default=None, description="publicly_traded_symbol")
|
|
123
|
+
publicly_traded_exchange: Optional[str] = Field(default=None, description="publicly_traded_exchange")
|
|
124
|
+
logo_url: str = Field(description="logo_url")
|
|
125
|
+
crunchbase_url: Optional[str] = Field(default=None, description="crunchbase_url")
|
|
126
|
+
primary_domain: str = Field(description="primary_domain")
|
|
127
|
+
industry: str = Field(description="industry")
|
|
128
|
+
keywords: List[str] = Field(description="keywords")
|
|
129
|
+
estimated_num_employees: int = Field(description="estimated_num_employees")
|
|
130
|
+
industries: List[str] = Field(description="industries")
|
|
131
|
+
secondary_industries: List[Any] = Field(description="secondary_industries")
|
|
132
|
+
snippets_loaded: bool = Field(description="snippets_loaded")
|
|
133
|
+
industry_tag_id: str = Field(description="industry_tag_id")
|
|
134
|
+
industry_tag_hash: Dict[str, str] = Field(description="industry_tag_hash")
|
|
135
|
+
retail_location_count: int = Field(description="retail_location_count")
|
|
136
|
+
raw_address: str = Field(description="raw_address")
|
|
137
|
+
street_address: str = Field(description="street_address")
|
|
138
|
+
city: str = Field(description="city")
|
|
139
|
+
state: str = Field(description="state")
|
|
140
|
+
postal_code: str = Field(description="postal_code")
|
|
141
|
+
country: str = Field(description="country")
|
|
142
|
+
owned_by_organization_id: Optional[str] = Field(default=None, description="owned_by_organization_id")
|
|
143
|
+
seo_description: str = Field(description="seo_description")
|
|
144
|
+
short_description: str = Field(description="short_description")
|
|
145
|
+
suborganizations: List[Any] = Field(description="suborganizations")
|
|
146
|
+
num_suborganizations: int = Field(description="num_suborganizations")
|
|
147
|
+
annual_revenue_printed: str = Field(description="annual_revenue_printed")
|
|
148
|
+
annual_revenue: int = Field(description="annual_revenue")
|
|
149
|
+
total_funding: int = Field(description="total_funding")
|
|
150
|
+
total_funding_printed: str = Field(description="total_funding_printed")
|
|
151
|
+
latest_funding_round_date: str = Field(description="latest_funding_round_date")
|
|
152
|
+
latest_funding_stage: str = Field(description="latest_funding_stage")
|
|
153
|
+
funding_events: List[Dict[str, Any]] = Field(description="funding_events")
|
|
154
|
+
technology_names: List[str] = Field(description="technology_names")
|
|
155
|
+
current_technologies: List[Dict[str, Any]] = Field(description="current_technologies")
|
|
156
|
+
org_chart_root_people_ids: List[str] = Field(description="org_chart_root_people_ids")
|
|
157
|
+
org_chart_sector: str = Field(description="org_chart_sector")
|
|
158
|
+
org_chart_removed: bool = Field(description="org_chart_removed")
|
|
159
|
+
org_chart_show_department_filter: bool = Field(description="org_chart_show_department_filter")
|
|
160
|
+
|
|
161
|
+
class PeopleEnrichmentResponse(BaseModel):
|
|
162
|
+
person: Optional["Person"] = None
|
|
163
|
+
|
|
164
|
+
class Person(BaseModel):
|
|
165
|
+
id: str = Field(description="id")
|
|
166
|
+
first_name: str = Field(description="first_name")
|
|
167
|
+
last_name: str = Field(description="last_name")
|
|
168
|
+
name: str = Field(description="name")
|
|
169
|
+
linkedin_url: Optional[str] = Field(default=None, description="linkedin_url")
|
|
170
|
+
title: Optional[str] = Field(default=None, description="title")
|
|
171
|
+
email_status: Optional[str] = Field(default=None, description="email_status")
|
|
172
|
+
photo_url: Optional[str] = Field(default=None, description="photo_url")
|
|
173
|
+
twitter_url: Optional[str] = Field(default=None, description="twitter_url")
|
|
174
|
+
github_url: Optional[str] = Field(default=None, description="github_url")
|
|
175
|
+
facebook_url: Optional[str] = Field(default=None, description="facebook_url")
|
|
176
|
+
extrapolated_email_confidence: Optional[str] = Field(default=None, description="extrapolated_email_confidence")
|
|
177
|
+
headline: Optional[str] = Field(description="headline")
|
|
178
|
+
email: Optional[str] = Field(description="email")
|
|
179
|
+
organization_id: Optional[str] = Field(description="organization_id")
|
|
180
|
+
employment_history: List[EmploymentHistory] = Field(description="employment_history")
|
|
181
|
+
state: Optional[str] = Field(default=None, description="state")
|
|
182
|
+
city: Optional[str] = Field(default=None, description="city")
|
|
183
|
+
country: Optional[str] = Field(default=None, description="country")
|
|
184
|
+
contact_id: Optional[str] = Field(default=None, description="contact_id")
|
|
185
|
+
contact: Optional[Contact] = Field(default=None, description="contact")
|
|
186
|
+
revealed_for_current_team: bool = Field(description="revealed_for_current_team")
|
|
187
|
+
organization: Optional[Organization] = Field(default=None, description="organization")
|
|
188
|
+
is_likely_to_engage: Optional[bool] = Field(default=None, description="is_likely_to_engage")
|
|
189
|
+
intent_strength: Optional[str] = Field(default=None, description="intent_strength")
|
|
190
|
+
show_intent: bool = Field(description="show_intent")
|
|
191
|
+
departments: List[str] = Field(description="departments")
|
|
192
|
+
subdepartments: List[str] = Field(description="subdepartments")
|
|
193
|
+
functions: List[str] = Field(description="functions")
|
|
194
|
+
seniority: Optional[str] = Field(description="seniority")
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
from typing import Optional, List, Dict, Any
|
|
2
|
+
from pydantic import BaseModel, Field
|
|
3
|
+
|
|
4
|
+
class PeopleSearchQuery(BaseModel):
|
|
5
|
+
person_titles: Optional[List[str]] = Field(default=None, description="Job titles held by the people you want to find. For a person to be included in search results, they only need to match 1 of the job titles you add. Adding more job titles expands your search results. Results also include job titles with the same terms, even if they are not exact matches. For example, searching for `marketing manager` might return people with the job title `content marketing manager`. Use this parameter in combination with the `person_seniorities[]` parameter to find people based on specific job functions and seniority levels. Examples: `sales development representative`; `marketing manager`; `research analyst`")
|
|
6
|
+
include_similar_titles: Optional[bool] = Field(default=True, description="This parameter determines whether people with job titles similar to the titles you define in the `person_titles[]` parameter are returned in the response. Set this parameter to `false` when using `person_titles[]` to return only strict matches for job titles.")
|
|
7
|
+
person_locations: Optional[List[str]] = Field(default=None, description="The location where people live. You can search across cities, US states, and countries. To find people based on the headquarters locations of their current employer, use the `organization_locations` parameter. Examples: `california`; `ireland`; `chicago`")
|
|
8
|
+
person_seniorities: Optional[List[str]] = Field(default=None, description="The job seniority that people hold within their current employer. This enables you to find people that currently hold positions at certain reporting levels, such as Director level or senior IC level. For a person to be included in search results, they only need to match 1 of the seniorities you add. Adding more seniorities expands your search results. Searches only return results based on their current job title, so searching for Director-level employees only returns people that currently hold a Director-level title. If someone was previously a Director, but is currently a VP, they would not be included in your search results. Use this parameter in combination with the `person_titles[]` parameter to find people based on specific job functions and seniority levels. The following options can be used for this parameter: `owner`, `founder`, `c_suite`, `partner`, `vp`, `head`, `director`, `manager`, `senior`, `entry`, `intern`")
|
|
9
|
+
organization_locations: Optional[List[str]] = Field(default=None, description="The location of the company headquarters for a person's current employer. You can search across cities, US states, and countries. If a company has several office locations, results are still based on the headquarters location. For example, if you search `chicago` but a company's HQ location is in `boston`, people that work for the Boston-based company will not appear in your results, even if they match other parameters. To find people based on their personal location, use the `person_locations` parameter. Examples: `texas`; `tokyo`; `spain`")
|
|
10
|
+
q_organization_domains_list: Optional[List[str]] = Field(default=None, description="The domain name for the person's employer. This can be the current employer or a previous employer. Do not include `www.`, the `@` symbol, or similar. This parameter accepts up to 1,000 domains in a single request. Examples: `apollo.io`; `microsoft.com`")
|
|
11
|
+
contact_email_status: Optional[List[str]] = Field(default=None, description="The email statuses for the people you want to find. You can add multiple statuses to expand your search. The statuses you can search include: `verified`, `unverified`, `likely to engage`, `unavailable`")
|
|
12
|
+
organization_ids: Optional[List[str]] = Field(default=None, description="The Apollo IDs for the companies (employers) you want to include in your search results. Each company in the Apollo database is assigned a unique ID. To find IDs, call the [Organization Search endpoint](/reference/organization-search) and identify the values for `organization_id`. Example: `5e66b6381e05b4008c8331b8`")
|
|
13
|
+
organization_num_employees_ranges: Optional[List[str]] = Field(default=None, description="The number range of employees working for the person's current company. This enables you to find people based on the headcount of their employer. You can add multiple ranges to expand your search results. Each range you add needs to be a string, with the upper and lower numbers of the range separated only by a comma. Examples: `1,10`; `250,500`; `10000,20000`")
|
|
14
|
+
q_keywords: Optional[str] = Field(default=None, description="A string of words over which we want to filter the results.")
|
|
15
|
+
page: Optional[int] = Field(default=None, description="The page number of the Apollo data that you want to retrieve. Use this parameter in combination with the `per_page` parameter to make search results for navigable and improve the performance of the endpoint. Example: `4`")
|
|
16
|
+
per_page: Optional[int] = Field(default=None, description="The number of search results that should be returned for each page. Limited the number of results per page improves the endpoint's performance. Use the `page` parameter to search the different pages of data. Example: `10`")
|
|
17
|
+
|
|
18
|
+
class Breadcrumb(BaseModel):
|
|
19
|
+
label: str = Field(description="label")
|
|
20
|
+
signal_field_name: str = Field(description="signal_field_name")
|
|
21
|
+
value: str = Field(description="value")
|
|
22
|
+
display_name: str = Field(description="display_name")
|
|
23
|
+
|
|
24
|
+
class DialerFlags(BaseModel):
|
|
25
|
+
country_name: str = Field(description="country_name")
|
|
26
|
+
country_enabled: bool = Field(description="country_enabled")
|
|
27
|
+
high_risk_calling_enabled: bool = Field(description="high_risk_calling_enabled")
|
|
28
|
+
potential_high_risk_number: bool = Field(description="potential_high_risk_number")
|
|
29
|
+
|
|
30
|
+
class PhoneNumber(BaseModel):
|
|
31
|
+
raw_number: str = Field(description="raw_number")
|
|
32
|
+
sanitized_number: str = Field(description="sanitized_number")
|
|
33
|
+
type: str = Field(description="type")
|
|
34
|
+
position: int = Field(description="position")
|
|
35
|
+
status: str = Field(description="status")
|
|
36
|
+
dnc_status: str = Field(description="dnc_status")
|
|
37
|
+
dnc_other_info: str = Field(description="dnc_other_info")
|
|
38
|
+
dialer_flags: DialerFlags = Field(description="dialer_flags")
|
|
39
|
+
|
|
40
|
+
class ContactEmail(BaseModel):
|
|
41
|
+
email: str = Field(description="email")
|
|
42
|
+
email_md5: str = Field(description="email_md5")
|
|
43
|
+
email_sha256: str = Field(description="email_sha256")
|
|
44
|
+
email_status: str = Field(description="email_status")
|
|
45
|
+
email_source: str = Field(description="email_source")
|
|
46
|
+
extrapolated_email_confidence: str = Field(description="extrapolated_email_confidence")
|
|
47
|
+
position: int = Field(description="position")
|
|
48
|
+
email_from_customer: str = Field(description="email_from_customer")
|
|
49
|
+
free_domain: bool = Field(description="free_domain")
|
|
50
|
+
|
|
51
|
+
class Account(BaseModel):
|
|
52
|
+
id: str = Field(description="id")
|
|
53
|
+
name: str = Field(description="name")
|
|
54
|
+
website_url: str = Field(description="website_url")
|
|
55
|
+
blog_url: str = Field(description="blog_url")
|
|
56
|
+
angellist_url: str = Field(description="angellist_url")
|
|
57
|
+
linkedin_url: str = Field(description="linkedin_url")
|
|
58
|
+
twitter_url: str = Field(description="twitter_url")
|
|
59
|
+
facebook_url: str = Field(description="facebook_url")
|
|
60
|
+
primary_phone: Dict[str, Any] = Field(description="primary_phone")
|
|
61
|
+
languages: List[Any] = Field(description="languages")
|
|
62
|
+
alexa_ranking: int = Field(description="alexa_ranking")
|
|
63
|
+
phone: str = Field(description="phone")
|
|
64
|
+
linkedin_uid: str = Field(description="linkedin_uid")
|
|
65
|
+
founded_year: int = Field(description="founded_year")
|
|
66
|
+
publicly_traded_symbol: str = Field(description="publicly_traded_symbol")
|
|
67
|
+
publicly_traded_exchange: str = Field(description="publicly_traded_exchange")
|
|
68
|
+
logo_url: str = Field(description="logo_url")
|
|
69
|
+
crunchbase_url: str = Field(description="crunchbase_url")
|
|
70
|
+
primary_domain: str = Field(description="primary_domain")
|
|
71
|
+
domain: str = Field(description="domain")
|
|
72
|
+
team_id: str = Field(description="team_id")
|
|
73
|
+
organization_id: str = Field(description="organization_id")
|
|
74
|
+
account_stage_id: str = Field(description="account_stage_id")
|
|
75
|
+
source: str = Field(description="source")
|
|
76
|
+
original_source: str = Field(description="original_source")
|
|
77
|
+
creator_id: str = Field(description="creator_id")
|
|
78
|
+
owner_id: str = Field(description="owner_id")
|
|
79
|
+
created_at: str = Field(description="created_at")
|
|
80
|
+
phone_status: str = Field(description="phone_status")
|
|
81
|
+
hubspot_id: str = Field(description="hubspot_id")
|
|
82
|
+
salesforce_id: str = Field(description="salesforce_id")
|
|
83
|
+
crm_owner_id: str = Field(description="crm_owner_id")
|
|
84
|
+
parent_account_id: str = Field(description="parent_account_id")
|
|
85
|
+
sanitized_phone: str = Field(description="sanitized_phone")
|
|
86
|
+
account_playbook_statuses: List[Any] = Field(description="account_playbook_statuses")
|
|
87
|
+
account_rule_config_statuses: List[Any] = Field(description="account_rule_config_statuses")
|
|
88
|
+
existence_level: str = Field(description="existence_level")
|
|
89
|
+
label_ids: List[str] = Field(description="label_ids")
|
|
90
|
+
typed_custom_fields: Dict[str, Any] = Field(description="typed_custom_fields")
|
|
91
|
+
custom_field_errors: Dict[str, Any] = Field(description="custom_field_errors")
|
|
92
|
+
modality: str = Field(description="modality")
|
|
93
|
+
source_display_name: str = Field(description="source_display_name")
|
|
94
|
+
salesforce_record_url: str = Field(description="salesforce_record_url")
|
|
95
|
+
crm_record_url: str = Field(description="crm_record_url")
|
|
96
|
+
|
|
97
|
+
class EmploymentHistory(BaseModel):
|
|
98
|
+
id: str = Field(description="id")
|
|
99
|
+
created_at: str = Field(description="created_at")
|
|
100
|
+
current: bool = Field(description="current")
|
|
101
|
+
degree: str = Field(description="degree")
|
|
102
|
+
description: str = Field(description="description")
|
|
103
|
+
emails: str = Field(description="emails")
|
|
104
|
+
end_date: str = Field(description="end_date")
|
|
105
|
+
grade_level: str = Field(description="grade_level")
|
|
106
|
+
kind: str = Field(description="kind")
|
|
107
|
+
major: str = Field(description="major")
|
|
108
|
+
organization_id: str = Field(description="organization_id")
|
|
109
|
+
organization_name: str = Field(description="organization_name")
|
|
110
|
+
raw_address: str = Field(description="raw_address")
|
|
111
|
+
start_date: str = Field(description="start_date")
|
|
112
|
+
title: str = Field(description="title")
|
|
113
|
+
updated_at: str = Field(description="updated_at")
|
|
114
|
+
id: str = Field(description="id")
|
|
115
|
+
key: str = Field(description="key")
|
|
116
|
+
|
|
117
|
+
class Organization(BaseModel):
|
|
118
|
+
id: str = Field(description="id")
|
|
119
|
+
name: str = Field(description="name")
|
|
120
|
+
website_url: str = Field(description="website_url")
|
|
121
|
+
blog_url: str = Field(description="blog_url")
|
|
122
|
+
angellist_url: str = Field(description="angellist_url")
|
|
123
|
+
linkedin_url: str = Field(description="linkedin_url")
|
|
124
|
+
twitter_url: str = Field(description="twitter_url")
|
|
125
|
+
facebook_url: str = Field(description="facebook_url")
|
|
126
|
+
primary_phone: Dict[str, Any] = Field(description="primary_phone")
|
|
127
|
+
languages: List[Any] = Field(description="languages")
|
|
128
|
+
alexa_ranking: int = Field(description="alexa_ranking")
|
|
129
|
+
phone: str = Field(description="phone")
|
|
130
|
+
linkedin_uid: str = Field(description="linkedin_uid")
|
|
131
|
+
founded_year: int = Field(description="founded_year")
|
|
132
|
+
publicly_traded_symbol: str = Field(description="publicly_traded_symbol")
|
|
133
|
+
publicly_traded_exchange: str = Field(description="publicly_traded_exchange")
|
|
134
|
+
logo_url: str = Field(description="logo_url")
|
|
135
|
+
crunchbase_url: str = Field(description="crunchbase_url")
|
|
136
|
+
primary_domain: str = Field(description="primary_domain")
|
|
137
|
+
|
|
138
|
+
class Contact(BaseModel):
|
|
139
|
+
contact_roles: List[Any] = Field(description="contact_roles")
|
|
140
|
+
id: str = Field(description="id")
|
|
141
|
+
first_name: str = Field(description="first_name")
|
|
142
|
+
last_name: str = Field(description="last_name")
|
|
143
|
+
name: str = Field(description="name")
|
|
144
|
+
linkedin_url: str = Field(description="linkedin_url")
|
|
145
|
+
title: str = Field(description="title")
|
|
146
|
+
contact_stage_id: str = Field(description="contact_stage_id")
|
|
147
|
+
owner_id: str = Field(description="owner_id")
|
|
148
|
+
creator_id: str = Field(description="creator_id")
|
|
149
|
+
person_id: str = Field(description="person_id")
|
|
150
|
+
email_needs_tickling: bool = Field(description="email_needs_tickling")
|
|
151
|
+
organization_name: str = Field(description="organization_name")
|
|
152
|
+
source: str = Field(description="source")
|
|
153
|
+
original_source: str = Field(description="original_source")
|
|
154
|
+
organization_id: str = Field(description="organization_id")
|
|
155
|
+
headline: str = Field(description="headline")
|
|
156
|
+
photo_url: str = Field(description="photo_url")
|
|
157
|
+
present_raw_address: str = Field(description="present_raw_address")
|
|
158
|
+
linkedin_uid: str = Field(description="linkedin_uid")
|
|
159
|
+
extrapolated_email_confidence: str = Field(description="extrapolated_email_confidence")
|
|
160
|
+
salesforce_id: str = Field(description="salesforce_id")
|
|
161
|
+
salesforce_lead_id: str = Field(description="salesforce_lead_id")
|
|
162
|
+
salesforce_contact_id: str = Field(description="salesforce_contact_id")
|
|
163
|
+
salesforce_account_id: str = Field(description="salesforce_account_id")
|
|
164
|
+
crm_owner_id: str = Field(description="crm_owner_id")
|
|
165
|
+
created_at: str = Field(description="created_at")
|
|
166
|
+
emailer_campaign_ids: List[str] = Field(description="emailer_campaign_ids")
|
|
167
|
+
direct_dial_status: str = Field(description="direct_dial_status")
|
|
168
|
+
direct_dial_enrichment_failed_at: str = Field(description="direct_dial_enrichment_failed_at")
|
|
169
|
+
email_status: str = Field(description="email_status")
|
|
170
|
+
email_source: str = Field(description="email_source")
|
|
171
|
+
account_id: str = Field(description="account_id")
|
|
172
|
+
last_activity_date: str = Field(description="last_activity_date")
|
|
173
|
+
hubspot_vid: str = Field(description="hubspot_vid")
|
|
174
|
+
hubspot_company_id: str = Field(description="hubspot_company_id")
|
|
175
|
+
crm_id: str = Field(description="crm_id")
|
|
176
|
+
sanitized_phone: str = Field(description="sanitized_phone")
|
|
177
|
+
merged_crm_ids: str = Field(description="merged_crm_ids")
|
|
178
|
+
updated_at: str = Field(description="updated_at")
|
|
179
|
+
queued_for_crm_push: bool = Field(description="queued_for_crm_push")
|
|
180
|
+
suggested_from_rule_engine_config_id: str = Field(description="suggested_from_rule_engine_config_id")
|
|
181
|
+
email_unsubscribed: str = Field(description="email_unsubscribed")
|
|
182
|
+
label_ids: List[Any] = Field(description="label_ids")
|
|
183
|
+
has_pending_email_arcgate_request: bool = Field(description="has_pending_email_arcgate_request")
|
|
184
|
+
has_email_arcgate_request: bool = Field(description="has_email_arcgate_request")
|
|
185
|
+
existence_level: str = Field(description="existence_level")
|
|
186
|
+
email: str = Field(description="email")
|
|
187
|
+
email_from_customer: str = Field(description="email_from_customer")
|
|
188
|
+
typed_custom_fields: Dict[str, Any] = Field(description="typed_custom_fields")
|
|
189
|
+
custom_field_errors: Dict[str, Any] = Field(description="custom_field_errors")
|
|
190
|
+
salesforce_record_url: str = Field(description="salesforce_record_url")
|
|
191
|
+
crm_record_url: str = Field(description="crm_record_url")
|
|
192
|
+
email_status_unavailable_reason: str = Field(description="email_status_unavailable_reason")
|
|
193
|
+
email_true_status: str = Field(description="email_true_status")
|
|
194
|
+
updated_email_true_status: bool = Field(description="updated_email_true_status")
|
|
195
|
+
contact_rule_config_statuses: List[Dict[str, Any]] = Field(description="contact_rule_config_statuses")
|
|
196
|
+
source_display_name: str = Field(description="source_display_name")
|
|
197
|
+
twitter_url: str = Field(description="twitter_url")
|
|
198
|
+
contact_campaign_statuses: List[Dict[str, Any]] = Field(description="contact_campaign_statuses")
|
|
199
|
+
state: str = Field(description="state")
|
|
200
|
+
city: str = Field(description="city")
|
|
201
|
+
country: str = Field(description="country")
|
|
202
|
+
account: Account = Field(description="account")
|
|
203
|
+
contact_emails: List[ContactEmail] = Field(description="contact_emails")
|
|
204
|
+
organization: Organization = Field(description="organization")
|
|
205
|
+
employment_history: List[EmploymentHistory] = Field(description="employment_history")
|
|
206
|
+
time_zone: str = Field(description="time_zone")
|
|
207
|
+
intent_strength: str = Field(description="intent_strength")
|
|
208
|
+
show_intent: bool = Field(description="show_intent")
|
|
209
|
+
phone_numbers: List[PhoneNumber] = Field(description="phone_numbers")
|
|
210
|
+
account_phone_note: str = Field(description="account_phone_note")
|
|
211
|
+
free_domain: bool = Field(description="free_domain")
|
|
212
|
+
is_likely_to_engage: bool = Field(description="is_likely_to_engage")
|
|
213
|
+
email_domain_catchall: bool = Field(description="email_domain_catchall")
|
|
214
|
+
contact_job_change_event: str = Field(description="contact_job_change_event")
|
|
215
|
+
|
|
216
|
+
class Pagination(BaseModel):
|
|
217
|
+
page: int = Field(description="page")
|
|
218
|
+
per_page: int = Field(description="per_page")
|
|
219
|
+
total_entries: int = Field(description="total_entries")
|
|
220
|
+
total_pages: int = Field(description="total_pages")
|
|
221
|
+
|
|
222
|
+
class PeopleSearchResponse(BaseModel):
|
|
223
|
+
# breadcrumbs: Optional[List[Breadcrumb]] = Field(default=None, description="breadcrumbs")
|
|
224
|
+
partial_results_only: Optional[bool] = Field(default=None, description="partial_results_only")
|
|
225
|
+
has_join: Optional[bool] = Field(default=None, description="has_join")
|
|
226
|
+
disable_eu_prospecting: Optional[bool] = Field(default=None, description="disable_eu_prospecting")
|
|
227
|
+
partial_results_limit: Optional[int] = Field(default=None, description="partial_results_limit")
|
|
228
|
+
pagination: Optional[Pagination] = Field(default=None, description="pagination")
|
|
229
|
+
contacts: Optional[List[Contact]] = Field(default=None, description="contacts")
|
|
230
|
+
people: Optional[List[Any]] = Field(default=None, description="people")
|
|
231
|
+
model_ids: Optional[List[str]] = Field(default=None, description="model_ids")
|
|
232
|
+
num_fetch_result: Optional[str] = Field(default=None, description="num_fetch_result")
|
|
233
|
+
# derived_params: Optional[str] = Field(default=None, description="derived_params")
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: iflow-mcp_edwardchoh-apollo-io-mcp-server
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: MCP server that exposes the Apollo.io API functionalities as tools
|
|
5
|
+
Requires-Python: >=3.10
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Requires-Dist: mcp[cli]>=1.6.0
|
|
9
|
+
Requires-Dist: python-dotenv
|
|
10
|
+
Requires-Dist: httpx
|
|
11
|
+
Dynamic: license-file
|
|
12
|
+
|
|
13
|
+
# Apollo.io MCP Server
|
|
14
|
+
|
|
15
|
+
This project provides an MCP server that exposes the Apollo.io API functionalities as tools. It allows you to interact with the Apollo.io API using the Model Context Protocol (MCP).
|
|
16
|
+
|
|
17
|
+
## Overview
|
|
18
|
+
|
|
19
|
+
The project consists of the following main components:
|
|
20
|
+
|
|
21
|
+
- `apollo_client.py`: Defines the `ApolloClient` class, which is used to interact with the Apollo.io API. It includes methods for people enrichment, organization enrichment, people search, organization search, and organization job postings.
|
|
22
|
+
- `server.py`: Defines the FastMCP server, which exposes the Apollo.io API functionalities as tools. It uses the `ApolloClient` class defined in `apollo_client.py` to interact with the API.
|
|
23
|
+
- `apollo/`: Contains the data models for the Apollo.io API, such as `PeopleEnrichmentQuery`, `OrganizationEnrichmentQuery`, `PeopleSearchQuery`, `OrganizationSearchQuery`, and `OrganizationJobPostingsQuery`.
|
|
24
|
+
|
|
25
|
+
## Functionalities
|
|
26
|
+
|
|
27
|
+
The following functionalities are exposed as MCP tools:
|
|
28
|
+
|
|
29
|
+
- `people_enrichment`: Use the People Enrichment endpoint to enrich data for 1 person.
|
|
30
|
+
- `organization_enrichment`: Use the Organization Enrichment endpoint to enrich data for 1 company.
|
|
31
|
+
- `people_search`: Use the People Search endpoint to find people.
|
|
32
|
+
- `organization_search`: Use the Organization Search endpoint to find organizations.
|
|
33
|
+
- `organization_job_postings`: Use the Organization Job Postings endpoint to find job postings for a specific organization.
|
|
34
|
+
|
|
35
|
+
## Usage
|
|
36
|
+
|
|
37
|
+
To use this MCP server, you need to:
|
|
38
|
+
|
|
39
|
+
1. Set the `APOLLO_IO_API_KEY` environment variable with your Apollo.io API key. Or create '.env' file in the project root with `APOLLO_IO_API_KEY`.
|
|
40
|
+
2. Get dependencies: `uv sync`
|
|
41
|
+
3. Run the `uv run mcp run server.py`
|
|
42
|
+
|
|
43
|
+
## Data Models
|
|
44
|
+
|
|
45
|
+
The `apollo/` directory contains the data models for the Apollo.io API. These models are used to define the input and output of the MCP tools.
|
|
46
|
+
|
|
47
|
+
- `apollo/people.py`: Defines the data models for the People Enrichment endpoint.
|
|
48
|
+
- `apollo/organization.py`: Defines the data models for the Organization Enrichment endpoint.
|
|
49
|
+
- `apollo/people_search.py`: Defines the data models for the People Search endpoint.
|
|
50
|
+
- `apollo/organization_search.py`: Defines the data models for the Organization Search endpoint.
|
|
51
|
+
- `apollo/organization_job_postings.py`: Defines the data models for the Organization Job Postings endpoint.
|
|
52
|
+
|
|
53
|
+
## Testing
|
|
54
|
+
|
|
55
|
+
To test, set `APOLLO_IO_API_KEY` environment variable and run `uv run apollo_client.py`.
|
|
56
|
+
|
|
57
|
+
## Usage with Claude for Desktop
|
|
58
|
+
|
|
59
|
+
1. Configure Claude for Desktop to use these MCP servers by adding them to your `claude_desktop_config.json` file:
|
|
60
|
+
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"mcpServers": {
|
|
64
|
+
"apollo-io-mcp-server": {
|
|
65
|
+
"type": "stdio",
|
|
66
|
+
"command": "uv",
|
|
67
|
+
"args": [
|
|
68
|
+
"run",
|
|
69
|
+
"mcp",
|
|
70
|
+
"run",
|
|
71
|
+
"path/to/apollo-io-mcp-server/server.py"
|
|
72
|
+
]
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Resources
|
|
79
|
+
|
|
80
|
+
- [Apollo.io API Documentation](https://docs.apollo.io/reference/)
|
|
81
|
+
- [MCP Protocol Documentation](https://github.com/modelcontextprotocol/mcp)
|
|
82
|
+
- [Claude for Desktop Documentation](https://claude.ai/docs)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
pyproject.toml
|
|
4
|
+
apollo/__init__.py
|
|
5
|
+
apollo/organization.py
|
|
6
|
+
apollo/organization_job_postings.py
|
|
7
|
+
apollo/organization_search.py
|
|
8
|
+
apollo/people.py
|
|
9
|
+
apollo/people_search.py
|
|
10
|
+
iflow_mcp_edwardchoh_apollo_io_mcp_server.egg-info/PKG-INFO
|
|
11
|
+
iflow_mcp_edwardchoh_apollo_io_mcp_server.egg-info/SOURCES.txt
|
|
12
|
+
iflow_mcp_edwardchoh_apollo_io_mcp_server.egg-info/dependency_links.txt
|
|
13
|
+
iflow_mcp_edwardchoh_apollo_io_mcp_server.egg-info/entry_points.txt
|
|
14
|
+
iflow_mcp_edwardchoh_apollo_io_mcp_server.egg-info/requires.txt
|
|
15
|
+
iflow_mcp_edwardchoh_apollo_io_mcp_server.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
apollo
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "iflow-mcp_edwardchoh-apollo-io-mcp-server"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "MCP server that exposes the Apollo.io API functionalities as tools"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.10"
|
|
7
|
+
dependencies = [
|
|
8
|
+
"mcp[cli]>=1.6.0",
|
|
9
|
+
"python-dotenv",
|
|
10
|
+
"httpx",
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
[project.scripts]
|
|
14
|
+
apollo-io-mcp = "server:main"
|