mcpscraper-sdk 0.13.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mcpscraper_sdk-0.13.0/.gitignore +6 -0
- mcpscraper_sdk-0.13.0/PKG-INFO +128 -0
- mcpscraper_sdk-0.13.0/README.md +117 -0
- mcpscraper_sdk-0.13.0/pyproject.toml +28 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/__init__.py +9 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/_mcp_generated_client.py +1111 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/client.py +324 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/errors.py +29 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_client.py +136 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/__init__.py +0 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/access_accept_share.py +17 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/access_approve_sender.py +16 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/access_decline_share.py +16 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/access_inbox_settings.py +16 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/access_invite_account.py +21 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/access_issue_key.py +26 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/access_list_approved_senders.py +15 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/access_list_keys.py +17 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/access_note_inbox.py +14 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/access_remove_approved_sender.py +17 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/access_revoke_key.py +17 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/access_revoke_share.py +16 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/access_set_scope.py +19 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/access_share_note.py +26 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/access_share_vault.py +20 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/access_swap_vault.py +17 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/access_switch_account.py +18 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/access_unlink_share.py +16 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/add_vault.py +18 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/audit_site.py +17 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_click.py +16 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_close.py +12 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_extension_delete.py +12 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_extension_import.py +13 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_extension_list.py +10 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_goto.py +13 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_list_replays.py +12 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_list_sessions.py +12 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_locate.py +13 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_open.py +17 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_press.py +13 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_profile_connect.py +19 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_profile_list.py +15 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_read.py +12 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_replay_annotate.py +19 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_replay_download.py +14 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_replay_mark.py +20 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_replay_start.py +12 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_replay_stop.py +13 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_screenshot.py +12 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_scroll.py +16 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/browser_type.py +14 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/bulk_delete_notes.py +24 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/call_service_connection_action.py +14 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/capture_serp_page_snapshots.py +16 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/capture_serp_snapshot.py +22 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/check_site_export.py +12 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/cost_usage.py +28 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/create_channel.py +19 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/create_scheduled_action.py +25 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/create_secure_vault.py +17 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/create_webhook.py +19 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/credits_info.py +13 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/delete_note.py +23 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/delete_scheduled_action.py +16 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/delete_vault.py +18 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/describe_service_connection_tool.py +14 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/diff_page.py +14 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/directory_workflow.py +24 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/export_connected_service_data.py +20 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/export_search_console_table_data.py +15 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/extract_site.py +18 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/extract_url.py +20 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/facebook_ad_search.py +14 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/facebook_ad_transcribe.py +12 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/facebook_page_intel.py +16 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/facebook_video_transcribe.py +13 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/fact_history.py +18 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/g2_reviews.py +13 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/get_chat_link.py +15 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/get_message_note.py +17 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/get_schedule_link.py +16 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/get_schedule_status.py +22 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/get_vault_app_link.py +15 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/get_vault_contract.py +17 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/gmail_send_message.py +15 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/google_ads_page_intel.py +15 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/google_ads_search.py +14 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/google_ads_transcribe.py +12 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/google_calendar_create_event.py +20 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/harvest_paa.py +20 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/import_service_connection_to_memory.py +17 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/instagram_media_download.py +19 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/instagram_profile_content.py +19 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/library_ingest.py +31 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/list_channel_members.py +18 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/list_channel_messages.py +17 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/list_memory_tags.py +16 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/list_scheduled_actions.py +14 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/list_service_connections.py +10 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/list_shared_with_me.py +14 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/list_vaults.py +16 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/list_webhooks.py +14 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/map_site_urls.py +13 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/maps_place_intel.py +18 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/maps_search.py +20 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/memory_backlinks.py +18 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/memory_capture.py +31 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/memory_export.py +18 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/memory_get.py +18 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/memory_graph_path.py +21 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/memory_graph_universe.py +23 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/memory_list.py +20 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/memory_put.py +26 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/memory_questions.py +18 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/memory_search.py +39 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/memory_suggest.py +17 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/memory_upload.py +22 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/meta_ad_creative_media.py +15 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/my_mentions.py +16 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/pause_scheduled_action.py +15 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/poll_channel.py +21 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/post_message.py +20 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/prepare_memory_write.py +26 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/propose_scheduled_action.py +21 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/provision_defaults.py +23 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/query_fanout_workflow.py +17 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/rank_tracker_workflow.py +26 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/react_message.py +21 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/read_service_connection.py +14 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/record_fact.py +22 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/reddit_thread.py +13 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/remove_channel_member.py +17 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/renew_connected_data_download.py +12 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/reply_message.py +21 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/report_artifact_read.py +14 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/resolve_memory_tags.py +16 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/resume_scheduled_action.py +17 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/revoke_chat_link.py +14 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/revoke_schedule_link.py +14 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/revoke_vault_app_link.py +14 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/revoke_webhook.py +16 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/route_memory.py +22 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/search_serp.py +20 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/set_agent_identity.py +16 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/set_schedule_defaults.py +16 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/set_schedule_entitlement.py +18 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/set_scheduled_action_connections.py +13 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/slack_send_message.py +14 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/storage_usage.py +19 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/table_create.py +19 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/table_delete_rows.py +17 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/table_describe.py +17 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/table_drop.py +16 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/table_insert_rows.py +17 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/table_list.py +14 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/table_query.py +22 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/temporal_recall.py +22 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/test_service_connection.py +13 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/trustpilot_reviews.py +13 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/upsert_memory_tag.py +19 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/validate_memory_write.py +22 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/video_analyze_start.py +21 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/video_analyze_status.py +22 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/video_frame_analysis.py +16 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/video_frame_analysis_status.py +12 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/workflow_artifact_read.py +14 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/workflow_list.py +12 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/workflow_run.py +14 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/workflow_status.py +12 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/workflow_step.py +12 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/workflow_suggest.py +19 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/youtube_harvest.py +15 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/youtube_transcribe.py +13 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/mcp_models/zoom_create_meeting.py +17 -0
- mcpscraper_sdk-0.13.0/src/mcpscraper/models.py +822 -0
- mcpscraper_sdk-0.13.0/tests/test_client.py +344 -0
- mcpscraper_sdk-0.13.0/uv.lock +833 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: mcpscraper-sdk
|
|
3
|
+
Version: 0.13.0
|
|
4
|
+
Summary: Official Python client for all 165 mcpscraper.dev MCP tools and the REST API
|
|
5
|
+
Project-URL: Repository, https://github.com/VilovietaSEO/mcpscraper-sdk
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Requires-Python: >=3.10
|
|
8
|
+
Requires-Dist: pydantic>=2.0
|
|
9
|
+
Requires-Dist: requests>=2.31
|
|
10
|
+
Description-Content-Type: text/markdown
|
|
11
|
+
|
|
12
|
+
# mcpscraper-sdk (Python)
|
|
13
|
+
|
|
14
|
+
Official Python client for the [mcpscraper.dev](https://mcpscraper.dev) REST API — SERP search, People-Also-Ask harvesting, single-page and whole-site extraction, YouTube, Facebook/Google Ads Transparency, Instagram, Reddit, video breakdown, Google Maps, and directory/rank-tracking workflows.
|
|
15
|
+
|
|
16
|
+
This is a thin HTTP client generated against [`../../contracts/scraper.openapi.yaml`](../../contracts/scraper.openapi.yaml), the public contract for the hosted API. It contains no scraping, proxy, or billing logic — only typed request/response plumbing over `requests`.
|
|
17
|
+
|
|
18
|
+
## Install
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
pip install "mcpscraper-sdk @ git+https://github.com/VilovietaSEO/mcpscraper-sdk.git#subdirectory=packages/scraper-python"
|
|
22
|
+
# or
|
|
23
|
+
uv add "mcpscraper-sdk @ git+https://github.com/VilovietaSEO/mcpscraper-sdk.git#subdirectory=packages/scraper-python"
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Usage
|
|
27
|
+
|
|
28
|
+
```python
|
|
29
|
+
from mcpscraper import ScraperClient, ScraperApiError
|
|
30
|
+
|
|
31
|
+
client = ScraperClient(api_key="sk_live_your_key")
|
|
32
|
+
|
|
33
|
+
serp = client.search_serp(query="roof repair Denver")
|
|
34
|
+
|
|
35
|
+
try:
|
|
36
|
+
places = client.maps.search({"query": "roofers", "location": "Denver, CO"})
|
|
37
|
+
print(places)
|
|
38
|
+
except ScraperApiError as err:
|
|
39
|
+
if err.is_insufficient_balance():
|
|
40
|
+
print(f"Need {err.body['required_credits']} credits, have {err.body['balance_credits']}. Top up: {err.body['topup_url']}")
|
|
41
|
+
else:
|
|
42
|
+
raise
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Errors
|
|
46
|
+
|
|
47
|
+
Every non-2xx response raises a `ScraperApiError` with `.status`, `.code`, and the raw response `.body`. Two cases have narrowing helpers:
|
|
48
|
+
|
|
49
|
+
- `err.is_insufficient_balance()` — `err.body` has `balance_credits`, `required_credits`, `topup_url`.
|
|
50
|
+
- `err.is_concurrency_limit_exceeded()` — `err.body` has `active`, `limit`, `retryable`.
|
|
51
|
+
|
|
52
|
+
## API surface
|
|
53
|
+
|
|
54
|
+
`client.tools` is the generated 165-tool MCP surface — 76 MCP Scraper tools plus 89 mirrored memory tools — with one typed snake_case method per tool:
|
|
55
|
+
|
|
56
|
+
Use `client.tools.call_tool_result(name, args)` when a multimodal tool must preserve its native MCP image, audio, or resource blocks. `call_tool(...)` remains the parsed, backward-compatible path.
|
|
57
|
+
|
|
58
|
+
```python
|
|
59
|
+
client.tools.search.search_serp(query="roof repair Denver")
|
|
60
|
+
client.tools.memory.search(query="roofing warranty terms")
|
|
61
|
+
client.tools.connections.export_connected_service_data(
|
|
62
|
+
connection_id="conn_123",
|
|
63
|
+
dataset="resend_data",
|
|
64
|
+
last_days=7,
|
|
65
|
+
)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
The connected-data export performs bounded Gmail, Calendar, Google Search Console, Zoom, Meta Marketing, or Resend pagination server-side and returns small results inline or a private seven-day JSONL artifact. Use `search_console_performance` for bounded Search Analytics rows across every accessible property, and `meta_ads_insights` for daily account, campaign, ad-set, and ad reporting across connected Meta ad accounts. Resend can aggregate sent/received mail, logs, contacts, broadcasts, and templates with `resend_data`. Resume partial exports with the returned `continuation` object; renew an expired signed URL with `client.tools.connections.renew_connected_data_download(artifact_id="artifact_123")`. Use `list_service_connections` for verified grants and per-tool permission blockers, then `describe_service_connection_tool` for the exact provider-native schema before calling through the generic connection bridges.
|
|
69
|
+
|
|
70
|
+
Core operations are flat on the client: `search_serp`, `harvest_paa`, `extract_url`, `map_site_urls`, `extract_site`, `audit_site`, `get_extract_site_status`, `list_jobs`, `get_job`, `get_history`, `get_ledger`.
|
|
71
|
+
|
|
72
|
+
Everything else is namespaced by product area, matching the OpenAPI spec's tags: `client.youtube`, `client.screenshot`, `client.facebook`, `client.google_ads`, `client.instagram`, `client.reddit`, `client.video`, `client.maps`, `client.directory`, `client.serp_intelligence`, `client.workflows`.
|
|
73
|
+
|
|
74
|
+
Typed Pydantic models for every request/response schema are available from `mcpscraper.models` if you want to construct or validate payloads explicitly — the client methods themselves accept plain keyword arguments/dicts and return parsed JSON.
|
|
75
|
+
|
|
76
|
+
### Retry-safe SERP Intelligence captures
|
|
77
|
+
|
|
78
|
+
Pass a stable idempotency key when a capture may be retried. The regular method continues to return the response body; `capture_with_receipt` also returns the key accepted or generated by the server so it can be reused after a timeout or uncertain response:
|
|
79
|
+
|
|
80
|
+
```python
|
|
81
|
+
result = client.serp_intelligence.capture(
|
|
82
|
+
{"query": "roofers near me"},
|
|
83
|
+
idempotency_key="serp-run-2026-07-14-001",
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
receipt = client.serp_intelligence.capture_with_receipt({"query": "roofers near me"})
|
|
87
|
+
print(receipt["data"]["billing"]["creditsUsed"], receipt["idempotency_key"])
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Reusing a key with the same body recovers the original debit and settlement. Reusing it with a different body raises `ScraperApiError` with status `409` and code `idempotency_conflict`.
|
|
91
|
+
|
|
92
|
+
## Scrape → memory vault
|
|
93
|
+
|
|
94
|
+
```python
|
|
95
|
+
page = client.extract_url(url="https://example.com/pricing", depositToVault=True, vaultName="competitors")
|
|
96
|
+
print(page["memory"]) # {"deposited": True, "vault": "competitors", "noteId": "...", "chunks": 4}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Memory tools, using only this API key
|
|
100
|
+
|
|
101
|
+
`client.memory_tools.call_tool(name, args)` dispatches to any of the 87 memory.mcpscraper.dev tools through `POST /memory/mcp-call`, using only this mcpscraper.dev API key — no separate memory key needed:
|
|
102
|
+
|
|
103
|
+
```python
|
|
104
|
+
hits = client.memory_tools.call_tool("searchTool", {"query": "competitor pricing pages"})
|
|
105
|
+
vaults = client.memory_tools.call_tool("listVaultsTool")
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
This generic compatibility bridge remains available, but new integrations should use `client.tools`, whose generated namespaces provide one typed method for every one of the 165 unified MCP tools.
|
|
109
|
+
|
|
110
|
+
## Regenerating models
|
|
111
|
+
|
|
112
|
+
`src/mcpscraper/models.py` is generated from the OpenAPI spec and checked in. After editing `../../contracts/scraper.openapi.yaml`, regenerate with:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
uv run datamodel-codegen \
|
|
116
|
+
--input ../../contracts/scraper.openapi.yaml \
|
|
117
|
+
--input-file-type openapi \
|
|
118
|
+
--output src/mcpscraper/models.py \
|
|
119
|
+
--output-model-type pydantic_v2.BaseModel \
|
|
120
|
+
--field-constraints \
|
|
121
|
+
--use-schema-description \
|
|
122
|
+
--target-python-version 3.10 \
|
|
123
|
+
--disable-timestamp
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## See also
|
|
127
|
+
|
|
128
|
+
[Repo README](../../README.md) (multi-language examples with real sample output) · [`mcpscraper-sdk` on npm](../scraper) (Node, full `memory_tools` typed surface) · [`mcpscraper-memory-sdk` Python source package](../memory-python) · [`mcpscraper-cli`](../cli)
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# mcpscraper-sdk (Python)
|
|
2
|
+
|
|
3
|
+
Official Python client for the [mcpscraper.dev](https://mcpscraper.dev) REST API — SERP search, People-Also-Ask harvesting, single-page and whole-site extraction, YouTube, Facebook/Google Ads Transparency, Instagram, Reddit, video breakdown, Google Maps, and directory/rank-tracking workflows.
|
|
4
|
+
|
|
5
|
+
This is a thin HTTP client generated against [`../../contracts/scraper.openapi.yaml`](../../contracts/scraper.openapi.yaml), the public contract for the hosted API. It contains no scraping, proxy, or billing logic — only typed request/response plumbing over `requests`.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pip install "mcpscraper-sdk @ git+https://github.com/VilovietaSEO/mcpscraper-sdk.git#subdirectory=packages/scraper-python"
|
|
11
|
+
# or
|
|
12
|
+
uv add "mcpscraper-sdk @ git+https://github.com/VilovietaSEO/mcpscraper-sdk.git#subdirectory=packages/scraper-python"
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```python
|
|
18
|
+
from mcpscraper import ScraperClient, ScraperApiError
|
|
19
|
+
|
|
20
|
+
client = ScraperClient(api_key="sk_live_your_key")
|
|
21
|
+
|
|
22
|
+
serp = client.search_serp(query="roof repair Denver")
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
places = client.maps.search({"query": "roofers", "location": "Denver, CO"})
|
|
26
|
+
print(places)
|
|
27
|
+
except ScraperApiError as err:
|
|
28
|
+
if err.is_insufficient_balance():
|
|
29
|
+
print(f"Need {err.body['required_credits']} credits, have {err.body['balance_credits']}. Top up: {err.body['topup_url']}")
|
|
30
|
+
else:
|
|
31
|
+
raise
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Errors
|
|
35
|
+
|
|
36
|
+
Every non-2xx response raises a `ScraperApiError` with `.status`, `.code`, and the raw response `.body`. Two cases have narrowing helpers:
|
|
37
|
+
|
|
38
|
+
- `err.is_insufficient_balance()` — `err.body` has `balance_credits`, `required_credits`, `topup_url`.
|
|
39
|
+
- `err.is_concurrency_limit_exceeded()` — `err.body` has `active`, `limit`, `retryable`.
|
|
40
|
+
|
|
41
|
+
## API surface
|
|
42
|
+
|
|
43
|
+
`client.tools` is the generated 165-tool MCP surface — 76 MCP Scraper tools plus 89 mirrored memory tools — with one typed snake_case method per tool:
|
|
44
|
+
|
|
45
|
+
Use `client.tools.call_tool_result(name, args)` when a multimodal tool must preserve its native MCP image, audio, or resource blocks. `call_tool(...)` remains the parsed, backward-compatible path.
|
|
46
|
+
|
|
47
|
+
```python
|
|
48
|
+
client.tools.search.search_serp(query="roof repair Denver")
|
|
49
|
+
client.tools.memory.search(query="roofing warranty terms")
|
|
50
|
+
client.tools.connections.export_connected_service_data(
|
|
51
|
+
connection_id="conn_123",
|
|
52
|
+
dataset="resend_data",
|
|
53
|
+
last_days=7,
|
|
54
|
+
)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
The connected-data export performs bounded Gmail, Calendar, Google Search Console, Zoom, Meta Marketing, or Resend pagination server-side and returns small results inline or a private seven-day JSONL artifact. Use `search_console_performance` for bounded Search Analytics rows across every accessible property, and `meta_ads_insights` for daily account, campaign, ad-set, and ad reporting across connected Meta ad accounts. Resend can aggregate sent/received mail, logs, contacts, broadcasts, and templates with `resend_data`. Resume partial exports with the returned `continuation` object; renew an expired signed URL with `client.tools.connections.renew_connected_data_download(artifact_id="artifact_123")`. Use `list_service_connections` for verified grants and per-tool permission blockers, then `describe_service_connection_tool` for the exact provider-native schema before calling through the generic connection bridges.
|
|
58
|
+
|
|
59
|
+
Core operations are flat on the client: `search_serp`, `harvest_paa`, `extract_url`, `map_site_urls`, `extract_site`, `audit_site`, `get_extract_site_status`, `list_jobs`, `get_job`, `get_history`, `get_ledger`.
|
|
60
|
+
|
|
61
|
+
Everything else is namespaced by product area, matching the OpenAPI spec's tags: `client.youtube`, `client.screenshot`, `client.facebook`, `client.google_ads`, `client.instagram`, `client.reddit`, `client.video`, `client.maps`, `client.directory`, `client.serp_intelligence`, `client.workflows`.
|
|
62
|
+
|
|
63
|
+
Typed Pydantic models for every request/response schema are available from `mcpscraper.models` if you want to construct or validate payloads explicitly — the client methods themselves accept plain keyword arguments/dicts and return parsed JSON.
|
|
64
|
+
|
|
65
|
+
### Retry-safe SERP Intelligence captures
|
|
66
|
+
|
|
67
|
+
Pass a stable idempotency key when a capture may be retried. The regular method continues to return the response body; `capture_with_receipt` also returns the key accepted or generated by the server so it can be reused after a timeout or uncertain response:
|
|
68
|
+
|
|
69
|
+
```python
|
|
70
|
+
result = client.serp_intelligence.capture(
|
|
71
|
+
{"query": "roofers near me"},
|
|
72
|
+
idempotency_key="serp-run-2026-07-14-001",
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
receipt = client.serp_intelligence.capture_with_receipt({"query": "roofers near me"})
|
|
76
|
+
print(receipt["data"]["billing"]["creditsUsed"], receipt["idempotency_key"])
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Reusing a key with the same body recovers the original debit and settlement. Reusing it with a different body raises `ScraperApiError` with status `409` and code `idempotency_conflict`.
|
|
80
|
+
|
|
81
|
+
## Scrape → memory vault
|
|
82
|
+
|
|
83
|
+
```python
|
|
84
|
+
page = client.extract_url(url="https://example.com/pricing", depositToVault=True, vaultName="competitors")
|
|
85
|
+
print(page["memory"]) # {"deposited": True, "vault": "competitors", "noteId": "...", "chunks": 4}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Memory tools, using only this API key
|
|
89
|
+
|
|
90
|
+
`client.memory_tools.call_tool(name, args)` dispatches to any of the 87 memory.mcpscraper.dev tools through `POST /memory/mcp-call`, using only this mcpscraper.dev API key — no separate memory key needed:
|
|
91
|
+
|
|
92
|
+
```python
|
|
93
|
+
hits = client.memory_tools.call_tool("searchTool", {"query": "competitor pricing pages"})
|
|
94
|
+
vaults = client.memory_tools.call_tool("listVaultsTool")
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
This generic compatibility bridge remains available, but new integrations should use `client.tools`, whose generated namespaces provide one typed method for every one of the 165 unified MCP tools.
|
|
98
|
+
|
|
99
|
+
## Regenerating models
|
|
100
|
+
|
|
101
|
+
`src/mcpscraper/models.py` is generated from the OpenAPI spec and checked in. After editing `../../contracts/scraper.openapi.yaml`, regenerate with:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
uv run datamodel-codegen \
|
|
105
|
+
--input ../../contracts/scraper.openapi.yaml \
|
|
106
|
+
--input-file-type openapi \
|
|
107
|
+
--output src/mcpscraper/models.py \
|
|
108
|
+
--output-model-type pydantic_v2.BaseModel \
|
|
109
|
+
--field-constraints \
|
|
110
|
+
--use-schema-description \
|
|
111
|
+
--target-python-version 3.10 \
|
|
112
|
+
--disable-timestamp
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## See also
|
|
116
|
+
|
|
117
|
+
[Repo README](../../README.md) (multi-language examples with real sample output) · [`mcpscraper-sdk` on npm](../scraper) (Node, full `memory_tools` typed surface) · [`mcpscraper-memory-sdk` Python source package](../memory-python) · [`mcpscraper-cli`](../cli)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "mcpscraper-sdk"
|
|
3
|
+
version = "0.13.0"
|
|
4
|
+
description = "Official Python client for all 165 mcpscraper.dev MCP tools and the REST API"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
license = "MIT"
|
|
7
|
+
requires-python = ">=3.10"
|
|
8
|
+
dependencies = [
|
|
9
|
+
"requests>=2.31",
|
|
10
|
+
"pydantic>=2.0",
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
[project.urls]
|
|
14
|
+
Repository = "https://github.com/VilovietaSEO/mcpscraper-sdk"
|
|
15
|
+
|
|
16
|
+
[dependency-groups]
|
|
17
|
+
dev = [
|
|
18
|
+
"pytest>=8.0",
|
|
19
|
+
"responses>=0.25",
|
|
20
|
+
"datamodel-code-generator>=0.25",
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
[build-system]
|
|
24
|
+
requires = ["hatchling"]
|
|
25
|
+
build-backend = "hatchling.build"
|
|
26
|
+
|
|
27
|
+
[tool.hatch.build.targets.wheel]
|
|
28
|
+
packages = ["src/mcpscraper"]
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
from .client import ScraperClient
|
|
2
|
+
from .errors import ScraperApiError
|
|
3
|
+
from .mcp_client import McpToolsClient, McpToolError
|
|
4
|
+
from ._mcp_generated_client import MCP_TOOL_BINDINGS, MCP_TOOL_COUNT
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
"ScraperClient", "ScraperApiError", "McpToolsClient", "McpToolError",
|
|
8
|
+
"MCP_TOOL_BINDINGS", "MCP_TOOL_COUNT",
|
|
9
|
+
]
|