one-search-mcp 1.0.6 → 1.0.10
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.
- package/README.md +20 -7
- package/dist/index.cjs +12 -658
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -3
- package/dist/index.d.ts +7 -3
- package/dist/index.js +12 -632
- package/dist/index.js.map +1 -1
- package/package.json +21 -8
package/dist/index.js
CHANGED
|
@@ -1,636 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import{Server as Se}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as Ee,ListToolsRequestSchema as ve}from"@modelcontextprotocol/sdk/types.js";import{StdioServerTransport as Te}from"@modelcontextprotocol/sdk/server/stdio.js";async function M(i){let{query:t,limit:e=10,safeSearch:r=0,page:n=1,apiUrl:a="https://api.bing.microsoft.com/v7.0/search",apiKey:o,language:s}=i,c=["Off","Moderate","Strict"];if(!o)throw new Error("Bing API key is required");let h={q:t,count:e,offset:(n-1)*e,mkt:s,safeSearch:c[r]};try{let u=new URLSearchParams;Object.entries(h).forEach(([d,w])=>{w!==void 0&&u.set(d,w.toString())});let g=await fetch(`${a}?${u}`,{method:"GET",headers:{"Content-Type":"application/json","Ocp-Apim-Subscription-Key":o}});if(!g.ok)throw new Error(`Bing search error: ${g.status} ${g.statusText}`);return{results:(await g.json()).webPages?.value?.map(d=>({title:d.name,snippet:d.snippet,url:d.url,source:d.siteName,thumbnailUrl:d.thumbnailUrl,language:d.language,image:null,video:null,engine:"bing"}))??[],success:!0}}catch(u){let g=u instanceof Error?u.message:"Bing search error.";throw process.stdout.write(g),u}}import*as T from"duck-duck-scrape";import oe from"async-retry";async function $(i){try{let{query:t,timeout:e=1e4,safeSearch:r=T.SafeSearchType.OFF,retry:n={retries:3},...a}=i,o=await oe(()=>T.search(t,{...a,safeSearch:r},{response_timeout:e}),n);return{results:(o?{noResults:o.noResults,vqd:o.vqd,results:o.results}:{noResults:!0,vqd:"",results:[]}).results.map(c=>({title:c.title,snippet:c.description,url:c.url,source:c.hostname,image:null,video:null,engine:"duckduckgo"})),success:!0}}catch(t){let e=t instanceof Error?t.message:"DuckDuckGo search error.";throw process.stdout.write(e),t}}import le from"node:url";async function F(i){try{let{query:t,page:e=1,limit:r=10,categories:n="general",engines:a="all",safeSearch:o=0,format:s="json",language:c="auto",timeRange:h="",timeout:u=1e4,apiKey:g,apiUrl:l}=i;if(!l)throw new Error("SearxNG API URL is required");let p=new AbortController,y=setTimeout(()=>p.abort(),Number(u)),d={q:t,pageno:e,categories:n,format:s,safesearch:o,language:c,engines:a,time_range:h},w=`${l}/search`,ie=le.format({query:d}),k={"Content-Type":"application/json"};g&&(k.Authorization=`Bearer ${g}`);let ne=await fetch(`${w}${ie}`,{method:"POST",headers:k,signal:p.signal});clearTimeout(y);let U=await ne.json();return U.results?{results:U.results.slice(0,r).map(f=>{let se=f.img_src?{thumbnail:f.thumbnail_src,src:f.img_src}:null,ae=f.iframe_src?{thumbnail:f.thumbnail_src,src:f.iframe_src}:null;return{title:f.title,snippet:f.content,url:f.url,source:f.source,image:se,video:ae,engine:f.engine}}),success:!0}:{results:[],success:!1}}catch(t){let e=t instanceof Error?t.message:"Searxng search error.";throw process.stdout.write(e),t}}import{tavily as ce}from"@tavily/core";async function G(i){let{query:t,limit:e=10,categories:r="general",timeRange:n,apiKey:a}=i;if(!a)throw new Error("Tavily API key is required");try{let o=ce({apiKey:a}),s={topic:r,timeRange:n,maxResults:e};return{results:(await o.search(t,s)).results.map(u=>({title:u.title,url:u.url,snippet:u.content,engine:"tavily"})),success:!0}}catch(o){let s=o instanceof Error?o.message:"Tavily search error.";throw process.stdout.write(s),o}}import{Page as tt}from"puppeteer-core";import*as _ from"fs";import*as O from"path";import*as q from"os";import{defaultLogger as ue}from"@agent-infra/logger";var N=class{logger;constructor(t){this.logger=t??ue}get browsers(){let t=q.homedir(),e=process.env.LOCALAPPDATA;return[{name:"Chromium",executable:{win32:"C:\\Program Files\\Chromium\\Application\\chrome.exe",darwin:"/Applications/Chromium.app/Contents/MacOS/Chromium",linux:"/usr/bin/chromium"},userDataDir:{win32:`${e}\\Chromium\\User Data`,darwin:`${t}/Library/Application Support/Chromium`,linux:`${t}/.config/chromium`}},{name:"Google Chrome",executable:{win32:"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",darwin:"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",linux:"/usr/bin/google-chrome"},userDataDir:{win32:`${e}\\Google\\Chrome\\User Data`,darwin:`${t}/Library/Application Support/Google/Chrome`,linux:`${t}/.config/google-chrome`}},{name:"Google Chrome Canary",executable:{win32:"C:\\Program Files\\Google\\Chrome Canary\\Application\\chrome.exe",darwin:"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary",linux:"/usr/bin/google-chrome-canary"},userDataDir:{win32:`${e}\\Google\\Chrome Canary\\User Data`,darwin:`${t}/Library/Application Support/Google/Chrome Canary`,linux:`${t}/.config/google-chrome-canary`}}]}findBrowser(t){let e=process.platform;if(this.logger.info("Finding browser on platform:",e),e!=="darwin"&&e!=="win32"&&e!=="linux"){let a=new Error(`Unsupported platform: ${e}`);throw this.logger.error(a.message),a}let r=t?this.browsers.find(a=>a.name===t&&_.existsSync(a.executable[e])):this.browsers.find(a=>_.existsSync(a.executable[e]));if(this.logger.log("browser",r),!r){let a=t?new Error(`Cannot find browser: ${t}`):new Error("Cannot find a supported browser on your system. Please install Chrome, Edge, or Brave.");throw this.logger.error(a.message),a}let n={executable:r.executable[e],userDataDir:r.userDataDir[e]};return this.logger.success(`Found browser: ${r.name}`),this.logger.info("Browser details:",n),n}getBrowserProfiles(t){let e=this.findBrowser(t);try{let n=JSON.parse(_.readFileSync(O.join(e.userDataDir,"Local State"),"utf8")).profile.info_cache;return Object.entries(n).map(([a,o])=>({displayName:o.name,path:O.join(e.userDataDir,a)}))}catch{return[]}}findChrome(){try{let{executable:t}=this.findBrowser("Google Chrome");return t}catch{return null}}};import{defaultLogger as he}from"@agent-infra/logger";var S=class{browser=null;logger;activePage=null;constructor(t){this.logger=t?.logger??he,this.logger.info("Browser Options:",t)}getBrowser(){if(!this.browser)throw new Error("Browser not launched");return this.browser}async setupPageListener(){this.browser&&this.browser.on("targetcreated",async t=>{let e=await t.page();e&&(this.logger.info("New page created:",await e.url()),this.activePage=e,e.once("close",()=>{this.activePage===e&&(this.activePage=null)}),e.once("error",()=>{this.activePage===e&&(this.activePage=null)}))})}async close(){this.logger.info("Closing browser");try{await this.browser?.close(),this.browser=null,this.logger.success("Browser closed successfully")}catch(t){throw this.logger.error("Failed to close browser:",t),t}}async evaluateOnNewPage(t){let{url:e,pageFunction:r,pageFunctionParams:n,beforePageLoad:a,afterPageLoad:o,beforeSendResult:s,waitForOptions:c}=t,h=await this.browser.newPage();try{await a?.(h),await h.goto(e,{waitUntil:"networkidle2",...c}),await o?.(h);let u=await h.evaluateHandle(()=>window),g=await h.evaluate(r,u,...n);return await s?.(h,g),await u.dispose(),await h.close(),g}catch(u){throw await h.close(),u}}async createPage(){if(!this.browser)throw this.logger.error("No active browser"),new Error("Browser not launched");return await this.browser.newPage()}async getActivePage(){if(!this.browser)throw new Error("Browser not launched");if(this.activePage)try{return await this.activePage.evaluate(()=>document.readyState),this.activePage}catch(e){this.logger.warn("Active page no longer available:",e),this.activePage=null}let t=await this.browser.pages();if(t.length===0)return this.activePage=await this.createPage(),this.activePage;for(let e=t.length-1;e>=0;e--){let r=t[e];try{return await r.evaluate(()=>document.readyState),this.activePage=r,r}catch{continue}}throw new Error("No active page found")}};import*as H from"puppeteer-core";var A=class extends S{browserFinder=new N;async launch(t={}){this.logger.info("Launching browser with options:",t);let e=t?.executablePath||this.browserFinder.findBrowser().executable;this.logger.info("Using executable path:",e);let r=t?.defaultViewport?.width??1280,n=t?.defaultViewport?.height??800,a={executablePath:e,headless:t?.headless??!1,defaultViewport:{width:r,height:n},args:["--no-sandbox","--mute-audio","--disable-gpu","--disable-http2","--disable-blink-features=AutomationControlled","--disable-infobars","--disable-background-timer-throttling","--disable-popup-blocking","--disable-backgrounding-occluded-windows","--disable-renderer-backgrounding","--disable-window-activation","--disable-focus-on-load","--no-default-browser-check","--disable-web-security","--disable-features=IsolateOrigins,site-per-process","--disable-site-isolation-trials",`--window-size=${r},${n+90}`,t?.proxy?`--proxy-server=${t.proxy}`:"",t?.profilePath?`--profile-directory=${t.profilePath}`:""].filter(Boolean),ignoreDefaultArgs:["--enable-automation"],timeout:t.timeout??0,downloadBehavior:{policy:"deny"}};this.logger.info("Launch options:",a);try{this.browser=await H.launch(a),await this.setupPageListener(),this.logger.success("Browser launched successfully")}catch(o){throw this.logger.error("Failed to launch browser:",o),o}}};import*as ge from"puppeteer-core";var j='function q(t,e){if(e&&e.documentElement)t=e,e=arguments[2];else if(!t||!t.documentElement)throw new Error("First argument to Readability constructor should be a document object.");if(e=e||{},this._doc=t,this._docJSDOMParser=this._doc.firstChild.__JSDOMParser__,this._articleTitle=null,this._articleByline=null,this._articleDir=null,this._articleSiteName=null,this._attempts=[],this._debug=!!e.debug,this._maxElemsToParse=e.maxElemsToParse||this.DEFAULT_MAX_ELEMS_TO_PARSE,this._nbTopCandidates=e.nbTopCandidates||this.DEFAULT_N_TOP_CANDIDATES,this._charThreshold=e.charThreshold||this.DEFAULT_CHAR_THRESHOLD,this._classesToPreserve=this.CLASSES_TO_PRESERVE.concat(e.classesToPreserve||[]),this._keepClasses=!!e.keepClasses,this._serializer=e.serializer||function(i){return i.innerHTML},this._disableJSONLD=!!e.disableJSONLD,this._allowedVideoRegex=e.allowedVideoRegex||this.REGEXPS.videos,this._flags=this.FLAG_STRIP_UNLIKELYS|this.FLAG_WEIGHT_CLASSES|this.FLAG_CLEAN_CONDITIONALLY,this._debug){let i=function(r){if(r.nodeType==r.TEXT_NODE)return`${r.nodeName} ("${r.textContent}")`;let l=Array.from(r.attributes||[],function(a){return`${a.name}="${a.value}"`}).join(" ");return`<${r.localName} ${l}>`};this.log=function(){if(typeof console!="undefined"){let l=Array.from(arguments,a=>a&&a.nodeType==this.ELEMENT_NODE?i(a):a);l.unshift("Reader: (Readability)"),console.log.apply(console,l)}else if(typeof dump!="undefined"){var r=Array.prototype.map.call(arguments,function(l){return l&&l.nodeName?i(l):l}).join(" ");dump("Reader: (Readability) "+r+`\n`)}}}else this.log=function(){}}q.prototype={FLAG_STRIP_UNLIKELYS:1,FLAG_WEIGHT_CLASSES:2,FLAG_CLEAN_CONDITIONALLY:4,ELEMENT_NODE:1,TEXT_NODE:3,DEFAULT_MAX_ELEMS_TO_PARSE:0,DEFAULT_N_TOP_CANDIDATES:5,DEFAULT_TAGS_TO_SCORE:"section,h2,h3,h4,h5,h6,p,td,pre".toUpperCase().split(","),DEFAULT_CHAR_THRESHOLD:500,REGEXPS:{unlikelyCandidates:/-ad-|ai2html|banner|breadcrumbs|combx|comment|community|cover-wrap|disqus|extra|footer|gdpr|header|legends|menu|related|remark|replies|rss|shoutbox|sidebar|skyscraper|social|sponsor|supplemental|ad-break|agegate|pagination|pager|popup|yom-remote/i,okMaybeItsACandidate:/and|article|body|column|content|main|shadow/i,positive:/article|body|content|entry|hentry|h-entry|main|page|pagination|post|text|blog|story/i,negative:/-ad-|hidden|^hid$| hid$| hid |^hid |banner|combx|comment|com-|contact|foot|footer|footnote|gdpr|masthead|media|meta|outbrain|promo|related|scroll|share|shoutbox|sidebar|skyscraper|sponsor|shopping|tags|tool|widget/i,extraneous:/print|archive|comment|discuss|e[\\-]?mail|share|reply|all|login|sign|single|utility/i,byline:/byline|author|dateline|writtenby|p-author/i,replaceFonts:/<(\\/?)font[^>]*>/gi,normalize:/\\s{2,}/g,videos:/\\/\\/(www\\.)?((dailymotion|youtube|youtube-nocookie|player\\.vimeo|v\\.qq)\\.com|(archive|upload\\.wikimedia)\\.org|player\\.twitch\\.tv)/i,shareElements:/(\\b|_)(share|sharedaddy)(\\b|_)/i,nextLink:/(next|weiter|continue|>([^\\|]|$)|\xBB([^\\|]|$))/i,prevLink:/(prev|earl|old|new|<|\xAB)/i,tokenize:/\\W+/g,whitespace:/^\\s*$/,hasContent:/\\S$/,hashUrl:/^#.+/,srcsetUrl:/(\\S+)(\\s+[\\d.]+[xw])?(\\s*(?:,|$))/g,b64DataUrl:/^data:\\s*([^\\s;,]+)\\s*;\\s*base64\\s*,/i,commas:/\\u002C|\\u060C|\\uFE50|\\uFE10|\\uFE11|\\u2E41|\\u2E34|\\u2E32|\\uFF0C/g,jsonLdArticleTypes:/^Article|AdvertiserContentArticle|NewsArticle|AnalysisNewsArticle|AskPublicNewsArticle|BackgroundNewsArticle|OpinionNewsArticle|ReportageNewsArticle|ReviewNewsArticle|Report|SatiricalArticle|ScholarlyArticle|MedicalScholarlyArticle|SocialMediaPosting|BlogPosting|LiveBlogPosting|DiscussionForumPosting|TechArticle|APIReference$/},UNLIKELY_ROLES:["menu","menubar","complementary","navigation","alert","alertdialog","dialog"],DIV_TO_P_ELEMS:new Set(["BLOCKQUOTE","DL","DIV","IMG","OL","P","PRE","TABLE","UL"]),ALTER_TO_DIV_EXCEPTIONS:["DIV","ARTICLE","SECTION","P"],PRESENTATIONAL_ATTRIBUTES:["align","background","bgcolor","border","cellpadding","cellspacing","frame","hspace","rules","style","valign","vspace"],DEPRECATED_SIZE_ATTRIBUTE_ELEMS:["TABLE","TH","TD","HR","PRE"],PHRASING_ELEMS:["ABBR","AUDIO","B","BDO","BR","BUTTON","CITE","CODE","DATA","DATALIST","DFN","EM","EMBED","I","IMG","INPUT","KBD","LABEL","MARK","MATH","METER","NOSCRIPT","OBJECT","OUTPUT","PROGRESS","Q","RUBY","SAMP","SCRIPT","SELECT","SMALL","SPAN","STRONG","SUB","SUP","TEXTAREA","TIME","VAR","WBR"],CLASSES_TO_PRESERVE:["page"],HTML_ESCAPE_MAP:{lt:"<",gt:">",amp:"&",quot:\'"\',apos:"\'"},_postProcessContent:function(t){this._fixRelativeUris(t),this._simplifyNestedElements(t),this._keepClasses||this._cleanClasses(t)},_removeNodes:function(t,e){if(this._docJSDOMParser&&t._isLiveNodeList)throw new Error("Do not pass live node lists to _removeNodes");for(var i=t.length-1;i>=0;i--){var r=t[i],l=r.parentNode;l&&(!e||e.call(this,r,i,t))&&l.removeChild(r)}},_replaceNodeTags:function(t,e){if(this._docJSDOMParser&&t._isLiveNodeList)throw new Error("Do not pass live node lists to _replaceNodeTags");for(let i of t)this._setNodeTag(i,e)},_forEachNode:function(t,e){Array.prototype.forEach.call(t,e,this)},_findNode:function(t,e){return Array.prototype.find.call(t,e,this)},_someNode:function(t,e){return Array.prototype.some.call(t,e,this)},_everyNode:function(t,e){return Array.prototype.every.call(t,e,this)},_concatNodeLists:function(){var t=Array.prototype.slice,e=t.call(arguments),i=e.map(function(r){return t.call(r)});return Array.prototype.concat.apply([],i)},_getAllNodesWithTag:function(t,e){return t.querySelectorAll?t.querySelectorAll(e.join(",")):[].concat.apply([],e.map(function(i){var r=t.getElementsByTagName(i);return Array.isArray(r)?r:Array.from(r)}))},_cleanClasses:function(t){var e=this._classesToPreserve,i=(t.getAttribute("class")||"").split(/\\s+/).filter(function(r){return e.indexOf(r)!=-1}).join(" ");for(i?t.setAttribute("class",i):t.removeAttribute("class"),t=t.firstElementChild;t;t=t.nextElementSibling)this._cleanClasses(t)},_fixRelativeUris:function(t){var e=this._doc.baseURI,i=this._doc.documentURI;function r(s){if(e==i&&s.charAt(0)=="#")return s;try{return new URL(s,e).href}catch(h){}return s}var l=this._getAllNodesWithTag(t,["a"]);this._forEachNode(l,function(s){var h=s.getAttribute("href");if(h)if(h.indexOf("javascript:")===0)if(s.childNodes.length===1&&s.childNodes[0].nodeType===this.TEXT_NODE){var c=this._doc.createTextNode(s.textContent);s.parentNode.replaceChild(c,s)}else{for(var n=this._doc.createElement("span");s.firstChild;)n.appendChild(s.firstChild);s.parentNode.replaceChild(n,s)}else s.setAttribute("href",r(h))});var a=this._getAllNodesWithTag(t,["img","picture","figure","video","audio","source"]);this._forEachNode(a,function(s){var h=s.getAttribute("src"),c=s.getAttribute("poster"),n=s.getAttribute("srcset");if(h&&s.setAttribute("src",r(h)),c&&s.setAttribute("poster",r(c)),n){var u=n.replace(this.REGEXPS.srcsetUrl,function(m,b,N,v){return r(b)+(N||"")+v});s.setAttribute("srcset",u)}})},_simplifyNestedElements:function(t){for(var e=t;e;){if(e.parentNode&&["DIV","SECTION"].includes(e.tagName)&&!(e.id&&e.id.startsWith("readability"))){if(this._isElementWithoutContent(e)){e=this._removeAndGetNext(e);continue}else if(this._hasSingleTagInsideElement(e,"DIV")||this._hasSingleTagInsideElement(e,"SECTION")){for(var i=e.children[0],r=0;r<e.attributes.length;r++)i.setAttribute(e.attributes[r].name,e.attributes[r].value);e.parentNode.replaceChild(i,e),e=i;continue}}e=this._getNextNode(e)}},_getArticleTitle:function(){var t=this._doc,e="",i="";try{e=i=t.title.trim(),typeof e!="string"&&(e=i=this._getInnerText(t.getElementsByTagName("title")[0]))}catch(u){}var r=!1;function l(u){return u.split(/\\s+/).length}if(/ [\\|\\-\\\\\\/>\xBB] /.test(e))r=/ [\\\\\\/>\xBB] /.test(e),e=i.replace(/(.*)[\\|\\-\\\\\\/>\xBB] .*/gi,"$1"),l(e)<3&&(e=i.replace(/[^\\|\\-\\\\\\/>\xBB]*[\\|\\-\\\\\\/>\xBB](.*)/gi,"$1"));else if(e.indexOf(": ")!==-1){var a=this._concatNodeLists(t.getElementsByTagName("h1"),t.getElementsByTagName("h2")),s=e.trim(),h=this._someNode(a,function(u){return u.textContent.trim()===s});h||(e=i.substring(i.lastIndexOf(":")+1),l(e)<3?e=i.substring(i.indexOf(":")+1):l(i.substr(0,i.indexOf(":")))>5&&(e=i))}else if(e.length>150||e.length<15){var c=t.getElementsByTagName("h1");c.length===1&&(e=this._getInnerText(c[0]))}e=e.trim().replace(this.REGEXPS.normalize," ");var n=l(e);return n<=4&&(!r||n!=l(i.replace(/[\\|\\-\\\\\\/>\xBB]+/g,""))-1)&&(e=i),e},_prepDocument:function(){var t=this._doc;this._removeNodes(this._getAllNodesWithTag(t,["style"])),t.body&&this._replaceBrs(t.body),this._replaceNodeTags(this._getAllNodesWithTag(t,["font"]),"SPAN")},_nextNode:function(t){for(var e=t;e&&e.nodeType!=this.ELEMENT_NODE&&this.REGEXPS.whitespace.test(e.textContent);)e=e.nextSibling;return e},_replaceBrs:function(t){this._forEachNode(this._getAllNodesWithTag(t,["br"]),function(e){for(var i=e.nextSibling,r=!1;(i=this._nextNode(i))&&i.tagName=="BR";){r=!0;var l=i.nextSibling;i.parentNode.removeChild(i),i=l}if(r){var a=this._doc.createElement("p");for(e.parentNode.replaceChild(a,e),i=a.nextSibling;i;){if(i.tagName=="BR"){var s=this._nextNode(i.nextSibling);if(s&&s.tagName=="BR")break}if(!this._isPhrasingContent(i))break;var h=i.nextSibling;a.appendChild(i),i=h}for(;a.lastChild&&this._isWhitespace(a.lastChild);)a.removeChild(a.lastChild);a.parentNode.tagName==="P"&&this._setNodeTag(a.parentNode,"DIV")}})},_setNodeTag:function(t,e){if(this.log("_setNodeTag",t,e),this._docJSDOMParser)return t.localName=e.toLowerCase(),t.tagName=e.toUpperCase(),t;for(var i=t.ownerDocument.createElement(e);t.firstChild;)i.appendChild(t.firstChild);t.parentNode.replaceChild(i,t),t.readability&&(i.readability=t.readability);for(var r=0;r<t.attributes.length;r++)try{i.setAttribute(t.attributes[r].name,t.attributes[r].value)}catch(l){}return i},_prepArticle:function(t){this._cleanStyles(t),this._markDataTables(t),this._fixLazyImages(t),this._cleanConditionally(t,"form"),this._cleanConditionally(t,"fieldset"),this._clean(t,"object"),this._clean(t,"embed"),this._clean(t,"footer"),this._clean(t,"link"),this._clean(t,"aside");var e=this.DEFAULT_CHAR_THRESHOLD;this._forEachNode(t.children,function(i){this._cleanMatchedNodes(i,function(r,l){return this.REGEXPS.shareElements.test(l)&&r.textContent.length<e})}),this._clean(t,"iframe"),this._clean(t,"input"),this._clean(t,"textarea"),this._clean(t,"select"),this._clean(t,"button"),this._cleanHeaders(t),this._cleanConditionally(t,"table"),this._cleanConditionally(t,"ul"),this._cleanConditionally(t,"div"),this._replaceNodeTags(this._getAllNodesWithTag(t,["h1"]),"h2"),this._removeNodes(this._getAllNodesWithTag(t,["p"]),function(i){var r=i.getElementsByTagName("img").length,l=i.getElementsByTagName("embed").length,a=i.getElementsByTagName("object").length,s=i.getElementsByTagName("iframe").length,h=r+l+a+s;return h===0&&!this._getInnerText(i,!1)}),this._forEachNode(this._getAllNodesWithTag(t,["br"]),function(i){var r=this._nextNode(i.nextSibling);r&&r.tagName=="P"&&i.parentNode.removeChild(i)}),this._forEachNode(this._getAllNodesWithTag(t,["table"]),function(i){var r=this._hasSingleTagInsideElement(i,"TBODY")?i.firstElementChild:i;if(this._hasSingleTagInsideElement(r,"TR")){var l=r.firstElementChild;if(this._hasSingleTagInsideElement(l,"TD")){var a=l.firstElementChild;a=this._setNodeTag(a,this._everyNode(a.childNodes,this._isPhrasingContent)?"P":"DIV"),i.parentNode.replaceChild(a,i)}}})},_initializeNode:function(t){switch(t.readability={contentScore:0},t.tagName){case"DIV":t.readability.contentScore+=5;break;case"PRE":case"TD":case"BLOCKQUOTE":t.readability.contentScore+=3;break;case"ADDRESS":case"OL":case"UL":case"DL":case"DD":case"DT":case"LI":case"FORM":t.readability.contentScore-=3;break;case"H1":case"H2":case"H3":case"H4":case"H5":case"H6":case"TH":t.readability.contentScore-=5;break}t.readability.contentScore+=this._getClassWeight(t)},_removeAndGetNext:function(t){var e=this._getNextNode(t,!0);return t.parentNode.removeChild(t),e},_getNextNode:function(t,e){if(!e&&t.firstElementChild)return t.firstElementChild;if(t.nextElementSibling)return t.nextElementSibling;do t=t.parentNode;while(t&&!t.nextElementSibling);return t&&t.nextElementSibling},_textSimilarity:function(t,e){var i=t.toLowerCase().split(this.REGEXPS.tokenize).filter(Boolean),r=e.toLowerCase().split(this.REGEXPS.tokenize).filter(Boolean);if(!i.length||!r.length)return 0;var l=r.filter(s=>!i.includes(s)),a=l.join(" ").length/r.join(" ").length;return 1-a},_checkByline:function(t,e){if(this._articleByline)return!1;if(t.getAttribute!==void 0)var i=t.getAttribute("rel"),r=t.getAttribute("itemprop");return(i==="author"||r&&r.indexOf("author")!==-1||this.REGEXPS.byline.test(e))&&this._isValidByline(t.textContent)?(this._articleByline=t.textContent.trim(),!0):!1},_getNodeAncestors:function(t,e){e=e||0;for(var i=0,r=[];t.parentNode&&(r.push(t.parentNode),!(e&&++i===e));)t=t.parentNode;return r},_grabArticle:function(t){this.log("**** grabArticle ****");var e=this._doc,i=t!==null;if(t=t||this._doc.body,!t)return this.log("No body found in document. Abort."),null;for(var r=t.innerHTML;;){this.log("Starting grabArticle loop");var l=this._flagIsActive(this.FLAG_STRIP_UNLIKELYS),a=[],s=this._doc.documentElement;let J=!0;for(;s;){s.tagName==="HTML"&&(this._articleLang=s.getAttribute("lang"));var h=s.className+" "+s.id;if(!this._isProbablyVisible(s)){this.log("Removing hidden node - "+h),s=this._removeAndGetNext(s);continue}if(s.getAttribute("aria-modal")=="true"&&s.getAttribute("role")=="dialog"){s=this._removeAndGetNext(s);continue}if(this._checkByline(s,h)){s=this._removeAndGetNext(s);continue}if(J&&this._headerDuplicatesTitle(s)){this.log("Removing header: ",s.textContent.trim(),this._articleTitle.trim()),J=!1,s=this._removeAndGetNext(s);continue}if(l){if(this.REGEXPS.unlikelyCandidates.test(h)&&!this.REGEXPS.okMaybeItsACandidate.test(h)&&!this._hasAncestorTag(s,"table")&&!this._hasAncestorTag(s,"code")&&s.tagName!=="BODY"&&s.tagName!=="A"){this.log("Removing unlikely candidate - "+h),s=this._removeAndGetNext(s);continue}if(this.UNLIKELY_ROLES.includes(s.getAttribute("role"))){this.log("Removing content with role "+s.getAttribute("role")+" - "+h),s=this._removeAndGetNext(s);continue}}if((s.tagName==="DIV"||s.tagName==="SECTION"||s.tagName==="HEADER"||s.tagName==="H1"||s.tagName==="H2"||s.tagName==="H3"||s.tagName==="H4"||s.tagName==="H5"||s.tagName==="H6")&&this._isElementWithoutContent(s)){s=this._removeAndGetNext(s);continue}if(this.DEFAULT_TAGS_TO_SCORE.indexOf(s.tagName)!==-1&&a.push(s),s.tagName==="DIV"){for(var c=null,n=s.firstChild;n;){var u=n.nextSibling;if(this._isPhrasingContent(n))c!==null?c.appendChild(n):this._isWhitespace(n)||(c=e.createElement("p"),s.replaceChild(c,n),c.appendChild(n));else if(c!==null){for(;c.lastChild&&this._isWhitespace(c.lastChild);)c.removeChild(c.lastChild);c=null}n=u}if(this._hasSingleTagInsideElement(s,"P")&&this._getLinkDensity(s)<.25){var m=s.children[0];s.parentNode.replaceChild(m,s),s=m,a.push(s)}else this._hasChildBlockElement(s)||(s=this._setNodeTag(s,"P"),a.push(s))}s=this._getNextNode(s)}var b=[];this._forEachNode(a,function(A){if(!(!A.parentNode||typeof A.parentNode.tagName=="undefined")){var T=this._getInnerText(A);if(!(T.length<25)){var K=this._getNodeAncestors(A,5);if(K.length!==0){var C=0;C+=1,C+=T.split(this.REGEXPS.commas).length,C+=Math.min(Math.floor(T.length/100),3),this._forEachNode(K,function(S,F){if(!(!S.tagName||!S.parentNode||typeof S.parentNode.tagName=="undefined")){if(typeof S.readability=="undefined"&&(this._initializeNode(S),b.push(S)),F===0)var X=1;else F===1?X=2:X=F*3;S.readability.contentScore+=C/X}})}}}});for(var N=[],v=0,y=b.length;v<y;v+=1){var E=b[v],d=E.readability.contentScore*(1-this._getLinkDensity(E));E.readability.contentScore=d,this.log("Candidate:",E,"with score "+d);for(var p=0;p<this._nbTopCandidates;p++){var x=N[p];if(!x||d>x.readability.contentScore){N.splice(p,0,E),N.length>this._nbTopCandidates&&N.pop();break}}}var o=N[0]||null,L=!1,g;if(o===null||o.tagName==="BODY"){for(o=e.createElement("DIV"),L=!0;t.firstChild;)this.log("Moving child out:",t.firstChild),o.appendChild(t.firstChild);t.appendChild(o),this._initializeNode(o)}else if(o){for(var I=[],P=1;P<N.length;P++)N[P].readability.contentScore/o.readability.contentScore>=.75&&I.push(this._getNodeAncestors(N[P]));var O=3;if(I.length>=O)for(g=o.parentNode;g.tagName!=="BODY";){for(var G=0,H=0;H<I.length&&G<O;H++)G+=Number(I[H].includes(g));if(G>=O){o=g;break}g=g.parentNode}o.readability||this._initializeNode(o),g=o.parentNode;for(var M=o.readability.contentScore,Q=M/3;g.tagName!=="BODY";){if(!g.readability){g=g.parentNode;continue}var V=g.readability.contentScore;if(V<Q)break;if(V>M){o=g;break}M=g.readability.contentScore,g=g.parentNode}for(g=o.parentNode;g.tagName!="BODY"&&g.children.length==1;)o=g,g=o.parentNode;o.readability||this._initializeNode(o)}var _=e.createElement("DIV");i&&(_.id="readability-content");var Z=Math.max(10,o.readability.contentScore*.2);g=o.parentNode;for(var U=g.children,w=0,j=U.length;w<j;w++){var f=U[w],R=!1;if(this.log("Looking at sibling node:",f,f.readability?"with score "+f.readability.contentScore:""),this.log("Sibling has score",f.readability?f.readability.contentScore:"Unknown"),f===o)R=!0;else{var $=0;if(f.className===o.className&&o.className!==""&&($+=o.readability.contentScore*.2),f.readability&&f.readability.contentScore+$>=Z)R=!0;else if(f.nodeName==="P"){var Y=this._getLinkDensity(f),z=this._getInnerText(f),k=z.length;(k>80&&Y<.25||k<80&&k>0&&Y===0&&z.search(/\\.( |$)/)!==-1)&&(R=!0)}}R&&(this.log("Appending node:",f),this.ALTER_TO_DIV_EXCEPTIONS.indexOf(f.nodeName)===-1&&(this.log("Altering sibling:",f,"to div."),f=this._setNodeTag(f,"DIV")),_.appendChild(f),U=g.children,w-=1,j-=1)}if(this._debug&&this.log("Article content pre-prep: "+_.innerHTML),this._prepArticle(_),this._debug&&this.log("Article content post-prep: "+_.innerHTML),L)o.id="readability-page-1",o.className="page";else{var B=e.createElement("DIV");for(B.id="readability-page-1",B.className="page";_.firstChild;)B.appendChild(_.firstChild);_.appendChild(B)}this._debug&&this.log("Article content after paging: "+_.innerHTML);var W=!0,D=this._getInnerText(_,!0).length;if(D<this._charThreshold)if(W=!1,t.innerHTML=r,this._flagIsActive(this.FLAG_STRIP_UNLIKELYS))this._removeFlag(this.FLAG_STRIP_UNLIKELYS),this._attempts.push({articleContent:_,textLength:D});else if(this._flagIsActive(this.FLAG_WEIGHT_CLASSES))this._removeFlag(this.FLAG_WEIGHT_CLASSES),this._attempts.push({articleContent:_,textLength:D});else if(this._flagIsActive(this.FLAG_CLEAN_CONDITIONALLY))this._removeFlag(this.FLAG_CLEAN_CONDITIONALLY),this._attempts.push({articleContent:_,textLength:D});else{if(this._attempts.push({articleContent:_,textLength:D}),this._attempts.sort(function(A,T){return T.textLength-A.textLength}),!this._attempts[0].textLength)return null;_=this._attempts[0].articleContent,W=!0}if(W){var tt=[g,o].concat(this._getNodeAncestors(g));return this._someNode(tt,function(A){if(!A.tagName)return!1;var T=A.getAttribute("dir");return T?(this._articleDir=T,!0):!1}),_}}},_isValidByline:function(t){return typeof t=="string"||t instanceof String?(t=t.trim(),t.length>0&&t.length<100):!1},_unescapeHtmlEntities:function(t){if(!t)return t;var e=this.HTML_ESCAPE_MAP;return t.replace(/&(quot|amp|apos|lt|gt);/g,function(i,r){return e[r]}).replace(/&#(?:x([0-9a-z]{1,4})|([0-9]{1,4}));/gi,function(i,r,l){var a=parseInt(r||l,r?16:10);return String.fromCharCode(a)})},_getJSONLD:function(t){var e=this._getAllNodesWithTag(t,["script"]),i;return this._forEachNode(e,function(r){if(!i&&r.getAttribute("type")==="application/ld+json")try{var l=r.textContent.replace(/^\\s*<!\\[CDATA\\[|\\]\\]>\\s*$/g,""),a=JSON.parse(l);if(!a["@context"]||!a["@context"].match(/^https?\\:\\/\\/schema\\.org$/)||(!a["@type"]&&Array.isArray(a["@graph"])&&(a=a["@graph"].find(function(n){return(n["@type"]||"").match(this.REGEXPS.jsonLdArticleTypes)})),!a||!a["@type"]||!a["@type"].match(this.REGEXPS.jsonLdArticleTypes)))return;if(i={},typeof a.name=="string"&&typeof a.headline=="string"&&a.name!==a.headline){var s=this._getArticleTitle(),h=this._textSimilarity(a.name,s)>.75,c=this._textSimilarity(a.headline,s)>.75;c&&!h?i.title=a.headline:i.title=a.name}else typeof a.name=="string"?i.title=a.name.trim():typeof a.headline=="string"&&(i.title=a.headline.trim());a.author&&(typeof a.author.name=="string"?i.byline=a.author.name.trim():Array.isArray(a.author)&&a.author[0]&&typeof a.author[0].name=="string"&&(i.byline=a.author.filter(function(n){return n&&typeof n.name=="string"}).map(function(n){return n.name.trim()}).join(", "))),typeof a.description=="string"&&(i.excerpt=a.description.trim()),a.publisher&&typeof a.publisher.name=="string"&&(i.siteName=a.publisher.name.trim()),typeof a.datePublished=="string"&&(i.datePublished=a.datePublished.trim());return}catch(n){this.log(n.message)}}),i||{}},_getArticleMetadata:function(t){var e={},i={},r=this._doc.getElementsByTagName("meta"),l=/\\s*(article|dc|dcterm|og|twitter)\\s*:\\s*(author|creator|description|published_time|title|site_name)\\s*/gi,a=/^\\s*(?:(dc|dcterm|og|twitter|weibo:(article|webpage))\\s*[\\.:]\\s*)?(author|creator|description|title|site_name)\\s*$/i;return this._forEachNode(r,function(s){var h=s.getAttribute("name"),c=s.getAttribute("property"),n=s.getAttribute("content");if(n){var u=null,m=null;c&&(u=c.match(l),u&&(m=u[0].toLowerCase().replace(/\\s/g,""),i[m]=n.trim())),!u&&h&&a.test(h)&&(m=h,n&&(m=m.toLowerCase().replace(/\\s/g,"").replace(/\\./g,":"),i[m]=n.trim()))}}),e.title=t.title||i["dc:title"]||i["dcterm:title"]||i["og:title"]||i["weibo:article:title"]||i["weibo:webpage:title"]||i.title||i["twitter:title"],e.title||(e.title=this._getArticleTitle()),e.byline=t.byline||i["dc:creator"]||i["dcterm:creator"]||i.author,e.excerpt=t.excerpt||i["dc:description"]||i["dcterm:description"]||i["og:description"]||i["weibo:article:description"]||i["weibo:webpage:description"]||i.description||i["twitter:description"],e.siteName=t.siteName||i["og:site_name"],e.publishedTime=t.datePublished||i["article:published_time"]||null,e.title=this._unescapeHtmlEntities(e.title),e.byline=this._unescapeHtmlEntities(e.byline),e.excerpt=this._unescapeHtmlEntities(e.excerpt),e.siteName=this._unescapeHtmlEntities(e.siteName),e.publishedTime=this._unescapeHtmlEntities(e.publishedTime),e},_isSingleImage:function(t){return t.tagName==="IMG"?!0:t.children.length!==1||t.textContent.trim()!==""?!1:this._isSingleImage(t.children[0])},_unwrapNoscriptImages:function(t){var e=Array.from(t.getElementsByTagName("img"));this._forEachNode(e,function(r){for(var l=0;l<r.attributes.length;l++){var a=r.attributes[l];switch(a.name){case"src":case"srcset":case"data-src":case"data-srcset":return}if(/\\.(jpg|jpeg|png|webp)/i.test(a.value))return}r.parentNode.removeChild(r)});var i=Array.from(t.getElementsByTagName("noscript"));this._forEachNode(i,function(r){var l=t.createElement("div");if(l.innerHTML=r.innerHTML,!!this._isSingleImage(l)){var a=r.previousElementSibling;if(a&&this._isSingleImage(a)){var s=a;s.tagName!=="IMG"&&(s=a.getElementsByTagName("img")[0]);for(var h=l.getElementsByTagName("img")[0],c=0;c<s.attributes.length;c++){var n=s.attributes[c];if(n.value!==""&&(n.name==="src"||n.name==="srcset"||/\\.(jpg|jpeg|png|webp)/i.test(n.value))){if(h.getAttribute(n.name)===n.value)continue;var u=n.name;h.hasAttribute(u)&&(u="data-old-"+u),h.setAttribute(u,n.value)}}r.parentNode.replaceChild(l.firstElementChild,a)}}})},_removeScripts:function(t){this._removeNodes(this._getAllNodesWithTag(t,["script","noscript"]))},_hasSingleTagInsideElement:function(t,e){return t.children.length!=1||t.children[0].tagName!==e?!1:!this._someNode(t.childNodes,function(i){return i.nodeType===this.TEXT_NODE&&this.REGEXPS.hasContent.test(i.textContent)})},_isElementWithoutContent:function(t){return t.nodeType===this.ELEMENT_NODE&&t.textContent.trim().length==0&&(t.children.length==0||t.children.length==t.getElementsByTagName("br").length+t.getElementsByTagName("hr").length)},_hasChildBlockElement:function(t){return this._someNode(t.childNodes,function(e){return this.DIV_TO_P_ELEMS.has(e.tagName)||this._hasChildBlockElement(e)})},_isPhrasingContent:function(t){return t.nodeType===this.TEXT_NODE||this.PHRASING_ELEMS.indexOf(t.tagName)!==-1||(t.tagName==="A"||t.tagName==="DEL"||t.tagName==="INS")&&this._everyNode(t.childNodes,this._isPhrasingContent)},_isWhitespace:function(t){return t.nodeType===this.TEXT_NODE&&t.textContent.trim().length===0||t.nodeType===this.ELEMENT_NODE&&t.tagName==="BR"},_getInnerText:function(t,e){e=typeof e=="undefined"?!0:e;var i=t.textContent.trim();return e?i.replace(this.REGEXPS.normalize," "):i},_getCharCount:function(t,e){return e=e||",",this._getInnerText(t).split(e).length-1},_cleanStyles:function(t){if(!(!t||t.tagName.toLowerCase()==="svg")){for(var e=0;e<this.PRESENTATIONAL_ATTRIBUTES.length;e++)t.removeAttribute(this.PRESENTATIONAL_ATTRIBUTES[e]);this.DEPRECATED_SIZE_ATTRIBUTE_ELEMS.indexOf(t.tagName)!==-1&&(t.removeAttribute("width"),t.removeAttribute("height"));for(var i=t.firstElementChild;i!==null;)this._cleanStyles(i),i=i.nextElementSibling}},_getLinkDensity:function(t){var e=this._getInnerText(t).length;if(e===0)return 0;var i=0;return this._forEachNode(t.getElementsByTagName("a"),function(r){var l=r.getAttribute("href"),a=l&&this.REGEXPS.hashUrl.test(l)?.3:1;i+=this._getInnerText(r).length*a}),i/e},_getClassWeight:function(t){if(!this._flagIsActive(this.FLAG_WEIGHT_CLASSES))return 0;var e=0;return typeof t.className=="string"&&t.className!==""&&(this.REGEXPS.negative.test(t.className)&&(e-=25),this.REGEXPS.positive.test(t.className)&&(e+=25)),typeof t.id=="string"&&t.id!==""&&(this.REGEXPS.negative.test(t.id)&&(e-=25),this.REGEXPS.positive.test(t.id)&&(e+=25)),e},_clean:function(t,e){var i=["object","embed","iframe"].indexOf(e)!==-1;this._removeNodes(this._getAllNodesWithTag(t,[e]),function(r){if(i){for(var l=0;l<r.attributes.length;l++)if(this._allowedVideoRegex.test(r.attributes[l].value))return!1;if(r.tagName==="object"&&this._allowedVideoRegex.test(r.innerHTML))return!1}return!0})},_hasAncestorTag:function(t,e,i,r){i=i||3,e=e.toUpperCase();for(var l=0;t.parentNode;){if(i>0&&l>i)return!1;if(t.parentNode.tagName===e&&(!r||r(t.parentNode)))return!0;t=t.parentNode,l++}return!1},_getRowAndColumnCount:function(t){for(var e=0,i=0,r=t.getElementsByTagName("tr"),l=0;l<r.length;l++){var a=r[l].getAttribute("rowspan")||0;a&&(a=parseInt(a,10)),e+=a||1;for(var s=0,h=r[l].getElementsByTagName("td"),c=0;c<h.length;c++){var n=h[c].getAttribute("colspan")||0;n&&(n=parseInt(n,10)),s+=n||1}i=Math.max(i,s)}return{rows:e,columns:i}},_markDataTables:function(t){for(var e=t.getElementsByTagName("table"),i=0;i<e.length;i++){var r=e[i],l=r.getAttribute("role");if(l=="presentation"){r._readabilityDataTable=!1;continue}var a=r.getAttribute("datatable");if(a=="0"){r._readabilityDataTable=!1;continue}var s=r.getAttribute("summary");if(s){r._readabilityDataTable=!0;continue}var h=r.getElementsByTagName("caption")[0];if(h&&h.childNodes.length>0){r._readabilityDataTable=!0;continue}var c=["col","colgroup","tfoot","thead","th"],n=function(m){return!!r.getElementsByTagName(m)[0]};if(c.some(n)){this.log("Data table because found data-y descendant"),r._readabilityDataTable=!0;continue}if(r.getElementsByTagName("table")[0]){r._readabilityDataTable=!1;continue}var u=this._getRowAndColumnCount(r);if(u.rows>=10||u.columns>4){r._readabilityDataTable=!0;continue}r._readabilityDataTable=u.rows*u.columns>10}},_fixLazyImages:function(t){this._forEachNode(this._getAllNodesWithTag(t,["img","picture","figure"]),function(e){if(e.src&&this.REGEXPS.b64DataUrl.test(e.src)){var i=this.REGEXPS.b64DataUrl.exec(e.src);if(i[1]==="image/svg+xml")return;for(var r=!1,l=0;l<e.attributes.length;l++){var a=e.attributes[l];if(a.name!=="src"&&/\\.(jpg|jpeg|png|webp)/i.test(a.value)){r=!0;break}}if(r){var s=e.src.search(/base64\\s*/i)+7,h=e.src.length-s;h<133&&e.removeAttribute("src")}}if(!((e.src||e.srcset&&e.srcset!="null")&&e.className.toLowerCase().indexOf("lazy")===-1)){for(var c=0;c<e.attributes.length;c++)if(a=e.attributes[c],!(a.name==="src"||a.name==="srcset"||a.name==="alt")){var n=null;if(/\\.(jpg|jpeg|png|webp)\\s+\\d/.test(a.value)?n="srcset":/^\\s*\\S+\\.(jpg|jpeg|png|webp)\\S*\\s*$/.test(a.value)&&(n="src"),n){if(e.tagName==="IMG"||e.tagName==="PICTURE")e.setAttribute(n,a.value);else if(e.tagName==="FIGURE"&&!this._getAllNodesWithTag(e,["img","picture"]).length){var u=this._doc.createElement("img");u.setAttribute(n,a.value),e.appendChild(u)}}}}})},_getTextDensity:function(t,e){var i=this._getInnerText(t,!0).length;if(i===0)return 0;var r=0,l=this._getAllNodesWithTag(t,e);return this._forEachNode(l,a=>r+=this._getInnerText(a,!0).length),r/i},_cleanConditionally:function(t,e){this._flagIsActive(this.FLAG_CLEAN_CONDITIONALLY)&&this._removeNodes(this._getAllNodesWithTag(t,[e]),function(i){var r=function(g){return g._readabilityDataTable},l=e==="ul"||e==="ol";if(!l){var a=0,s=this._getAllNodesWithTag(i,["ul","ol"]);this._forEachNode(s,g=>a+=this._getInnerText(g).length),l=a/this._getInnerText(i).length>.9}if(e==="table"&&r(i)||this._hasAncestorTag(i,"table",-1,r)||this._hasAncestorTag(i,"code"))return!1;var h=this._getClassWeight(i);this.log("Cleaning Conditionally",i);var c=0;if(h+c<0)return!0;if(this._getCharCount(i,",")<10){for(var n=i.getElementsByTagName("p").length,u=i.getElementsByTagName("img").length,m=i.getElementsByTagName("li").length-100,b=i.getElementsByTagName("input").length,N=this._getTextDensity(i,["h1","h2","h3","h4","h5","h6"]),v=0,y=this._getAllNodesWithTag(i,["object","embed","iframe"]),E=0;E<y.length;E++){for(var d=0;d<y[E].attributes.length;d++)if(this._allowedVideoRegex.test(y[E].attributes[d].value))return!1;if(y[E].tagName==="object"&&this._allowedVideoRegex.test(y[E].innerHTML))return!1;v++}var p=this._getLinkDensity(i),x=this._getInnerText(i).length,o=u>1&&n/u<.5&&!this._hasAncestorTag(i,"figure")||!l&&m>n||b>Math.floor(n/3)||!l&&N<.9&&x<25&&(u===0||u>2)&&!this._hasAncestorTag(i,"figure")||!l&&h<25&&p>.2||h>=25&&p>.5||v===1&&x<75||v>1;if(l&&o){for(var L=0;L<i.children.length;L++)if(i.children[L].children.length>1)return o;let g=i.getElementsByTagName("li").length;if(u==g)return!1}return o}return!1})},_cleanMatchedNodes:function(t,e){for(var i=this._getNextNode(t,!0),r=this._getNextNode(t);r&&r!=i;)e.call(this,r,r.className+" "+r.id)?r=this._removeAndGetNext(r):r=this._getNextNode(r)},_cleanHeaders:function(t){let e=this._getAllNodesWithTag(t,["h1","h2"]);this._removeNodes(e,function(i){let r=this._getClassWeight(i)<0;return r&&this.log("Removing header with low class weight:",i),r})},_headerDuplicatesTitle:function(t){if(t.tagName!="H1"&&t.tagName!="H2")return!1;var e=this._getInnerText(t,!1);return this.log("Evaluating similarity of header:",e,this._articleTitle),this._textSimilarity(this._articleTitle,e)>.75},_flagIsActive:function(t){return(this._flags&t)>0},_removeFlag:function(t){this._flags=this._flags&~t},_isProbablyVisible:function(t){return(!t.style||t.style.display!="none")&&(!t.style||t.style.visibility!="hidden")&&!t.hasAttribute("hidden")&&(!t.hasAttribute("aria-hidden")||t.getAttribute("aria-hidden")!="true"||t.className&&t.className.indexOf&&t.className.indexOf("fallback-image")!==-1)},parse:function(){if(this._maxElemsToParse>0){var t=this._doc.getElementsByTagName("*").length;if(t>this._maxElemsToParse)throw new Error("Aborting parsing document; "+t+" elements found")}this._unwrapNoscriptImages(this._doc);var e=this._disableJSONLD?{}:this._getJSONLD(this._doc);this._removeScripts(this._doc),this._prepDocument();var i=this._getArticleMetadata(e);this._articleTitle=i.title;var r=this._grabArticle();if(!r)return null;if(this.log("Grabbed: "+r.innerHTML),this._postProcessContent(r),!i.excerpt){var l=r.getElementsByTagName("p");l.length>0&&(i.excerpt=l[0].textContent.trim())}var a=r.textContent;return{title:this._articleTitle,byline:i.byline||this._articleByline,dir:this._articleDir,lang:this._articleLang,content:this._serializer(r),textContent:a,length:a.length,excerpt:i.excerpt,siteName:i.siteName||this._articleSiteName,publishedTime:i.publishedTime}}};typeof module=="object"&&(module.exports=q);\n';import{defaultLogger as we}from"@agent-infra/logger";import pe from"turndown";import{gfm as de}from"turndown-plugin-gfm";import{defaultLogger as me}from"@agent-infra/logger";import fe from"user-agents";var ye=i=>{try{return new URL(i)}catch{return null}},W=i=>{let t=ye(i);if(!t)return!0;let{hostname:e}=t;return["reddit.com","www.reddit.com","x.com","twitter.com","www.twitter.com","youtube.com","www.youtube.com"].includes(e)};async function be(i){let t=new fe({deviceCategory:"desktop"}).toString();await i.setBypassCSP(!0),await i.setUserAgent(t),await i.evaluate(()=>{Object.defineProperty(navigator,"webdriver",{get:()=>{}}),Object.defineProperty(navigator,"languages",{get:()=>["en-US","en"]}),Object.defineProperty(navigator,"plugins",{get:()=>[{},{},{},{},{}]}),Object.defineProperty(navigator,"headless",{get:()=>!1});let e=window.navigator.permissions.query;window.navigator.permissions.query=r=>r.name==="notifications"?Promise.resolve({state:Notification.permission}):e(r)})}async function I(i){await be(i),await i.setRequestInterception(!0),i.on("request",t=>t.resourceType()!=="document"?t.abort():t.isNavigationRequest()?t.continue():t.abort())}function V(i,t){let e=new Function("module",`${t}
|
|
3
|
+
return module.exports`)({}),r=i.document;r.querySelectorAll("script,noscript,style,link,svg,img,video,iframe,canvas,.reflist").forEach(s=>s.remove());let n=new e(r).parse(),a=n?.content||"",o=r.title;return{content:a,title:n?.title||o}}function X(i,t={}){if(!i)return"";try{let{codeBlockStyle:e="fenced",headingStyle:r="atx",emDelimiter:n="*",strongDelimiter:a="**",gfmExtension:o=!0}=t,s=new pe({codeBlockStyle:e,headingStyle:r,emDelimiter:n,strongDelimiter:a});return o&&s.use(de),s.turndown(i)}catch(e){return me.error("Error converting HTML to Markdown:",e),i}}var x=class{queue=[];concurrency;running=0;results=[];constructor(t=1){this.concurrency=t}add(t){return new Promise((e,r)=>{this.queue.push(async()=>{try{let n=await t();return e(n),n}catch(n){throw r(n),n}}),this.run()})}async run(){if(this.running>=this.concurrency||this.queue.length===0)return;this.running++;let t=this.queue.shift();try{let e=await t();this.results.push(e)}catch{}finally{this.running--,this.run()}}async waitAll(){for(;this.running>0||this.queue.length>0;)await new Promise(t=>setTimeout(t,100));return this.results}};var E=class{getSearchUrl(t,e){return`https://www.bing.com/search?${new URLSearchParams({q:`${e.excludeDomains&&e.excludeDomains.length>0?`${e.excludeDomains.map(n=>`-site:${n}`).join(" ")} `:""}${t}`,count:`${e.count||10}`}).toString()}`}extractSearchResults(t){let e=[],r=t.document,n=o=>{try{return new URL(o),!0}catch{return!1}},a=o=>{let s=o.cloneNode(!0);return s.querySelectorAll("h2").forEach(l=>l.remove()),s.querySelectorAll(".b_attribution").forEach(l=>l.remove()),s.querySelectorAll("script, style").forEach(l=>l.remove()),Array.from(s.querySelectorAll("*")).filter(l=>l.textContent?.trim()).map(l=>l.textContent?.trim()).filter(Boolean).reduce((l,p)=>(l.some(y=>y.includes(p)||p.includes(y))||l.push(p),l),[]).join(" ").trim().replace(/\s+/g," ")};try{r.querySelectorAll(".b_algo").forEach(s=>{let c=s.querySelector("h2"),u=s.querySelector("h2 a")?.getAttribute("href"),g=a(s);if(!u||!n(u))return;let l={title:c?.textContent||"",snippet:g,url:u,content:""};!l.title||!l.url||e.push(l)})}catch(o){throw console.error("Error extracting search results from Bing:",o),o}return e}async waitForSearchResults(t,e){await t.waitForSelector("#b_results",{timeout:e??1e4})}};var L=class{getSearchUrl(t,e){let r=e.excludeDomains&&e.excludeDomains.length>0?e.excludeDomains.map(a=>`-site:${a}`).join(" "):"";return`https://www.baidu.com/s?${new URLSearchParams({wd:r?`${r} ${t}`:t,rn:`${e.count||10}`}).toString()}`}extractSearchResults(t){let e=[],r=t.document;try{r.querySelectorAll(".result").forEach(a=>{let o=a.querySelector(".t a"),s=o?.getAttribute("href"),c=a.querySelector(".c-span-last .content-right_2s-H4");if(!s)return;let h={title:o?.textContent||"",url:s,snippet:c?.textContent||"",content:""};!h.title||!h.url||e.push(h)})}catch(n){console.error("Error extracting search results from Baidu:",n)}return e}async waitForSearchResults(t,e){await t.waitForSelector("#page",{timeout:e??1e4})}};var P=class{getSearchUrl(t,e){let{count:r=10,excludeDomains:n=[]}=e,a=n&&n.length>0?n.map(s=>`-site:${s}`).join(" "):"";return`https://www.sogou.com/web?${new URLSearchParams({query:`${a?`${a} `:""}${t}`,num:`${r}`}).toString()}`}extractSearchResults(t){let e=[],r=t.document,n=s=>{try{return new URL(s),!0}catch{return!1}},a="https://www.sogou.com",o={results:".results .vrwrap",resultTitle:".vr-title",resultLink:".vr-title > a",resultSnippet:[".star-wiki",".fz-mid",".attribute-centent"],resultSnippetExcluded:[".text-lightgray",".zan-box",".tag-website"],related:"#main .vrwrap.middle-better-hintBox .hint-mid"};try{r.querySelectorAll(o.results).forEach(c=>{let h=c.querySelector(o.resultTitle),u=c.querySelector(o.resultLink)?.getAttribute("href"),g=o.resultSnippet.map(p=>(o.resultSnippetExcluded.forEach(d=>{c.querySelector(d)?.remove()}),c.querySelector(p)?.textContent?.trim()||""));if(u?.includes("http")||(u=`${a}${u}`),!u?.trim()||!n(u))return;let l={title:h?.textContent?.trim()||"",url:u,snippet:g.join(""),content:""};!l.title||!l.url||e.push(l)})}catch(s){let c=s instanceof Error?s.message:String(s);throw console.error("Error extracting search results from Sogou:",c),s}return e}async waitForSearchResults(t,e){await t.waitForSelector("#pagebar_container",{timeout:e??1e4})}};var C=class{getSearchUrl(t,e){let r=new URLSearchParams({q:`${e.excludeDomains&&e.excludeDomains.length>0?`${e.excludeDomains.map(n=>`-site:${n}`).join(" ")} `:""}${t}`,num:`${e.count||10}`});return r.set("udm","14"),`https://www.google.com/search?${r.toString()}`}extractSearchResults(t){let e=[],r=t.document,n=o=>{try{return new URL(o),!0}catch{return!1}},a=o=>{let s=o.cloneNode(!0);return s.querySelectorAll("h3").forEach(l=>l.remove()),s.querySelectorAll("cite").forEach(l=>l.remove()),s.querySelectorAll("script, style").forEach(l=>l.remove()),Array.from(s.querySelectorAll("*")).filter(l=>l.textContent?.trim()).map(l=>l.textContent?.trim()).filter(Boolean).reduce((l,p)=>(l.some(y=>y.includes(p)||p.includes(y))||l.push(p),l),[]).join(" ").trim().replace(/\s+/g," ")};try{r.querySelectorAll(".tF2Cxc").forEach(s=>{let c=s.querySelector("h3"),u=s.querySelector("a")?.getAttribute("href"),g=a(s.parentElement||s);if(!u||!n(u))return;let l={title:c?.textContent||"",url:u,snippet:g,content:""};!l.title||!l.url||e.push(l)})}catch(o){console.error(o)}return e}async waitForSearchResults(t,e){await t.waitForSelector("#search",{timeout:e??1e4})}};function D(i){switch(i){case"bing":return new E;case"baidu":return new L;case"sogou":return new P;case"google":return new C;default:return new E}}var R=class{constructor(t={}){this.config=t;this.logger=t?.logger??we,this.browser=t.browser??new A({logger:this.logger}),this.defaultEngine=t.defaultEngine??"bing"}logger;browser;isBrowserOpen=!1;defaultEngine;async perform(t){this.logger.info("Starting search with options:",t);let e=Array.isArray(t.query)?t.query:[t.query],r=t.excludeDomains||[],n=t.count&&Math.max(3,Math.floor(t.count/e.length)),a=t.engine||this.defaultEngine;try{this.isBrowserOpen?this.logger.info("Using existing browser instance"):(this.logger.info("Launching browser"),await this.browser.launch(this.config.browserOptions),this.isBrowserOpen=!0);let o=new x(t.concurrency||15),s=new Set,c=await Promise.all(e.map(h=>this.search(this.browser,{query:h,count:n,queue:o,visitedUrls:s,excludeDomains:r,truncate:t.truncate,needVisitedUrls:t.needVisitedUrls,engine:a})));return this.logger.success("Search completed successfully"),c.flat()}catch(o){return this.logger.error("Search failed:",o),[]}finally{!t.keepBrowserOpen&&this.isBrowserOpen&&await this.closeBrowser()}}async closeBrowser(){this.isBrowserOpen&&(this.logger.info("Closing browser"),await this.browser.close(),this.isBrowserOpen=!1)}async search(t,e){let r=D(e.engine),n=r.getSearchUrl(e.query,{count:e.count,excludeDomains:e.excludeDomains});this.logger.info(`Searching with ${e.engine} engine: ${n}`);let a=await t.evaluateOnNewPage({url:n,waitForOptions:{waitUntil:"networkidle0"},pageFunction:r.extractSearchResults,pageFunctionParams:[],beforePageLoad:async s=>{await I(s)},afterPageLoad:async s=>{r.waitForSearchResults&&await r.waitForSearchResults(s,1e4)}});return this.logger.info(`Fetched ${a?.length??0} links`),a=a?.filter(s=>e.visitedUrls.has(s.url)?!1:(e.visitedUrls.add(s.url),!W(s.url)))||[],a.length?(await Promise.allSettled(e.needVisitedUrls?a.map(s=>e.queue.add(()=>this.visitLink(this.browser,s))):a)).map(s=>s.status==="rejected"||!s.value?null:{...s.value,content:e.truncate?s.value.content.slice(0,e.truncate):s.value.content}).filter(s=>s!==null):(this.logger.info("No valid links found"),[])}async visitLink(t,e){try{this.logger.info("Visiting link:",e.url);let r=await t.evaluateOnNewPage({url:e.url,pageFunction:V,pageFunctionParams:[j],beforePageLoad:async n=>{await I(n)}});if(r){let n=X(r.content);return{...r,url:e.url,content:n,snippet:e.snippet}}}catch(r){this.logger.error("Failed to visit link:",r)}}};import{ConsoleLogger as _e}from"@agent-infra/logger";var K=new _e("[LocalSearch]");async function Y(i){let{query:t,limit:e=10}=i,{engines:r="all"}=i,n=new R({logger:K,browserOptions:{headless:!0}});r==="all"&&(r="bing,google,baidu,sogou");try{let a=r.split(",");if(a.length===0)throw new Error("engines is required");let o=[];for(let s of a){let c=await n.perform({query:t,count:e,engine:s,needVisitedUrls:!1});if(c.length>0){o.push(...c);break}}return K.info(`Found ${o.length} results for ${t}`,o),{results:o,success:!0}}catch(a){let o=a instanceof Error?a.message:"Local search error.";throw process.stdout.write(o),a}finally{await n.closeBrowser()}}var z={name:"one_search",description:"Search and retrieve content from web pages. Returns SERP results by default (url, title, description).",inputSchema:{type:"object",properties:{query:{type:"string",description:"Search query string"},limit:{type:"number",description:"Maximum number of results to return (default: 10)"},language:{type:"string",description:"Language code for search results (default: auto)"},categories:{type:"string",enum:["general","news","images","videos","it","science","map","music","files","social_media"],description:"Categories to search for (default: general)"},timeRange:{type:"string",description:"Time range for search results (default: all)",enum:["all","day","week","month","year"]}},required:["query"]}},J={name:"one_map",description:"Discover URLs from a starting point. Can use both sitemap.xml and HTML link discovery.",inputSchema:{type:"object",properties:{url:{type:"string",description:"Starting URL for URL discovery"},search:{type:"string",description:"Optional search term to filter URLs"},ignoreSitemap:{type:"boolean",description:"Skip sitemap.xml discovery and only use HTML links"},sitemapOnly:{type:"boolean",description:"Only use sitemap.xml for discovery, ignore HTML links"},includeSubdomains:{type:"boolean",description:"Include URLs from subdomains in results"},limit:{type:"number",description:"Maximum number of URLs to return"}},required:["url"]}},Q={name:"one_scrape",description:"Scrape a single webpage with advanced options for content extraction. Supports various formats including markdown, HTML, and screenshots. Can execute custom actions like clicking or scrolling before scraping.",inputSchema:{type:"object",properties:{url:{type:"string",description:"The URL to scrape"},formats:{type:"array",items:{type:"string",enum:["markdown","html","rawHtml","screenshot","links","screenshot@fullPage","extract"]},description:"Content formats to extract (default: ['markdown'])"},onlyMainContent:{type:"boolean",description:"Extract only the main content, filtering out navigation, footers, etc."},includeTags:{type:"array",items:{type:"string"},description:"HTML tags to specifically include in extraction"},excludeTags:{type:"array",items:{type:"string"},description:"HTML tags to exclude from extraction"},waitFor:{type:"number",description:"Time in milliseconds to wait for dynamic content to load"},timeout:{type:"number",description:"Maximum time in milliseconds to wait for the page to load"},actions:{type:"array",items:{type:"object",properties:{type:{type:"string",enum:["wait","click","screenshot","write","press","scroll","scrape","executeJavascript"],description:"Type of action to perform"},selector:{type:"string",description:"CSS selector for the target element"},milliseconds:{type:"number",description:"Time to wait in milliseconds (for wait action)"},text:{type:"string",description:"Text to write (for write action)"},key:{type:"string",description:"Key to press (for press action)"},direction:{type:"string",enum:["up","down"],description:"Scroll direction"},script:{type:"string",description:"JavaScript code to execute"},fullPage:{type:"boolean",description:"Take full page screenshot"}},required:["type"]},description:"List of actions to perform before scraping"},extract:{type:"object",properties:{schema:{type:"object",description:"Schema for structured data extraction"},systemPrompt:{type:"string",description:"System prompt for LLM extraction"},prompt:{type:"string",description:"User prompt for LLM extraction"}},description:"Configuration for structured data extraction"},mobile:{type:"boolean",description:"Use mobile viewport"},skipTlsVerification:{type:"boolean",description:"Skip TLS certificate verification"},removeBase64Images:{type:"boolean",description:"Remove base64 encoded images from output"},location:{type:"object",properties:{country:{type:"string",description:"Country code for geolocation"},languages:{type:"array",items:{type:"string"},description:"Language codes for content"}},description:"Location settings for scraping"}},required:["url"]}},Z={name:"one_extract",description:"Extract structured information from web pages using LLM. Supports both cloud AI and self-hosted LLM extraction.",inputSchema:{type:"object",properties:{urls:{type:"array",items:{type:"string"},description:"List of URLs to extract information from"},prompt:{type:"string",description:"Prompt for the LLM extraction"},systemPrompt:{type:"string",description:"System prompt for LLM extraction"},schema:{type:"object",description:"JSON schema for structured data extraction"},allowExternalLinks:{type:"boolean",description:"Allow extraction from external links"},enableWebSearch:{type:"boolean",description:"Enable web search for additional context"},includeSubdomains:{type:"boolean",description:"Include subdomains in extraction"}},required:["urls"]}};import Ne from"@mendable/firecrawl-js";import Ae from"@dotenvx/dotenvx";import{SafeSearchType as B}from"duck-duck-scrape";Ae.config();var xe=process.env.SEARCH_API_URL,v=process.env.SEARCH_API_KEY,ee=process.env.SEARCH_PROVIDER??"local",Le=process.env.SAFE_SEARCH??0,Pe=process.env.LIMIT??10,Ce=process.env.CATEGORIES??"general",Re=process.env.ENGINES??"all",Oe=process.env.FORMAT??"json",Ie=process.env.LANGUAGE??"auto",De=process.env.TIME_RANGE??"",Be=process.env.TIMEOUT??1e4,ke=process.env.FIRECRAWL_API_KEY,te=process.env.FIRECRAWL_API_URL,re=new Ne({apiKey:ke??"",...te?{apiUrl:te}:{}}),m=new Se({name:"one-search-mcp",version:"0.0.1"},{capabilities:{tools:{},logging:{}}}),b={limit:Number(Pe),categories:Ce,format:Oe,safesearch:Le,language:Ie,engines:Re,time_range:De,timeout:Be};m.setRequestHandler(ve,async()=>({tools:[z,Z,Q,J]}));m.setRequestHandler(Ee,async i=>{let t=Date.now();try{let{name:e,arguments:r}=i.params;if(!r)throw new Error("No arguments provided");switch(m.sendLoggingMessage({level:"info",data:`[${new Date().toISOString()}] Received request for tool: [${e}]`}),e){case"one_search":{if(!Fe(r))throw new Error(`Invalid arguments for tool: [${e}]`);try{let{results:n,success:a}=await Ue({...r,apiKey:v??"",apiUrl:xe});if(!a)throw new Error("Failed to search");return{content:[{type:"text",text:n.map(s=>`Title: ${s.title}
|
|
4
|
+
URL: ${s.url}
|
|
5
|
+
Description: ${s.snippet}
|
|
6
|
+
${s.markdown?`Content: ${s.markdown}`:""}`).join(`
|
|
2
7
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
6
|
-
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
8
|
+
`)}],results:n,success:a}}catch(n){return m.sendLoggingMessage({level:"error",data:`[${new Date().toISOString()}] Error searching: ${n}`}),{success:!1,content:[{type:"text",text:n instanceof Error?n.message:"Unknown error"}]}}}case"one_scrape":{if(!Ge(r))throw new Error(`Invalid arguments for tool: [${e}]`);try{let n=Date.now();m.sendLoggingMessage({level:"info",data:`[${new Date().toISOString()}] Scraping started for url: [${r.url}]`});let{url:a,...o}=r,{content:s,success:c,result:h}=await Me(a,o);return m.sendLoggingMessage({level:"info",data:`[${new Date().toISOString()}] Scraping completed in ${Date.now()-n}ms`}),{content:s,result:h,success:c}}catch(n){return m.sendLoggingMessage({level:"error",data:`[${new Date().toISOString()}] Error scraping: ${n}`}),{success:!1,content:[{type:"text",text:n instanceof Error?n.message:"Unknown error"}]}}}case"one_map":{if(!qe(r))throw new Error(`Invalid arguments for tool: [${e}]`);try{let{content:n,success:a,result:o}=await $e(r.url,r);return{content:n,result:o,success:a}}catch(n){return m.sendLoggingMessage({level:"error",data:`[${new Date().toISOString()}] Error mapping: ${n}`}),{success:!1,content:[{type:"text",text:n instanceof Error?n.message:String(n)}]}}}default:throw new Error(`Unknown tool: ${e}`)}}catch(e){let r=e instanceof Error?e.message:String(e);return m.sendLoggingMessage({level:"error",data:{message:`[${new Date().toISOString()}] Error processing request: ${r}`,tool:i.params.name,arguments:i.params.arguments,timestamp:new Date().toISOString(),duration:Date.now()-t}}),{success:!1,content:[{type:"text",text:r}]}}finally{m.sendLoggingMessage({level:"info",data:`[${new Date().toISOString()}] Request completed in ${Date.now()-t}ms`})}});async function Ue(i){switch(ee){case"searxng":{let t={...b,...i,apiKey:v},{categories:e,language:r}=b;return e&&(t.categories=e),r&&(t.language=r),await F(t)}case"tavily":return await G({...b,...i,apiKey:v});case"bing":return await M({...b,...i,apiKey:v});case"duckduckgo":{let t=i.safeSearch??0,e=[B.STRICT,B.MODERATE,B.OFF];return await $({...b,...i,apiKey:v,safeSearch:e[t]})}case"local":return await Y({...b,...i});default:throw new Error(`Unsupported search provider: ${ee}`)}}async function Me(i,t){let e=await re.scrapeUrl(i,{...t});if(!e.success)throw new Error(`Failed to scrape: ${e.error}`);let r=[];return e.markdown&&r.push(e.markdown),e.rawHtml&&r.push(e.rawHtml),e.links&&r.push(e.links.join(`
|
|
9
|
+
`)),e.screenshot&&r.push(e.screenshot),e.html&&r.push(e.html),e.extract&&r.push(e.extract),{content:[{type:"text",text:r.join(`
|
|
7
10
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const {
|
|
14
|
-
query,
|
|
15
|
-
page = 1,
|
|
16
|
-
limit = 10,
|
|
17
|
-
categories = "general",
|
|
18
|
-
engines = "all",
|
|
19
|
-
safeSearch = 0,
|
|
20
|
-
format = "json",
|
|
21
|
-
language = "auto",
|
|
22
|
-
timeRange = "",
|
|
23
|
-
timeout = 1e4,
|
|
24
|
-
apiKey,
|
|
25
|
-
apiUrl
|
|
26
|
-
} = params;
|
|
27
|
-
if (!apiUrl) {
|
|
28
|
-
throw new Error("SearxNG API URL is required");
|
|
29
|
-
}
|
|
30
|
-
const controller = new AbortController();
|
|
31
|
-
const timeoutId = setTimeout(() => controller.abort(), Number(timeout));
|
|
32
|
-
const config = {
|
|
33
|
-
q: query,
|
|
34
|
-
pageno: page,
|
|
35
|
-
categories,
|
|
36
|
-
format,
|
|
37
|
-
safesearch: safeSearch,
|
|
38
|
-
language,
|
|
39
|
-
engines,
|
|
40
|
-
time_range: timeRange
|
|
41
|
-
};
|
|
42
|
-
const endpoint = `${apiUrl}/search`;
|
|
43
|
-
const queryParams = url.format({ query: config });
|
|
44
|
-
const headers = {
|
|
45
|
-
"Content-Type": "application/json"
|
|
46
|
-
};
|
|
47
|
-
if (apiKey) {
|
|
48
|
-
headers["Authorization"] = `Bearer ${apiKey}`;
|
|
49
|
-
}
|
|
50
|
-
const res = await fetch(`${endpoint}${queryParams}`, {
|
|
51
|
-
method: "POST",
|
|
52
|
-
headers,
|
|
53
|
-
signal: controller.signal
|
|
54
|
-
});
|
|
55
|
-
clearTimeout(timeoutId);
|
|
56
|
-
const response = await res.json();
|
|
57
|
-
if (response.results) {
|
|
58
|
-
const list = response.results.slice(0, limit);
|
|
59
|
-
const results = list.map((item) => {
|
|
60
|
-
const image = item.img_src ? {
|
|
61
|
-
thumbnail: item.thumbnail_src,
|
|
62
|
-
src: item.img_src
|
|
63
|
-
} : null;
|
|
64
|
-
const video = item.iframe_src ? {
|
|
65
|
-
thumbnail: item.thumbnail_src,
|
|
66
|
-
src: item.iframe_src
|
|
67
|
-
} : null;
|
|
68
|
-
return {
|
|
69
|
-
title: item.title,
|
|
70
|
-
snippet: item.content,
|
|
71
|
-
url: item.url,
|
|
72
|
-
source: item.source,
|
|
73
|
-
image,
|
|
74
|
-
video,
|
|
75
|
-
engine: item.engine
|
|
76
|
-
};
|
|
77
|
-
});
|
|
78
|
-
return {
|
|
79
|
-
results,
|
|
80
|
-
success: true
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
return {
|
|
84
|
-
results: [],
|
|
85
|
-
success: false
|
|
86
|
-
};
|
|
87
|
-
} catch (err) {
|
|
88
|
-
const msg = err instanceof Error ? err.message : "Searxng search error.";
|
|
89
|
-
process.stdout.write(msg);
|
|
90
|
-
throw err;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
var tvly = null;
|
|
94
|
-
async function tavilySearch(options) {
|
|
95
|
-
const {
|
|
96
|
-
query,
|
|
97
|
-
limit = 10,
|
|
98
|
-
categories = "general",
|
|
99
|
-
timeRange,
|
|
100
|
-
apiKey
|
|
101
|
-
} = options;
|
|
102
|
-
if (!apiKey) {
|
|
103
|
-
throw new Error("Tavily API key is required");
|
|
104
|
-
}
|
|
105
|
-
if (!tvly) {
|
|
106
|
-
tvly = tavily({
|
|
107
|
-
apiKey
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
const params = {
|
|
111
|
-
topic: categories,
|
|
112
|
-
timeRange,
|
|
113
|
-
maxResults: limit
|
|
114
|
-
};
|
|
115
|
-
const res = await tvly.search(query, params);
|
|
116
|
-
const results = res.results.map((item) => ({
|
|
117
|
-
title: item.title,
|
|
118
|
-
url: item.url,
|
|
119
|
-
snippet: item.content
|
|
120
|
-
}));
|
|
121
|
-
return {
|
|
122
|
-
results,
|
|
123
|
-
success: true
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// src/tools.ts
|
|
128
|
-
var SEARCH_TOOL = {
|
|
129
|
-
name: "one_search",
|
|
130
|
-
description: "Search and retrieve content from web pages. Returns SERP results by default (url, title, description).",
|
|
131
|
-
inputSchema: {
|
|
132
|
-
type: "object",
|
|
133
|
-
properties: {
|
|
134
|
-
query: {
|
|
135
|
-
type: "string",
|
|
136
|
-
description: "Search query string"
|
|
137
|
-
},
|
|
138
|
-
limit: {
|
|
139
|
-
type: "number",
|
|
140
|
-
description: "Maximum number of results to return (default: 10)"
|
|
141
|
-
},
|
|
142
|
-
language: {
|
|
143
|
-
type: "string",
|
|
144
|
-
description: "Language code for search results (default: auto)"
|
|
145
|
-
},
|
|
146
|
-
categories: {
|
|
147
|
-
type: "string",
|
|
148
|
-
enum: [
|
|
149
|
-
"general",
|
|
150
|
-
"news",
|
|
151
|
-
"images",
|
|
152
|
-
"videos",
|
|
153
|
-
"it",
|
|
154
|
-
"science",
|
|
155
|
-
"map",
|
|
156
|
-
"music",
|
|
157
|
-
"files",
|
|
158
|
-
"social_media"
|
|
159
|
-
],
|
|
160
|
-
description: "Categories to search for (default: general)"
|
|
161
|
-
},
|
|
162
|
-
timeRange: {
|
|
163
|
-
type: "string",
|
|
164
|
-
description: "Time range for search results (default: all)",
|
|
165
|
-
enum: [
|
|
166
|
-
"all",
|
|
167
|
-
"day",
|
|
168
|
-
"week",
|
|
169
|
-
"month",
|
|
170
|
-
"year"
|
|
171
|
-
]
|
|
172
|
-
}
|
|
173
|
-
},
|
|
174
|
-
required: ["query"]
|
|
175
|
-
}
|
|
176
|
-
};
|
|
177
|
-
var SCRAPE_TOOL = {
|
|
178
|
-
name: "one_scrape",
|
|
179
|
-
description: "Scrape a single webpage with advanced options for content extraction. Supports various formats including markdown, HTML, and screenshots. Can execute custom actions like clicking or scrolling before scraping.",
|
|
180
|
-
inputSchema: {
|
|
181
|
-
type: "object",
|
|
182
|
-
properties: {
|
|
183
|
-
url: {
|
|
184
|
-
type: "string",
|
|
185
|
-
description: "The URL to scrape"
|
|
186
|
-
},
|
|
187
|
-
formats: {
|
|
188
|
-
type: "array",
|
|
189
|
-
items: {
|
|
190
|
-
type: "string",
|
|
191
|
-
enum: [
|
|
192
|
-
"markdown",
|
|
193
|
-
"html",
|
|
194
|
-
"rawHtml",
|
|
195
|
-
"screenshot",
|
|
196
|
-
"links",
|
|
197
|
-
"screenshot@fullPage",
|
|
198
|
-
"extract"
|
|
199
|
-
]
|
|
200
|
-
},
|
|
201
|
-
description: "Content formats to extract (default: ['markdown'])"
|
|
202
|
-
},
|
|
203
|
-
onlyMainContent: {
|
|
204
|
-
type: "boolean",
|
|
205
|
-
description: "Extract only the main content, filtering out navigation, footers, etc."
|
|
206
|
-
},
|
|
207
|
-
includeTags: {
|
|
208
|
-
type: "array",
|
|
209
|
-
items: { type: "string" },
|
|
210
|
-
description: "HTML tags to specifically include in extraction"
|
|
211
|
-
},
|
|
212
|
-
excludeTags: {
|
|
213
|
-
type: "array",
|
|
214
|
-
items: { type: "string" },
|
|
215
|
-
description: "HTML tags to exclude from extraction"
|
|
216
|
-
},
|
|
217
|
-
waitFor: {
|
|
218
|
-
type: "number",
|
|
219
|
-
description: "Time in milliseconds to wait for dynamic content to load"
|
|
220
|
-
},
|
|
221
|
-
timeout: {
|
|
222
|
-
type: "number",
|
|
223
|
-
description: "Maximum time in milliseconds to wait for the page to load"
|
|
224
|
-
},
|
|
225
|
-
actions: {
|
|
226
|
-
type: "array",
|
|
227
|
-
items: {
|
|
228
|
-
type: "object",
|
|
229
|
-
properties: {
|
|
230
|
-
type: {
|
|
231
|
-
type: "string",
|
|
232
|
-
enum: [
|
|
233
|
-
"wait",
|
|
234
|
-
"click",
|
|
235
|
-
"screenshot",
|
|
236
|
-
"write",
|
|
237
|
-
"press",
|
|
238
|
-
"scroll",
|
|
239
|
-
"scrape",
|
|
240
|
-
"executeJavascript"
|
|
241
|
-
],
|
|
242
|
-
description: "Type of action to perform"
|
|
243
|
-
},
|
|
244
|
-
selector: {
|
|
245
|
-
type: "string",
|
|
246
|
-
description: "CSS selector for the target element"
|
|
247
|
-
},
|
|
248
|
-
milliseconds: {
|
|
249
|
-
type: "number",
|
|
250
|
-
description: "Time to wait in milliseconds (for wait action)"
|
|
251
|
-
},
|
|
252
|
-
text: {
|
|
253
|
-
type: "string",
|
|
254
|
-
description: "Text to write (for write action)"
|
|
255
|
-
},
|
|
256
|
-
key: {
|
|
257
|
-
type: "string",
|
|
258
|
-
description: "Key to press (for press action)"
|
|
259
|
-
},
|
|
260
|
-
direction: {
|
|
261
|
-
type: "string",
|
|
262
|
-
enum: ["up", "down"],
|
|
263
|
-
description: "Scroll direction"
|
|
264
|
-
},
|
|
265
|
-
script: {
|
|
266
|
-
type: "string",
|
|
267
|
-
description: "JavaScript code to execute"
|
|
268
|
-
},
|
|
269
|
-
fullPage: {
|
|
270
|
-
type: "boolean",
|
|
271
|
-
description: "Take full page screenshot"
|
|
272
|
-
}
|
|
273
|
-
},
|
|
274
|
-
required: ["type"]
|
|
275
|
-
},
|
|
276
|
-
description: "List of actions to perform before scraping"
|
|
277
|
-
},
|
|
278
|
-
extract: {
|
|
279
|
-
type: "object",
|
|
280
|
-
properties: {
|
|
281
|
-
schema: {
|
|
282
|
-
type: "object",
|
|
283
|
-
description: "Schema for structured data extraction"
|
|
284
|
-
},
|
|
285
|
-
systemPrompt: {
|
|
286
|
-
type: "string",
|
|
287
|
-
description: "System prompt for LLM extraction"
|
|
288
|
-
},
|
|
289
|
-
prompt: {
|
|
290
|
-
type: "string",
|
|
291
|
-
description: "User prompt for LLM extraction"
|
|
292
|
-
}
|
|
293
|
-
},
|
|
294
|
-
description: "Configuration for structured data extraction"
|
|
295
|
-
},
|
|
296
|
-
mobile: {
|
|
297
|
-
type: "boolean",
|
|
298
|
-
description: "Use mobile viewport"
|
|
299
|
-
},
|
|
300
|
-
skipTlsVerification: {
|
|
301
|
-
type: "boolean",
|
|
302
|
-
description: "Skip TLS certificate verification"
|
|
303
|
-
},
|
|
304
|
-
removeBase64Images: {
|
|
305
|
-
type: "boolean",
|
|
306
|
-
description: "Remove base64 encoded images from output"
|
|
307
|
-
},
|
|
308
|
-
location: {
|
|
309
|
-
type: "object",
|
|
310
|
-
properties: {
|
|
311
|
-
country: {
|
|
312
|
-
type: "string",
|
|
313
|
-
description: "Country code for geolocation"
|
|
314
|
-
},
|
|
315
|
-
languages: {
|
|
316
|
-
type: "array",
|
|
317
|
-
items: { type: "string" },
|
|
318
|
-
description: "Language codes for content"
|
|
319
|
-
}
|
|
320
|
-
},
|
|
321
|
-
description: "Location settings for scraping"
|
|
322
|
-
}
|
|
323
|
-
},
|
|
324
|
-
required: ["url"]
|
|
325
|
-
}
|
|
326
|
-
};
|
|
327
|
-
var EXTRACT_TOOL = {
|
|
328
|
-
name: "one_extract",
|
|
329
|
-
description: "Extract structured information from web pages using LLM. Supports both cloud AI and self-hosted LLM extraction.",
|
|
330
|
-
inputSchema: {
|
|
331
|
-
type: "object",
|
|
332
|
-
properties: {
|
|
333
|
-
urls: {
|
|
334
|
-
type: "array",
|
|
335
|
-
items: { type: "string" },
|
|
336
|
-
description: "List of URLs to extract information from"
|
|
337
|
-
},
|
|
338
|
-
prompt: {
|
|
339
|
-
type: "string",
|
|
340
|
-
description: "Prompt for the LLM extraction"
|
|
341
|
-
},
|
|
342
|
-
systemPrompt: {
|
|
343
|
-
type: "string",
|
|
344
|
-
description: "System prompt for LLM extraction"
|
|
345
|
-
},
|
|
346
|
-
schema: {
|
|
347
|
-
type: "object",
|
|
348
|
-
description: "JSON schema for structured data extraction"
|
|
349
|
-
},
|
|
350
|
-
allowExternalLinks: {
|
|
351
|
-
type: "boolean",
|
|
352
|
-
description: "Allow extraction from external links"
|
|
353
|
-
},
|
|
354
|
-
enableWebSearch: {
|
|
355
|
-
type: "boolean",
|
|
356
|
-
description: "Enable web search for additional context"
|
|
357
|
-
},
|
|
358
|
-
includeSubdomains: {
|
|
359
|
-
type: "boolean",
|
|
360
|
-
description: "Include subdomains in extraction"
|
|
361
|
-
}
|
|
362
|
-
},
|
|
363
|
-
required: ["urls"]
|
|
364
|
-
}
|
|
365
|
-
};
|
|
366
|
-
|
|
367
|
-
// src/index.ts
|
|
368
|
-
import FirecrawlApp from "@mendable/firecrawl-js";
|
|
369
|
-
import dotenvx from "@dotenvx/dotenvx";
|
|
370
|
-
dotenvx.config();
|
|
371
|
-
var SEARCH_API_URL = process.env.SEARCH_API_URL;
|
|
372
|
-
var SEARCH_API_KEY = process.env.SEARCH_API_KEY;
|
|
373
|
-
var SEARCH_PROVIDER = process.env.SEARCH_PROVIDER ?? "searxng";
|
|
374
|
-
var SAFE_SEARCH = process.env.SAFE_SEARCH ?? 0;
|
|
375
|
-
var LIMIT = process.env.LIMIT ?? 10;
|
|
376
|
-
var CATEGORIES = process.env.CATEGORIES ?? "general";
|
|
377
|
-
var ENGINES = process.env.ENGINES ?? "all";
|
|
378
|
-
var FORMAT = process.env.FORMAT ?? "json";
|
|
379
|
-
var LANGUAGE = process.env.LANGUAGE ?? "auto";
|
|
380
|
-
var TIME_RANGE = process.env.TIME_RANGE ?? "";
|
|
381
|
-
var DEFAULT_TIMEOUT = process.env.TIMEOUT ?? 1e4;
|
|
382
|
-
var FIRECRAWL_API_KEY = process.env.FIRECRAWL_API_KEY;
|
|
383
|
-
var FIRECRAWL_API_URL = process.env.FIRECRAWL_API_URL;
|
|
384
|
-
var firecrawl = new FirecrawlApp({
|
|
385
|
-
apiKey: FIRECRAWL_API_KEY ?? "",
|
|
386
|
-
...FIRECRAWL_API_URL ? { apiUrl: FIRECRAWL_API_URL } : {}
|
|
387
|
-
});
|
|
388
|
-
var server = new Server(
|
|
389
|
-
{
|
|
390
|
-
name: "one-search-mcp",
|
|
391
|
-
version: "0.0.1"
|
|
392
|
-
},
|
|
393
|
-
{
|
|
394
|
-
capabilities: {
|
|
395
|
-
tools: {},
|
|
396
|
-
logging: {}
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
);
|
|
400
|
-
var searchDefaultConfig = {
|
|
401
|
-
limit: Number(LIMIT),
|
|
402
|
-
categories: CATEGORIES,
|
|
403
|
-
format: FORMAT,
|
|
404
|
-
safesearch: SAFE_SEARCH,
|
|
405
|
-
language: LANGUAGE,
|
|
406
|
-
engines: ENGINES,
|
|
407
|
-
time_range: TIME_RANGE,
|
|
408
|
-
timeout: DEFAULT_TIMEOUT
|
|
409
|
-
};
|
|
410
|
-
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
411
|
-
tools: [
|
|
412
|
-
SEARCH_TOOL,
|
|
413
|
-
EXTRACT_TOOL,
|
|
414
|
-
SCRAPE_TOOL
|
|
415
|
-
]
|
|
416
|
-
}));
|
|
417
|
-
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
418
|
-
const startTime = Date.now();
|
|
419
|
-
try {
|
|
420
|
-
const { name, arguments: args } = request.params;
|
|
421
|
-
if (!args) {
|
|
422
|
-
throw new Error("No arguments provided");
|
|
423
|
-
}
|
|
424
|
-
server.sendLoggingMessage({
|
|
425
|
-
level: "info",
|
|
426
|
-
data: `[${(/* @__PURE__ */ new Date()).toISOString()}] Received request for tool: [${name}]`
|
|
427
|
-
});
|
|
428
|
-
switch (name) {
|
|
429
|
-
case "one_search": {
|
|
430
|
-
if (!checkSearchArgs(args)) {
|
|
431
|
-
throw new Error(`Invalid arguments for tool: [${name}]`);
|
|
432
|
-
}
|
|
433
|
-
try {
|
|
434
|
-
const { results, success } = await processSearch({
|
|
435
|
-
...args,
|
|
436
|
-
apiKey: SEARCH_API_KEY ?? "",
|
|
437
|
-
apiUrl: SEARCH_API_URL ?? ""
|
|
438
|
-
});
|
|
439
|
-
if (!success) {
|
|
440
|
-
throw new Error("Failed to search");
|
|
441
|
-
}
|
|
442
|
-
const resultsText = results.map((result) => `Title: ${result.title}
|
|
443
|
-
URL: ${result.url}
|
|
444
|
-
Description: ${result.snippet}
|
|
445
|
-
${result.markdown ? `Content: ${result.markdown}` : ""}`);
|
|
446
|
-
return {
|
|
447
|
-
content: [
|
|
448
|
-
{
|
|
449
|
-
type: "text",
|
|
450
|
-
text: resultsText.join("\n\n")
|
|
451
|
-
}
|
|
452
|
-
],
|
|
453
|
-
results,
|
|
454
|
-
success
|
|
455
|
-
};
|
|
456
|
-
} catch (error) {
|
|
457
|
-
server.sendLoggingMessage({
|
|
458
|
-
level: "error",
|
|
459
|
-
data: `[${(/* @__PURE__ */ new Date()).toISOString()}] Error searching: ${error}`
|
|
460
|
-
});
|
|
461
|
-
const msg = error instanceof Error ? error.message : "Unknown error";
|
|
462
|
-
return {
|
|
463
|
-
success: false,
|
|
464
|
-
content: [
|
|
465
|
-
{
|
|
466
|
-
type: "text",
|
|
467
|
-
text: msg
|
|
468
|
-
}
|
|
469
|
-
]
|
|
470
|
-
};
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
case "one_scrape": {
|
|
474
|
-
if (!checkScrapeArgs(args)) {
|
|
475
|
-
throw new Error(`Invalid arguments for tool: [${name}]`);
|
|
476
|
-
}
|
|
477
|
-
try {
|
|
478
|
-
const startTime2 = Date.now();
|
|
479
|
-
server.sendLoggingMessage({
|
|
480
|
-
level: "info",
|
|
481
|
-
data: `[${(/* @__PURE__ */ new Date()).toISOString()}] Scraping started for url: [${args.url}]`
|
|
482
|
-
});
|
|
483
|
-
const { url: url2, ...scrapeArgs } = args;
|
|
484
|
-
const { content, success, result } = await processScrape(url2, scrapeArgs);
|
|
485
|
-
server.sendLoggingMessage({
|
|
486
|
-
level: "info",
|
|
487
|
-
data: `[${(/* @__PURE__ */ new Date()).toISOString()}] Scraping completed in ${Date.now() - startTime2}ms`
|
|
488
|
-
});
|
|
489
|
-
return {
|
|
490
|
-
content,
|
|
491
|
-
result,
|
|
492
|
-
success
|
|
493
|
-
};
|
|
494
|
-
} catch (error) {
|
|
495
|
-
server.sendLoggingMessage({
|
|
496
|
-
level: "error",
|
|
497
|
-
data: `[${(/* @__PURE__ */ new Date()).toISOString()}] Error scraping: ${error}`
|
|
498
|
-
});
|
|
499
|
-
const msg = error instanceof Error ? error.message : "Unknown error";
|
|
500
|
-
return {
|
|
501
|
-
success: false,
|
|
502
|
-
content: [
|
|
503
|
-
{
|
|
504
|
-
type: "text",
|
|
505
|
-
text: msg
|
|
506
|
-
}
|
|
507
|
-
]
|
|
508
|
-
};
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
default: {
|
|
512
|
-
throw new Error(`Unknown tool: ${name}`);
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
} catch (error) {
|
|
516
|
-
const msg = error instanceof Error ? error.message : String(error);
|
|
517
|
-
server.sendLoggingMessage({
|
|
518
|
-
level: "error",
|
|
519
|
-
data: {
|
|
520
|
-
message: `[${(/* @__PURE__ */ new Date()).toISOString()}] Error processing request: ${msg}`,
|
|
521
|
-
tool: request.params.name,
|
|
522
|
-
arguments: request.params.arguments,
|
|
523
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
524
|
-
duration: Date.now() - startTime
|
|
525
|
-
}
|
|
526
|
-
});
|
|
527
|
-
return {
|
|
528
|
-
success: false,
|
|
529
|
-
content: [
|
|
530
|
-
{
|
|
531
|
-
type: "text",
|
|
532
|
-
text: msg
|
|
533
|
-
}
|
|
534
|
-
]
|
|
535
|
-
};
|
|
536
|
-
} finally {
|
|
537
|
-
server.sendLoggingMessage({
|
|
538
|
-
level: "info",
|
|
539
|
-
data: `[${(/* @__PURE__ */ new Date()).toISOString()}] Request completed in ${Date.now() - startTime}ms`
|
|
540
|
-
});
|
|
541
|
-
}
|
|
542
|
-
});
|
|
543
|
-
async function processSearch(args) {
|
|
544
|
-
switch (SEARCH_PROVIDER) {
|
|
545
|
-
case "searxng": {
|
|
546
|
-
const params = {
|
|
547
|
-
...searchDefaultConfig,
|
|
548
|
-
...args,
|
|
549
|
-
apiKey: SEARCH_API_KEY
|
|
550
|
-
};
|
|
551
|
-
const { categories, language } = searchDefaultConfig;
|
|
552
|
-
if (categories) {
|
|
553
|
-
params.categories = categories;
|
|
554
|
-
}
|
|
555
|
-
if (language) {
|
|
556
|
-
params.language = language;
|
|
557
|
-
}
|
|
558
|
-
return await searxngSearch(params);
|
|
559
|
-
}
|
|
560
|
-
case "tavily": {
|
|
561
|
-
return await tavilySearch({
|
|
562
|
-
...searchDefaultConfig,
|
|
563
|
-
...args,
|
|
564
|
-
apiKey: SEARCH_API_KEY
|
|
565
|
-
});
|
|
566
|
-
}
|
|
567
|
-
default:
|
|
568
|
-
throw new Error(`Unsupported search provider: ${SEARCH_PROVIDER}`);
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
async function processScrape(url2, args) {
|
|
572
|
-
const res = await firecrawl.scrapeUrl(url2, {
|
|
573
|
-
...args
|
|
574
|
-
});
|
|
575
|
-
if (!res.success) {
|
|
576
|
-
throw new Error(`Failed to scrape: ${res.error}`);
|
|
577
|
-
}
|
|
578
|
-
const content = [];
|
|
579
|
-
if (res.markdown) {
|
|
580
|
-
content.push(res.markdown);
|
|
581
|
-
}
|
|
582
|
-
if (res.rawHtml) {
|
|
583
|
-
content.push(res.rawHtml);
|
|
584
|
-
}
|
|
585
|
-
if (res.links) {
|
|
586
|
-
content.push(res.links.join("\n"));
|
|
587
|
-
}
|
|
588
|
-
if (res.screenshot) {
|
|
589
|
-
content.push(res.screenshot);
|
|
590
|
-
}
|
|
591
|
-
if (res.html) {
|
|
592
|
-
content.push(res.html);
|
|
593
|
-
}
|
|
594
|
-
if (res.extract) {
|
|
595
|
-
content.push(res.extract);
|
|
596
|
-
}
|
|
597
|
-
return {
|
|
598
|
-
content: [
|
|
599
|
-
{
|
|
600
|
-
type: "text",
|
|
601
|
-
text: content.join("\n\n") || "No content found"
|
|
602
|
-
}
|
|
603
|
-
],
|
|
604
|
-
result: res,
|
|
605
|
-
success: true
|
|
606
|
-
};
|
|
607
|
-
}
|
|
608
|
-
function checkSearchArgs(args) {
|
|
609
|
-
return typeof args === "object" && args !== null && "query" in args && typeof args.query === "string";
|
|
610
|
-
}
|
|
611
|
-
function checkScrapeArgs(args) {
|
|
612
|
-
return typeof args === "object" && args !== null && "url" in args && typeof args.url === "string";
|
|
613
|
-
}
|
|
614
|
-
async function runServer() {
|
|
615
|
-
try {
|
|
616
|
-
process.stdout.write("Starting OneSearch MCP server...\n");
|
|
617
|
-
const transport = new StdioServerTransport();
|
|
618
|
-
await server.connect(transport);
|
|
619
|
-
server.sendLoggingMessage({
|
|
620
|
-
level: "info",
|
|
621
|
-
data: "OneSearch MCP server started"
|
|
622
|
-
});
|
|
623
|
-
} catch (error) {
|
|
624
|
-
const msg = error instanceof Error ? error.message : String(error);
|
|
625
|
-
process.stderr.write(`Error starting server: ${msg}
|
|
626
|
-
`);
|
|
627
|
-
process.exit(1);
|
|
628
|
-
}
|
|
629
|
-
}
|
|
630
|
-
runServer().catch((error) => {
|
|
631
|
-
const msg = error instanceof Error ? error.message : String(error);
|
|
632
|
-
process.stderr.write(`Error running server: ${msg}
|
|
633
|
-
`);
|
|
634
|
-
process.exit(1);
|
|
635
|
-
});
|
|
11
|
+
`)||"No content found"}],result:e,success:!0}}async function $e(i,t){let e=await re.mapUrl(i,{...t});if("error"in e)throw new Error(`Failed to map: ${e.error}`);if(!e.links)throw new Error(`No links found from: ${i}`);return{content:[{type:"text",text:e.links.join(`
|
|
12
|
+
`).trim()}],result:e.links,success:!0}}function Fe(i){return typeof i=="object"&&i!==null&&"query"in i&&typeof i.query=="string"}function Ge(i){return typeof i=="object"&&i!==null&&"url"in i&&typeof i.url=="string"}function qe(i){return typeof i=="object"&&i!==null&&"url"in i&&typeof i.url=="string"}async function He(){try{process.stdout.write(`Starting OneSearch MCP server...
|
|
13
|
+
`);let i=new Te;await m.connect(i),m.sendLoggingMessage({level:"info",data:"OneSearch MCP server started"})}catch(i){let t=i instanceof Error?i.message:String(i);process.stderr.write(`Error starting server: ${t}
|
|
14
|
+
`),process.exit(1)}}He().catch(i=>{let t=i instanceof Error?i.message:String(i);process.stderr.write(`Error running server: ${t}
|
|
15
|
+
`),process.exit(1)});
|
|
636
16
|
//# sourceMappingURL=index.js.map
|