@decodo/mcp-server 1.0.3 → 1.1.1

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 (158) hide show
  1. package/README.md +93 -34
  2. package/build/clients/scraper-api-client.js +78 -16
  3. package/build/clients/scraper-api-client.js.map +1 -1
  4. package/build/constants.js +35 -1
  5. package/build/constants.js.map +1 -1
  6. package/build/index.js +11 -11
  7. package/build/index.js.map +1 -1
  8. package/build/server/sapi-base-server.js +76 -0
  9. package/build/server/sapi-base-server.js.map +1 -0
  10. package/build/server/sapi-http-server.js +11 -0
  11. package/build/server/sapi-http-server.js.map +1 -0
  12. package/build/server/sapi-stdio-server.js +11 -0
  13. package/build/server/sapi-stdio-server.js.map +1 -0
  14. package/build/server.js +53 -0
  15. package/build/server.js.map +1 -0
  16. package/build/tools/amazon-bestsellers/amazon-bestsellers-tool.js +55 -0
  17. package/build/tools/amazon-bestsellers/amazon-bestsellers-tool.js.map +1 -0
  18. package/build/tools/amazon-bestsellers/index.js +18 -0
  19. package/build/tools/amazon-bestsellers/index.js.map +1 -0
  20. package/build/tools/amazon-pricing/amazon-pricing-tool.js +67 -0
  21. package/build/tools/amazon-pricing/amazon-pricing-tool.js.map +1 -0
  22. package/build/tools/amazon-pricing/index.js +18 -0
  23. package/build/tools/amazon-pricing/index.js.map +1 -0
  24. package/build/tools/amazon-product/amazon-product-tool.js +62 -0
  25. package/build/tools/amazon-product/amazon-product-tool.js.map +1 -0
  26. package/build/tools/amazon-product/index.js +18 -0
  27. package/build/tools/amazon-product/index.js.map +1 -0
  28. package/build/tools/amazon-search/amazon-search-tool.js +63 -0
  29. package/build/tools/amazon-search/amazon-search-tool.js.map +1 -0
  30. package/build/tools/amazon-search/index.js +18 -0
  31. package/build/tools/amazon-search/index.js.map +1 -0
  32. package/build/tools/amazon-sellers/amazon-sellers-tool.js +56 -0
  33. package/build/tools/amazon-sellers/amazon-sellers-tool.js.map +1 -0
  34. package/build/tools/amazon-sellers/index.js +18 -0
  35. package/build/tools/amazon-sellers/index.js.map +1 -0
  36. package/build/tools/bing-search/bing-search-tool.js +64 -0
  37. package/build/tools/bing-search/bing-search-tool.js.map +1 -0
  38. package/build/tools/bing-search/index.js +18 -0
  39. package/build/tools/bing-search/index.js.map +1 -0
  40. package/build/tools/chatgpt/chatgpt-tool.js +47 -0
  41. package/build/tools/chatgpt/chatgpt-tool.js.map +1 -0
  42. package/build/tools/chatgpt/index.js +18 -0
  43. package/build/tools/chatgpt/index.js.map +1 -0
  44. package/build/tools/google-ads/google-ads-tool.js +59 -0
  45. package/build/tools/google-ads/google-ads-tool.js.map +1 -0
  46. package/build/tools/google-ads/index.js +18 -0
  47. package/build/tools/google-ads/index.js.map +1 -0
  48. package/build/tools/google-ai-mode/google-ai-mode-tool.js +50 -0
  49. package/build/tools/google-ai-mode/google-ai-mode-tool.js.map +1 -0
  50. package/build/tools/google-ai-mode/index.js +18 -0
  51. package/build/tools/google-ai-mode/index.js.map +1 -0
  52. package/build/tools/google-lens/google-lens-tool.js +52 -0
  53. package/build/tools/google-lens/google-lens-tool.js.map +1 -0
  54. package/build/tools/google-lens/index.js +18 -0
  55. package/build/tools/google-lens/index.js.map +1 -0
  56. package/build/tools/google-search/google-search-tool.js +60 -0
  57. package/build/tools/google-search/google-search-tool.js.map +1 -0
  58. package/build/tools/google-search/index.js +18 -0
  59. package/build/tools/google-search/index.js.map +1 -0
  60. package/build/tools/google-travel-hotels/google-travel-hotels-tool.js +52 -0
  61. package/build/tools/google-travel-hotels/google-travel-hotels-tool.js.map +1 -0
  62. package/build/tools/google-travel-hotels/index.js +18 -0
  63. package/build/tools/google-travel-hotels/index.js.map +1 -0
  64. package/build/tools/index.js +30 -5
  65. package/build/tools/index.js.map +1 -1
  66. package/build/tools/perplexity/index.js +18 -0
  67. package/build/tools/perplexity/index.js.map +1 -0
  68. package/build/tools/perplexity/perplexity-tool.js +46 -0
  69. package/build/tools/perplexity/perplexity-tool.js.map +1 -0
  70. package/build/tools/reddit-post/index.js +18 -0
  71. package/build/tools/reddit-post/index.js.map +1 -0
  72. package/build/tools/reddit-post/reddit-post-tool.js +51 -0
  73. package/build/tools/reddit-post/reddit-post-tool.js.map +1 -0
  74. package/build/tools/reddit-subreddit/index.js +18 -0
  75. package/build/tools/reddit-subreddit/index.js.map +1 -0
  76. package/build/tools/reddit-subreddit/reddit-subreddit-tool.js +49 -0
  77. package/build/tools/reddit-subreddit/reddit-subreddit-tool.js.map +1 -0
  78. package/build/tools/reddit-user/index.js +18 -0
  79. package/build/tools/reddit-user/index.js.map +1 -0
  80. package/build/tools/reddit-user/reddit-user-tool.js +55 -0
  81. package/build/tools/reddit-user/reddit-user-tool.js.map +1 -0
  82. package/build/tools/scrape-as-markdown/index.js +18 -0
  83. package/build/tools/scrape-as-markdown/index.js.map +1 -0
  84. package/build/tools/scrape-as-markdown/scrape-as-markdown-tool.js +79 -0
  85. package/build/tools/scrape-as-markdown/scrape-as-markdown-tool.js.map +1 -0
  86. package/build/tools/screenshot/index.js +18 -0
  87. package/build/tools/screenshot/index.js.map +1 -0
  88. package/build/tools/screenshot/screenshot-tool.js +48 -0
  89. package/build/tools/screenshot/screenshot-tool.js.map +1 -0
  90. package/build/tools/target-product/index.js +18 -0
  91. package/build/tools/target-product/index.js.map +1 -0
  92. package/build/tools/target-product/target-product-tool.js +50 -0
  93. package/build/tools/target-product/target-product-tool.js.map +1 -0
  94. package/build/tools/target-search/index.js +18 -0
  95. package/build/tools/target-search/index.js.map +1 -0
  96. package/build/tools/target-search/target-search-tool.js +56 -0
  97. package/build/tools/target-search/target-search-tool.js.map +1 -0
  98. package/build/tools/tiktok-post/index.js +18 -0
  99. package/build/tools/tiktok-post/index.js.map +1 -0
  100. package/build/tools/tiktok-post/tiktok-post-tool.js +48 -0
  101. package/build/tools/tiktok-post/tiktok-post-tool.js.map +1 -0
  102. package/build/tools/tiktok-shop-product/index.js +18 -0
  103. package/build/tools/tiktok-shop-product/index.js.map +1 -0
  104. package/build/tools/tiktok-shop-product/tiktok-shop-product-tool.js +47 -0
  105. package/build/tools/tiktok-shop-product/tiktok-shop-product-tool.js.map +1 -0
  106. package/build/tools/tiktok-shop-search/index.js +18 -0
  107. package/build/tools/tiktok-shop-search/index.js.map +1 -0
  108. package/build/tools/tiktok-shop-search/tiktok-shop-search-tool.js +54 -0
  109. package/build/tools/tiktok-shop-search/tiktok-shop-search-tool.js.map +1 -0
  110. package/build/tools/tiktok-shop-url/index.js +18 -0
  111. package/build/tools/tiktok-shop-url/index.js.map +1 -0
  112. package/build/tools/tiktok-shop-url/tiktok-shop-url-tool.js +45 -0
  113. package/build/tools/tiktok-shop-url/tiktok-shop-url-tool.js.map +1 -0
  114. package/build/tools/tool.js +7 -0
  115. package/build/tools/tool.js.map +1 -0
  116. package/build/tools/walmart-product/index.js +18 -0
  117. package/build/tools/walmart-product/index.js.map +1 -0
  118. package/build/tools/walmart-product/walmart-product-tool.js +61 -0
  119. package/build/tools/walmart-product/walmart-product-tool.js.map +1 -0
  120. package/build/tools/walmart-search/index.js +18 -0
  121. package/build/tools/walmart-search/index.js.map +1 -0
  122. package/build/tools/walmart-search/walmart-search-tool.js +62 -0
  123. package/build/tools/walmart-search/walmart-search-tool.js.map +1 -0
  124. package/build/tools/youtube-channel/index.js +18 -0
  125. package/build/tools/youtube-channel/index.js.map +1 -0
  126. package/build/tools/youtube-channel/youtube-channel-tool.js +48 -0
  127. package/build/tools/youtube-channel/youtube-channel-tool.js.map +1 -0
  128. package/build/tools/youtube-metadata/index.js +18 -0
  129. package/build/tools/youtube-metadata/index.js.map +1 -0
  130. package/build/tools/youtube-metadata/youtube-metadata-tool.js +43 -0
  131. package/build/tools/youtube-metadata/youtube-metadata-tool.js.map +1 -0
  132. package/build/tools/youtube-search/index.js +18 -0
  133. package/build/tools/youtube-search/index.js.map +1 -0
  134. package/build/tools/youtube-search/youtube-search-tool.js +43 -0
  135. package/build/tools/youtube-search/youtube-search-tool.js.map +1 -0
  136. package/build/tools/youtube-subtitles/index.js +18 -0
  137. package/build/tools/youtube-subtitles/index.js.map +1 -0
  138. package/build/tools/youtube-subtitles/youtube-subtitles-tool.js +48 -0
  139. package/build/tools/youtube-subtitles/youtube-subtitles-tool.js.map +1 -0
  140. package/build/utils.js +14 -3
  141. package/build/utils.js.map +1 -1
  142. package/build/zod/zod-types.js +12 -4
  143. package/build/zod/zod-types.js.map +1 -1
  144. package/package.json +37 -12
  145. package/build/sapi-mcp-server.js +0 -40
  146. package/build/sapi-mcp-server.js.map +0 -1
  147. package/build/tools/amazon-search-parsed-tool.js +0 -46
  148. package/build/tools/amazon-search-parsed-tool.js.map +0 -1
  149. package/build/tools/google-search-parsed-tool.js +0 -54
  150. package/build/tools/google-search-parsed-tool.js.map +0 -1
  151. package/build/tools/reddit-post-tool.js +0 -34
  152. package/build/tools/reddit-post-tool.js.map +0 -1
  153. package/build/tools/reddit-subreddit-tool.js +0 -34
  154. package/build/tools/reddit-subreddit-tool.js.map +0 -1
  155. package/build/tools/scrape-as-markdown-tool.js +0 -70
  156. package/build/tools/scrape-as-markdown-tool.js.map +0 -1
  157. package/build/tools/scrape-tool.js +0 -70
  158. package/build/tools/scrape-tool.js.map +0 -1
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./youtube-subtitles-tool"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/youtube-subtitles/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.YoutubeSubtitlesTool = void 0;
7
+ const zod_1 = __importDefault(require("zod"));
8
+ const constants_1 = require("../../constants");
9
+ const tool_1 = require("../tool");
10
+ const zodLanguageCode = zod_1.default
11
+ .string()
12
+ .describe('Language code for subtitles (e.g., "en", "es")')
13
+ .optional();
14
+ class YoutubeSubtitlesTool extends tool_1.Tool {
15
+ constructor() {
16
+ super(...arguments);
17
+ this.toolset = constants_1.TOOLSET.SOCIAL_MEDIA;
18
+ this.transformResponse = ({ data }) => {
19
+ return { data: JSON.stringify(data) };
20
+ };
21
+ this.register = ({ server, sapiClient, auth }) => {
22
+ server.registerTool('youtube_subtitles', {
23
+ description: 'Scrape YouTube video subtitles',
24
+ inputSchema: {
25
+ query: zod_1.default.string().describe('YouTube video ID (e.g., "L8zSWbQN-v8")'),
26
+ language_code: zodLanguageCode,
27
+ },
28
+ annotations: {
29
+ readOnlyHint: true,
30
+ openWorldHint: true,
31
+ },
32
+ }, async (scrapingParams) => {
33
+ const params = Object.assign(Object.assign({}, scrapingParams), { target: constants_1.SCRAPER_API_TARGETS.YOUTUBE_SUBTITLES });
34
+ const { data } = await sapiClient.scrape({ auth, scrapingParams: params });
35
+ return {
36
+ content: [
37
+ {
38
+ type: 'text',
39
+ text: JSON.stringify(data),
40
+ },
41
+ ],
42
+ };
43
+ });
44
+ };
45
+ }
46
+ }
47
+ exports.YoutubeSubtitlesTool = YoutubeSubtitlesTool;
48
+ //# sourceMappingURL=youtube-subtitles-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"youtube-subtitles-tool.js","sourceRoot":"","sources":["../../../src/tools/youtube-subtitles/youtube-subtitles-tool.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAoB;AAEpB,+CAA+D;AAC/D,kCAAqD;AAErD,MAAM,eAAe,GAAG,aAAC;KACtB,MAAM,EAAE;KACR,QAAQ,CAAC,gDAAgD,CAAC;KAC1D,QAAQ,EAAE,CAAC;AAEd,MAAa,oBAAqB,SAAQ,WAAI;IAA9C;;QACE,YAAO,GAAG,mBAAO,CAAC,YAAY,CAAC;QAE/B,sBAAiB,GAAG,CAAC,EAAE,IAAI,EAAoB,EAAE,EAAE;YACjD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,CAAC,CAAC;QAEF,aAAQ,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAwB,EAAE,EAAE;YAChE,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;gBACE,WAAW,EAAE,gCAAgC;gBAC7C,WAAW,EAAE;oBACX,KAAK,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;oBACpE,aAAa,EAAE,eAAe;iBAC/B;gBACD,WAAW,EAAE;oBACX,YAAY,EAAE,IAAI;oBAClB,aAAa,EAAE,IAAI;iBACpB;aACF,EACD,KAAK,EAAE,cAAiC,EAAE,EAAE;gBAC1C,MAAM,MAAM,GAAG,gCACV,cAAc,KACjB,MAAM,EAAE,+BAAmB,CAAC,iBAAiB,GACnB,CAAC;gBAE7B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,MAAM,CAAS,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;gBAEnF,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;yBAC3B;qBACF;iBACF,CAAC;YACJ,CAAC,CACF,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;CAAA;AAxCD,oDAwCC"}
package/build/utils.js CHANGED
@@ -1,6 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.removeKeyFromNestedObject = void 0;
3
+ exports.removeKeyFromNestedObject = exports.resolveToolsets = void 0;
4
+ const resolveToolsets = (toolsets) => {
5
+ if (!(toolsets === null || toolsets === void 0 ? void 0 : toolsets.trim())) {
6
+ return [];
7
+ }
8
+ return toolsets
9
+ .split(',')
10
+ .map(s => s.trim())
11
+ .filter(Boolean);
12
+ };
13
+ exports.resolveToolsets = resolveToolsets;
4
14
  const removeKeyFromNestedObject = ({ obj, keyToRemove, }) => {
5
15
  if (typeof obj !== 'object' || obj === null) {
6
16
  return obj;
@@ -8,12 +18,13 @@ const removeKeyFromNestedObject = ({ obj, keyToRemove, }) => {
8
18
  if (Array.isArray(obj)) {
9
19
  return obj.map(item => (0, exports.removeKeyFromNestedObject)({ obj: item, keyToRemove }));
10
20
  }
21
+ const record = obj;
11
22
  const newObj = {};
12
- for (const key in obj) {
23
+ for (const key in record) {
13
24
  if (key === keyToRemove) {
14
25
  continue;
15
26
  }
16
- newObj[key] = (0, exports.removeKeyFromNestedObject)({ obj: obj[key], keyToRemove });
27
+ newObj[key] = (0, exports.removeKeyFromNestedObject)({ obj: record[key], keyToRemove });
17
28
  }
18
29
  return newObj;
19
30
  };
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAAO,MAAM,yBAAyB,GAAG,CAAC,EACxC,GAAG,EACH,WAAW,GAIZ,EAAU,EAAE;IACX,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAA,iCAAyB,EAAC,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,MAAM,GAAG,EAAE,CAAC;IAElB,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,GAAG,IAAA,iCAAyB,EAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AA1BW,QAAA,yBAAyB,6BA0BpC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAEO,MAAM,eAAe,GAAG,CAAC,QAAiB,EAAa,EAAE;IAC9D,IAAI,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,EAAE,CAAA,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,QAAQ;SACZ,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SAClB,MAAM,CAAC,OAAO,CAAc,CAAC;AAClC,CAAC,CAAC;AATW,QAAA,eAAe,mBAS1B;AAEK,MAAM,yBAAyB,GAAG,CAAC,EACxC,GAAG,EACH,WAAW,GAIZ,EAAU,EAAE;IACX,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAA,iCAAyB,EAAC,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,GAAG,IAAA,iCAAyB,EAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAW,EAAE,WAAW,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AA3BW,QAAA,yBAAyB,6BA2BpC"}
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.zodFullResponse = exports.zodTokenLimit = exports.zodJsRender = exports.zodLocale = exports.zodGeo = void 0;
6
+ exports.zodDeviceType = exports.zodCountry = exports.zodTokenLimit = exports.zodXhr = exports.zodJsRender = exports.zodLocale = exports.zodGeo = void 0;
7
7
  const zod_1 = __importDefault(require("zod"));
8
8
  exports.zodGeo = zod_1.default
9
9
  .string()
@@ -14,12 +14,20 @@ exports.zodJsRender = zod_1.default
14
14
  .boolean()
15
15
  .describe('Should the request be opened in a headless browser, false by default')
16
16
  .optional();
17
+ exports.zodXhr = zod_1.default
18
+ .boolean()
19
+ .describe('When true, includes XHR/fetch responses in the scrape result where supported by the target')
20
+ .optional();
17
21
  exports.zodTokenLimit = zod_1.default
18
22
  .number()
19
23
  .describe(`The number of tokens to return in the response - anything above this limit will be truncated`)
20
24
  .optional();
21
- exports.zodFullResponse = zod_1.default
22
- .boolean()
23
- .describe(`If true, content will not be truncated`)
25
+ exports.zodCountry = zod_1.default
26
+ .string()
27
+ .describe('Country code for the request (e.g., US, GB, DE)')
28
+ .optional();
29
+ exports.zodDeviceType = zod_1.default
30
+ .enum(['desktop', 'mobile', 'tablet'])
31
+ .describe('Device type to emulate for the request')
24
32
  .optional();
25
33
  //# sourceMappingURL=zod-types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zod-types.js","sourceRoot":"","sources":["../../src/zod/zod-types.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAoB;AAEP,QAAA,MAAM,GAAG,aAAC;KACpB,MAAM,EAAE;KACR,QAAQ,CAAC,iEAAiE,CAAC;KAC3E,QAAQ,EAAE,CAAC;AAED,QAAA,SAAS,GAAG,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC,QAAQ,EAAE,CAAC;AAE5E,QAAA,WAAW,GAAG,aAAC;KACzB,OAAO,EAAE;KACT,QAAQ,CAAC,sEAAsE,CAAC;KAChF,QAAQ,EAAE,CAAC;AAED,QAAA,aAAa,GAAG,aAAC;KAC3B,MAAM,EAAE;KACR,QAAQ,CACP,8FAA8F,CAC/F;KACA,QAAQ,EAAE,CAAC;AAED,QAAA,eAAe,GAAG,aAAC;KAC7B,OAAO,EAAE;KACT,QAAQ,CAAC,wCAAwC,CAAC;KAClD,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"zod-types.js","sourceRoot":"","sources":["../../src/zod/zod-types.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAoB;AAEP,QAAA,MAAM,GAAG,aAAC;KACpB,MAAM,EAAE;KACR,QAAQ,CAAC,iEAAiE,CAAC;KAC3E,QAAQ,EAAE,CAAC;AAED,QAAA,SAAS,GAAG,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC,QAAQ,EAAE,CAAC;AAE5E,QAAA,WAAW,GAAG,aAAC;KACzB,OAAO,EAAE;KACT,QAAQ,CAAC,sEAAsE,CAAC;KAChF,QAAQ,EAAE,CAAC;AAED,QAAA,MAAM,GAAG,aAAC;KACpB,OAAO,EAAE;KACT,QAAQ,CACP,4FAA4F,CAC7F;KACA,QAAQ,EAAE,CAAC;AAED,QAAA,aAAa,GAAG,aAAC;KAC3B,MAAM,EAAE;KACR,QAAQ,CACP,8FAA8F,CAC/F;KACA,QAAQ,EAAE,CAAC;AAED,QAAA,UAAU,GAAG,aAAC;KACxB,MAAM,EAAE;KACR,QAAQ,CAAC,iDAAiD,CAAC;KAC3D,QAAQ,EAAE,CAAC;AAED,QAAA,aAAa,GAAG,aAAC;KAC3B,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;KACrC,QAAQ,CAAC,wCAAwC,CAAC;KAClD,QAAQ,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,37 +1,62 @@
1
1
  {
2
2
  "name": "@decodo/mcp-server",
3
- "version": "1.0.3",
4
- "description": "",
3
+ "version": "1.1.1",
4
+ "description": "Decodo MCP Server",
5
5
  "bin": {
6
6
  "decodo-mcp": "./build/index.js"
7
7
  },
8
8
  "main": "index.js",
9
9
  "mcpName": "io.github.Decodo/mcp-web-scraper",
10
10
  "scripts": {
11
- "build": "tsc && chmod 755 build/index.js",
12
- "dev": "pnpm run build && mcp-inspector",
13
- "test": "jest"
11
+ "build": "tsc && chmod 755 build/server.js",
12
+ "dev": "nodemon --watch src -e ts --exec 'tsx src/server.ts'",
13
+ "start": "node build/server.js",
14
+ "inspect": "mcp-inspector",
15
+ "test": "jest",
16
+ "lint": "eslint src/",
17
+ "release": "semantic-release"
14
18
  },
15
19
  "keywords": [],
16
20
  "author": "",
17
21
  "license": "ISC",
22
+ "publishConfig": {
23
+ "access": "public"
24
+ },
18
25
  "files": [
19
26
  "build"
20
27
  ],
28
+ "dependencies": {
29
+ "@modelcontextprotocol/sdk": "^1.12.3",
30
+ "axios": "^1.15.0",
31
+ "dotenv": "^16.5.0",
32
+ "node-html-markdown": "^1.3.0",
33
+ "tsx": "^4.21.0"
34
+ },
21
35
  "devDependencies": {
22
- "@modelcontextprotocol/inspector": "^0.14.0",
36
+ "@eslint/js": "^10.0.1",
37
+ "@modelcontextprotocol/inspector": "^0.21.1",
38
+ "@semantic-release/changelog": "^6.0.3",
39
+ "@semantic-release/git": "^10.0.1",
40
+ "@semantic-release/github": "^12.0.6",
41
+ "@semantic-release/npm": "^13.1.5",
42
+ "@types/express": "^5.0.1",
23
43
  "@types/jest": "^30.0.0",
24
44
  "@types/node": "^24.0.0",
45
+ "eslint": "^10.2.1",
25
46
  "jest": "^30.0.0",
26
- "mcps-logger": "^1.0.0",
47
+ "nodemon": "^3.1.14",
48
+ "semantic-release": "^25.0.3",
27
49
  "ts-jest": "^29.4.0",
28
50
  "typescript": "^5.8.3",
51
+ "typescript-eslint": "^8.58.2",
29
52
  "zod": "^3.25.57"
30
53
  },
31
- "dependencies": {
32
- "@modelcontextprotocol/sdk": "^1.12.3",
33
- "axios": "^1.9.0",
34
- "dotenv": "^16.5.0",
35
- "node-html-markdown": "^1.3.0"
54
+ "repository": {
55
+ "type": "git",
56
+ "url": "https://github.com/Decodo/mcp-server.git"
57
+ },
58
+ "homepage": "https://github.com/Decodo/mcp-server#readme",
59
+ "bugs": {
60
+ "url": "https://github.com/Decodo/mcp-server/issues"
36
61
  }
37
62
  }
@@ -1,40 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ScraperAPIMCPServer = void 0;
4
- const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
5
- const scraper_api_client_1 = require("./clients/scraper-api-client");
6
- const tools_1 = require("./tools");
7
- class ScraperAPIMCPServer {
8
- constructor({ sapiUsername, sapiPassword }) {
9
- this.server = new mcp_js_1.McpServer({
10
- name: 'decodo',
11
- version: '0.1.0',
12
- capabilities: {
13
- logging: {},
14
- resources: {},
15
- tools: {},
16
- },
17
- });
18
- const auth = Buffer.from(`${sapiUsername}:${sapiPassword}`).toString('base64');
19
- this.sapiClient = new scraper_api_client_1.ScraperApiClient({ auth });
20
- this.registerTools();
21
- this.registerResources();
22
- }
23
- connect(transport) {
24
- this.server.connect(transport);
25
- }
26
- registerTools() {
27
- // scrape
28
- tools_1.ScrapeAsMarkdownTool.register({ server: this.server, sapiClient: this.sapiClient });
29
- // targets
30
- tools_1.GoogleSearchParsedTool.register({ server: this.server, sapiClient: this.sapiClient });
31
- tools_1.AmazonSearchParsedTool.register({ server: this.server, sapiClient: this.sapiClient });
32
- tools_1.RedditPostTool.register({ server: this.server, sapiClient: this.sapiClient });
33
- tools_1.RedditSubredditTool.register({ server: this.server, sapiClient: this.sapiClient });
34
- }
35
- registerResources() {
36
- // todo: expose info about all targets available
37
- }
38
- }
39
- exports.ScraperAPIMCPServer = ScraperAPIMCPServer;
40
- //# sourceMappingURL=sapi-mcp-server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sapi-mcp-server.js","sourceRoot":"","sources":["../src/sapi-mcp-server.ts"],"names":[],"mappings":";;;AAAA,oEAAoE;AAEpE,qEAAgE;AAChE,mCAMiB;AAEjB,MAAa,mBAAmB;IAK9B,YAAY,EAAE,YAAY,EAAE,YAAY,EAAkD;QACxF,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAS,CAAC;YAC1B,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,OAAO;YAChB,YAAY,EAAE;gBACZ,OAAO,EAAE,EAAE;gBACX,SAAS,EAAE,EAAE;gBACb,KAAK,EAAE,EAAE;aACV;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,IAAI,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAE/E,IAAI,CAAC,UAAU,GAAG,IAAI,qCAAgB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjD,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO,CAAC,SAA+B;QACrC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAED,aAAa;QACX,SAAS;QACT,4BAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAEpF,UAAU;QACV,8BAAsB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QACtF,8BAAsB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QACtF,sBAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9E,2BAAmB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,iBAAiB;QACf,gDAAgD;IAClD,CAAC;CACF;AA1CD,kDA0CC"}
@@ -1,46 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- var _a;
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.AmazonSearchParsedTool = void 0;
8
- const zod_1 = __importDefault(require("zod"));
9
- const constants_1 = require("../constants");
10
- const utils_1 = require("../utils");
11
- const zod_types_1 = require("../zod/zod-types");
12
- class AmazonSearchParsedTool {
13
- }
14
- exports.AmazonSearchParsedTool = AmazonSearchParsedTool;
15
- _a = AmazonSearchParsedTool;
16
- AmazonSearchParsedTool.FIELDS_WITH_HIGH_CHAR_COUNT = ['suggested', 'amazons_choices', 'refinements'];
17
- AmazonSearchParsedTool.transformAutoParsedResponse = ({ obj }) => {
18
- for (const fieldToRemove of _a.FIELDS_WITH_HIGH_CHAR_COUNT) {
19
- obj = (0, utils_1.removeKeyFromNestedObject)({ obj, keyToRemove: fieldToRemove });
20
- }
21
- const text = JSON.stringify(obj);
22
- return text;
23
- };
24
- AmazonSearchParsedTool.register = ({ server, sapiClient, }) => {
25
- server.registerTool('amazon_search_parsed', {
26
- description: 'Scrape Amazon Search results with automatic parsing',
27
- inputSchema: {
28
- query: zod_1.default.string().describe('Search query'),
29
- geo: zod_types_1.zodGeo,
30
- jsRender: zod_types_1.zodJsRender,
31
- },
32
- }, async (scrapingParams) => {
33
- const params = Object.assign(Object.assign({}, scrapingParams), { target: constants_1.SCRAPER_API_TARGETS.AMAZON_SEARCH, parse: true });
34
- const { data } = await sapiClient.scrape({ scrapingParams: params });
35
- const text = _a.transformAutoParsedResponse({ obj: data });
36
- return {
37
- content: [
38
- {
39
- type: 'text',
40
- text,
41
- },
42
- ],
43
- };
44
- });
45
- };
46
- //# sourceMappingURL=amazon-search-parsed-tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"amazon-search-parsed-tool.js","sourceRoot":"","sources":["../../src/tools/amazon-search-parsed-tool.ts"],"names":[],"mappings":";;;;;;;AAAA,8CAAoB;AAIpB,4CAAmD;AACnD,oCAAqD;AACrD,gDAAkE;AAElE,MAAa,sBAAsB;;AAAnC,wDAoDC;;AAnDQ,kDAA2B,GAAG,CAAC,WAAW,EAAE,iBAAiB,EAAE,aAAa,CAAC,AAAlD,CAAmD;AAE9E,kDAA2B,GAAG,CAAC,EAAE,GAAG,EAAmB,EAAU,EAAE;IACxE,KAAK,MAAM,aAAa,IAAI,EAAsB,CAAC,2BAA2B,EAAE,CAAC;QAC/E,GAAG,GAAG,IAAA,iCAAyB,EAAC,EAAE,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAEjC,OAAO,IAAI,CAAC;AACd,CAAC,AARiC,CAQhC;AAEK,+BAAQ,GAAG,CAAC,EACjB,MAAM,EACN,UAAU,GAIX,EAAE,EAAE;IACH,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,WAAW,EAAE,qDAAqD;QAClE,WAAW,EAAE;YACX,KAAK,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC1C,GAAG,EAAE,kBAAM;YACX,QAAQ,EAAE,uBAAW;SACtB;KACF,EACD,KAAK,EAAE,cAAiC,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,gCACV,cAAc,KACjB,MAAM,EAAE,+BAAmB,CAAC,aAAa,EACzC,KAAK,EAAE,IAAI,GACe,CAAC;QAE7B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,MAAM,CAAS,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;QAE7E,MAAM,IAAI,GAAG,EAAI,CAAC,2BAA2B,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7D,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI;iBACL;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,AAtCc,CAsCb"}
@@ -1,54 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- var _a;
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.GoogleSearchParsedTool = void 0;
8
- const zod_1 = __importDefault(require("zod"));
9
- const constants_1 = require("../constants");
10
- const utils_1 = require("../utils");
11
- const zod_types_1 = require("../zod/zod-types");
12
- class GoogleSearchParsedTool {
13
- }
14
- exports.GoogleSearchParsedTool = GoogleSearchParsedTool;
15
- _a = GoogleSearchParsedTool;
16
- GoogleSearchParsedTool.FIELDS_WITH_HIGH_CHAR_COUNT = [
17
- 'images',
18
- 'image_data',
19
- 'related_searches_urls',
20
- 'factoids',
21
- 'people_also_buy_from',
22
- 'what_people_are_saying',
23
- ];
24
- GoogleSearchParsedTool.transformAutoParsedResponse = ({ obj }) => {
25
- for (const fieldToRemove of _a.FIELDS_WITH_HIGH_CHAR_COUNT) {
26
- obj = (0, utils_1.removeKeyFromNestedObject)({ obj, keyToRemove: fieldToRemove });
27
- }
28
- const text = JSON.stringify(obj);
29
- return text;
30
- };
31
- GoogleSearchParsedTool.register = ({ server, sapiClient, }) => {
32
- server.registerTool('google_search_parsed', {
33
- description: 'Scrape Google Search results with automatic parsing',
34
- inputSchema: {
35
- query: zod_1.default.string().describe('Search query'),
36
- geo: zod_types_1.zodGeo,
37
- locale: zod_types_1.zodLocale,
38
- jsRender: zod_types_1.zodJsRender,
39
- },
40
- }, async (scrapingParams) => {
41
- const params = Object.assign(Object.assign({}, scrapingParams), { target: constants_1.SCRAPER_API_TARGETS.GOOGLE_SEARCH, parse: true });
42
- const { data } = await sapiClient.scrape({ scrapingParams: params });
43
- const text = _a.transformAutoParsedResponse({ obj: data });
44
- return {
45
- content: [
46
- {
47
- type: 'text',
48
- text,
49
- },
50
- ],
51
- };
52
- });
53
- };
54
- //# sourceMappingURL=google-search-parsed-tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"google-search-parsed-tool.js","sourceRoot":"","sources":["../../src/tools/google-search-parsed-tool.ts"],"names":[],"mappings":";;;;;;;AAAA,8CAAoB;AAIpB,4CAAmD;AACnD,oCAAqD;AACrD,gDAAkE;AAElE,MAAa,sBAAsB;;AAAnC,wDA4DC;;AA3DQ,kDAA2B,GAAG;IACnC,QAAQ;IACR,YAAY;IACZ,uBAAuB;IACvB,UAAU;IACV,sBAAsB;IACtB,wBAAwB;CACzB,AAPiC,CAOhC;AAEK,kDAA2B,GAAG,CAAC,EAAE,GAAG,EAAmB,EAAU,EAAE;IACxE,KAAK,MAAM,aAAa,IAAI,EAAsB,CAAC,2BAA2B,EAAE,CAAC;QAC/E,GAAG,GAAG,IAAA,iCAAyB,EAAC,EAAE,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAEjC,OAAO,IAAI,CAAC;AACd,CAAC,AARiC,CAQhC;AAEK,+BAAQ,GAAG,CAAC,EACjB,MAAM,EACN,UAAU,GAIX,EAAE,EAAE;IACH,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,WAAW,EAAE,qDAAqD;QAClE,WAAW,EAAE;YACX,KAAK,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC1C,GAAG,EAAE,kBAAM;YACX,MAAM,EAAE,qBAAS;YACjB,QAAQ,EAAE,uBAAW;SACtB;KACF,EACD,KAAK,EAAE,cAAiC,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,gCACV,cAAc,KACjB,MAAM,EAAE,+BAAmB,CAAC,aAAa,EACzC,KAAK,EAAE,IAAI,GACe,CAAC;QAE7B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,MAAM,CAAS,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;QAE7E,MAAM,IAAI,GAAG,EAAI,CAAC,2BAA2B,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7D,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI;iBACL;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,AAvCc,CAuCb"}
@@ -1,34 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- var _a;
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.RedditPostTool = void 0;
8
- const zod_1 = __importDefault(require("zod"));
9
- const constants_1 = require("../constants");
10
- class RedditPostTool {
11
- }
12
- exports.RedditPostTool = RedditPostTool;
13
- _a = RedditPostTool;
14
- RedditPostTool.register = ({ server, sapiClient, }) => {
15
- server.registerTool('reddit_post', {
16
- description: 'Scrape a specific Reddit post',
17
- inputSchema: {
18
- url: zod_1.default.string().describe('reddit post URL'),
19
- },
20
- }, async (scrapingParams) => {
21
- const params = Object.assign(Object.assign({}, scrapingParams), { target: constants_1.SCRAPER_API_TARGETS.REDDIT_POST });
22
- const { data } = await sapiClient.scrape({ scrapingParams: params });
23
- const text = JSON.stringify(data, null, 2);
24
- return {
25
- content: [
26
- {
27
- type: 'text',
28
- text,
29
- },
30
- ],
31
- };
32
- });
33
- };
34
- //# sourceMappingURL=reddit-post-tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reddit-post-tool.js","sourceRoot":"","sources":["../../src/tools/reddit-post-tool.ts"],"names":[],"mappings":";;;;;;;AAAA,8CAAoB;AAIpB,4CAAmD;AAEnD,MAAa,cAAc;;AAA3B,wCAqCC;;AApCQ,uBAAQ,GAAG,CAAC,EACjB,MAAM,EACN,UAAU,GAIX,EAAE,EAAE;IACH,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,WAAW,EAAE,+BAA+B;QAC5C,WAAW,EAAE;YACX,GAAG,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;SAC5C;KACF,EACD,KAAK,EAAE,cAAiC,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,gCACV,cAAc,KACjB,MAAM,EAAE,+BAAmB,CAAC,WAAW,GACb,CAAC;QAE7B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,MAAM,CAAS,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;QAE7E,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAE3C,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI;iBACL;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,AAnCc,CAmCb"}
@@ -1,34 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- var _a;
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.RedditSubredditTool = void 0;
8
- const zod_1 = __importDefault(require("zod"));
9
- const constants_1 = require("../constants");
10
- class RedditSubredditTool {
11
- }
12
- exports.RedditSubredditTool = RedditSubredditTool;
13
- _a = RedditSubredditTool;
14
- RedditSubredditTool.register = ({ server, sapiClient, }) => {
15
- server.registerTool('reddit_subreddit', {
16
- description: 'Scrape Reddit subreddit results with automatic parsing',
17
- inputSchema: {
18
- url: zod_1.default.string().describe('URL to subreddit'),
19
- },
20
- }, async (scrapingParams) => {
21
- const params = Object.assign(Object.assign({}, scrapingParams), { target: constants_1.SCRAPER_API_TARGETS.REDDIT_SUBREDDIT });
22
- const { data } = await sapiClient.scrape({ scrapingParams: params });
23
- const text = JSON.stringify(data, null, 2);
24
- return {
25
- content: [
26
- {
27
- type: 'text',
28
- text,
29
- },
30
- ],
31
- };
32
- });
33
- };
34
- //# sourceMappingURL=reddit-subreddit-tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reddit-subreddit-tool.js","sourceRoot":"","sources":["../../src/tools/reddit-subreddit-tool.ts"],"names":[],"mappings":";;;;;;;AAAA,8CAAoB;AAIpB,4CAAmD;AAEnD,MAAa,mBAAmB;;AAAhC,kDAqCC;;AApCQ,4BAAQ,GAAG,CAAC,EACjB,MAAM,EACN,UAAU,GAIX,EAAE,EAAE;IACH,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,WAAW,EAAE,wDAAwD;QACrE,WAAW,EAAE;YACX,GAAG,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;SAC7C;KACF,EACD,KAAK,EAAE,cAAiC,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,gCACV,cAAc,KACjB,MAAM,EAAE,+BAAmB,CAAC,gBAAgB,GAClB,CAAC;QAE7B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,MAAM,CAAS,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;QAE7E,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAE3C,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI;iBACL;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,AAnCc,CAmCb"}
@@ -1,70 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- var _a;
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.ScrapeAsMarkdownTool = void 0;
8
- const zod_1 = __importDefault(require("zod"));
9
- const node_html_markdown_1 = require("node-html-markdown");
10
- const zod_types_1 = require("../zod/zod-types");
11
- class ScrapeAsMarkdownTool {
12
- }
13
- exports.ScrapeAsMarkdownTool = ScrapeAsMarkdownTool;
14
- _a = ScrapeAsMarkdownTool;
15
- ScrapeAsMarkdownTool.LARGE_CONTENT_SYMBOL_COUNT = 10000;
16
- ScrapeAsMarkdownTool.isResponseOverLimit = (content) => {
17
- return content.length > _a.LARGE_CONTENT_SYMBOL_COUNT;
18
- };
19
- ScrapeAsMarkdownTool.shouldTruncateResponse = ({ content, shouldShowFullResponse, }) => {
20
- if (shouldShowFullResponse) {
21
- return false;
22
- }
23
- return _a.isResponseOverLimit(content);
24
- };
25
- ScrapeAsMarkdownTool.truncateResponse = ({ content, limit }) => {
26
- return content.substring(0, limit);
27
- };
28
- ScrapeAsMarkdownTool.transformResponse = ({ html, tokenLimit, shouldShowFullResponse, }) => {
29
- const markdown = node_html_markdown_1.NodeHtmlMarkdown.translate(html, {});
30
- if (_a.shouldTruncateResponse({ content: markdown, shouldShowFullResponse })) {
31
- const truncated = _a.truncateResponse({
32
- content: markdown,
33
- limit: tokenLimit || _a.LARGE_CONTENT_SYMBOL_COUNT,
34
- });
35
- return { markdown: truncated, isTruncated: true };
36
- }
37
- return { markdown, isTruncated: false };
38
- };
39
- ScrapeAsMarkdownTool.register = ({ server, sapiClient, }) => {
40
- server.tool('scrape_as_markdown', 'Scrape the contents of a website and return Markdown-formatted results', {
41
- url: zod_1.default.string().describe('URL to scrape'),
42
- geo: zod_types_1.zodGeo,
43
- locale: zod_types_1.zodLocale,
44
- jsRender: zod_types_1.zodJsRender,
45
- tokenLimit: zod_types_1.zodTokenLimit,
46
- fullResponse: zod_types_1.zodFullResponse,
47
- }, async (scrapingParams) => {
48
- const { data } = await sapiClient.scrape({ scrapingParams });
49
- const { markdown, isTruncated } = _a.transformResponse({
50
- html: data,
51
- tokenLimit: scrapingParams.tokenLimit,
52
- shouldShowFullResponse: scrapingParams.fullResponse,
53
- });
54
- return {
55
- content: [
56
- {
57
- type: 'text',
58
- text: isTruncated
59
- ? `The website content is over ${_a.LARGE_CONTENT_SYMBOL_COUNT} symbols, therefore, the content has been truncated. If you wish to obtain the full response, just say "full response". Alternatively, you say a specific token limit in the prompt.`
60
- : 'Full website content retrieved.',
61
- },
62
- {
63
- type: 'text',
64
- text: markdown,
65
- },
66
- ],
67
- };
68
- });
69
- };
70
- //# sourceMappingURL=scrape-as-markdown-tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scrape-as-markdown-tool.js","sourceRoot":"","sources":["../../src/tools/scrape-as-markdown-tool.ts"],"names":[],"mappings":";;;;;;;AAAA,8CAAoB;AAIpB,2DAAsD;AACtD,gDAAkG;AAElG,MAAa,oBAAoB;;AAAjC,oDA4FC;;AA3FQ,+CAA0B,GAAG,KAAM,AAAT,CAAU;AAEpC,wCAAmB,GAAG,CAAC,OAAe,EAAE,EAAE;IAC/C,OAAO,OAAO,CAAC,MAAM,GAAG,EAAI,CAAC,0BAA0B,CAAC;AAC1D,CAAC,AAFyB,CAExB;AAEK,2CAAsB,GAAG,CAAC,EAC/B,OAAO,EACP,sBAAsB,GAIvB,EAAE,EAAE;IACH,IAAI,sBAAsB,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,EAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC,AAZ4B,CAY3B;AAEK,qCAAgB,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAsC,EAAE,EAAE;IACnF,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC,AAFsB,CAErB;AAEK,sCAAiB,GAAG,CAAC,EAC1B,IAAI,EACJ,UAAU,EACV,sBAAsB,GAKvB,EAAE,EAAE;IACH,MAAM,QAAQ,GAAG,qCAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEtD,IAAI,EAAI,CAAC,sBAAsB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,CAAC,EAAE,CAAC;QAC/E,MAAM,SAAS,GAAG,EAAI,CAAC,gBAAgB,CAAC;YACtC,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,UAAU,IAAI,EAAI,CAAC,0BAA0B;SACrD,CAAC,CAAC;QAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACpD,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAC1C,CAAC,AArBuB,CAqBtB;AAEK,6BAAQ,GAAG,CAAC,EACjB,MAAM,EACN,UAAU,GAIX,EAAE,EAAE;IACH,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,wEAAwE,EACxE;QACE,GAAG,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QACzC,GAAG,EAAE,kBAAM;QACX,MAAM,EAAE,qBAAS;QACjB,QAAQ,EAAE,uBAAW;QACrB,UAAU,EAAE,yBAAa;QACzB,YAAY,EAAE,2BAAe;KAC9B,EACD,KAAK,EAAE,cAAiC,EAAE,EAAE;QAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;QAE7D,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAI,CAAC,iBAAiB,CAAC;YACvD,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,cAAc,CAAC,UAAU;YACrC,sBAAsB,EAAE,cAAc,CAAC,YAAY;SACpD,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,WAAW;wBACf,CAAC,CAAC,+BAA+B,EAAI,CAAC,0BAA0B,sLAAsL;wBACtP,CAAC,CAAC,iCAAiC;iBACtC;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,QAAQ;iBACf;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,AA3Cc,CA2Cb"}
@@ -1,70 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- var _a;
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.ScrapeTool = void 0;
8
- const zod_1 = __importDefault(require("zod"));
9
- const node_html_markdown_1 = require("node-html-markdown");
10
- const zod_types_1 = require("../zod/zod-types");
11
- class ScrapeTool {
12
- }
13
- exports.ScrapeTool = ScrapeTool;
14
- _a = ScrapeTool;
15
- ScrapeTool.LARGE_CONTENT_SYMBOL_COUNT = 10000;
16
- ScrapeTool.isResponseOverLimit = (content) => {
17
- return content.length > _a.LARGE_CONTENT_SYMBOL_COUNT;
18
- };
19
- ScrapeTool.shouldTruncateResponse = ({ content, shouldShowFullResponse, }) => {
20
- if (shouldShowFullResponse) {
21
- return false;
22
- }
23
- return _a.isResponseOverLimit(content);
24
- };
25
- ScrapeTool.truncateResponse = ({ content, limit }) => {
26
- return content.substring(0, limit);
27
- };
28
- ScrapeTool.transformResponse = ({ html, tokenLimit, shouldShowFullResponse, }) => {
29
- const markdown = node_html_markdown_1.NodeHtmlMarkdown.translate(html, {});
30
- if (_a.shouldTruncateResponse({ content: markdown, shouldShowFullResponse })) {
31
- const truncated = _a.truncateResponse({
32
- content: markdown,
33
- limit: tokenLimit || _a.LARGE_CONTENT_SYMBOL_COUNT,
34
- });
35
- return { markdown: truncated, isTruncated: true };
36
- }
37
- return { markdown, isTruncated: false };
38
- };
39
- ScrapeTool.register = ({ server, sapiClient, }) => {
40
- server.tool('scrape', 'Scrape the contents of a website', {
41
- url: zod_1.default.string().describe('URL to scrape'),
42
- geo: zod_types_1.zodGeo,
43
- locale: zod_types_1.zodLocale,
44
- jsRender: zod_types_1.zodJsRender,
45
- tokenLimit: zod_types_1.zodTokenLimit,
46
- fullResponse: zod_types_1.zodFullResponse,
47
- }, async (scrapingParams) => {
48
- const { data } = await sapiClient.scrape({ scrapingParams });
49
- const { markdown, isTruncated } = _a.transformResponse({
50
- html: data,
51
- tokenLimit: scrapingParams.tokenLimit,
52
- shouldShowFullResponse: scrapingParams.fullResponse,
53
- });
54
- return {
55
- content: [
56
- {
57
- type: 'text',
58
- text: isTruncated
59
- ? `The website content is over ${_a.LARGE_CONTENT_SYMBOL_COUNT} symbols, therefore, I have truncated the content. If you wish to obtain the full response, just say "full response". Alternatively, you can tell me a specific token limit.`
60
- : 'Full website content retrieved.',
61
- },
62
- {
63
- type: 'text',
64
- text: markdown,
65
- },
66
- ],
67
- };
68
- });
69
- };
70
- //# sourceMappingURL=scrape-tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scrape-tool.js","sourceRoot":"","sources":["../../src/tools/scrape-tool.ts"],"names":[],"mappings":";;;;;;;AAAA,8CAAoB;AAIpB,2DAAsD;AACtD,gDAAkG;AAElG,MAAa,UAAU;;AAAvB,gCA4FC;;AA3FQ,qCAA0B,GAAG,KAAM,AAAT,CAAU;AAEpC,8BAAmB,GAAG,CAAC,OAAe,EAAE,EAAE;IAC/C,OAAO,OAAO,CAAC,MAAM,GAAG,EAAI,CAAC,0BAA0B,CAAC;AAC1D,CAAC,AAFyB,CAExB;AAEK,iCAAsB,GAAG,CAAC,EAC/B,OAAO,EACP,sBAAsB,GAIvB,EAAE,EAAE;IACH,IAAI,sBAAsB,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,EAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC,AAZ4B,CAY3B;AAEK,2BAAgB,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAsC,EAAE,EAAE;IACnF,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC,AAFsB,CAErB;AAEK,4BAAiB,GAAG,CAAC,EAC1B,IAAI,EACJ,UAAU,EACV,sBAAsB,GAKvB,EAAE,EAAE;IACH,MAAM,QAAQ,GAAG,qCAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEtD,IAAI,EAAI,CAAC,sBAAsB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,CAAC,EAAE,CAAC;QAC/E,MAAM,SAAS,GAAG,EAAI,CAAC,gBAAgB,CAAC;YACtC,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,UAAU,IAAI,EAAI,CAAC,0BAA0B;SACrD,CAAC,CAAC;QAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACpD,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAC1C,CAAC,AArBuB,CAqBtB;AAEK,mBAAQ,GAAG,CAAC,EACjB,MAAM,EACN,UAAU,GAIX,EAAE,EAAE;IACH,MAAM,CAAC,IAAI,CACT,QAAQ,EACR,kCAAkC,EAClC;QACE,GAAG,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QACzC,GAAG,EAAE,kBAAM;QACX,MAAM,EAAE,qBAAS;QACjB,QAAQ,EAAE,uBAAW;QACrB,UAAU,EAAE,yBAAa;QACzB,YAAY,EAAE,2BAAe;KAC9B,EACD,KAAK,EAAE,cAAiC,EAAE,EAAE;QAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;QAE7D,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAI,CAAC,iBAAiB,CAAC;YACvD,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,cAAc,CAAC,UAAU;YACrC,sBAAsB,EAAE,cAAc,CAAC,YAAY;SACpD,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,WAAW;wBACf,CAAC,CAAC,+BAA+B,EAAI,CAAC,0BAA0B,8KAA8K;wBAC9O,CAAC,CAAC,iCAAiC;iBACtC;gBACD;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,QAAQ;iBACf;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,AA3Cc,CA2Cb"}