universal-mcp-applications 0.1.30rc1__tar.gz → 0.1.30rc2__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.30rc1 → universal_mcp_applications-0.1.30rc2}/PKG-INFO +1 -1
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/pyproject.toml +1 -1
- universal_mcp_applications-0.1.30rc2/src/universal_mcp/applications/linkedin/README.md +27 -0
- universal_mcp_applications-0.1.30rc2/src/universal_mcp/applications/scraper/app.py +248 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/uv.lock +1 -1
- universal_mcp_applications-0.1.30rc1/src/universal_mcp/applications/linkedin/README.md +0 -15
- universal_mcp_applications-0.1.30rc1/src/universal_mcp/applications/scraper/app.py +0 -175
- universal_mcp_applications-0.1.30rc1/src/universal_mcp/applications/scraper/scraper_testers.py +0 -17
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/.gitignore +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/GEMINI.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/LICENSE +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/bump_and_release.sh +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/scripts/docgen.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/scripts/prompts.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/scripts/readme.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/scripts/run_docgen.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/tests/test_applications.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/BEST_PRACTICES.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/ahrefs/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/ahrefs/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/ahrefs/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/airtable/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/airtable/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/airtable/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/apollo/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/apollo/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/apollo/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/asana/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/asana/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/asana/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/aws_s3/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/aws_s3/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/aws_s3/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/bill/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/bill/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/bill/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/box/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/box/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/box/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/braze/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/braze/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/braze/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/browser_use/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/browser_use/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/browser_use/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/cal_com_v2/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/cal_com_v2/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/cal_com_v2/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/calendly/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/calendly/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/calendly/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/canva/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/canva/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/canva/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/clickup/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/clickup/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/clickup/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/coda/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/coda/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/coda/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/confluence/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/confluence/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/confluence/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/contentful/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/contentful/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/contentful/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/crustdata/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/crustdata/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/crustdata/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/dialpad/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/dialpad/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/dialpad/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/digitalocean/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/digitalocean/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/digitalocean/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/domain_checker/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/domain_checker/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/domain_checker/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/e2b/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/e2b/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/e2b/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/elevenlabs/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/elevenlabs/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/elevenlabs/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/exa/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/exa/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/exa/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/falai/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/falai/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/falai/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/figma/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/figma/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/figma/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/file_system/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/file_system/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/file_system/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/firecrawl/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/firecrawl/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/firecrawl/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/fireflies/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/fireflies/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/fireflies/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/fpl/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/fpl/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/fpl/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/fpl/utils/api.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/fpl/utils/fixtures.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/fpl/utils/helper.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/fpl/utils/league_utils.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/fpl/utils/position_utils.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/ghost_content/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/ghost_content/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/ghost_content/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/github/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/github/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/github/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/gong/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/gong/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/gong/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_calendar/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_calendar/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_calendar/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_docs/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_docs/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_docs/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_drive/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_drive/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_drive/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_gemini/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_gemini/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_gemini/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_mail/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_mail/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_mail/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_searchconsole/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_searchconsole/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_searchconsole/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_sheet/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_sheet/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_sheet/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/google_sheet/helper.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/hashnode/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/hashnode/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/hashnode/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/heygen/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/heygen/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/heygen/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/http_tools/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/http_tools/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/http_tools/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/hubspot/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/hubspot/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/hubspot/api_segments/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/hubspot/api_segments/api_segment_base.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/hubspot/api_segments/crm_api.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/hubspot/api_segments/marketing_api.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/hubspot/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/jira/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/jira/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/jira/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/klaviyo/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/klaviyo/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/klaviyo/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/linkedin/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/linkedin/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/mailchimp/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/mailchimp/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/mailchimp/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/markitdown/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/markitdown/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/markitdown/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/miro/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/miro/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/miro/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/ms_teams/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/ms_teams/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/ms_teams/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/neon/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/neon/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/neon/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/notion/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/notion/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/notion/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/onedrive/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/onedrive/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/onedrive/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/openai/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/openai/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/openai/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/outlook/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/outlook/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/outlook/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/perplexity/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/perplexity/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/perplexity/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/pipedrive/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/pipedrive/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/pipedrive/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/posthog/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/posthog/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/posthog/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/reddit/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/reddit/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/reddit/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/resend/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/resend/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/resend/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/retell/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/retell/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/retell/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/rocketlane/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/rocketlane/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/rocketlane/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/scraper/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/scraper/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/semanticscholar/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/semanticscholar/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/semanticscholar/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/semrush/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/semrush/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/semrush/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/sendgrid/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/sendgrid/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/sendgrid/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/sentry/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/sentry/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/sentry/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/serpapi/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/serpapi/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/serpapi/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/sharepoint/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/sharepoint/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/sharepoint/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/shopify/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/shopify/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/shopify/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/shortcut/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/shortcut/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/shortcut/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/slack/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/slack/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/slack/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/spotify/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/spotify/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/spotify/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/supabase/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/supabase/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/supabase/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/tavily/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/tavily/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/tavily/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/trello/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/trello/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/trello/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/twilio/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/twilio/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/twilio/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/twitter/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/twitter/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/twitter/api_segments/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/twitter/api_segments/api_segment_base.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/twitter/api_segments/compliance_api.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/twitter/api_segments/dm_conversations_api.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/twitter/api_segments/dm_events_api.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/twitter/api_segments/likes_api.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/twitter/api_segments/lists_api.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/twitter/api_segments/openapi_json_api.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/twitter/api_segments/spaces_api.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/twitter/api_segments/trends_api.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/twitter/api_segments/tweets_api.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/twitter/api_segments/usage_api.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/twitter/api_segments/users_api.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/twitter/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/whatsapp/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/whatsapp/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/whatsapp/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/whatsapp/audio.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/whatsapp/whatsapp.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/whatsapp_business/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/whatsapp_business/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/whatsapp_business/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/wrike/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/wrike/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/wrike/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/yahoo_finance/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/yahoo_finance/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/yahoo_finance/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/youtube/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/youtube/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/youtube/app.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/zenquotes/README.md +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/universal_mcp/applications/zenquotes/__init__.py +0 -0
- {universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/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.30rc2
|
|
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
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# LinkedinApp MCP Server
|
|
2
|
+
|
|
3
|
+
An MCP Server for the LinkedinApp API.
|
|
4
|
+
|
|
5
|
+
## 🛠️ Tool List
|
|
6
|
+
|
|
7
|
+
This is automatically generated from OpenAPI schema for the LinkedinApp API.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
| Tool | Description |
|
|
11
|
+
|------|-------------|
|
|
12
|
+
| `list_all_chats` | 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. |
|
|
13
|
+
| `list_chat_messages` | Retrieves messages from a specific chat identified by `chat_id`. Supports pagination and filtering by date or sender. Unlike `list_all_messages`, which fetches from all chats, this function targets the contents of a single conversation. |
|
|
14
|
+
| `send_chat_message` | Sends a text message to a specific chat conversation using its `chat_id`. This function creates a new message via a POST request, distinguishing it from read-only functions like `list_chat_messages`. It returns the API's response, which typically confirms the successful creation of the message. |
|
|
15
|
+
| `retrieve_chat` | 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. |
|
|
16
|
+
| `list_all_messages` | 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. |
|
|
17
|
+
| `list_all_accounts` | Retrieves a paginated list of all social media accounts linked to the Unipile service. This is crucial for obtaining the `account_id` required by other methods to specify which user account should perform an action, like sending a message or retrieving user-specific posts. |
|
|
18
|
+
| `list_profile_posts` | Retrieves a paginated list of posts from a specific user or company profile using their provider ID. An authorizing `account_id` is required, and the `is_company` flag must specify the entity type, distinguishing this from `retrieve_post` which fetches a single post by its own ID. |
|
|
19
|
+
| `retrieve_own_profile` | 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. |
|
|
20
|
+
| `retrieve_user_profile` | 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. |
|
|
21
|
+
| `retrieve_post` | 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. |
|
|
22
|
+
| `list_post_comments` | 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'. |
|
|
23
|
+
| `create_post` | 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. |
|
|
24
|
+
| `list_content_reactions` | 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. |
|
|
25
|
+
| `create_post_comment` | Publishes a comment on a specified post. By providing an optional `comment_id`, it creates a threaded reply to an existing comment instead of a new top-level one. This function's dual capability distinguishes it from `list_post_comments`, which only retrieves comments and their replies. |
|
|
26
|
+
| `create_reaction` | Adds a specified reaction (e.g., 'like', 'love') to a LinkedIn post or, optionally, to a specific comment. This function performs a POST request to create the reaction, differentiating it from `list_content_reactions` which only retrieves existing ones. |
|
|
27
|
+
| `search` | Performs a comprehensive LinkedIn search for people, companies, posts, or jobs using keywords. |
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from dotenv import load_dotenv
|
|
3
|
+
|
|
4
|
+
load_dotenv()
|
|
5
|
+
|
|
6
|
+
from typing import Any, Literal
|
|
7
|
+
|
|
8
|
+
from loguru import logger
|
|
9
|
+
from universal_mcp.applications.application import APIApplication
|
|
10
|
+
from universal_mcp.integrations import Integration
|
|
11
|
+
|
|
12
|
+
class ScraperApp(APIApplication):
|
|
13
|
+
"""
|
|
14
|
+
Application for interacting with LinkedIn API.
|
|
15
|
+
Provides a simplified interface for LinkedIn search operations.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def __init__(self, integration: Integration, **kwargs: Any) -> None:
|
|
19
|
+
super().__init__(name="scraper", integration=integration, **kwargs)
|
|
20
|
+
if self.integration:
|
|
21
|
+
credentials = self.integration.get_credentials()
|
|
22
|
+
self.account_id = credentials.get("account_id")
|
|
23
|
+
else:
|
|
24
|
+
logger.warning("Integration not found")
|
|
25
|
+
self.account_id = None
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def base_url(self) -> str:
|
|
29
|
+
if not self._base_url:
|
|
30
|
+
unipile_dsn = os.getenv("UNIPILE_DSN")
|
|
31
|
+
if not unipile_dsn:
|
|
32
|
+
logger.error(
|
|
33
|
+
"UnipileApp: UNIPILE_DSN environment variable is not set."
|
|
34
|
+
)
|
|
35
|
+
raise ValueError(
|
|
36
|
+
"UnipileApp: UNIPILE_DSN environment variable is required."
|
|
37
|
+
)
|
|
38
|
+
self._base_url = f"https://{unipile_dsn}"
|
|
39
|
+
return self._base_url
|
|
40
|
+
|
|
41
|
+
@base_url.setter
|
|
42
|
+
def base_url(self, base_url: str) -> None:
|
|
43
|
+
self._base_url = base_url
|
|
44
|
+
logger.info(f"UnipileApp: Base URL set to {self._base_url}")
|
|
45
|
+
|
|
46
|
+
def _get_headers(self) -> dict[str, str]:
|
|
47
|
+
"""
|
|
48
|
+
Get the headers for Unipile API requests.
|
|
49
|
+
Overrides the base class method to use X-Api-Key.
|
|
50
|
+
"""
|
|
51
|
+
if not self.integration:
|
|
52
|
+
logger.warning(
|
|
53
|
+
"UnipileApp: No integration configured, returning empty headers."
|
|
54
|
+
)
|
|
55
|
+
return {}
|
|
56
|
+
|
|
57
|
+
api_key = os.getenv("UNIPILE_API_KEY")
|
|
58
|
+
if not api_key:
|
|
59
|
+
logger.error(
|
|
60
|
+
"UnipileApp: API key not found in integration credentials for Unipile."
|
|
61
|
+
)
|
|
62
|
+
return { # Or return minimal headers if some calls might not need auth (unlikely for Unipile)
|
|
63
|
+
"Content-Type": "application/json",
|
|
64
|
+
"Cache-Control": "no-cache",
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
logger.debug("UnipileApp: Using X-Api-Key for authentication.")
|
|
68
|
+
return {
|
|
69
|
+
"x-api-key": api_key,
|
|
70
|
+
"Content-Type": "application/json",
|
|
71
|
+
"Cache-Control": "no-cache", # Often good practice for APIs
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
def linkedin_search(
|
|
75
|
+
self,
|
|
76
|
+
category: Literal["people", "companies", "posts", "jobs"],
|
|
77
|
+
cursor: str | None = None,
|
|
78
|
+
limit: int | None = None,
|
|
79
|
+
keywords: str | None = None,
|
|
80
|
+
date_posted: Literal["past_day", "past_week", "past_month"] | None = None,
|
|
81
|
+
sort_by: Literal["relevance", "date"] = "relevance",
|
|
82
|
+
minimum_salary_value: int = 40,
|
|
83
|
+
) -> dict[str, Any]:
|
|
84
|
+
"""
|
|
85
|
+
Performs a comprehensive LinkedIn search for people, companies, posts, or jobs using keywords.
|
|
86
|
+
Supports pagination and targets either the classic or Sales Navigator API for posts.
|
|
87
|
+
For people, companies, and jobs, it uses the classic API.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
category: Type of search to perform. Valid values are "people", "companies", "posts", or "jobs".
|
|
91
|
+
cursor: Pagination cursor for the next page of entries.
|
|
92
|
+
limit: Number of items to return (up to 50 for Classic search).
|
|
93
|
+
keywords: Keywords to search for.
|
|
94
|
+
date_posted: Filter by when the post was posted (posts only). Valid values are "past_day", "past_week", or "past_month".
|
|
95
|
+
sort_by: How to sort the results (for posts and jobs). Valid values are "relevance" or "date".
|
|
96
|
+
minimum_salary_value: The minimum salary to filter for (jobs only).
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
A dictionary containing search results and pagination details.
|
|
100
|
+
|
|
101
|
+
Raises:
|
|
102
|
+
httpx.HTTPError: If the API request fails.
|
|
103
|
+
ValueError: If the category is empty.
|
|
104
|
+
|
|
105
|
+
Tags:
|
|
106
|
+
linkedin, search, people, companies, posts, jobs, api, important
|
|
107
|
+
"""
|
|
108
|
+
if not category:
|
|
109
|
+
raise ValueError("Category cannot be empty.")
|
|
110
|
+
|
|
111
|
+
url = f"{self.base_url}/api/v1/linkedin/search"
|
|
112
|
+
|
|
113
|
+
params: dict[str, Any] = {"account_id": self.account_id}
|
|
114
|
+
if cursor:
|
|
115
|
+
params["cursor"] = cursor
|
|
116
|
+
if limit is not None:
|
|
117
|
+
params["limit"] = limit
|
|
118
|
+
|
|
119
|
+
payload: dict[str, Any] = {"api": "classic", "category": category}
|
|
120
|
+
|
|
121
|
+
if keywords:
|
|
122
|
+
payload["keywords"] = keywords
|
|
123
|
+
|
|
124
|
+
if category == "posts":
|
|
125
|
+
if date_posted:
|
|
126
|
+
payload["date_posted"] = date_posted
|
|
127
|
+
if sort_by:
|
|
128
|
+
payload["sort_by"] = sort_by
|
|
129
|
+
|
|
130
|
+
elif category == "jobs":
|
|
131
|
+
payload["minimum_salary"] = {
|
|
132
|
+
"currency": "USD",
|
|
133
|
+
"value": minimum_salary_value,
|
|
134
|
+
}
|
|
135
|
+
if sort_by:
|
|
136
|
+
payload["sort_by"] = sort_by
|
|
137
|
+
|
|
138
|
+
response = self._post(url, params=params, data=payload)
|
|
139
|
+
return self._handle_response(response)
|
|
140
|
+
|
|
141
|
+
def linkedin_list_profile_posts(
|
|
142
|
+
self,
|
|
143
|
+
identifier: str, # User or Company provider internal ID
|
|
144
|
+
cursor: str | None = None,
|
|
145
|
+
limit: int | None = None, # 1-100 (spec says max 250)
|
|
146
|
+
is_company: bool | None = None,
|
|
147
|
+
) -> dict[str, Any]:
|
|
148
|
+
"""
|
|
149
|
+
Retrieves a paginated list of posts from a specific user or company profile using their provider ID. An authorizing `account_id` is required, and the `is_company` flag must specify the entity type, distinguishing this from `retrieve_post` which fetches a single post by its own ID.
|
|
150
|
+
|
|
151
|
+
Args:
|
|
152
|
+
identifier: The entity's provider internal ID (LinkedIn ID).
|
|
153
|
+
cursor: Pagination cursor.
|
|
154
|
+
limit: Number of items to return (1-100, as per Unipile example, though spec allows up to 250).
|
|
155
|
+
is_company: Boolean indicating if the identifier is for a company.
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
A dictionary containing a list of post objects and pagination details.
|
|
159
|
+
|
|
160
|
+
Raises:
|
|
161
|
+
httpx.HTTPError: If the API request fails.
|
|
162
|
+
|
|
163
|
+
Tags:
|
|
164
|
+
linkedin, post, list, user_posts, company_posts, content, api, important
|
|
165
|
+
"""
|
|
166
|
+
url = f"{self.base_url}/api/v1/users/{identifier}/posts"
|
|
167
|
+
params: dict[str, Any] = {"account_id": self.account_id}
|
|
168
|
+
if cursor:
|
|
169
|
+
params["cursor"] = cursor
|
|
170
|
+
if limit:
|
|
171
|
+
params["limit"] = limit
|
|
172
|
+
if is_company is not None:
|
|
173
|
+
params["is_company"] = is_company
|
|
174
|
+
|
|
175
|
+
response = self._get(url, params=params)
|
|
176
|
+
return response.json()
|
|
177
|
+
|
|
178
|
+
def linkedin_retrieve_profile(self, identifier: str) -> dict[str, Any]:
|
|
179
|
+
"""
|
|
180
|
+
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.
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
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".
|
|
184
|
+
|
|
185
|
+
Returns:
|
|
186
|
+
A dictionary containing the user's profile details.
|
|
187
|
+
|
|
188
|
+
Raises:
|
|
189
|
+
httpx.HTTPError: If the API request fails.
|
|
190
|
+
|
|
191
|
+
Tags:
|
|
192
|
+
linkedin, user, profile, retrieve, get, api, important
|
|
193
|
+
"""
|
|
194
|
+
url = f"{self.base_url}/api/v1/users/{identifier}"
|
|
195
|
+
params: dict[str, Any] = {"account_id": self.account_id}
|
|
196
|
+
response = self._get(url, params=params)
|
|
197
|
+
return self._handle_response(response)
|
|
198
|
+
|
|
199
|
+
def linkedin_list_post_comments(
|
|
200
|
+
self,
|
|
201
|
+
post_id: str,
|
|
202
|
+
comment_id: str | None = None,
|
|
203
|
+
cursor: str | None = None,
|
|
204
|
+
limit: int | None = None,
|
|
205
|
+
) -> dict[str, Any]:
|
|
206
|
+
"""
|
|
207
|
+
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'.
|
|
208
|
+
|
|
209
|
+
Args:
|
|
210
|
+
post_id: The social ID of the post.
|
|
211
|
+
comment_id: If provided, retrieves replies to this comment ID instead of top-level comments.
|
|
212
|
+
cursor: Pagination cursor.
|
|
213
|
+
limit: Number of comments to return. (OpenAPI spec shows type string, passed as string if provided).
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
A dictionary containing a list of comment objects and pagination details.
|
|
217
|
+
|
|
218
|
+
Raises:
|
|
219
|
+
httpx.HTTPError: If the API request fails.
|
|
220
|
+
|
|
221
|
+
Tags:
|
|
222
|
+
linkedin, post, comment, list, content, api, important
|
|
223
|
+
"""
|
|
224
|
+
url = f"{self.base_url}/api/v1/posts/{post_id}/comments"
|
|
225
|
+
params: dict[str, Any] = {"account_id": self.account_id}
|
|
226
|
+
if cursor:
|
|
227
|
+
params["cursor"] = cursor
|
|
228
|
+
if limit is not None:
|
|
229
|
+
params["limit"] = str(limit)
|
|
230
|
+
if comment_id:
|
|
231
|
+
params["comment_id"] = comment_id
|
|
232
|
+
|
|
233
|
+
response = self._get(url, params=params)
|
|
234
|
+
return response.json()
|
|
235
|
+
|
|
236
|
+
def list_tools(self):
|
|
237
|
+
"""
|
|
238
|
+
Returns a list of available tools/functions in this application.
|
|
239
|
+
|
|
240
|
+
Returns:
|
|
241
|
+
A list of functions that can be used as tools.
|
|
242
|
+
"""
|
|
243
|
+
return [
|
|
244
|
+
self.linkedin_search,
|
|
245
|
+
self.linkedin_list_profile_posts,
|
|
246
|
+
self.linkedin_retrieve_profile,
|
|
247
|
+
self.linkedin_list_post_comments,
|
|
248
|
+
]
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# LinkedinApp MCP Server
|
|
2
|
-
|
|
3
|
-
An MCP Server for the LinkedinApp API.
|
|
4
|
-
|
|
5
|
-
## 🛠️ Tool List
|
|
6
|
-
|
|
7
|
-
This is automatically generated from OpenAPI schema for the LinkedinApp API.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
| Tool | Description |
|
|
11
|
-
|------|-------------|
|
|
12
|
-
| `create_post` | Publishes a new text post to a specified LinkedIn author's feed (person or organization). It allows configuring visibility, distribution, and lifecycle state. Upon success, it returns the unique URN and URL for the new post, distinguishing this creation operation from the update or delete functions. |
|
|
13
|
-
| `get_authenticated_user_profile` | Retrieves the authenticated user's profile from the LinkedIn `/v2/userinfo` endpoint. Using credentials from the active integration, it returns a dictionary with basic user details like name and email. This function is for fetching user data, distinct from others that create, update, or delete posts. |
|
|
14
|
-
| `delete_post` | Deletes a LinkedIn post identified by its unique Uniform Resource Name (URN). This function sends a DELETE request to the API, permanently removing the content. Upon a successful HTTP 204 response, it returns a dictionary confirming the post's deletion status. |
|
|
15
|
-
| `update_post` | Modifies an existing LinkedIn post, identified by its URN, by performing a partial update. It selectively changes attributes like commentary or ad context, distinguishing it from `create_post` which creates new content. Returns a confirmation dictionary upon successful completion. |
|
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
from dotenv import load_dotenv
|
|
2
|
-
|
|
3
|
-
load_dotenv()
|
|
4
|
-
|
|
5
|
-
from typing import Any, Literal
|
|
6
|
-
|
|
7
|
-
from loguru import logger
|
|
8
|
-
from universal_mcp.applications.application import APIApplication
|
|
9
|
-
from universal_mcp.integrations import Integration
|
|
10
|
-
|
|
11
|
-
from universal_mcp.applications.linkedin import LinkedinApp
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class ScraperApp(APIApplication):
|
|
15
|
-
"""
|
|
16
|
-
Application for interacting with LinkedIn API.
|
|
17
|
-
Provides a simplified interface for LinkedIn search operations.
|
|
18
|
-
"""
|
|
19
|
-
|
|
20
|
-
def __init__(self, integration: Integration, **kwargs: Any) -> None:
|
|
21
|
-
super().__init__(name="scraper", integration=integration, **kwargs)
|
|
22
|
-
if self.integration:
|
|
23
|
-
credentials = self.integration.get_credentials()
|
|
24
|
-
self.account_id = credentials.get("account_id")
|
|
25
|
-
self._unipile_app = LinkedinApp(integration=self.integration)
|
|
26
|
-
else:
|
|
27
|
-
logger.warning("Integration not found")
|
|
28
|
-
self.account_id = None
|
|
29
|
-
self._unipile_app = None
|
|
30
|
-
|
|
31
|
-
def linkedin_search(
|
|
32
|
-
self,
|
|
33
|
-
category: Literal["people", "companies", "posts", "jobs"],
|
|
34
|
-
cursor: str | None = None,
|
|
35
|
-
limit: int | None = None,
|
|
36
|
-
keywords: str | None = None,
|
|
37
|
-
date_posted: str | None = None,
|
|
38
|
-
sort_by: Literal["relevance", "date"] = "relevance",
|
|
39
|
-
minimum_salary_value: int = 40,
|
|
40
|
-
) -> dict[str, Any]:
|
|
41
|
-
"""
|
|
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
|
-
|
|
44
|
-
Args:
|
|
45
|
-
category: Type of search to perform. Valid values are "people", "companies", "posts", or "jobs".
|
|
46
|
-
cursor: Pagination cursor for the next page of entries.
|
|
47
|
-
limit: Number of items to return (up to 50 for Classic search).
|
|
48
|
-
keywords: Keywords to search for.
|
|
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
|
-
minimum_salary_value: The minimum salary to filter for (jobs only).
|
|
52
|
-
|
|
53
|
-
Returns:
|
|
54
|
-
A dictionary containing search results and pagination details.
|
|
55
|
-
|
|
56
|
-
Raises:
|
|
57
|
-
httpx.HTTPError: If the API request fails.
|
|
58
|
-
|
|
59
|
-
Tags:
|
|
60
|
-
linkedin, search, posts, people, companies, api, scrapper, important
|
|
61
|
-
"""
|
|
62
|
-
return self._unipile_app.search(
|
|
63
|
-
account_id=self.account_id,
|
|
64
|
-
category=category,
|
|
65
|
-
cursor=cursor,
|
|
66
|
-
limit=limit,
|
|
67
|
-
keywords=keywords,
|
|
68
|
-
date_posted=date_posted,
|
|
69
|
-
sort_by=sort_by,
|
|
70
|
-
minimum_salary_value=minimum_salary_value,
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
def linkedin_list_profile_posts(
|
|
74
|
-
self,
|
|
75
|
-
identifier: str,
|
|
76
|
-
cursor: str | None = None,
|
|
77
|
-
limit: int | None = None,
|
|
78
|
-
) -> dict[str, Any]:
|
|
79
|
-
"""
|
|
80
|
-
Fetches a paginated list of all posts from a specific user or company profile using their unique identifier. This function retrieves content directly from a single profile, unlike the broader, keyword-based `linkedin_search` which searches across the entire LinkedIn platform.
|
|
81
|
-
|
|
82
|
-
Args:
|
|
83
|
-
identifier: The entity's provider internal ID (LinkedIn ID).starts with ACo for users, while for companies it's a series of numbers. You can get it in the results of linkedin_search.
|
|
84
|
-
cursor: Pagination cursor for the next page of entries.
|
|
85
|
-
limit: Number of items to return (1-100, though spec allows up to 250).
|
|
86
|
-
|
|
87
|
-
Returns:
|
|
88
|
-
A dictionary containing a list of post objects and pagination details.
|
|
89
|
-
|
|
90
|
-
Raises:
|
|
91
|
-
httpx.HTTPError: If the API request fails.
|
|
92
|
-
|
|
93
|
-
Tags:
|
|
94
|
-
linkedin, post, list, user_posts, company_posts, content, api, important
|
|
95
|
-
"""
|
|
96
|
-
|
|
97
|
-
return self._unipile_app.list_profile_posts(
|
|
98
|
-
identifier=identifier,
|
|
99
|
-
account_id=self.account_id,
|
|
100
|
-
cursor=cursor,
|
|
101
|
-
limit=limit,
|
|
102
|
-
)
|
|
103
|
-
|
|
104
|
-
def linkedin_retrieve_profile(
|
|
105
|
-
self,
|
|
106
|
-
identifier: str,
|
|
107
|
-
) -> dict[str, Any]:
|
|
108
|
-
"""
|
|
109
|
-
Retrieves a specific LinkedIn user's profile using their unique identifier (e.g., public username). Unlike other methods that list posts or comments, this function focuses on fetching the user's core profile data by delegating the request to the integrated Unipile application.
|
|
110
|
-
|
|
111
|
-
Args:
|
|
112
|
-
identifier: Use the id from linkedin_search results. It starts with ACo for users and is a series of numbers for companies.
|
|
113
|
-
|
|
114
|
-
Returns:
|
|
115
|
-
A dictionary containing the user's profile details.
|
|
116
|
-
|
|
117
|
-
Raises:
|
|
118
|
-
httpx.HTTPError: If the API request fails.
|
|
119
|
-
|
|
120
|
-
Tags:
|
|
121
|
-
linkedin, user, profile, retrieve, get, api, important
|
|
122
|
-
"""
|
|
123
|
-
|
|
124
|
-
return self._unipile_app.retrieve_user_profile(
|
|
125
|
-
identifier=identifier,
|
|
126
|
-
account_id=self.account_id,
|
|
127
|
-
)
|
|
128
|
-
|
|
129
|
-
def linkedin_list_post_comments(
|
|
130
|
-
self,
|
|
131
|
-
post_id: str,
|
|
132
|
-
comment_id: str | None = None,
|
|
133
|
-
cursor: str | None = None,
|
|
134
|
-
limit: int | None = None,
|
|
135
|
-
) -> dict[str, Any]:
|
|
136
|
-
"""
|
|
137
|
-
Fetches a paginated list of comments for a specified LinkedIn post. Providing a `comment_id` retrieves replies to that specific comment instead of top-level ones. This function exclusively targets post interactions, differentiating it from others that list posts or retrieve entire profiles.
|
|
138
|
-
|
|
139
|
-
Args:
|
|
140
|
-
post_id: The social ID of the post. Example urn:li:ugcPost:7386500271624896512
|
|
141
|
-
comment_id: If provided, retrieves replies to this comment ID instead of top-level comments.
|
|
142
|
-
cursor: Pagination cursor.
|
|
143
|
-
limit: Number of comments to return.
|
|
144
|
-
|
|
145
|
-
Returns:
|
|
146
|
-
A dictionary containing a list of comment objects and pagination details.
|
|
147
|
-
|
|
148
|
-
Raises:
|
|
149
|
-
httpx.HTTPError: If the API request fails.
|
|
150
|
-
|
|
151
|
-
Tags:
|
|
152
|
-
linkedin, post, comment, list, content, api, important
|
|
153
|
-
"""
|
|
154
|
-
|
|
155
|
-
return self._unipile_app.list_post_comments(
|
|
156
|
-
post_id=post_id,
|
|
157
|
-
account_id=self.account_id,
|
|
158
|
-
comment_id=comment_id,
|
|
159
|
-
cursor=cursor,
|
|
160
|
-
limit=limit,
|
|
161
|
-
)
|
|
162
|
-
|
|
163
|
-
def list_tools(self):
|
|
164
|
-
"""
|
|
165
|
-
Returns a list of available tools/functions in this application.
|
|
166
|
-
|
|
167
|
-
Returns:
|
|
168
|
-
A list of functions that can be used as tools.
|
|
169
|
-
"""
|
|
170
|
-
return [
|
|
171
|
-
self.linkedin_search,
|
|
172
|
-
self.linkedin_list_profile_posts,
|
|
173
|
-
self.linkedin_retrieve_profile,
|
|
174
|
-
self.linkedin_list_post_comments,
|
|
175
|
-
]
|
universal_mcp_applications-0.1.30rc1/src/universal_mcp/applications/scraper/scraper_testers.py
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
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"))
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/bump_and_release.sh
RENAMED
|
File without changes
|
{universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/scripts/docgen.py
RENAMED
|
File without changes
|
{universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/scripts/prompts.py
RENAMED
|
File without changes
|
{universal_mcp_applications-0.1.30rc1 → universal_mcp_applications-0.1.30rc2}/src/scripts/readme.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|