universal-mcp-applications 0.1.20__py3-none-any.whl → 0.1.21__py3-none-any.whl
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.
Potentially problematic release.
This version of universal-mcp-applications might be problematic. Click here for more details.
- universal_mcp/applications/scraper/app.py +219 -0
- universal_mcp/applications/unipile/app.py +257 -0
- universal_mcp/applications/youtube/app.py +16 -6
- {universal_mcp_applications-0.1.20.dist-info → universal_mcp_applications-0.1.21.dist-info}/METADATA +1 -1
- {universal_mcp_applications-0.1.20.dist-info → universal_mcp_applications-0.1.21.dist-info}/RECORD +7 -7
- {universal_mcp_applications-0.1.20.dist-info → universal_mcp_applications-0.1.21.dist-info}/WHEEL +0 -0
- {universal_mcp_applications-0.1.20.dist-info → universal_mcp_applications-0.1.21.dist-info}/licenses/LICENSE +0 -0
|
@@ -174,6 +174,223 @@ class ScraperApp(APIApplication):
|
|
|
174
174
|
limit=limit,
|
|
175
175
|
)
|
|
176
176
|
|
|
177
|
+
def linkedin_people_search(
|
|
178
|
+
self,
|
|
179
|
+
cursor: Optional[str] = None,
|
|
180
|
+
limit: Optional[int] = None,
|
|
181
|
+
keywords: Optional[str] = None,
|
|
182
|
+
last_viewed_at: Optional[int] = None,
|
|
183
|
+
saved_search_id: Optional[str] = None,
|
|
184
|
+
recent_search_id: Optional[str] = None,
|
|
185
|
+
location: Optional[dict[str, Any]] = None,
|
|
186
|
+
location_by_postal_code: Optional[dict[str, Any]] = None,
|
|
187
|
+
industry: Optional[dict[str, Any]] = None,
|
|
188
|
+
first_name: Optional[str] = None,
|
|
189
|
+
last_name: Optional[str] = None,
|
|
190
|
+
tenure: Optional[list[dict[str, Any]]] = None,
|
|
191
|
+
groups: Optional[list[str]] = None,
|
|
192
|
+
school: Optional[dict[str, Any]] = None,
|
|
193
|
+
profile_language: Optional[list[str]] = None,
|
|
194
|
+
company: Optional[dict[str, Any]] = None,
|
|
195
|
+
company_headcount: Optional[list[dict[str, Any]]] = None,
|
|
196
|
+
company_type: Optional[list[str]] = None,
|
|
197
|
+
company_location: Optional[dict[str, Any]] = None,
|
|
198
|
+
tenure_at_company: Optional[list[dict[str, Any]]] = None,
|
|
199
|
+
past_company: Optional[dict[str, Any]] = None,
|
|
200
|
+
function: Optional[dict[str, Any]] = None,
|
|
201
|
+
role: Optional[dict[str, Any]] = None,
|
|
202
|
+
tenure_at_role: Optional[list[dict[str, Any]]] = None,
|
|
203
|
+
seniority: Optional[dict[str, Any]] = None,
|
|
204
|
+
past_role: Optional[dict[str, Any]] = None,
|
|
205
|
+
following_your_company: Optional[bool] = None,
|
|
206
|
+
viewed_your_profile_recently: Optional[bool] = None,
|
|
207
|
+
network_distance: Optional[list[str]] = None,
|
|
208
|
+
connections_of: Optional[list[str]] = None,
|
|
209
|
+
past_colleague: Optional[bool] = None,
|
|
210
|
+
shared_experiences: Optional[bool] = None,
|
|
211
|
+
changed_jobs: Optional[bool] = None,
|
|
212
|
+
posted_on_linkedin: Optional[bool] = None,
|
|
213
|
+
mentionned_in_news: Optional[bool] = None,
|
|
214
|
+
persona: Optional[list[str]] = None,
|
|
215
|
+
account_lists: Optional[dict[str, Any]] = None,
|
|
216
|
+
lead_lists: Optional[dict[str, Any]] = None,
|
|
217
|
+
viewed_profile_recently: Optional[bool] = None,
|
|
218
|
+
messaged_recently: Optional[bool] = None,
|
|
219
|
+
include_saved_leads: Optional[bool] = None,
|
|
220
|
+
include_saved_accounts: Optional[bool] = None,
|
|
221
|
+
) -> dict[str, Any]:
|
|
222
|
+
"""
|
|
223
|
+
Performs a comprehensive LinkedIn Sales Navigator people search with advanced targeting options.
|
|
224
|
+
This function provides access to LinkedIn's Sales Navigator search capabilities for finding people
|
|
225
|
+
with precise filters including experience, company details, education, and relationship criteria.
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
cursor: Pagination cursor for the next page of entries.
|
|
229
|
+
limit: Number of items to return.
|
|
230
|
+
keywords: LinkedIn native filter: KEYWORDS.
|
|
231
|
+
last_viewed_at: Unix timestamp for saved search filtering.
|
|
232
|
+
saved_search_id: ID of saved search (overrides other parameters).
|
|
233
|
+
recent_search_id: ID of recent search (overrides other parameters).
|
|
234
|
+
location: LinkedIn native filter: GEOGRAPHY. Example: {"include": ["San Francisco Bay Area", "New York City Area"]}
|
|
235
|
+
location_by_postal_code: Location filter by postal code. Example: {"postal_code": "94105", "radius": "25"}
|
|
236
|
+
industry: LinkedIn native filter: INDUSTRY. Example: {"include": ["Information Technology and Services", "Financial Services"]}
|
|
237
|
+
first_name: LinkedIn native filter: FIRST NAME. Example: "John"
|
|
238
|
+
last_name: LinkedIn native filter: LAST NAME. Example: "Smith"
|
|
239
|
+
tenure: LinkedIn native filter: YEARS OF EXPERIENCE. Example: [{"min": 5, "max": 10}]
|
|
240
|
+
groups: LinkedIn native filter: GROUPS. Example: ["group_id_1", "group_id_2"]
|
|
241
|
+
school: LinkedIn native filter: SCHOOL. Example: {"include": ["Stanford University", "Harvard University"]}
|
|
242
|
+
profile_language: ISO 639-1 language codes, LinkedIn native filter: PROFILE LANGUAGE. Example: ["en", "es"]
|
|
243
|
+
company: LinkedIn native filter: CURRENT COMPANY. Example: {"include": ["Google", "Microsoft", "Apple"]}
|
|
244
|
+
company_headcount: LinkedIn native filter: COMPANY HEADCOUNT. Example: [{"min": 100, "max": 1000}]
|
|
245
|
+
company_type: LinkedIn native filter: COMPANY TYPE. Example: ["Public Company", "Privately Held"]
|
|
246
|
+
company_location: LinkedIn native filter: COMPANY HEADQUARTERS LOCATION. Example: {"include": ["San Francisco", "Seattle"]}
|
|
247
|
+
tenure_at_company: LinkedIn native filter: YEARS IN CURRENT COMPANY. Example: [{"min": 2, "max": 5}]
|
|
248
|
+
past_company: LinkedIn native filter: PAST COMPANY. Example: {"include": ["Facebook", "Amazon"]}
|
|
249
|
+
function: LinkedIn native filter: FUNCTION. Example: {"include": ["Engineering", "Sales", "Marketing"]}
|
|
250
|
+
role: LinkedIn native filter: CURRENT JOB TITLE. Example: {"include": ["Software Engineer", "Product Manager"]}
|
|
251
|
+
tenure_at_role: LinkedIn native filter: YEARS IN CURRENT POSITION. Example: [{"min": 1, "max": 3}]
|
|
252
|
+
seniority: LinkedIn native filter: SENIORITY LEVEL. Example: {"include": ["Senior", "Director", "VP"]}
|
|
253
|
+
past_role: LinkedIn native filter: PAST JOB TITLE. Example: {"include": ["Senior Developer", "Team Lead"]}
|
|
254
|
+
following_your_company: LinkedIn native filter: FOLLOWING YOUR COMPANY. Example: True
|
|
255
|
+
viewed_your_profile_recently: LinkedIn native filter: VIEWED YOUR PROFILE RECENTLY. Example: True
|
|
256
|
+
network_distance: First, second, third+ degree or GROUP, LinkedIn native filter: CONNECTION. Example: ["1st", "2nd"]
|
|
257
|
+
connections_of: LinkedIn native filter: CONNECTIONS OF. Example: ["person_id_1", "person_id_2"]
|
|
258
|
+
past_colleague: LinkedIn native filter: PAST COLLEAGUE. Example: True
|
|
259
|
+
shared_experiences: LinkedIn native filter: SHARED EXPERIENCES. Example: True
|
|
260
|
+
changed_jobs: LinkedIn native filter: CHANGED JOBS. Example: True
|
|
261
|
+
posted_on_linkedin: LinkedIn native filter: POSTED ON LINKEDIN. Example: True
|
|
262
|
+
mentionned_in_news: LinkedIn native filter: MENTIONNED IN NEWS. Example: True
|
|
263
|
+
persona: LinkedIn native filter: PERSONA. Example: ["persona_id_1", "persona_id_2"]
|
|
264
|
+
account_lists: LinkedIn native filter: ACCOUNT LISTS. Example: {"include": ["list_id_1"]}
|
|
265
|
+
lead_lists: LinkedIn native filter: LEAD LISTS. Example: {"include": ["lead_list_id_1"]}
|
|
266
|
+
viewed_profile_recently: LinkedIn native filter: PEOPLE YOU INTERACTED WITH / VIEWED PROFILE. Example: True
|
|
267
|
+
messaged_recently: LinkedIn native filter: PEOPLE YOU INTERACTED WITH / MESSAGED. Example: True
|
|
268
|
+
include_saved_leads: LinkedIn native filter: SAVED LEADS AND ACCOUNTS / ALL MY SAVED LEADS. Example: True
|
|
269
|
+
include_saved_accounts: LinkedIn native filter: SAVED LEADS AND ACCOUNTS / ALL MY SAVED ACCOUNTS. Example: True
|
|
270
|
+
|
|
271
|
+
Returns:
|
|
272
|
+
A dictionary containing search results and pagination details.
|
|
273
|
+
|
|
274
|
+
Raises:
|
|
275
|
+
httpx.HTTPError: If the API request fails.
|
|
276
|
+
|
|
277
|
+
Tags:
|
|
278
|
+
linkedin, sales_navigator, people, search, advanced, scraper, api, important
|
|
279
|
+
"""
|
|
280
|
+
return self._unipile_app.people_search(
|
|
281
|
+
account_id=self.account_id,
|
|
282
|
+
cursor=cursor,
|
|
283
|
+
limit=limit,
|
|
284
|
+
keywords=keywords,
|
|
285
|
+
last_viewed_at=last_viewed_at,
|
|
286
|
+
saved_search_id=saved_search_id,
|
|
287
|
+
recent_search_id=recent_search_id,
|
|
288
|
+
location=location,
|
|
289
|
+
location_by_postal_code=location_by_postal_code,
|
|
290
|
+
industry=industry,
|
|
291
|
+
first_name=first_name,
|
|
292
|
+
last_name=last_name,
|
|
293
|
+
tenure=tenure,
|
|
294
|
+
groups=groups,
|
|
295
|
+
school=school,
|
|
296
|
+
profile_language=profile_language,
|
|
297
|
+
company=company,
|
|
298
|
+
company_headcount=company_headcount,
|
|
299
|
+
company_type=company_type,
|
|
300
|
+
company_location=company_location,
|
|
301
|
+
tenure_at_company=tenure_at_company,
|
|
302
|
+
past_company=past_company,
|
|
303
|
+
function=function,
|
|
304
|
+
role=role,
|
|
305
|
+
tenure_at_role=tenure_at_role,
|
|
306
|
+
seniority=seniority,
|
|
307
|
+
past_role=past_role,
|
|
308
|
+
following_your_company=following_your_company,
|
|
309
|
+
viewed_your_profile_recently=viewed_your_profile_recently,
|
|
310
|
+
network_distance=network_distance,
|
|
311
|
+
connections_of=connections_of,
|
|
312
|
+
past_colleague=past_colleague,
|
|
313
|
+
shared_experiences=shared_experiences,
|
|
314
|
+
changed_jobs=changed_jobs,
|
|
315
|
+
posted_on_linkedin=posted_on_linkedin,
|
|
316
|
+
mentionned_in_news=mentionned_in_news,
|
|
317
|
+
persona=persona,
|
|
318
|
+
account_lists=account_lists,
|
|
319
|
+
lead_lists=lead_lists,
|
|
320
|
+
viewed_profile_recently=viewed_profile_recently,
|
|
321
|
+
messaged_recently=messaged_recently,
|
|
322
|
+
include_saved_leads=include_saved_leads,
|
|
323
|
+
include_saved_accounts=include_saved_accounts,
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
def linkedin_company_search(
|
|
327
|
+
self,
|
|
328
|
+
cursor: Optional[str] = None,
|
|
329
|
+
limit: Optional[int] = None,
|
|
330
|
+
keywords: Optional[str] = None,
|
|
331
|
+
last_viewed_at: Optional[int] = None,
|
|
332
|
+
saved_search_id: Optional[str] = None,
|
|
333
|
+
recent_search_id: Optional[str] = None,
|
|
334
|
+
location: Optional[dict[str, Any]] = None,
|
|
335
|
+
location_by_postal_code: Optional[dict[str, Any]] = None,
|
|
336
|
+
industry: Optional[dict[str, Any]] = None,
|
|
337
|
+
company_headcount: Optional[list[dict[str, Any]]] = None,
|
|
338
|
+
company_type: Optional[list[str]] = None,
|
|
339
|
+
company_location: Optional[dict[str, Any]] = None,
|
|
340
|
+
following_your_company: Optional[bool] = None,
|
|
341
|
+
account_lists: Optional[dict[str, Any]] = None,
|
|
342
|
+
include_saved_accounts: Optional[bool] = None,
|
|
343
|
+
) -> dict[str, Any]:
|
|
344
|
+
"""
|
|
345
|
+
Performs a comprehensive LinkedIn Sales Navigator company search with advanced targeting options.
|
|
346
|
+
This function provides access to LinkedIn's Sales Navigator search capabilities for finding companies
|
|
347
|
+
with precise filters including size, location, industry, and relationship criteria.
|
|
348
|
+
|
|
349
|
+
Args:
|
|
350
|
+
cursor: Pagination cursor for the next page of entries.
|
|
351
|
+
limit: Number of items to return.
|
|
352
|
+
keywords: LinkedIn native filter: KEYWORDS. Example: "fintech startup"
|
|
353
|
+
last_viewed_at: Unix timestamp for saved search filtering.
|
|
354
|
+
saved_search_id: ID of saved search (overrides other parameters).
|
|
355
|
+
recent_search_id: ID of recent search (overrides other parameters).
|
|
356
|
+
location: LinkedIn native filter: GEOGRAPHY. Example: {"include": ["San Francisco Bay Area", "New York City Area"]}
|
|
357
|
+
location_by_postal_code: Location filter by postal code. Example: {"postal_code": "94105", "radius": "25"}
|
|
358
|
+
industry: LinkedIn native filter: INDUSTRY. Example: {"include": ["Information Technology and Services", "Financial Services"]}
|
|
359
|
+
company_headcount: LinkedIn native filter: COMPANY HEADCOUNT. Example: [{"min": 10, "max": 100}]
|
|
360
|
+
company_type: LinkedIn native filter: COMPANY TYPE. Example: ["Public Company", "Privately Held", "Startup"]
|
|
361
|
+
company_location: LinkedIn native filter: COMPANY HEADQUARTERS LOCATION. Example: {"include": ["San Francisco", "Seattle", "Austin"]}
|
|
362
|
+
following_your_company: LinkedIn native filter: FOLLOWING YOUR COMPANY. Example: True
|
|
363
|
+
account_lists: LinkedIn native filter: ACCOUNT LISTS. Example: {"include": ["account_list_id_1"]}
|
|
364
|
+
include_saved_accounts: LinkedIn native filter: SAVED LEADS AND ACCOUNTS / ALL MY SAVED ACCOUNTS. Example: True
|
|
365
|
+
|
|
366
|
+
Returns:
|
|
367
|
+
A dictionary containing search results and pagination details.
|
|
368
|
+
|
|
369
|
+
Raises:
|
|
370
|
+
httpx.HTTPError: If the API request fails.
|
|
371
|
+
|
|
372
|
+
Tags:
|
|
373
|
+
linkedin, sales_navigator, companies, search, advanced, scraper, api, important
|
|
374
|
+
"""
|
|
375
|
+
return self._unipile_app.company_search(
|
|
376
|
+
account_id=self.account_id,
|
|
377
|
+
cursor=cursor,
|
|
378
|
+
limit=limit,
|
|
379
|
+
keywords=keywords,
|
|
380
|
+
last_viewed_at=last_viewed_at,
|
|
381
|
+
saved_search_id=saved_search_id,
|
|
382
|
+
recent_search_id=recent_search_id,
|
|
383
|
+
location=location,
|
|
384
|
+
location_by_postal_code=location_by_postal_code,
|
|
385
|
+
industry=industry,
|
|
386
|
+
company_headcount=company_headcount,
|
|
387
|
+
company_type=company_type,
|
|
388
|
+
company_location=company_location,
|
|
389
|
+
following_your_company=following_your_company,
|
|
390
|
+
account_lists=account_lists,
|
|
391
|
+
include_saved_accounts=include_saved_accounts,
|
|
392
|
+
)
|
|
393
|
+
|
|
177
394
|
def list_tools(self):
|
|
178
395
|
"""
|
|
179
396
|
Returns a list of available tools/functions in this application.
|
|
@@ -186,4 +403,6 @@ class ScraperApp(APIApplication):
|
|
|
186
403
|
self.linkedin_list_profile_posts,
|
|
187
404
|
self.linkedin_retrieve_profile,
|
|
188
405
|
self.linkedin_list_post_comments,
|
|
406
|
+
self.linkedin_people_search,
|
|
407
|
+
self.linkedin_company_search,
|
|
189
408
|
]
|
|
@@ -778,6 +778,261 @@ class UnipileApp(APIApplication):
|
|
|
778
778
|
response = self._post(url, params=params, data=payload)
|
|
779
779
|
return self._handle_response(response)
|
|
780
780
|
|
|
781
|
+
def people_search(
|
|
782
|
+
self,
|
|
783
|
+
account_id: str,
|
|
784
|
+
cursor: str | None = None,
|
|
785
|
+
limit: int | None = None,
|
|
786
|
+
keywords: str | None = None,
|
|
787
|
+
last_viewed_at: int | None = None,
|
|
788
|
+
saved_search_id: str | None = None,
|
|
789
|
+
recent_search_id: str | None = None,
|
|
790
|
+
location: dict[str, Any] | None = None,
|
|
791
|
+
location_by_postal_code: dict[str, Any] | None = None,
|
|
792
|
+
industry: dict[str, Any] | None = None,
|
|
793
|
+
first_name: str | None = None,
|
|
794
|
+
last_name: str | None = None,
|
|
795
|
+
tenure: list[dict[str, Any]] | None = None,
|
|
796
|
+
groups: list[str] | None = None,
|
|
797
|
+
school: dict[str, Any] | None = None,
|
|
798
|
+
profile_language: list[str] | None = None,
|
|
799
|
+
company: dict[str, Any] | None = None,
|
|
800
|
+
company_headcount: list[dict[str, Any]] | None = None,
|
|
801
|
+
company_type: list[str] | None = None,
|
|
802
|
+
company_location: dict[str, Any] | None = None,
|
|
803
|
+
tenure_at_company: list[dict[str, Any]] | None = None,
|
|
804
|
+
past_company: dict[str, Any] | None = None,
|
|
805
|
+
function: dict[str, Any] | None = None,
|
|
806
|
+
role: dict[str, Any] | None = None,
|
|
807
|
+
tenure_at_role: list[dict[str, Any]] | None = None,
|
|
808
|
+
seniority: dict[str, Any] | None = None,
|
|
809
|
+
past_role: dict[str, Any] | None = None,
|
|
810
|
+
following_your_company: bool | None = None,
|
|
811
|
+
viewed_your_profile_recently: bool | None = None,
|
|
812
|
+
network_distance: list[str] | None = None,
|
|
813
|
+
connections_of: list[str] | None = None,
|
|
814
|
+
past_colleague: bool | None = None,
|
|
815
|
+
shared_experiences: bool | None = None,
|
|
816
|
+
changed_jobs: bool | None = None,
|
|
817
|
+
posted_on_linkedin: bool | None = None,
|
|
818
|
+
mentionned_in_news: bool | None = None,
|
|
819
|
+
persona: list[str] | None = None,
|
|
820
|
+
account_lists: dict[str, Any] | None = None,
|
|
821
|
+
lead_lists: dict[str, Any] | None = None,
|
|
822
|
+
viewed_profile_recently: bool | None = None,
|
|
823
|
+
messaged_recently: bool | None = None,
|
|
824
|
+
include_saved_leads: bool | None = None,
|
|
825
|
+
include_saved_accounts: bool | None = None,
|
|
826
|
+
) -> dict[str, Any]:
|
|
827
|
+
"""
|
|
828
|
+
Performs a comprehensive LinkedIn Sales Navigator people search with all available parameters.
|
|
829
|
+
This function provides access to LinkedIn's advanced Sales Navigator search capabilities
|
|
830
|
+
for finding people with precise targeting options.
|
|
831
|
+
|
|
832
|
+
Args:
|
|
833
|
+
account_id: The ID of the Unipile account to perform the search from (REQUIRED).
|
|
834
|
+
cursor: Pagination cursor for the next page of entries.
|
|
835
|
+
limit: Number of items to return.
|
|
836
|
+
keywords: LinkedIn native filter: KEYWORDS.
|
|
837
|
+
last_viewed_at: Unix timestamp for saved search filtering.
|
|
838
|
+
saved_search_id: ID of saved search (overrides other parameters).
|
|
839
|
+
recent_search_id: ID of recent search (overrides other parameters).
|
|
840
|
+
location: LinkedIn native filter: GEOGRAPHY.
|
|
841
|
+
location_by_postal_code: Location filter by postal code.
|
|
842
|
+
industry: LinkedIn native filter: INDUSTRY.
|
|
843
|
+
first_name: LinkedIn native filter: FIRST NAME.
|
|
844
|
+
last_name: LinkedIn native filter: LAST NAME.
|
|
845
|
+
tenure: LinkedIn native filter: YEARS OF EXPERIENCE.
|
|
846
|
+
groups: LinkedIn native filter: GROUPS.
|
|
847
|
+
school: LinkedIn native filter: SCHOOL.
|
|
848
|
+
profile_language: ISO 639-1 language codes, LinkedIn native filter: PROFILE LANGUAGE.
|
|
849
|
+
company: LinkedIn native filter: CURRENT COMPANY.
|
|
850
|
+
company_headcount: LinkedIn native filter: COMPANY HEADCOUNT.
|
|
851
|
+
company_type: LinkedIn native filter: COMPANY TYPE.
|
|
852
|
+
company_location: LinkedIn native filter: COMPANY HEADQUARTERS LOCATION.
|
|
853
|
+
tenure_at_company: LinkedIn native filter: YEARS IN CURRENT COMPANY.
|
|
854
|
+
past_company: LinkedIn native filter: PAST COMPANY.
|
|
855
|
+
function: LinkedIn native filter: FUNCTION.
|
|
856
|
+
role: LinkedIn native filter: CURRENT JOB TITLE.
|
|
857
|
+
tenure_at_role: LinkedIn native filter: YEARS IN CURRENT POSITION.
|
|
858
|
+
seniority: LinkedIn native filter: SENIORITY LEVEL.
|
|
859
|
+
past_role: LinkedIn native filter: PAST JOB TITLE.
|
|
860
|
+
following_your_company: LinkedIn native filter: FOLLOWING YOUR COMPANY.
|
|
861
|
+
viewed_your_profile_recently: LinkedIn native filter: VIEWED YOUR PROFILE RECENTLY.
|
|
862
|
+
network_distance: First, second, third+ degree or GROUP, LinkedIn native filter: CONNECTION.
|
|
863
|
+
connections_of: LinkedIn native filter: CONNECTIONS OF.
|
|
864
|
+
past_colleague: LinkedIn native filter: PAST COLLEAGUE.
|
|
865
|
+
shared_experiences: LinkedIn native filter: SHARED EXPERIENCES.
|
|
866
|
+
changed_jobs: LinkedIn native filter: CHANGED JOBS.
|
|
867
|
+
posted_on_linkedin: LinkedIn native filter: POSTED ON LINKEDIN.
|
|
868
|
+
mentionned_in_news: LinkedIn native filter: MENTIONNED IN NEWS.
|
|
869
|
+
persona: LinkedIn native filter: PERSONA.
|
|
870
|
+
account_lists: LinkedIn native filter: ACCOUNT LISTS.
|
|
871
|
+
lead_lists: LinkedIn native filter: LEAD LISTS.
|
|
872
|
+
viewed_profile_recently: LinkedIn native filter: PEOPLE YOU INTERACTED WITH / VIEWED PROFILE.
|
|
873
|
+
messaged_recently: LinkedIn native filter: PEOPLE YOU INTERACTED WITH / MESSAGED.
|
|
874
|
+
include_saved_leads: LinkedIn native filter: SAVED LEADS AND ACCOUNTS / ALL MY SAVED LEADS.
|
|
875
|
+
include_saved_accounts: LinkedIn native filter: SAVED LEADS AND ACCOUNTS / ALL MY SAVED ACCOUNTS.
|
|
876
|
+
|
|
877
|
+
Returns:
|
|
878
|
+
A dictionary containing search results and pagination details.
|
|
879
|
+
|
|
880
|
+
Raises:
|
|
881
|
+
httpx.HTTPError: If the API request fails.
|
|
882
|
+
|
|
883
|
+
Tags:
|
|
884
|
+
linkedin, sales_navigator, people, search, advanced, api, important
|
|
885
|
+
"""
|
|
886
|
+
url = f"{self.base_url}/api/v1/linkedin/search"
|
|
887
|
+
|
|
888
|
+
params: dict[str, Any] = {"account_id": account_id}
|
|
889
|
+
if cursor:
|
|
890
|
+
params["cursor"] = cursor
|
|
891
|
+
if limit is not None:
|
|
892
|
+
params["limit"] = limit
|
|
893
|
+
|
|
894
|
+
payload: dict[str, Any] = {
|
|
895
|
+
"api": "sales_navigator",
|
|
896
|
+
"category": "people"
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
# Add all the Sales Navigator specific parameters
|
|
900
|
+
sn_params = {
|
|
901
|
+
"keywords": keywords,
|
|
902
|
+
"last_viewed_at": last_viewed_at,
|
|
903
|
+
"saved_search_id": saved_search_id,
|
|
904
|
+
"recent_search_id": recent_search_id,
|
|
905
|
+
"location": location,
|
|
906
|
+
"location_by_postal_code": location_by_postal_code,
|
|
907
|
+
"industry": industry,
|
|
908
|
+
"first_name": first_name,
|
|
909
|
+
"last_name": last_name,
|
|
910
|
+
"tenure": tenure,
|
|
911
|
+
"groups": groups,
|
|
912
|
+
"school": school,
|
|
913
|
+
"profile_language": profile_language,
|
|
914
|
+
"company": company,
|
|
915
|
+
"company_headcount": company_headcount,
|
|
916
|
+
"company_type": company_type,
|
|
917
|
+
"company_location": company_location,
|
|
918
|
+
"tenure_at_company": tenure_at_company,
|
|
919
|
+
"past_company": past_company,
|
|
920
|
+
"function": function,
|
|
921
|
+
"role": role,
|
|
922
|
+
"tenure_at_role": tenure_at_role,
|
|
923
|
+
"seniority": seniority,
|
|
924
|
+
"past_role": past_role,
|
|
925
|
+
"following_your_company": following_your_company,
|
|
926
|
+
"viewed_your_profile_recently": viewed_your_profile_recently,
|
|
927
|
+
"network_distance": network_distance,
|
|
928
|
+
"connections_of": connections_of,
|
|
929
|
+
"past_colleague": past_colleague,
|
|
930
|
+
"shared_experiences": shared_experiences,
|
|
931
|
+
"changed_jobs": changed_jobs,
|
|
932
|
+
"posted_on_linkedin": posted_on_linkedin,
|
|
933
|
+
"mentionned_in_news": mentionned_in_news,
|
|
934
|
+
"persona": persona,
|
|
935
|
+
"account_lists": account_lists,
|
|
936
|
+
"lead_lists": lead_lists,
|
|
937
|
+
"viewed_profile_recently": viewed_profile_recently,
|
|
938
|
+
"messaged_recently": messaged_recently,
|
|
939
|
+
"include_saved_leads": include_saved_leads,
|
|
940
|
+
"include_saved_accounts": include_saved_accounts,
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
# Only add parameters that are not None
|
|
944
|
+
payload.update({k: v for k, v in sn_params.items() if v is not None})
|
|
945
|
+
|
|
946
|
+
response = self._post(url, params=params, data=payload)
|
|
947
|
+
return self._handle_response(response)
|
|
948
|
+
|
|
949
|
+
def company_search(
|
|
950
|
+
self,
|
|
951
|
+
account_id: str,
|
|
952
|
+
cursor: str | None = None,
|
|
953
|
+
limit: int | None = None,
|
|
954
|
+
keywords: str | None = None,
|
|
955
|
+
last_viewed_at: int | None = None,
|
|
956
|
+
saved_search_id: str | None = None,
|
|
957
|
+
recent_search_id: str | None = None,
|
|
958
|
+
location: dict[str, Any] | None = None,
|
|
959
|
+
location_by_postal_code: dict[str, Any] | None = None,
|
|
960
|
+
industry: dict[str, Any] | None = None,
|
|
961
|
+
company_headcount: list[dict[str, Any]] | None = None,
|
|
962
|
+
company_type: list[str] | None = None,
|
|
963
|
+
company_location: dict[str, Any] | None = None,
|
|
964
|
+
following_your_company: bool | None = None,
|
|
965
|
+
account_lists: dict[str, Any] | None = None,
|
|
966
|
+
include_saved_accounts: bool | None = None,
|
|
967
|
+
) -> dict[str, Any]:
|
|
968
|
+
"""
|
|
969
|
+
Performs a comprehensive LinkedIn Sales Navigator company search with relevant parameters.
|
|
970
|
+
This function provides access to LinkedIn's advanced Sales Navigator search capabilities
|
|
971
|
+
for finding companies with precise targeting options.
|
|
972
|
+
|
|
973
|
+
Args:
|
|
974
|
+
account_id: The ID of the Unipile account to perform the search from (REQUIRED).
|
|
975
|
+
cursor: Pagination cursor for the next page of entries.
|
|
976
|
+
limit: Number of items to return.
|
|
977
|
+
keywords: LinkedIn native filter: KEYWORDS.
|
|
978
|
+
last_viewed_at: Unix timestamp for saved search filtering.
|
|
979
|
+
saved_search_id: ID of saved search (overrides other parameters).
|
|
980
|
+
recent_search_id: ID of recent search (overrides other parameters).
|
|
981
|
+
location: LinkedIn native filter: GEOGRAPHY.
|
|
982
|
+
location_by_postal_code: Location filter by postal code.
|
|
983
|
+
industry: LinkedIn native filter: INDUSTRY.
|
|
984
|
+
company_headcount: LinkedIn native filter: COMPANY HEADCOUNT. Example {"min": 10, "max": 100}
|
|
985
|
+
company_type: LinkedIn native filter: COMPANY TYPE.
|
|
986
|
+
company_location: LinkedIn native filter: COMPANY HEADQUARTERS LOCATION.
|
|
987
|
+
following_your_company: LinkedIn native filter: FOLLOWING YOUR COMPANY.
|
|
988
|
+
account_lists: LinkedIn native filter: ACCOUNT LISTS.
|
|
989
|
+
include_saved_accounts: LinkedIn native filter: SAVED LEADS AND ACCOUNTS / ALL MY SAVED ACCOUNTS.
|
|
990
|
+
|
|
991
|
+
Returns:
|
|
992
|
+
A dictionary containing search results and pagination details.
|
|
993
|
+
|
|
994
|
+
Raises:
|
|
995
|
+
httpx.HTTPError: If the API request fails.
|
|
996
|
+
|
|
997
|
+
Tags:
|
|
998
|
+
linkedin, sales_navigator, companies, search, advanced, api, important
|
|
999
|
+
"""
|
|
1000
|
+
url = f"{self.base_url}/api/v1/linkedin/search"
|
|
1001
|
+
|
|
1002
|
+
params: dict[str, Any] = {"account_id": account_id}
|
|
1003
|
+
if cursor:
|
|
1004
|
+
params["cursor"] = cursor
|
|
1005
|
+
if limit is not None:
|
|
1006
|
+
params["limit"] = limit
|
|
1007
|
+
|
|
1008
|
+
payload: dict[str, Any] = {
|
|
1009
|
+
"api": "sales_navigator",
|
|
1010
|
+
"category": "companies"
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
# Add all the Sales Navigator company-specific parameters
|
|
1014
|
+
sn_params = {
|
|
1015
|
+
"keywords": keywords,
|
|
1016
|
+
"last_viewed_at": last_viewed_at,
|
|
1017
|
+
"saved_search_id": saved_search_id,
|
|
1018
|
+
"recent_search_id": recent_search_id,
|
|
1019
|
+
"location": location,
|
|
1020
|
+
"location_by_postal_code": location_by_postal_code,
|
|
1021
|
+
"industry": industry,
|
|
1022
|
+
"company_headcount": company_headcount,
|
|
1023
|
+
"company_type": company_type,
|
|
1024
|
+
"company_location": company_location,
|
|
1025
|
+
"following_your_company": following_your_company,
|
|
1026
|
+
"account_lists": account_lists,
|
|
1027
|
+
"include_saved_accounts": include_saved_accounts,
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
# Only add parameters that are not None
|
|
1031
|
+
payload.update({k: v for k, v in sn_params.items() if v is not None})
|
|
1032
|
+
|
|
1033
|
+
response = self._post(url, params=params, data=payload)
|
|
1034
|
+
return self._handle_response(response)
|
|
1035
|
+
|
|
781
1036
|
def retrieve_user_profile(
|
|
782
1037
|
self,
|
|
783
1038
|
identifier: str,
|
|
@@ -824,4 +1079,6 @@ class UnipileApp(APIApplication):
|
|
|
824
1079
|
self.create_post_comment,
|
|
825
1080
|
self.create_reaction,
|
|
826
1081
|
self.search,
|
|
1082
|
+
self.people_search,
|
|
1083
|
+
self.company_search,
|
|
827
1084
|
]
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
from typing import Any
|
|
2
|
+
import os
|
|
2
3
|
|
|
3
4
|
from youtube_transcript_api import YouTubeTranscriptApi
|
|
4
|
-
from youtube_transcript_api.proxies import
|
|
5
|
-
|
|
5
|
+
from youtube_transcript_api.proxies import WebshareProxyConfig
|
|
6
6
|
|
|
7
7
|
from universal_mcp.applications.application import APIApplication
|
|
8
8
|
from universal_mcp.integrations import Integration
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class YoutubeApp(APIApplication):
|
|
12
|
-
def __init__(self, integration: Integration = None, **kwargs) -> None:
|
|
12
|
+
def __init__(self, integration: Integration | None = None, **kwargs) -> None:
|
|
13
13
|
"""
|
|
14
14
|
Initializes an instance of a YouTube application integration.
|
|
15
15
|
|
|
@@ -298,10 +298,20 @@ class YoutubeApp(APIApplication):
|
|
|
298
298
|
raise ValueError("Missing required parameter 'video_id'")
|
|
299
299
|
|
|
300
300
|
try:
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
301
|
+
proxy_username = os.getenv("PROXY_USERNAME")
|
|
302
|
+
proxy_password = os.getenv("PROXY_PASSWORD")
|
|
303
|
+
proxy_port = int(os.getenv("PROXY_PORT", 80))
|
|
304
|
+
|
|
305
|
+
if not proxy_username or not proxy_password:
|
|
306
|
+
raise ValueError(
|
|
307
|
+
"PROXY_USERNAME and PROXY_PASSWORD must be set when using proxy"
|
|
304
308
|
)
|
|
309
|
+
api = YouTubeTranscriptApi(
|
|
310
|
+
proxy_config=WebshareProxyConfig(
|
|
311
|
+
proxy_username=proxy_username,
|
|
312
|
+
proxy_password=proxy_password,
|
|
313
|
+
proxy_port=proxy_port,
|
|
314
|
+
),
|
|
305
315
|
)
|
|
306
316
|
transcript = api.fetch(video_id)
|
|
307
317
|
|
{universal_mcp_applications-0.1.20.dist-info → universal_mcp_applications-0.1.21.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: universal-mcp-applications
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.21
|
|
4
4
|
Summary: A Universal MCP Application: universal_mcp_applications
|
|
5
5
|
Project-URL: Homepage, https://github.com/universal-mcp/applications
|
|
6
6
|
Project-URL: Repository, https://github.com/universal-mcp/applications
|
{universal_mcp_applications-0.1.20.dist-info → universal_mcp_applications-0.1.21.dist-info}/RECORD
RENAMED
|
@@ -190,7 +190,7 @@ universal_mcp/applications/rocketlane/__init__.py,sha256=jl3PjnTvPdjnbFXJgLywSlE
|
|
|
190
190
|
universal_mcp/applications/rocketlane/app.py,sha256=Re5-OoUWIIxL_ZJZ_RpEqz82hymgAWtdcOSJtJFzzs0,240690
|
|
191
191
|
universal_mcp/applications/scraper/README.md,sha256=JUNLshHABs4T1f24nvQeee62YIElSkxpU-zs2kuS0Gw,1497
|
|
192
192
|
universal_mcp/applications/scraper/__init__.py,sha256=RnkyFDeNR1tOsY_PskHdv4C8AYRbcjMt7KyYQWiGGD8,27
|
|
193
|
-
universal_mcp/applications/scraper/app.py,sha256=
|
|
193
|
+
universal_mcp/applications/scraper/app.py,sha256=rdyeQDGTok2Pb7jBI1AD4gjY_PWRpH3kEyJ1GknYoXg,20088
|
|
194
194
|
universal_mcp/applications/semanticscholar/README.md,sha256=JpLY_698pvstgoNfQ5Go8C8ehQ-o68uFDX5kr86upK0,2834
|
|
195
195
|
universal_mcp/applications/semanticscholar/__init__.py,sha256=eR36chrc0pbBsSE1GadvmQH0OmtKnSC91xbE7HcDPf0,36
|
|
196
196
|
universal_mcp/applications/semanticscholar/app.py,sha256=OHTFkR-IwRU5Rvb1bEu7XmRHikht3hEgZxszLQu6kFI,22234
|
|
@@ -251,7 +251,7 @@ universal_mcp/applications/twitter/api_segments/usage_api.py,sha256=aBhjTzYUN16s
|
|
|
251
251
|
universal_mcp/applications/twitter/api_segments/users_api.py,sha256=aypLs5_66TRtliSi2TjrQO9l6NuJa2LZn3Ywgwt8hEk,82349
|
|
252
252
|
universal_mcp/applications/unipile/README.md,sha256=gh_YsmeJ0pAU7XNBZD8OO-AgH7ed2kG8QPbxm2wYjlY,5205
|
|
253
253
|
universal_mcp/applications/unipile/__init__.py,sha256=0UZVOiYo_dDXbvTmtHrZ_fgvrbpasjWV17EEm4pZq9E,28
|
|
254
|
-
universal_mcp/applications/unipile/app.py,sha256=
|
|
254
|
+
universal_mcp/applications/unipile/app.py,sha256=WD_tXktYOjtEhaVwL5QKt9mMLoxhy-lUAzVLI_C6kQ0,45854
|
|
255
255
|
universal_mcp/applications/whatsapp/README.md,sha256=ZYbpVN0EqMW21ZCMcLNdheKX8OSPCkt3wcN8p8OZk5E,3849
|
|
256
256
|
universal_mcp/applications/whatsapp/__init__.py,sha256=miHfSBpu5lx226T8dMbvOw_5H6MJCWOKVK_WbqMma-8,29
|
|
257
257
|
universal_mcp/applications/whatsapp/app.py,sha256=dWuwHBKmUYMB3vROQy7MTvaXa6Mzr40R179APanzcFI,23975
|
|
@@ -268,11 +268,11 @@ universal_mcp/applications/yahoo_finance/__init__.py,sha256=ySX-_1nfnbrpeeUwkQG7
|
|
|
268
268
|
universal_mcp/applications/yahoo_finance/app.py,sha256=ZmlgcIle0V8njCQf8d_Hm-JqW_Ixhp8f9HG5qigohXA,9424
|
|
269
269
|
universal_mcp/applications/youtube/README.md,sha256=iK7wyIJrgA_Ai9GWdqMIsuIBQEr7srt5s_RiDeSDuU0,13502
|
|
270
270
|
universal_mcp/applications/youtube/__init__.py,sha256=HuPQYpxmH_duCaVBXIE_fm-XzSIcqMjpn066tpUkKhQ,28
|
|
271
|
-
universal_mcp/applications/youtube/app.py,sha256=
|
|
271
|
+
universal_mcp/applications/youtube/app.py,sha256=0rHSRc1qRWj9wfdtaKbus927Cc_w4DTJKEHoUNddApw,76926
|
|
272
272
|
universal_mcp/applications/zenquotes/README.md,sha256=FJyoTGRCaZjF_bsCBqg1CrYcvIfuUG_Qk616G1wjhF8,512
|
|
273
273
|
universal_mcp/applications/zenquotes/__init__.py,sha256=IkASLYaZiHJXlkGwEMk1HgIq5GwEZp5GhAIiJyjBd3g,30
|
|
274
274
|
universal_mcp/applications/zenquotes/app.py,sha256=S88JEoVFsyqow-56zcYPgRzhcz59AG_L_RdTFqtSwdA,1323
|
|
275
|
-
universal_mcp_applications-0.1.
|
|
276
|
-
universal_mcp_applications-0.1.
|
|
277
|
-
universal_mcp_applications-0.1.
|
|
278
|
-
universal_mcp_applications-0.1.
|
|
275
|
+
universal_mcp_applications-0.1.21.dist-info/METADATA,sha256=Rbmaw-Tt9xNty_V4G48aUBgqZxDjT0vIqa2rha75HX8,2918
|
|
276
|
+
universal_mcp_applications-0.1.21.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
277
|
+
universal_mcp_applications-0.1.21.dist-info/licenses/LICENSE,sha256=NweDZVPslBAZFzlgByF158b85GR0f5_tLQgq1NS48To,1063
|
|
278
|
+
universal_mcp_applications-0.1.21.dist-info/RECORD,,
|
{universal_mcp_applications-0.1.20.dist-info → universal_mcp_applications-0.1.21.dist-info}/WHEEL
RENAMED
|
File without changes
|
|
File without changes
|