with one click
sd-advanced-search
// Advanced search on ScienceDirect with filters like author, journal, year, title, keywords. Use when the user wants filtered academic paper search.
// Advanced search on ScienceDirect with filters like author, journal, year, title, keywords. Use when the user wants filtered academic paper search.
Download PDF from ScienceDirect articles. Requires institutional or subscriber access.
Export citations from ScienceDirect in RIS, BibTeX, or plain text format. Supports pushing to Zotero.
Browse a journal on ScienceDirect — view info, impact factor, latest articles, and specific issues. Use when the user asks about a journal or wants to browse its contents.
Navigate pages, change sort order, or adjust results per page on ScienceDirect search results.
Extract full metadata from a ScienceDirect article page (abstract, authors, keywords, DOI, references, PDF link). Use when the user wants details about a specific paper.
Re-parse the currently open ScienceDirect search results page. Internal skill used by other skills.
| name | sd-advanced-search |
| description | Advanced search on ScienceDirect with filters like author, journal, year, title, keywords. Use when the user wants filtered academic paper search. |
| argument-hint | [search terms and filters] |
Perform a filtered search on ScienceDirect by constructing URL parameters directly.
Build the search URL as {BASE_URL}/search?{params}&show=25 using these parameters:
| Param | Field | Example |
|---|---|---|
qs | All fields (keywords) | machine learning |
tak | Title, abstract or keywords | neural network |
title | Title only | transformer |
authors | Author name(s) | Hinton |
pub | Journal or book title | Nature |
date | Year or year range | 2023 or 2020-2025 |
volume | Volume number(s) | 5 or 7-11 |
issue | Issue number(s) | 1 or 1-3 |
page | Page number(s) | 55 or 1-9 |
docId | ISSN or ISBN | 0957-4174 |
affiliations | Author affiliation | MIT |
references | Cited references | Smith 2020 |
Multiple parameters can be combined. For example:
{BASE_URL}/search?tak=deep+learning&authors=LeCun&date=2020-2025&show=25
From $ARGUMENTS, identify which fields the user wants to filter on. Map natural language to URL parameters:
authors=Xpub=Ydate=2020-2025tak=Z or qs=Ztitle=...Use navigate_page to the constructed URL. Always include initScript to prevent bot detection:
initScript: "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
sciencedirect or search after navigation, the user may have been redirected to a login/authentication page. Tell the user: "页面被重定向,请在浏览器中完成登录或认证后告知我。" Then wait.When a captcha page is detected (title "请稍候…" or body contains "Are you a robot"):
evaluate_script to poll for #captcha-box (up to 8s).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
click(uid) on the checkbox element.document.contentType changed or the page URL changed (indicating success). If still on captcha, retry once or fall back to asking the user.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 };
}
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} ...
sd-paper-detail instead.