universal-mcp-applications 0.1.28__tar.gz → 0.1.30rc1__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.
Potentially problematic release.
This version of universal-mcp-applications might be problematic. Click here for more details.
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/PKG-INFO +1 -1
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/pyproject.toml +1 -1
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/tests/test_applications.py +0 -1
- {universal_mcp_applications-0.1.28/src/universal_mcp/applications/unipile → universal_mcp_applications-0.1.30rc1/src/universal_mcp/applications/linkedin}/app.py +65 -121
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/scraper/app.py +7 -7
- universal_mcp_applications-0.1.30rc1/src/universal_mcp/applications/scraper/scraper_testers.py +17 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/uv.lock +1 -1
- universal_mcp_applications-0.1.28/src/universal_mcp/applications/linkedin/app.py +0 -238
- universal_mcp_applications-0.1.28/src/universal_mcp/applications/unipile/README.md +0 -28
- universal_mcp_applications-0.1.28/src/universal_mcp/applications/unipile/__init__.py +0 -1
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/.gitignore +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/GEMINI.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/LICENSE +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/bump_and_release.sh +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/scripts/docgen.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/scripts/prompts.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/scripts/readme.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/scripts/run_docgen.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/BEST_PRACTICES.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/ahrefs/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/ahrefs/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/ahrefs/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/airtable/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/airtable/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/airtable/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/apollo/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/apollo/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/apollo/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/asana/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/asana/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/asana/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/aws_s3/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/aws_s3/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/aws_s3/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/bill/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/bill/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/bill/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/box/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/box/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/box/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/braze/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/braze/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/braze/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/browser_use/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/browser_use/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/browser_use/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/cal_com_v2/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/cal_com_v2/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/cal_com_v2/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/calendly/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/calendly/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/calendly/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/canva/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/canva/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/canva/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/clickup/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/clickup/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/clickup/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/coda/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/coda/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/coda/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/confluence/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/confluence/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/confluence/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/contentful/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/contentful/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/contentful/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/crustdata/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/crustdata/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/crustdata/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/dialpad/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/dialpad/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/dialpad/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/digitalocean/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/digitalocean/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/digitalocean/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/domain_checker/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/domain_checker/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/domain_checker/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/e2b/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/e2b/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/e2b/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/elevenlabs/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/elevenlabs/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/elevenlabs/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/exa/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/exa/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/exa/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/falai/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/falai/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/falai/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/figma/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/figma/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/figma/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/file_system/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/file_system/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/file_system/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/firecrawl/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/firecrawl/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/firecrawl/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/fireflies/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/fireflies/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/fireflies/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/fpl/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/fpl/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/fpl/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/fpl/utils/api.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/fpl/utils/fixtures.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/fpl/utils/helper.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/fpl/utils/league_utils.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/fpl/utils/position_utils.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/ghost_content/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/ghost_content/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/ghost_content/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/github/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/github/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/github/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/gong/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/gong/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/gong/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_calendar/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_calendar/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_calendar/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_docs/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_docs/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_docs/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_drive/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_drive/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_drive/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_gemini/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_gemini/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_gemini/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_mail/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_mail/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_mail/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_searchconsole/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_searchconsole/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_searchconsole/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_sheet/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_sheet/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_sheet/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/google_sheet/helper.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/hashnode/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/hashnode/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/hashnode/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/heygen/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/heygen/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/heygen/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/http_tools/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/http_tools/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/http_tools/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/hubspot/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/hubspot/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/hubspot/api_segments/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/hubspot/api_segments/api_segment_base.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/hubspot/api_segments/crm_api.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/hubspot/api_segments/marketing_api.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/hubspot/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/jira/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/jira/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/jira/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/klaviyo/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/klaviyo/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/klaviyo/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/linkedin/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/linkedin/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/mailchimp/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/mailchimp/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/mailchimp/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/markitdown/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/markitdown/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/markitdown/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/miro/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/miro/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/miro/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/ms_teams/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/ms_teams/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/ms_teams/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/neon/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/neon/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/neon/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/notion/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/notion/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/notion/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/onedrive/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/onedrive/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/onedrive/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/openai/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/openai/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/openai/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/outlook/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/outlook/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/outlook/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/perplexity/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/perplexity/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/perplexity/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/pipedrive/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/pipedrive/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/pipedrive/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/posthog/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/posthog/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/posthog/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/reddit/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/reddit/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/reddit/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/resend/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/resend/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/resend/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/retell/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/retell/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/retell/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/rocketlane/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/rocketlane/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/rocketlane/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/scraper/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/scraper/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/semanticscholar/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/semanticscholar/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/semanticscholar/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/semrush/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/semrush/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/semrush/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/sendgrid/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/sendgrid/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/sendgrid/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/sentry/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/sentry/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/sentry/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/serpapi/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/serpapi/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/serpapi/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/sharepoint/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/sharepoint/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/sharepoint/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/shopify/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/shopify/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/shopify/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/shortcut/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/shortcut/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/shortcut/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/slack/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/slack/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/slack/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/spotify/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/spotify/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/spotify/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/supabase/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/supabase/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/supabase/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/tavily/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/tavily/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/tavily/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/trello/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/trello/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/trello/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/twilio/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/twilio/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/twilio/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/twitter/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/twitter/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/twitter/api_segments/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/twitter/api_segments/api_segment_base.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/twitter/api_segments/compliance_api.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/twitter/api_segments/dm_conversations_api.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/twitter/api_segments/dm_events_api.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/twitter/api_segments/likes_api.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/twitter/api_segments/lists_api.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/twitter/api_segments/openapi_json_api.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/twitter/api_segments/spaces_api.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/twitter/api_segments/trends_api.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/twitter/api_segments/tweets_api.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/twitter/api_segments/usage_api.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/twitter/api_segments/users_api.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/twitter/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/whatsapp/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/whatsapp/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/whatsapp/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/whatsapp/audio.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/whatsapp/whatsapp.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/whatsapp_business/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/whatsapp_business/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/whatsapp_business/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/wrike/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/wrike/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/wrike/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/yahoo_finance/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/yahoo_finance/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/yahoo_finance/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/youtube/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/youtube/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/youtube/app.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/zenquotes/README.md +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/zenquotes/__init__.py +0 -0
- {universal_mcp_applications-0.1.28 → universal_mcp_applications-0.1.30rc1}/src/universal_mcp/applications/zenquotes/app.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: universal-mcp-applications
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.30rc1
|
|
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
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import json
|
|
2
|
-
|
|
3
|
-
from typing import Any, Literal
|
|
2
|
+
import os
|
|
3
|
+
from typing import Any, Callable, Literal
|
|
4
4
|
|
|
5
5
|
from loguru import logger
|
|
6
6
|
from universal_mcp.applications.application import APIApplication
|
|
7
7
|
from universal_mcp.integrations import Integration
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
class
|
|
10
|
+
class LinkedinApp(APIApplication):
|
|
11
11
|
"""
|
|
12
|
-
|
|
13
|
-
Handles operations related to chats, messages, accounts, posts, and user profiles.
|
|
12
|
+
Base class for Universal MCP Applications.
|
|
14
13
|
"""
|
|
15
14
|
|
|
16
15
|
def __init__(self, integration: Integration) -> None:
|
|
@@ -23,37 +22,31 @@ class UnipileApp(APIApplication):
|
|
|
23
22
|
via headers in `integration.get_credentials()`, e.g.,
|
|
24
23
|
`{"headers": {"x-api-key": "YOUR_API_KEY"}}`.
|
|
25
24
|
"""
|
|
26
|
-
super().__init__(name="
|
|
25
|
+
super().__init__(name="linkedin", integration=integration)
|
|
27
26
|
|
|
28
27
|
self._base_url = None
|
|
28
|
+
self.account_id = None
|
|
29
|
+
if self.integration:
|
|
30
|
+
credentials = self.integration.get_credentials()
|
|
31
|
+
if credentials:
|
|
32
|
+
self.account_id = credentials.get("account_id")
|
|
29
33
|
|
|
30
34
|
@property
|
|
31
35
|
def base_url(self) -> str:
|
|
32
|
-
"""
|
|
33
|
-
A property that lazily constructs and caches the Unipile API base URL from 'subdomain' and 'port' credentials. Built on first access and used by all API methods, it raises a ValueError if credentials are missing. This is the default construction, unlike the setter which allows manual override.
|
|
34
|
-
"""
|
|
35
36
|
if not self._base_url:
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
port = credentials.get("port")
|
|
39
|
-
if not subdomain or not port:
|
|
37
|
+
unipile_dsn = os.getenv("UNIPILE_DSN")
|
|
38
|
+
if not unipile_dsn:
|
|
40
39
|
logger.error(
|
|
41
|
-
"UnipileApp:
|
|
40
|
+
"UnipileApp: UNIPILE_DSN environment variable is not set."
|
|
42
41
|
)
|
|
43
42
|
raise ValueError(
|
|
44
|
-
"
|
|
43
|
+
"UnipileApp: UNIPILE_DSN environment variable is required."
|
|
45
44
|
)
|
|
46
|
-
self._base_url = f"https://{
|
|
45
|
+
self._base_url = f"https://{unipile_dsn}"
|
|
47
46
|
return self._base_url
|
|
48
47
|
|
|
49
48
|
@base_url.setter
|
|
50
49
|
def base_url(self, base_url: str) -> None:
|
|
51
|
-
"""
|
|
52
|
-
Sets or overrides the Unipile API's base URL. This setter allows manually changing the endpoint, bypassing the default URL that is dynamically constructed from integration credentials. It is primarily intended for testing against different environments or for custom deployments.
|
|
53
|
-
|
|
54
|
-
Args:
|
|
55
|
-
base_url: The new base URL to set.
|
|
56
|
-
"""
|
|
57
50
|
self._base_url = base_url
|
|
58
51
|
logger.info(f"UnipileApp: Base URL set to {self._base_url}")
|
|
59
52
|
|
|
@@ -68,14 +61,7 @@ class UnipileApp(APIApplication):
|
|
|
68
61
|
)
|
|
69
62
|
return {}
|
|
70
63
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
api_key = (
|
|
74
|
-
credentials.get("api_key")
|
|
75
|
-
or credentials.get("API_KEY")
|
|
76
|
-
or credentials.get("apiKey")
|
|
77
|
-
)
|
|
78
|
-
|
|
64
|
+
api_key = os.getenv("UNIPILE_API_KEY")
|
|
79
65
|
if not api_key:
|
|
80
66
|
logger.error(
|
|
81
67
|
"UnipileApp: API key not found in integration credentials for Unipile."
|
|
@@ -100,10 +86,9 @@ class UnipileApp(APIApplication):
|
|
|
100
86
|
after: str | None = None, # ISO 8601 UTC datetime
|
|
101
87
|
limit: int | None = None, # 1-250
|
|
102
88
|
account_type: str | None = None,
|
|
103
|
-
account_id: str | None = None, # Comma-separated list of ids
|
|
104
89
|
) -> dict[str, Any]:
|
|
105
90
|
"""
|
|
106
|
-
Retrieves a paginated list of all chat conversations across linked accounts. Supports filtering by unread status, date range,
|
|
91
|
+
Retrieves a paginated list of all chat conversations across linked accounts. Supports filtering by unread status, date range, and account provider, distinguishing it from functions listing messages within a single chat.
|
|
107
92
|
|
|
108
93
|
Args:
|
|
109
94
|
unread: Filter for unread chats only or read chats only.
|
|
@@ -112,7 +97,6 @@ class UnipileApp(APIApplication):
|
|
|
112
97
|
after: Filter for items created after this ISO 8601 UTC datetime (exclusive).
|
|
113
98
|
limit: Number of items to return (1-250).
|
|
114
99
|
account_type: Filter by provider (e.g., "linkedin").
|
|
115
|
-
account_id: Filter by specific account IDs (comma-separated).
|
|
116
100
|
|
|
117
101
|
Returns:
|
|
118
102
|
A dictionary containing a list of chat objects and a pagination cursor.
|
|
@@ -125,6 +109,9 @@ class UnipileApp(APIApplication):
|
|
|
125
109
|
"""
|
|
126
110
|
url = f"{self.base_url}/api/v1/chats"
|
|
127
111
|
params: dict[str, Any] = {}
|
|
112
|
+
|
|
113
|
+
params["account_id"] = self.account_id
|
|
114
|
+
|
|
128
115
|
if unread is not None:
|
|
129
116
|
params["unread"] = unread
|
|
130
117
|
if cursor:
|
|
@@ -137,8 +124,7 @@ class UnipileApp(APIApplication):
|
|
|
137
124
|
params["limit"] = limit
|
|
138
125
|
if account_type:
|
|
139
126
|
params["account_type"] = account_type
|
|
140
|
-
|
|
141
|
-
params["account_id"] = account_id
|
|
127
|
+
|
|
142
128
|
|
|
143
129
|
response = self._get(url, params=params)
|
|
144
130
|
return response.json()
|
|
@@ -216,15 +202,12 @@ class UnipileApp(APIApplication):
|
|
|
216
202
|
response = self._post(url, data=payload)
|
|
217
203
|
return response.json()
|
|
218
204
|
|
|
219
|
-
def retrieve_chat(
|
|
220
|
-
self, chat_id: str, account_id: str | None = None
|
|
221
|
-
) -> dict[str, Any]:
|
|
205
|
+
def retrieve_chat(self, chat_id: str) -> dict[str, Any]:
|
|
222
206
|
"""
|
|
223
|
-
Retrieves a single chat's details using its Unipile or provider-specific ID.
|
|
207
|
+
Retrieves a single chat's details using its Unipile or provider-specific ID. This function is distinct from `list_all_chats`, which returns a collection, by targeting one specific conversation.
|
|
224
208
|
|
|
225
209
|
Args:
|
|
226
210
|
chat_id: The Unipile or provider ID of the chat.
|
|
227
|
-
account_id: Mandatory if the chat_id is a provider ID. Specifies the account context.
|
|
228
211
|
|
|
229
212
|
Returns:
|
|
230
213
|
A dictionary containing the chat object details.
|
|
@@ -237,8 +220,8 @@ class UnipileApp(APIApplication):
|
|
|
237
220
|
"""
|
|
238
221
|
url = f"{self.base_url}/api/v1/chats/{chat_id}"
|
|
239
222
|
params: dict[str, Any] = {}
|
|
240
|
-
if account_id:
|
|
241
|
-
params["account_id"] = account_id
|
|
223
|
+
if self.account_id:
|
|
224
|
+
params["account_id"] = self.account_id
|
|
242
225
|
|
|
243
226
|
response = self._get(url, params=params)
|
|
244
227
|
return response.json()
|
|
@@ -250,10 +233,9 @@ class UnipileApp(APIApplication):
|
|
|
250
233
|
after: str | None = None, # ISO 8601 UTC datetime
|
|
251
234
|
limit: int | None = None, # 1-250
|
|
252
235
|
sender_id: str | None = None,
|
|
253
|
-
account_id: str | None = None,
|
|
254
236
|
) -> dict[str, Any]:
|
|
255
237
|
"""
|
|
256
|
-
Retrieves a paginated list of messages from all chats associated with the account
|
|
238
|
+
Retrieves a paginated list of messages from all chats associated with the account. Unlike `list_chat_messages` which targets a specific conversation, this function provides a global message view, filterable by sender and date range.
|
|
257
239
|
|
|
258
240
|
Args:
|
|
259
241
|
cursor: Pagination cursor.
|
|
@@ -261,7 +243,6 @@ class UnipileApp(APIApplication):
|
|
|
261
243
|
after: Filter for items created after this ISO 8601 UTC datetime.
|
|
262
244
|
limit: Number of items to return (1-250).
|
|
263
245
|
sender_id: Filter messages from a specific sender.
|
|
264
|
-
account_id: Filter messages from a specific linked account.
|
|
265
246
|
|
|
266
247
|
Returns:
|
|
267
248
|
A dictionary containing a list of message objects and a pagination cursor.
|
|
@@ -284,8 +265,8 @@ class UnipileApp(APIApplication):
|
|
|
284
265
|
params["limit"] = limit
|
|
285
266
|
if sender_id:
|
|
286
267
|
params["sender_id"] = sender_id
|
|
287
|
-
if account_id:
|
|
288
|
-
params["account_id"] = account_id
|
|
268
|
+
if self.account_id:
|
|
269
|
+
params["account_id"] = self.account_id
|
|
289
270
|
|
|
290
271
|
response = self._get(url, params=params)
|
|
291
272
|
return response.json()
|
|
@@ -321,33 +302,26 @@ class UnipileApp(APIApplication):
|
|
|
321
302
|
response = self._get(url, params=params)
|
|
322
303
|
return response.json()
|
|
323
304
|
|
|
324
|
-
def retrieve_linked_account(
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
) -> dict[str, Any]:
|
|
328
|
-
"""
|
|
329
|
-
Retrieves details for a specific account linked to Unipile using its ID. It fetches metadata about the connection itself (e.g., a linked LinkedIn account), differentiating it from `retrieve_user_profile` which fetches a user's profile from the external platform.
|
|
330
|
-
|
|
331
|
-
Args:
|
|
332
|
-
account_id: The ID of the account to retrieve.
|
|
305
|
+
# def retrieve_linked_account(self) -> dict[str, Any]:
|
|
306
|
+
# """
|
|
307
|
+
# Retrieves details for the account linked to Unipile. It fetches metadata about the connection itself (e.g., a linked LinkedIn account), differentiating it from `retrieve_user_profile` which fetches a user's profile from the external platform.
|
|
333
308
|
|
|
334
|
-
|
|
335
|
-
|
|
309
|
+
# Returns:
|
|
310
|
+
# A dictionary containing the account object details.
|
|
336
311
|
|
|
337
|
-
|
|
338
|
-
|
|
312
|
+
# Raises:
|
|
313
|
+
# httpx.HTTPError: If the API request fails.
|
|
339
314
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
315
|
+
# Tags:
|
|
316
|
+
# linkedin, account, retrieve, get, unipile, api, important
|
|
317
|
+
# """
|
|
318
|
+
# url = f"{self.base_url}/api/v1/accounts/{self.account_id}"
|
|
319
|
+
# response = self._get(url)
|
|
320
|
+
# return response.json()
|
|
346
321
|
|
|
347
322
|
def list_profile_posts(
|
|
348
323
|
self,
|
|
349
324
|
identifier: str, # User or Company provider internal ID
|
|
350
|
-
account_id: str, # Account to perform the request from (REQUIRED)
|
|
351
325
|
cursor: str | None = None,
|
|
352
326
|
limit: int | None = None, # 1-100 (spec says max 250)
|
|
353
327
|
is_company: bool | None = None,
|
|
@@ -357,7 +331,6 @@ class UnipileApp(APIApplication):
|
|
|
357
331
|
|
|
358
332
|
Args:
|
|
359
333
|
identifier: The entity's provider internal ID (LinkedIn ID).
|
|
360
|
-
account_id: The ID of the Unipile account to perform the request from (REQUIRED).
|
|
361
334
|
cursor: Pagination cursor.
|
|
362
335
|
limit: Number of items to return (1-100, as per Unipile example, though spec allows up to 250).
|
|
363
336
|
is_company: Boolean indicating if the identifier is for a company.
|
|
@@ -372,7 +345,7 @@ class UnipileApp(APIApplication):
|
|
|
372
345
|
linkedin, post, list, user_posts, company_posts, content, api, important
|
|
373
346
|
"""
|
|
374
347
|
url = f"{self.base_url}/api/v1/users/{identifier}/posts"
|
|
375
|
-
params: dict[str, Any] = {"account_id": account_id}
|
|
348
|
+
params: dict[str, Any] = {"account_id": self.account_id}
|
|
376
349
|
if cursor:
|
|
377
350
|
params["cursor"] = cursor
|
|
378
351
|
if limit:
|
|
@@ -383,15 +356,9 @@ class UnipileApp(APIApplication):
|
|
|
383
356
|
response = self._get(url, params=params)
|
|
384
357
|
return response.json()
|
|
385
358
|
|
|
386
|
-
def retrieve_own_profile(
|
|
387
|
-
self,
|
|
388
|
-
account_id: str,
|
|
389
|
-
) -> dict[str, Any]:
|
|
359
|
+
def retrieve_own_profile(self) -> dict[str, Any]:
|
|
390
360
|
"""
|
|
391
|
-
Retrieves the profile details for the user associated with the
|
|
392
|
-
|
|
393
|
-
Args:
|
|
394
|
-
account_id: The ID of the Unipile account to use for retrieving the profile (REQUIRED).
|
|
361
|
+
Retrieves the profile details for the user associated with the Unipile account. This function targets the API's 'me' endpoint to fetch the authenticated user's profile, distinct from `retrieve_user_profile` which fetches profiles of other users by their public identifier.
|
|
395
362
|
|
|
396
363
|
Returns:
|
|
397
364
|
A dictionary containing the user's profile details.
|
|
@@ -403,21 +370,16 @@ class UnipileApp(APIApplication):
|
|
|
403
370
|
linkedin, user, profile, me, retrieve, get, api
|
|
404
371
|
"""
|
|
405
372
|
url = f"{self.base_url}/api/v1/users/me"
|
|
406
|
-
params: dict[str, Any] = {"account_id": account_id}
|
|
373
|
+
params: dict[str, Any] = {"account_id": self.account_id}
|
|
407
374
|
response = self._get(url, params=params)
|
|
408
375
|
return response.json()
|
|
409
376
|
|
|
410
|
-
def retrieve_post(
|
|
411
|
-
self,
|
|
412
|
-
post_id: str,
|
|
413
|
-
account_id: str,
|
|
414
|
-
) -> dict[str, Any]:
|
|
377
|
+
def retrieve_post(self, post_id: str) -> dict[str, Any]:
|
|
415
378
|
"""
|
|
416
|
-
Fetches a specific post's details by its unique ID
|
|
379
|
+
Fetches a specific post's details by its unique ID. Unlike `list_profile_posts`, which retrieves a collection of posts from a user or company profile, this function targets one specific post and returns its full object.
|
|
417
380
|
|
|
418
381
|
Args:
|
|
419
382
|
post_id: The ID of the post to retrieve.
|
|
420
|
-
account_id: The ID of the Unipile account to perform the request from (REQUIRED).
|
|
421
383
|
|
|
422
384
|
Returns:
|
|
423
385
|
A dictionary containing the post details.
|
|
@@ -429,24 +391,22 @@ class UnipileApp(APIApplication):
|
|
|
429
391
|
linkedin, post, retrieve, get, content, api, important
|
|
430
392
|
"""
|
|
431
393
|
url = f"{self.base_url}/api/v1/posts/{post_id}"
|
|
432
|
-
params: dict[str, Any] = {"account_id": account_id}
|
|
394
|
+
params: dict[str, Any] = {"account_id": self.account_id}
|
|
433
395
|
response = self._get(url, params=params)
|
|
434
396
|
return response.json()
|
|
435
397
|
|
|
436
398
|
def list_post_comments(
|
|
437
399
|
self,
|
|
438
400
|
post_id: str,
|
|
439
|
-
account_id: str,
|
|
440
401
|
comment_id: str | None = None,
|
|
441
402
|
cursor: str | None = None,
|
|
442
403
|
limit: int | None = None,
|
|
443
404
|
) -> dict[str, Any]:
|
|
444
405
|
"""
|
|
445
|
-
Fetches comments for a specific post
|
|
406
|
+
Fetches comments for a specific post. Providing an optional `comment_id` retrieves threaded replies instead of top-level comments. This read-only operation contrasts with `create_post_comment`, which publishes new comments, and `list_content_reactions`, which retrieves 'likes'.
|
|
446
407
|
|
|
447
408
|
Args:
|
|
448
409
|
post_id: The social ID of the post.
|
|
449
|
-
account_id: The ID of the Unipile account to perform the request from (REQUIRED).
|
|
450
410
|
comment_id: If provided, retrieves replies to this comment ID instead of top-level comments.
|
|
451
411
|
cursor: Pagination cursor.
|
|
452
412
|
limit: Number of comments to return. (OpenAPI spec shows type string, passed as string if provided).
|
|
@@ -461,7 +421,7 @@ class UnipileApp(APIApplication):
|
|
|
461
421
|
linkedin, post, comment, list, content, api, important
|
|
462
422
|
"""
|
|
463
423
|
url = f"{self.base_url}/api/v1/posts/{post_id}/comments"
|
|
464
|
-
params: dict[str, Any] = {"account_id": account_id}
|
|
424
|
+
params: dict[str, Any] = {"account_id": self.account_id}
|
|
465
425
|
if cursor:
|
|
466
426
|
params["cursor"] = cursor
|
|
467
427
|
if limit is not None:
|
|
@@ -474,16 +434,14 @@ class UnipileApp(APIApplication):
|
|
|
474
434
|
|
|
475
435
|
def create_post(
|
|
476
436
|
self,
|
|
477
|
-
account_id: str,
|
|
478
437
|
text: str,
|
|
479
438
|
mentions: list[dict[str, Any]] | None = None,
|
|
480
439
|
external_link: str | None = None,
|
|
481
440
|
) -> dict[str, Any]:
|
|
482
441
|
"""
|
|
483
|
-
Publishes a new top-level post from
|
|
442
|
+
Publishes a new top-level post from the account, including text, user mentions, and an external link. This function creates original content, distinguishing it from `create_post_comment` which adds replies to existing posts.
|
|
484
443
|
|
|
485
444
|
Args:
|
|
486
|
-
account_id: The ID of the Unipile account that will author the post (added as query parameter).
|
|
487
445
|
text: The main text content of the post.
|
|
488
446
|
mentions: Optional list of dictionaries, each representing a mention.
|
|
489
447
|
Example: `[{"entity_urn": "urn:li:person:...", "start_index": 0, "end_index": 5}]`
|
|
@@ -501,7 +459,7 @@ class UnipileApp(APIApplication):
|
|
|
501
459
|
url = f"{self.base_url}/api/v1/posts"
|
|
502
460
|
|
|
503
461
|
params: dict[str, str] = {
|
|
504
|
-
"account_id": account_id,
|
|
462
|
+
"account_id": self.account_id,
|
|
505
463
|
"text": text,
|
|
506
464
|
}
|
|
507
465
|
|
|
@@ -516,17 +474,15 @@ class UnipileApp(APIApplication):
|
|
|
516
474
|
def list_content_reactions(
|
|
517
475
|
self,
|
|
518
476
|
post_id: str,
|
|
519
|
-
account_id: str,
|
|
520
477
|
comment_id: str | None = None,
|
|
521
478
|
cursor: str | None = None,
|
|
522
479
|
limit: int | None = None,
|
|
523
480
|
) -> dict[str, Any]:
|
|
524
481
|
"""
|
|
525
|
-
Retrieves a paginated list of reactions for a given post or, optionally, a specific comment. This read-only operation uses the
|
|
482
|
+
Retrieves a paginated list of reactions for a given post or, optionally, a specific comment. This read-only operation uses the account for the request, distinguishing it from the `create_reaction` function which adds new reactions.
|
|
526
483
|
|
|
527
484
|
Args:
|
|
528
485
|
post_id: The social ID of the post.
|
|
529
|
-
account_id: The ID of the Unipile account to perform the request from .
|
|
530
486
|
comment_id: If provided, retrieves reactions for this comment ID.
|
|
531
487
|
cursor: Pagination cursor.
|
|
532
488
|
limit: Number of reactions to return (1-100, spec max 250).
|
|
@@ -541,7 +497,7 @@ class UnipileApp(APIApplication):
|
|
|
541
497
|
linkedin, post, reaction, list, like, content, api
|
|
542
498
|
"""
|
|
543
499
|
url = f"{self.base_url}/api/v1/posts/{post_id}/reactions"
|
|
544
|
-
params: dict[str, Any] = {"account_id": account_id}
|
|
500
|
+
params: dict[str, Any] = {"account_id": self.account_id}
|
|
545
501
|
if cursor:
|
|
546
502
|
params["cursor"] = cursor
|
|
547
503
|
if limit:
|
|
@@ -555,7 +511,6 @@ class UnipileApp(APIApplication):
|
|
|
555
511
|
def create_post_comment(
|
|
556
512
|
self,
|
|
557
513
|
post_social_id: str,
|
|
558
|
-
account_id: str,
|
|
559
514
|
text: str,
|
|
560
515
|
comment_id: str | None = None, # If provided, replies to a specific comment
|
|
561
516
|
mentions_body: list[dict[str, Any]] | None = None,
|
|
@@ -565,7 +520,6 @@ class UnipileApp(APIApplication):
|
|
|
565
520
|
|
|
566
521
|
Args:
|
|
567
522
|
post_social_id: The social ID of the post to comment on.
|
|
568
|
-
account_id: The ID of the Unipile account performing the comment.
|
|
569
523
|
text: The text content of the comment (passed as a query parameter).
|
|
570
524
|
Supports Unipile's mention syntax like "Hey {{0}}".
|
|
571
525
|
comment_id: Optional ID of a specific comment to reply to instead of commenting on the post.
|
|
@@ -582,7 +536,7 @@ class UnipileApp(APIApplication):
|
|
|
582
536
|
"""
|
|
583
537
|
url = f"{self.base_url}/api/v1/posts/{post_social_id}/comments"
|
|
584
538
|
params: dict[str, Any] = {
|
|
585
|
-
"account_id": account_id,
|
|
539
|
+
"account_id": self.account_id,
|
|
586
540
|
"text": text,
|
|
587
541
|
}
|
|
588
542
|
|
|
@@ -608,7 +562,6 @@ class UnipileApp(APIApplication):
|
|
|
608
562
|
reaction_type: Literal[
|
|
609
563
|
"like", "celebrate", "love", "insightful", "funny", "support"
|
|
610
564
|
],
|
|
611
|
-
account_id: str,
|
|
612
565
|
comment_id: str | None = None,
|
|
613
566
|
) -> dict[str, Any]:
|
|
614
567
|
"""
|
|
@@ -616,8 +569,7 @@ class UnipileApp(APIApplication):
|
|
|
616
569
|
|
|
617
570
|
Args:
|
|
618
571
|
post_social_id: The social ID of the post or comment to react to.
|
|
619
|
-
reaction_type: The type of reaction .
|
|
620
|
-
account_id: Account ID of the Unipile account performing the reaction.
|
|
572
|
+
reaction_type: The type of reaction. Valid values are "like", "celebrate", "love", "insightful", "funny", or "support".
|
|
621
573
|
comment_id: Optional ID of a specific comment to react to instead of the post.
|
|
622
574
|
|
|
623
575
|
Returns:
|
|
@@ -632,7 +584,7 @@ class UnipileApp(APIApplication):
|
|
|
632
584
|
url = f"{self.base_url}/api/v1/posts/reaction"
|
|
633
585
|
|
|
634
586
|
params: dict[str, str] = {
|
|
635
|
-
"account_id": account_id,
|
|
587
|
+
"account_id": self.account_id,
|
|
636
588
|
"post_id": post_social_id,
|
|
637
589
|
"reaction_type": reaction_type,
|
|
638
590
|
}
|
|
@@ -652,7 +604,6 @@ class UnipileApp(APIApplication):
|
|
|
652
604
|
|
|
653
605
|
def search(
|
|
654
606
|
self,
|
|
655
|
-
account_id: str,
|
|
656
607
|
category: Literal["people", "companies", "posts", "jobs"],
|
|
657
608
|
cursor: str | None = None,
|
|
658
609
|
limit: int | None = None,
|
|
@@ -667,13 +618,12 @@ class UnipileApp(APIApplication):
|
|
|
667
618
|
For people, companies, and jobs, it uses the classic API.
|
|
668
619
|
|
|
669
620
|
Args:
|
|
670
|
-
|
|
671
|
-
category: Type of search to perform - "people", "companies", "posts", or "jobs".
|
|
621
|
+
category: Type of search to perform. Valid values are "people", "companies", "posts", or "jobs".
|
|
672
622
|
cursor: Pagination cursor for the next page of entries.
|
|
673
623
|
limit: Number of items to return (up to 50 for Classic search).
|
|
674
624
|
keywords: Keywords to search for.
|
|
675
|
-
date_posted: Filter by when the post was posted (posts only).
|
|
676
|
-
sort_by: How to sort the results (for posts and jobs).
|
|
625
|
+
date_posted: Filter by when the post was posted (posts only). Valid values are "past_day", "past_week", or "past_month".
|
|
626
|
+
sort_by: How to sort the results (for posts and jobs). Valid values are "relevance" or "date".
|
|
677
627
|
minimum_salary_value: The minimum salary to filter for (jobs only).
|
|
678
628
|
|
|
679
629
|
Returns:
|
|
@@ -691,7 +641,7 @@ class UnipileApp(APIApplication):
|
|
|
691
641
|
|
|
692
642
|
url = f"{self.base_url}/api/v1/linkedin/search"
|
|
693
643
|
|
|
694
|
-
params: dict[str, Any] = {"account_id": account_id}
|
|
644
|
+
params: dict[str, Any] = {"account_id": self.account_id}
|
|
695
645
|
if cursor:
|
|
696
646
|
params["cursor"] = cursor
|
|
697
647
|
if limit is not None:
|
|
@@ -719,19 +669,13 @@ class UnipileApp(APIApplication):
|
|
|
719
669
|
response = self._post(url, params=params, data=payload)
|
|
720
670
|
return self._handle_response(response)
|
|
721
671
|
|
|
722
|
-
def retrieve_user_profile(
|
|
723
|
-
self,
|
|
724
|
-
identifier: str,
|
|
725
|
-
account_id: str,
|
|
726
|
-
) -> dict[str, Any]:
|
|
672
|
+
def retrieve_user_profile(self, identifier: str) -> dict[str, Any]:
|
|
727
673
|
"""
|
|
728
|
-
Retrieves a specific LinkedIn user's profile using their public or internal ID
|
|
674
|
+
Retrieves a specific LinkedIn user's profile using their public or internal ID. Unlike `retrieve_own_profile`, which fetches the authenticated user's details, this function targets and returns data for any specified third-party user profile on the platform.
|
|
729
675
|
|
|
730
676
|
Args:
|
|
731
677
|
identifier: Can be the provider's internal id OR the provider's public id of the requested user.For example, for https://www.linkedin.com/in/manojbajaj95/, the identifier is "manojbajaj95".
|
|
732
678
|
|
|
733
|
-
account_id: The ID of the Unipile account to perform the request from (REQUIRED).
|
|
734
|
-
|
|
735
679
|
Returns:
|
|
736
680
|
A dictionary containing the user's profile details.
|
|
737
681
|
|
|
@@ -742,7 +686,7 @@ class UnipileApp(APIApplication):
|
|
|
742
686
|
linkedin, user, profile, retrieve, get, api, important
|
|
743
687
|
"""
|
|
744
688
|
url = f"{self.base_url}/api/v1/users/{identifier}"
|
|
745
|
-
params: dict[str, Any] = {"account_id": account_id}
|
|
689
|
+
params: dict[str, Any] = {"account_id": self.account_id}
|
|
746
690
|
response = self._get(url, params=params)
|
|
747
691
|
return self._handle_response(response)
|
|
748
692
|
|
|
@@ -754,7 +698,7 @@ class UnipileApp(APIApplication):
|
|
|
754
698
|
self.retrieve_chat,
|
|
755
699
|
self.list_all_messages,
|
|
756
700
|
self.list_all_accounts,
|
|
757
|
-
self.retrieve_linked_account,
|
|
701
|
+
# self.retrieve_linked_account,
|
|
758
702
|
self.list_profile_posts,
|
|
759
703
|
self.retrieve_own_profile,
|
|
760
704
|
self.retrieve_user_profile,
|
|
@@ -8,7 +8,7 @@ from loguru import logger
|
|
|
8
8
|
from universal_mcp.applications.application import APIApplication
|
|
9
9
|
from universal_mcp.integrations import Integration
|
|
10
10
|
|
|
11
|
-
from universal_mcp.applications.
|
|
11
|
+
from universal_mcp.applications.linkedin import LinkedinApp
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class ScraperApp(APIApplication):
|
|
@@ -22,7 +22,7 @@ class ScraperApp(APIApplication):
|
|
|
22
22
|
if self.integration:
|
|
23
23
|
credentials = self.integration.get_credentials()
|
|
24
24
|
self.account_id = credentials.get("account_id")
|
|
25
|
-
self._unipile_app =
|
|
25
|
+
self._unipile_app = LinkedinApp(integration=self.integration)
|
|
26
26
|
else:
|
|
27
27
|
logger.warning("Integration not found")
|
|
28
28
|
self.account_id = None
|
|
@@ -35,19 +35,19 @@ class ScraperApp(APIApplication):
|
|
|
35
35
|
limit: int | None = None,
|
|
36
36
|
keywords: str | None = None,
|
|
37
37
|
date_posted: str | None = None,
|
|
38
|
-
sort_by:
|
|
39
|
-
minimum_salary_value: int
|
|
38
|
+
sort_by: Literal["relevance", "date"] = "relevance",
|
|
39
|
+
minimum_salary_value: int = 40,
|
|
40
40
|
) -> dict[str, Any]:
|
|
41
41
|
"""
|
|
42
42
|
Performs a general LinkedIn search for posts, people, companies, or jobs using keywords and various filters. This function provides broad, keyword-based discovery across the platform, distinct from other methods that retrieve content from a specific user or company profile. It supports pagination and filtering criteria.
|
|
43
43
|
|
|
44
44
|
Args:
|
|
45
|
-
category: Type of search to perform
|
|
45
|
+
category: Type of search to perform. Valid values are "people", "companies", "posts", or "jobs".
|
|
46
46
|
cursor: Pagination cursor for the next page of entries.
|
|
47
47
|
limit: Number of items to return (up to 50 for Classic search).
|
|
48
48
|
keywords: Keywords to search for.
|
|
49
|
-
date_posted: Filter by when the post was posted (posts only).
|
|
50
|
-
sort_by: How to sort the results (for posts and jobs).
|
|
49
|
+
date_posted: Filter by when the post was posted (posts only). Valid values are "past_day", "past_week", or "past_month".
|
|
50
|
+
sort_by: How to sort the results (for posts and jobs). Valid values are "relevance" or "date".
|
|
51
51
|
minimum_salary_value: The minimum salary to filter for (jobs only).
|
|
52
52
|
|
|
53
53
|
Returns:
|
universal_mcp_applications-0.1.30rc1/src/universal_mcp/applications/scraper/scraper_testers.py
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from universal_mcp.applications.scraper import ScraperApp
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
from universal_mcp.agentr import AgentrClient, AgentrRegistry, AgentrIntegration
|
|
5
|
+
|
|
6
|
+
client = AgentrClient(api_key="key-1f5983ba-f433-4337-b652-dc40f8712660")
|
|
7
|
+
registry = AgentrRegistry(client=client)
|
|
8
|
+
|
|
9
|
+
integration = AgentrIntegration(name="scraper",client=client)
|
|
10
|
+
|
|
11
|
+
scraper = ScraperApp(integration=integration)
|
|
12
|
+
|
|
13
|
+
if __name__ == "__main__":
|
|
14
|
+
print(scraper.linkedin_search(keywords="ai", limit=2, category="jobs"))
|
|
15
|
+
# print(scraper.linkedin_retrieve_profile(identifier="ACoAAAEkwwAB9KEc2TrQgOLEQ-vzRyZeCDyc6DQ"))
|
|
16
|
+
# print(scraper.linkedin_list_profile_posts(identifier="ACoAAAEkwwAB9KEc2TrQgOLEQ-vzRyZeCDyc6DQ", limit=2))
|
|
17
|
+
# print(scraper.linkedin_list_post_comments(post_id="urn:li:ugcPost:7386500271624896512"))
|