scrapeunblocker-mcp 0.3.1 → 0.3.2

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.
Files changed (2) hide show
  1. package/dist/index.js +10 -183
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -10,7 +10,7 @@ import { APIError, ScrapeUnblockerClient } from "scrapeunblocker";
10
10
  import { z } from "zod";
11
11
 
12
12
  // src/plugin-catalog.ts
13
- var CATEGORIES = ["Travel", "Google", "Search engines", "E-commerce", "Classifieds & Resale", "Groceries", "Real estate", "Vehicles", "Jobs", "Reviews & Companies", "Local & Maps", "Apps", "Video, Music & Communities", "SEO & Ads"];
13
+ var CATEGORIES = ["Travel", "Google", "Search engines", "E-commerce", "Classifieds & Resale", "Groceries", "Real estate", "Vehicles", "Jobs", "Reviews & Companies", "Local & Maps", "Apps", "Video & Music", "SEO & Ads"];
14
14
  var PLUGINS = [
15
15
  {
16
16
  "name": "skyscanner_flights",
@@ -5099,7 +5099,7 @@ var PLUGINS = [
5099
5099
  {
5100
5100
  "name": "youtube_channel",
5101
5101
  "title": "Scrape a YouTube channel's videos",
5102
- "category": "Video, Music & Communities",
5102
+ "category": "Video & Music",
5103
5103
  "path": "/content/youtube-channel",
5104
5104
  "fixed": {},
5105
5105
  "description": "Returns a YouTube channel's recent videos as JSON: `videoId`, `title`, `views`, `published`, `thumbnail` and a watch `url`, plus a `channel` summary (name, id). Pass a handle (`@mkbhd`), a channel id (`UC...`) or a channel URL. Returns the channel's first page of videos (about 30).",
@@ -5135,7 +5135,7 @@ var PLUGINS = [
5135
5135
  {
5136
5136
  "name": "youtube_search",
5137
5137
  "title": "Search YouTube",
5138
- "category": "Video, Music & Communities",
5138
+ "category": "Video & Music",
5139
5139
  "path": "/content/youtube-search",
5140
5140
  "fixed": {},
5141
5141
  "description": "Searches YouTube for `query` and returns the results as JSON. For each video: `videoId`, `title`, `url`, `channel` (name/id/url), `publishedText`, `viewCount` (+ text), `lengthSeconds` (+ text), `thumbnails`, `descriptionSnippet`, `badges`, `verified` and `isLive`. Filter with `type` (video / channel / playlist / all) and `sort` (relevance / date / views / rating), and collect up to `max_results` across pages.",
@@ -5175,46 +5175,10 @@ var PLUGINS = [
5175
5175
  }
5176
5176
  ]
5177
5177
  },
5178
- {
5179
- "name": "youtube_comments",
5180
- "title": "Scrape a YouTube video's comments",
5181
- "category": "Video, Music & Communities",
5182
- "path": "/content/youtube-comments",
5183
- "fixed": {},
5184
- "description": "Returns a YouTube video's comments as JSON. For each comment: `commentId`, `author`, `authorChannelId`, `authorThumbnail`, `text`, `likeCount`, `publishedTimeText`, `replyCount`, and the `isPinned`, `isHearted`, `isAuthorVerified` and `isUploader` flags, plus the video `title` and total `commentCount`. Sort by `top` or `newest` and collect up to `max_results` across pages.",
5185
- "params": [
5186
- {
5187
- "name": "video",
5188
- "type": "string",
5189
- "required": true,
5190
- "description": "Video id (dQw4w9WgXcQ) or any YouTube video URL."
5191
- },
5192
- {
5193
- "name": "sort",
5194
- "type": "string",
5195
- "required": false,
5196
- "description": "Comment order: top, newest.",
5197
- "default": "top"
5198
- },
5199
- {
5200
- "name": "max_results",
5201
- "type": "integer",
5202
- "required": false,
5203
- "description": "How many comments to collect across pages (~20 per page).",
5204
- "default": 20
5205
- },
5206
- {
5207
- "name": "proxy_country",
5208
- "type": "string",
5209
- "required": false,
5210
- "description": "Proxy country the request is sent from (ISO-2, e.g. 'US', 'DE') for the watch page. Defaults to US."
5211
- }
5212
- ]
5213
- },
5214
5178
  {
5215
5179
  "name": "youtube_transcript",
5216
5180
  "title": "Get a YouTube video transcript",
5217
- "category": "Video, Music & Communities",
5181
+ "category": "Video & Music",
5218
5182
  "path": "/content/youtube-transcript",
5219
5183
  "fixed": {},
5220
5184
  "description": "Returns a YouTube video's captions as JSON: timestamped `segments` (`start`, `dur`, `text`) and a joined `text`, plus `availableLanguages`, the picked `language`, `isAutoGenerated`, and the video's `title`, `author` and `lengthSeconds`. Pass a video id or any YouTube video URL; choose a caption language with `lang`. Ideal for LLM/RAG pipelines, subtitles and content analysis.",
@@ -5249,7 +5213,7 @@ var PLUGINS = [
5249
5213
  {
5250
5214
  "name": "spotify_search",
5251
5215
  "title": "Scrape Spotify artists, albums, tracks, playlists and search (type=search)",
5252
- "category": "Video, Music & Communities",
5216
+ "category": "Video & Music",
5253
5217
  "path": "/music/spotify",
5254
5218
  "fixed": {
5255
5219
  "type": "search"
@@ -5293,7 +5257,7 @@ var PLUGINS = [
5293
5257
  {
5294
5258
  "name": "spotify_artist",
5295
5259
  "title": "Scrape Spotify artists, albums, tracks, playlists and search (type=artist)",
5296
- "category": "Video, Music & Communities",
5260
+ "category": "Video & Music",
5297
5261
  "path": "/music/spotify",
5298
5262
  "fixed": {
5299
5263
  "type": "artist"
@@ -5324,7 +5288,7 @@ var PLUGINS = [
5324
5288
  {
5325
5289
  "name": "spotify_album",
5326
5290
  "title": "Scrape Spotify artists, albums, tracks, playlists and search (type=album)",
5327
- "category": "Video, Music & Communities",
5291
+ "category": "Video & Music",
5328
5292
  "path": "/music/spotify",
5329
5293
  "fixed": {
5330
5294
  "type": "album"
@@ -5361,7 +5325,7 @@ var PLUGINS = [
5361
5325
  {
5362
5326
  "name": "spotify_track",
5363
5327
  "title": "Scrape Spotify artists, albums, tracks, playlists and search (type=track)",
5364
- "category": "Video, Music & Communities",
5328
+ "category": "Video & Music",
5365
5329
  "path": "/music/spotify",
5366
5330
  "fixed": {
5367
5331
  "type": "track"
@@ -5385,7 +5349,7 @@ var PLUGINS = [
5385
5349
  {
5386
5350
  "name": "spotify_playlist",
5387
5351
  "title": "Scrape Spotify artists, albums, tracks, playlists and search (type=playlist)",
5388
- "category": "Video, Music & Communities",
5352
+ "category": "Video & Music",
5389
5353
  "path": "/music/spotify",
5390
5354
  "fixed": {
5391
5355
  "type": "playlist"
@@ -5419,143 +5383,6 @@ var PLUGINS = [
5419
5383
  }
5420
5384
  ]
5421
5385
  },
5422
- {
5423
- "name": "telegram_channel",
5424
- "title": "Scrape a public Telegram channel: info and posts",
5425
- "category": "Video, Music & Communities",
5426
- "path": "/social/telegram-channel",
5427
- "fixed": {},
5428
- "description": "Reads a public Telegram channel's web preview. Returns `channel` (`username`, `title`, `description`, `avatar`, `verified`, `subscribers` and the other `counters`) and `posts`, newest first: `id`, `url`, `date` (ISO-8601 UTC), `text` (plain), `textHtml`, `views`, `author` (signature), `edited`, `forwardedFrom`, `replyTo`, `media` (photo / video / animation / round_video / voice / audio / document / sticker, with CDN `url`, `thumbnail`, `duration`), `poll`, `linkPreview`, `reactions` (a custom-emoji reaction has its `customEmojiId`, plus the standard `emoji` and `image` Telegram falls back to when the page shows that emoji anywhere), `buttons`, `links`, `hashtags` (the tags Telegram links; a bare '#7' is text) and `mentions`. One page (about 20 posts) by default; `max_posts` (up to 500) pages back through history; `before`, `after` and `since` bound the range, `q` searches inside the channel and `post_id` returns one post. `nextBefore` continues a capped answer. Only channels have a public preview: users, bots, groups and private channels answer 404. Billed one request per page fetched (`pagesFetched`).",
5429
- "params": [
5430
- {
5431
- "name": "channel",
5432
- "type": "string",
5433
- "required": true,
5434
- "description": "Public channel: username ('durov'), '@durov', or a t.me link ('https://t.me/durov', 'https://t.me/s/durov'). A post link ('https://t.me/durov/400') returns that one post."
5435
- },
5436
- {
5437
- "name": "max_posts",
5438
- "type": "integer",
5439
- "required": false,
5440
- "description": "Posts to collect, newest first (1-500), paging back through the channel's history; each page fetched is billed as one request. Omit it for one page, billed once: the newest posts (a page has 20 message slots and an album fills one per photo, so it can hold fewer posts)."
5441
- },
5442
- {
5443
- "name": "before",
5444
- "type": "integer",
5445
- "required": false,
5446
- "description": "Only posts with an id below this one. Pass `nextBefore` of a previous response to continue where it stopped."
5447
- },
5448
- {
5449
- "name": "after",
5450
- "type": "integer",
5451
- "required": false,
5452
- "description": "Stop at this post id: only posts with a higher id are returned."
5453
- },
5454
- {
5455
- "name": "since",
5456
- "type": "string",
5457
- "required": false,
5458
- "description": "Stop at this date: only posts published on or after it (YYYY-MM-DD or an ISO-8601 datetime, UTC when no offset is given)."
5459
- },
5460
- {
5461
- "name": "q",
5462
- "type": "string",
5463
- "required": false,
5464
- "description": "Search inside the channel: only posts matching this text."
5465
- },
5466
- {
5467
- "name": "post_id",
5468
- "type": "integer",
5469
- "required": false,
5470
- "description": "Return only this post (a post id of the channel)."
5471
- },
5472
- {
5473
- "name": "proxy_country",
5474
- "type": "string",
5475
- "required": false,
5476
- "description": "Proxy country the request is sent from (ISO-2, e.g. 'US', 'DE'). Leave blank to let the API pick."
5477
- }
5478
- ]
5479
- },
5480
- {
5481
- "name": "quora_question",
5482
- "title": "Scrape Quora questions, answers and profiles (mode=question)",
5483
- "category": "Video, Music & Communities",
5484
- "path": "/social/quora",
5485
- "fixed": {
5486
- "mode": "question"
5487
- },
5488
- "description": "Given a Quora `question` (URL or slug), returns the `question` (`qid`, `title`, `url`, `answerCount`, `allRelatedCount`, `followerCount`, `commentCount`, `topics`) and its `answers`: `id`, `url`, `relation` (`answer`, `merged` for an answer to a question Quora merged into this one, `related` with `include_related=true`), the answered `question`, `author` (`name`, `uid`, `profileUrl`, `imageUrl`, `credential`, `isVerified`, `isAnonymous`), the full `text` with `images` and `links`, `upvotes`, `views`, `shares`, `comments`, `createdAt`, `updatedAt` and `isAiGenerated`; plus `relatedQuestions`. Answers are in Quora's own order, up to `max_answers` (10 per page after the first few), unique within a call. `nextCursor` as `cursor` continues, best-effort: Quora re-ranks the list on every visit, so a continuation can repeat or skip answers of earlier calls (dedupe by `id`); for a complete list ask for a larger `max_answers` in one call (up to 300). `mode=profile&profile=` returns a public `profile` (`name`, `headline`, `description`, follower / following / answer / question / post counts, `contentViews`, `credentials`, `knowsAbout`, `spaces`, `topWriterYears`, `joinedAt`) with its newest `answers`. No login: only what Quora shows an anonymous visitor - Quora's search is not available that way, and Quora lists only a profile's newest few dozen answers to logged-out visitors (`pagingStopped`: `quora_logged_out_limit`). `pagingStopped` otherwise names why paging ended early (`blocked`, `time`, `unavailable`). Billed one unit per page fetched (`pagesFetched`); a `cursor` continuation bills only its GraphQL pages.",
5489
- "params": [
5490
- {
5491
- "name": "question",
5492
- "type": "string",
5493
- "required": true,
5494
- "description": "Quora question URL (https://www.quora.com/What-is-the-best-way-to-learn-programming), an answer URL on it, or the question slug (What-is-the-best-way-to-learn-programming). Language editions such as es.quora.com are accepted as URLs. Required with mode=question."
5495
- },
5496
- {
5497
- "name": "max_answers",
5498
- "type": "integer",
5499
- "required": false,
5500
- "description": "Answers to return: 1-300 with mode=question (default 20), 0-200 with mode=profile (default 10; 0 = profile only). Answers come 10 per page after the first few; each page is one billed unit."
5501
- },
5502
- {
5503
- "name": "include_related",
5504
- "type": "boolean",
5505
- "required": false,
5506
- "description": "mode=question: also return the answers Quora shows from related questions (its 'All related' view, `relation`='related'). By default only answers to this question and to questions merged into it.",
5507
- "default": false
5508
- },
5509
- {
5510
- "name": "cursor",
5511
- "type": "string",
5512
- "required": false,
5513
- "description": "Continue after a previous call: pass its `nextCursor`. Best-effort: each call is a new Quora visit and Quora re-ranks the list per visit, so a continuation can repeat or skip answers of earlier calls - dedupe by answer `id`. For a complete list ask for a larger `max_answers` in one call (up to 300)."
5514
- },
5515
- {
5516
- "name": "proxy_country",
5517
- "type": "string",
5518
- "required": false,
5519
- "description": "Proxy country the request is sent from (ISO-2, e.g. 'US', 'DE'). Leave blank for the countries chosen for the site."
5520
- }
5521
- ]
5522
- },
5523
- {
5524
- "name": "quora_profile",
5525
- "title": "Scrape Quora questions, answers and profiles (mode=profile)",
5526
- "category": "Video, Music & Communities",
5527
- "path": "/social/quora",
5528
- "fixed": {
5529
- "mode": "profile"
5530
- },
5531
- "description": "Given a Quora `question` (URL or slug), returns the `question` (`qid`, `title`, `url`, `answerCount`, `allRelatedCount`, `followerCount`, `commentCount`, `topics`) and its `answers`: `id`, `url`, `relation` (`answer`, `merged` for an answer to a question Quora merged into this one, `related` with `include_related=true`), the answered `question`, `author` (`name`, `uid`, `profileUrl`, `imageUrl`, `credential`, `isVerified`, `isAnonymous`), the full `text` with `images` and `links`, `upvotes`, `views`, `shares`, `comments`, `createdAt`, `updatedAt` and `isAiGenerated`; plus `relatedQuestions`. Answers are in Quora's own order, up to `max_answers` (10 per page after the first few), unique within a call. `nextCursor` as `cursor` continues, best-effort: Quora re-ranks the list on every visit, so a continuation can repeat or skip answers of earlier calls (dedupe by `id`); for a complete list ask for a larger `max_answers` in one call (up to 300). `mode=profile&profile=` returns a public `profile` (`name`, `headline`, `description`, follower / following / answer / question / post counts, `contentViews`, `credentials`, `knowsAbout`, `spaces`, `topWriterYears`, `joinedAt`) with its newest `answers`. No login: only what Quora shows an anonymous visitor - Quora's search is not available that way, and Quora lists only a profile's newest few dozen answers to logged-out visitors (`pagingStopped`: `quora_logged_out_limit`). `pagingStopped` otherwise names why paging ended early (`blocked`, `time`, `unavailable`). Billed one unit per page fetched (`pagesFetched`); a `cursor` continuation bills only its GraphQL pages.",
5532
- "params": [
5533
- {
5534
- "name": "profile",
5535
- "type": "string",
5536
- "required": true,
5537
- "description": "Quora profile URL (https://www.quora.com/profile/Adam-DAngelo) or profile slug (Adam-DAngelo). Required with mode=profile."
5538
- },
5539
- {
5540
- "name": "max_answers",
5541
- "type": "integer",
5542
- "required": false,
5543
- "description": "Answers to return: 1-300 with mode=question (default 20), 0-200 with mode=profile (default 10; 0 = profile only). Answers come 10 per page after the first few; each page is one billed unit."
5544
- },
5545
- {
5546
- "name": "cursor",
5547
- "type": "string",
5548
- "required": false,
5549
- "description": "Continue after a previous call: pass its `nextCursor`. Best-effort: each call is a new Quora visit and Quora re-ranks the list per visit, so a continuation can repeat or skip answers of earlier calls - dedupe by answer `id`. For a complete list ask for a larger `max_answers` in one call (up to 300)."
5550
- },
5551
- {
5552
- "name": "proxy_country",
5553
- "type": "string",
5554
- "required": false,
5555
- "description": "Proxy country the request is sent from (ISO-2, e.g. 'US', 'DE'). Leave blank for the countries chosen for the site."
5556
- }
5557
- ]
5558
- },
5559
5386
  {
5560
5387
  "name": "similarweb_overview",
5561
5388
  "title": "Get a website's Similarweb traffic overview",
@@ -5830,7 +5657,7 @@ ${details(plugin)}`, true);
5830
5657
  }
5831
5658
 
5832
5659
  // src/index.ts
5833
- var VERSION = "0.3.1";
5660
+ var VERSION = "0.3.2";
5834
5661
  var DEFAULT_BASE_URL = "https://api.scrapeunblocker.com";
5835
5662
  var API_KEY_HEADER = "x-scrapeunblocker-key";
5836
5663
  function resolveApiKey() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scrapeunblocker-mcp",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "mcpName": "com.scrapeunblocker/scrapeunblocker-mcp",
5
5
  "description": "Model Context Protocol (MCP) server for ScrapeUnblocker - lets Claude fetch any web page's HTML (or AI-parsed JSON) and run 100+ site plugins that return structured JSON, through the ScrapeUnblocker anti-bot API, using your own API key.",
6
6
  "keywords": [