Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
cookjohn avatar

Sd Advanced Search

  • 14 installs
  • 51 repo stars
  • Updated March 13, 2026
  • cookjohn/sd-skills

Runs filtered ScienceDirect searches by author, journal, year, title, and keywords via URL parameters.

About

Performs an advanced filtered search on ScienceDirect by constructing URL parameters. A developer uses it for precise academic paper searches on Elsevier's ScienceDirect.

  • Constructs ScienceDirect search URLs directly from filters
  • Supports author, journal, year, title, and keyword filters

Sd Advanced Search by the numbers

  • 14 all-time installs (skills.sh)
  • Ranked #1,417 of 2,715 Automation & Workflows skills by installs in the Skillselion catalog
  • Data as of Jul 29, 2026 (Skillselion catalog sync)
npx skills add https://github.com/cookjohn/sd-skills --skill sd-advanced-search

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs14
repo stars51
Last updatedMarch 13, 2026
Repositorycookjohn/sd-skills

What it does

Runs filtered ScienceDirect searches by author, journal, year, title, and keywords via URL parameters.

Files

SKILL.mdMarkdownGitHub ↗

ScienceDirect Advanced Search

Perform a filtered search on ScienceDirect by constructing URL parameters directly.

URL Parameter Reference

Build the search URL as {BASE_URL}/search?{params}&show=25 using these parameters:

ParamFieldExample
qsAll fields (keywords)machine learning
takTitle, abstract or keywordsneural network
titleTitle onlytransformer
authorsAuthor name(s)Hinton
pubJournal or book titleNature
dateYear or year range2023 or 2020-2025
volumeVolume number(s)5 or 7-11
issueIssue number(s)1 or 1-3
pagePage number(s)55 or 1-9
docIdISSN or ISBN0957-4174
affiliationsAuthor affiliationMIT
referencesCited referencesSmith 2020

Multiple parameters can be combined. For example:

{BASE_URL}/search?tak=deep+learning&authors=LeCun&date=2020-2025&show=25

Steps

Step 1: Parse user intent

From $ARGUMENTS, identify which fields the user wants to filter on. Map natural language to URL parameters:

  • "by author X" → authors=X
  • "in journal Y" → pub=Y
  • "from 2020 to 2025" / "since 2020" → date=2020-2025
  • "about topic Z" → tak=Z or qs=Z
  • "titled ..." → title=...

Step 2: Navigate

Use navigate_page to the constructed URL. Always include `initScript` to prevent bot detection:

initScript: "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"

Step 3: Check access

  • If the page shows "Are you a robot" or captcha: auto-click the Cloudflare Turnstile checkbox using the procedure below. If auto-click fails after 2 attempts, tell the user "请在浏览器中完成验证后告知我。"
  • If the URL no longer contains sciencedirect or search after navigation, the user may have been redirected to a login/authentication page. Tell the user: "页面被重定向,请在浏览器中完成登录或认证后告知我。" Then wait.
Cloudflare Turnstile auto-click procedure

When a captcha page is detected (title "请稍候…" or body contains "Are you a robot"):

1. Wait for the Turnstile iframe to load — use evaluate_script to poll for #captcha-box (up to 8s). 2. Take a snapshot — use take_snapshot to get the a11y tree. The checkbox is inside a cross-origin iframe but Chrome DevTools MCP can see it:

   Iframe "包含 Cloudflare 安全质询的小组件"
     checkbox "确认您是真人"   ← target uid

3. Click the checkbox — use click(uid) on the checkbox element. 4. Wait and verify — wait 3-5s, then check if document.contentType changed or the page URL changed (indicating success). If still on captcha, retry once or fall back to asking the user.

Step 4: Extract results

Use evaluate_script with built-in waiting (same as sd-search). Do NOT use wait_for — it returns oversized snapshots.

async () => {
  // Wait for results to load (up to 10s)
  for (let i = 0; i < 20; i++) {
    if (document.querySelector('li.ResultItem') || document.querySelector('.search-body-results-text')) break;
    await new Promise(r => setTimeout(r, 500));
  }

  const items = document.querySelectorAll('li.ResultItem');
  const papers = [];

  for (let i = 0; i < items.length; i++) {
    const item = items[i];
    const titleLink = item.querySelector('a.result-list-title-link');
    const journal = item.querySelector('a.subtype-srctitle-link');
    const dateSpans = item.querySelectorAll('.srctitle-date-fields > span');
    const date = dateSpans.length > 1 ? dateSpans[dateSpans.length - 1].textContent.trim() : '';
    const authors = [...item.querySelectorAll('.Authors .author')].map(a => a.textContent.trim());
    const doi = item.getAttribute('data-doi');
    const pii = titleLink?.href?.match(/pii\/(\w+)/)?.[1] || '';
    const articleType = item.querySelector('.article-type')?.textContent?.trim() || '';
    const isOpenAccess = !!item.querySelector('.access-label');

    papers.push({
      rank: i + 1,
      title: titleLink?.textContent?.trim() || '',
      pii, doi: doi || '',
      journal: journal?.textContent?.trim() || '',
      date, authors, articleType, openAccess: isOpenAccess,
    });
  }

  const totalText = document.querySelector('.search-body-results-text')?.textContent?.trim() || '';
  const pageInfo = document.querySelector('.Pagination li:first-child')?.textContent?.trim() || '';
  return { papers, totalResults: totalText, pageInfo };
}

Step 5: Present results

Same format as sd-search. Additionally, show the applied filters at the top:

Search filters: author={X}, journal={Y}, year={Z}
Found {totalResults}. {pageInfo}

1. {title} ...

Notes

  • URL parameter approach avoids form filling, keeping operations to 2 tool calls.
  • All parameters are optional and combinable.
  • If the user provides a very specific query (e.g., DOI or PII), consider using sd-paper-detail instead.

Related skills

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.