universal-mcp-applications 0.1.24__tar.gz → 0.1.26__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.24 → universal_mcp_applications-0.1.26}/PKG-INFO +1 -1
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/bump_and_release.sh +3 -4
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/pyproject.toml +1 -1
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_docs/app.py +152 -18
- universal_mcp_applications-0.1.26/src/universal_mcp/applications/outlook/app.py +524 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/reddit/app.py +30 -47
- universal_mcp_applications-0.1.26/test.py +56 -0
- universal_mcp_applications-0.1.26/uv.lock +5765 -0
- universal_mcp_applications-0.1.24/src/universal_mcp/applications/outlook/app.py +0 -442
- universal_mcp_applications-0.1.24/test.py +0 -71
- universal_mcp_applications-0.1.24/uv.lock +0 -5150
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/.gitignore +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/GEMINI.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/LICENSE +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/scripts/docgen.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/scripts/prompts.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/scripts/readme.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/scripts/run_docgen.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/tests/test_applications.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/BEST_PRACTICES.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/ahrefs/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/ahrefs/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/ahrefs/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/airtable/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/airtable/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/airtable/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/apollo/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/apollo/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/apollo/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/asana/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/asana/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/asana/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/aws_s3/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/aws_s3/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/aws_s3/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/bill/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/bill/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/bill/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/box/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/box/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/box/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/braze/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/braze/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/braze/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/browser_use/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/browser_use/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/browser_use/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/cal_com_v2/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/cal_com_v2/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/cal_com_v2/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/calendly/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/calendly/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/calendly/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/canva/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/canva/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/canva/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/clickup/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/clickup/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/clickup/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/coda/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/coda/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/coda/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/confluence/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/confluence/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/confluence/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/contentful/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/contentful/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/contentful/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/crustdata/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/crustdata/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/crustdata/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/dialpad/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/dialpad/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/dialpad/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/digitalocean/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/digitalocean/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/digitalocean/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/domain_checker/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/domain_checker/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/domain_checker/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/e2b/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/e2b/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/e2b/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/elevenlabs/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/elevenlabs/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/elevenlabs/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/exa/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/exa/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/exa/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/falai/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/falai/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/falai/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/figma/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/figma/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/figma/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/file_system/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/file_system/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/file_system/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/firecrawl/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/firecrawl/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/firecrawl/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/fireflies/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/fireflies/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/fireflies/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/fpl/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/fpl/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/fpl/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/fpl/utils/api.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/fpl/utils/fixtures.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/fpl/utils/helper.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/fpl/utils/league_utils.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/fpl/utils/position_utils.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/ghost_content/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/ghost_content/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/ghost_content/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/github/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/github/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/github/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/gong/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/gong/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/gong/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_calendar/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_calendar/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_calendar/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_docs/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_docs/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_drive/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_drive/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_drive/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_gemini/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_gemini/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_gemini/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_mail/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_mail/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_mail/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_searchconsole/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_searchconsole/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_searchconsole/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_sheet/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_sheet/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_sheet/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/google_sheet/helper.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/hashnode/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/hashnode/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/hashnode/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/heygen/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/heygen/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/heygen/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/http_tools/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/http_tools/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/http_tools/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/hubspot/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/hubspot/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/hubspot/api_segments/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/hubspot/api_segments/api_segment_base.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/hubspot/api_segments/crm_api.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/hubspot/api_segments/marketing_api.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/hubspot/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/jira/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/jira/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/jira/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/klaviyo/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/klaviyo/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/klaviyo/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/linkedin/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/linkedin/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/linkedin/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/mailchimp/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/mailchimp/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/mailchimp/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/markitdown/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/markitdown/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/markitdown/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/miro/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/miro/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/miro/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/ms_teams/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/ms_teams/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/ms_teams/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/neon/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/neon/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/neon/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/notion/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/notion/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/notion/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/openai/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/openai/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/openai/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/outlook/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/outlook/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/perplexity/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/perplexity/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/perplexity/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/pipedrive/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/pipedrive/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/pipedrive/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/posthog/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/posthog/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/posthog/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/reddit/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/reddit/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/resend/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/resend/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/resend/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/retell/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/retell/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/retell/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/rocketlane/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/rocketlane/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/rocketlane/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/scraper/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/scraper/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/scraper/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/semanticscholar/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/semanticscholar/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/semanticscholar/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/semrush/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/semrush/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/semrush/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/sendgrid/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/sendgrid/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/sendgrid/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/sentry/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/sentry/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/sentry/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/serpapi/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/serpapi/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/serpapi/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/sharepoint/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/sharepoint/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/sharepoint/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/shopify/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/shopify/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/shopify/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/shortcut/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/shortcut/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/shortcut/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/slack/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/slack/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/slack/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/spotify/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/spotify/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/spotify/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/supabase/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/supabase/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/supabase/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/tavily/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/tavily/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/tavily/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/trello/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/trello/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/trello/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/twilio/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/twilio/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/twilio/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/twitter/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/twitter/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/twitter/api_segments/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/twitter/api_segments/api_segment_base.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/twitter/api_segments/compliance_api.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/twitter/api_segments/dm_conversations_api.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/twitter/api_segments/dm_events_api.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/twitter/api_segments/likes_api.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/twitter/api_segments/lists_api.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/twitter/api_segments/openapi_json_api.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/twitter/api_segments/spaces_api.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/twitter/api_segments/trends_api.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/twitter/api_segments/tweets_api.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/twitter/api_segments/usage_api.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/twitter/api_segments/users_api.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/twitter/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/unipile/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/unipile/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/unipile/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/whatsapp/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/whatsapp/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/whatsapp/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/whatsapp/audio.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/whatsapp/whatsapp.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/whatsapp_business/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/whatsapp_business/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/whatsapp_business/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/wrike/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/wrike/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/wrike/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/yahoo_finance/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/yahoo_finance/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/yahoo_finance/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/youtube/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/youtube/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/youtube/app.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/zenquotes/README.md +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/src/universal_mcp/applications/zenquotes/__init__.py +0 -0
- {universal_mcp_applications-0.1.24 → universal_mcp_applications-0.1.26}/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.26
|
|
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
|
|
@@ -20,9 +20,8 @@ BRANCH=$(git branch --show-current)
|
|
|
20
20
|
CURRENT_VERSION=$(grep -E '^version = "[0-9]+\.[0-9]+\.[0-9]+.*"' pyproject.toml | cut -d'"' -f2)
|
|
21
21
|
|
|
22
22
|
# Split version into major, minor, patch
|
|
23
|
-
MAJOR
|
|
24
|
-
|
|
25
|
-
PATCH=$(echo "$CURRENT_VERSION" | cut -d'.' -f3)
|
|
23
|
+
IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION"
|
|
24
|
+
|
|
26
25
|
# Remove any rc suffix from PATCH if it exists
|
|
27
26
|
PATCH_NUM=$(echo $PATCH | sed 's/-rc[0-9]*//')
|
|
28
27
|
|
|
@@ -51,7 +50,7 @@ else
|
|
|
51
50
|
fi
|
|
52
51
|
|
|
53
52
|
# Update version in pyproject.toml
|
|
54
|
-
sed -i "s/^version =
|
|
53
|
+
sed -i '' "s/^version = ".*"/version = \"$NEW_VERSION\"/" pyproject.toml
|
|
55
54
|
|
|
56
55
|
echo "Version bumped from $CURRENT_VERSION to $NEW_VERSION"
|
|
57
56
|
|
|
@@ -55,37 +55,171 @@ class GoogleDocsApp(APIApplication):
|
|
|
55
55
|
|
|
56
56
|
def get_document_content(self, document_id: str) -> dict[str, Any]:
|
|
57
57
|
"""
|
|
58
|
-
Retrieves
|
|
59
|
-
|
|
58
|
+
Retrieves and converts a Google Docs document into Markdown-formatted content.
|
|
59
|
+
|
|
60
|
+
This method calls the Google Docs API via `get_document`, then parses the document structure
|
|
61
|
+
to extract paragraphs, headings, lists, tables, images, equations, footnotes, and horizontal rules.
|
|
62
|
+
The final result is a clean Markdown string that closely mirrors the layout and content of
|
|
63
|
+
the original document, including support for nested lists and multi-row tables.
|
|
64
|
+
|
|
60
65
|
Args:
|
|
61
|
-
document_id: The unique
|
|
62
|
-
|
|
66
|
+
document_id (str): The unique ID of the Google Document to retrieve.
|
|
67
|
+
|
|
63
68
|
Returns:
|
|
64
|
-
A dictionary
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
69
|
+
dict[str, Any]: A dictionary with the following keys:
|
|
70
|
+
- 'title' (str): The document's title.
|
|
71
|
+
- 'content' (str): The document content converted to Markdown.
|
|
72
|
+
Markdown Output Supports:
|
|
73
|
+
- Paragraphs and line breaks
|
|
74
|
+
- Headings (Heading 1-6)
|
|
75
|
+
- Bulleted and numbered lists (with nesting)
|
|
76
|
+
- Tables (converted to Markdown tables)
|
|
77
|
+
- Inline images (`` format)
|
|
78
|
+
- Equations (LaTeX-style `$...$`)
|
|
79
|
+
- Footnotes (`[^1]` references and notes at the end)
|
|
80
|
+
- Horizontal rules (`---`)
|
|
81
|
+
|
|
70
82
|
Tags:
|
|
71
|
-
|
|
83
|
+
google-docs, markdown, document-parsing, text-extraction, conversion, structured-data
|
|
72
84
|
"""
|
|
85
|
+
import re
|
|
86
|
+
|
|
73
87
|
response = self.get_document(document_id)
|
|
74
88
|
title = response.get("title", "")
|
|
75
|
-
text_chunks: list[str] = []
|
|
76
89
|
body_content = response.get("body", {}).get("content", [])
|
|
90
|
+
inline_objects = response.get("inlineObjects", {})
|
|
91
|
+
lists = response.get("lists", {})
|
|
92
|
+
footnotes_data = response.get("footnotes", {})
|
|
93
|
+
|
|
94
|
+
text_chunks: list[str] = []
|
|
95
|
+
footnotes: dict[str, str] = {}
|
|
96
|
+
footnote_index: dict[str, int] = {}
|
|
97
|
+
current_list_counters: dict[str, int] = {}
|
|
98
|
+
|
|
99
|
+
def extract_text_from_paragraph(paragraph: dict) -> str:
|
|
100
|
+
"""Extracts paragraph text with inline formatting."""
|
|
101
|
+
text = ""
|
|
102
|
+
for elem in paragraph.get("elements", []):
|
|
103
|
+
if "textRun" in elem:
|
|
104
|
+
content = elem["textRun"].get("content", "")
|
|
105
|
+
text += content
|
|
106
|
+
elif "inlineObjectElement" in elem:
|
|
107
|
+
obj_id = elem["inlineObjectElement"]["inlineObjectId"]
|
|
108
|
+
obj = inline_objects.get(obj_id, {})
|
|
109
|
+
embed = obj.get("inlineObjectProperties", {}).get("embeddedObject", {})
|
|
110
|
+
image_source = embed.get("imageProperties", {}).get("contentUri", "")
|
|
111
|
+
if image_source:
|
|
112
|
+
text += f"\n\n\n\n"
|
|
113
|
+
return text
|
|
114
|
+
|
|
115
|
+
def extract_table(table: dict) -> str:
|
|
116
|
+
rows = []
|
|
117
|
+
for i, row in enumerate(table.get("tableRows", [])):
|
|
118
|
+
cells = []
|
|
119
|
+
for cell in row.get("tableCells", []):
|
|
120
|
+
cell_text = ""
|
|
121
|
+
for content in cell.get("content", []):
|
|
122
|
+
if "paragraph" in content:
|
|
123
|
+
cell_text += extract_text_from_paragraph(content["paragraph"]).strip()
|
|
124
|
+
cells.append(cell_text)
|
|
125
|
+
row_line = "| " + " | ".join(cells) + " |"
|
|
126
|
+
rows.append(row_line)
|
|
127
|
+
if i == 0:
|
|
128
|
+
rows.insert(1, "| " + " | ".join(["---"] * len(cells)) + " |")
|
|
129
|
+
return "\n".join(rows)
|
|
130
|
+
|
|
131
|
+
def extract_heading_style(paragraph: dict) -> str:
|
|
132
|
+
"""Returns appropriate Markdown heading level."""
|
|
133
|
+
style = paragraph.get("paragraphStyle", {})
|
|
134
|
+
heading = style.get("namedStyleType", "")
|
|
135
|
+
match = re.match(r"HEADING_(\d)", heading)
|
|
136
|
+
if match:
|
|
137
|
+
level = int(match.group(1))
|
|
138
|
+
return "#" * level
|
|
139
|
+
return ""
|
|
140
|
+
|
|
141
|
+
def extract_list_prefix(paragraph: dict) -> str:
|
|
142
|
+
"""Generates proper list prefix (numbered or bullet)."""
|
|
143
|
+
list_id = paragraph.get("bullet", {}).get("listId")
|
|
144
|
+
if not list_id:
|
|
145
|
+
return ""
|
|
146
|
+
glyph = paragraph["bullet"].get("glyph", None)
|
|
147
|
+
nesting = paragraph["bullet"].get("nestingLevel", 0)
|
|
148
|
+
list_info = lists.get(list_id, {})
|
|
149
|
+
list_type = list_info.get("listProperties", {}).get("nestingLevels", [{}])[nesting].get("glyphType")
|
|
150
|
+
|
|
151
|
+
indent = " " * nesting
|
|
152
|
+
if list_type and "DECIMAL" in list_type:
|
|
153
|
+
current_list_counters[list_id] = current_list_counters.get(list_id, 1)
|
|
154
|
+
prefix = f"{current_list_counters[list_id]}. "
|
|
155
|
+
current_list_counters[list_id] += 1
|
|
156
|
+
else:
|
|
157
|
+
prefix = "- "
|
|
158
|
+
return indent + prefix
|
|
159
|
+
|
|
160
|
+
def extract_equation(paragraph: dict) -> str:
|
|
161
|
+
return "\n\n$" + paragraph.get("equation", {}).get("equation", "") + "$\n\n"
|
|
162
|
+
|
|
163
|
+
def extract_footnote_ref(footnote_id: str) -> str:
|
|
164
|
+
if footnote_id not in footnote_index:
|
|
165
|
+
footnote_index[footnote_id] = len(footnotes) + 1
|
|
166
|
+
fn_content = footnotes_data.get(footnote_id, {}).get("content", [])
|
|
167
|
+
fn_text = ""
|
|
168
|
+
for item in fn_content:
|
|
169
|
+
if "paragraph" in item:
|
|
170
|
+
fn_text += extract_text_from_paragraph(item["paragraph"]).strip()
|
|
171
|
+
footnotes[footnote_id] = fn_text
|
|
172
|
+
return f"[^{footnote_index[footnote_id]}]"
|
|
173
|
+
|
|
77
174
|
for element in body_content:
|
|
78
175
|
if "paragraph" in element:
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
176
|
+
para = element["paragraph"]
|
|
177
|
+
if "equation" in para:
|
|
178
|
+
text_chunks.append(extract_equation(para))
|
|
179
|
+
continue
|
|
180
|
+
|
|
181
|
+
heading_md = extract_heading_style(para)
|
|
182
|
+
list_prefix = extract_list_prefix(para)
|
|
183
|
+
|
|
184
|
+
para_text = extract_text_from_paragraph(para).strip()
|
|
185
|
+
if para_text:
|
|
186
|
+
if heading_md:
|
|
187
|
+
text_chunks.append(f"{heading_md} {para_text}")
|
|
188
|
+
elif list_prefix:
|
|
189
|
+
text_chunks.append(f"{list_prefix}{para_text}")
|
|
190
|
+
else:
|
|
191
|
+
text_chunks.append(para_text)
|
|
192
|
+
|
|
193
|
+
elif "table" in element:
|
|
194
|
+
table_md = extract_table(element["table"])
|
|
195
|
+
text_chunks.append(table_md)
|
|
196
|
+
|
|
197
|
+
elif "horizontalRule" in element:
|
|
198
|
+
text_chunks.append("\n---\n")
|
|
199
|
+
|
|
200
|
+
elif "tableOfContents" in element:
|
|
201
|
+
text_chunks.append("<!-- Table of Contents -->")
|
|
202
|
+
|
|
203
|
+
# Handle footnote references (inline elements)
|
|
204
|
+
elif "footnoteReference" in element:
|
|
205
|
+
footnote_id = element["footnoteReference"]["footnoteId"]
|
|
206
|
+
ref = extract_footnote_ref(footnote_id)
|
|
207
|
+
text_chunks.append(ref)
|
|
208
|
+
|
|
209
|
+
# Append footnotes at the end
|
|
210
|
+
if footnotes:
|
|
211
|
+
text_chunks.append("\n## Footnotes\n")
|
|
212
|
+
for fid, index in sorted(footnote_index.items(), key=lambda x: x[1]):
|
|
213
|
+
text_chunks.append(f"[^{index}]: {footnotes[fid]}")
|
|
214
|
+
|
|
215
|
+
content = "\n\n".join(chunk.strip() for chunk in text_chunks if chunk.strip())
|
|
216
|
+
|
|
84
217
|
return {
|
|
85
218
|
"title": title,
|
|
86
|
-
"content": content
|
|
219
|
+
"content": content
|
|
87
220
|
}
|
|
88
221
|
|
|
222
|
+
|
|
89
223
|
def insert_text(
|
|
90
224
|
self, document_id: str, content: str, index: int = 1
|
|
91
225
|
) -> dict[str, Any]:
|