
Cnki Search
Find Chinese and English academic papers on CNKI by keyword when validating a topic or writing literature-backed specs.
Overview
cnki-search is an agent skill for the Idea phase that searches CNKI by keyword and returns structured paper metadata in one browser-automation pass.
Install
npx skills add https://github.com/cookjohn/cnki-skills --skill cnki-searchWhat is this skill?
- Browser automation against kns.cnki.net/kns8s/search via Chrome DevTools MCP navigate and evaluate_script
- Returns result count plus structured list: titles, URLs, authors, journal, date in one call
- Chinese or English query arguments with verified selectors input.search-input and input.search-btn
- Explicit captcha detection—stops with error when visible tcaptcha challenge appears
- Single evaluate_script flow combining navigate, search, wait, and extract
Adoption & trust: 680 installs on skills.sh; 583 GitHub stars; 1/3 security scanners passed (skills.sh audits).
What problem does it solve?
You need CNKI literature fast but manual portal clicking does not fit an agentic research workflow.
Who is it for?
Solo builders validating ideas with Chinese academic sources or gathering citations for specs and content products.
Skip if: General web search, paywalled full-text download automation, or research when you cannot use browser MCP tools.
When should I use this skill?
The user wants to find academic papers on CNKI (中国知网) by keyword in Chinese or English.
What do I get? / Deliverables
You receive result counts and a structured list of papers with titles, URLs, authors, journals, and dates from a single search invocation.
- Structured CNKI result list with titles, URLs, authors, journal, and date
- Total result count or captcha error signal
Recommended Skills
Journey fit
Idea/research is the primary journey moment for external academic discovery before committing to build scope. Research subphase matches keyword search on 中国知网 with structured title, author, journal, date, and URL extraction.
How it compares
CNKI-specific browser integration—use instead of generic search MCPs when 知网 coverage is required.
Common Questions / FAQ
Who is cnki-search for?
Indie researchers and builders who work with Chinese academic literature and want agent-driven CNKI keyword search with structured results.
When should I use cnki-search?
During Idea/research when exploring a market or technology thesis, and in Validate/scope when you need citations to justify feature or compliance choices.
Is cnki-search safe to install?
It drives a real browser session to CNKI; review the Security Audits panel on this page and avoid submitting sensitive queries on shared automation profiles.
SKILL.md
READMESKILL.md - Cnki Search
# CNKI Basic Search Search CNKI for papers using keyword(s). Returns result count and structured result list (titles, URLs, authors, journal, date) in a single call. ## Arguments $ARGUMENTS contains the search keyword(s) in Chinese or English. ## Steps ### 1. Navigate Use `mcp__chrome-devtools__navigate_page` → `https://kns.cnki.net/kns8s/search` ### 2. Search + extract results (single evaluate_script, NO wait_for) Replace `YOUR_KEYWORDS` with actual search terms: ```javascript async () => { const query = "YOUR_KEYWORDS"; // Wait for search input (replaces wait_for) await new Promise((r, j) => { let n = 0; const c = () => { if (document.querySelector('input.search-input')) r(); else if (++n > 30) j('timeout'); else setTimeout(c, 500); }; c(); }); // Check captcha (only if visible on screen, not hidden SDK at top:-1000000) const outer = document.querySelector('#tcaptcha_transform_dy'); if (outer && outer.getBoundingClientRect().top >= 0) return { error: 'captcha' }; // Fill and submit (verified selectors: input.search-input, input.search-btn) const input = document.querySelector('input.search-input'); input.value = query; input.dispatchEvent(new Event('input', { bubbles: true })); document.querySelector('input.search-btn')?.click(); // Wait for results await new Promise((r, j) => { let n = 0; const c = () => { if (document.body.innerText.includes('条结果')) r(); else if (++n > 30) j('timeout'); else setTimeout(c, 500); }; c(); }); // Check captcha again const outer2 = document.querySelector('#tcaptcha_transform_dy'); if (outer2 && outer2.getBoundingClientRect().top >= 0) return { error: 'captcha' }; // Extract current page results (merged parse-results) const rows = document.querySelectorAll('.result-table-list tbody tr'); const checkboxes = document.querySelectorAll('.result-table-list tbody input.cbItem'); const results = Array.from(rows).map((row, i) => { const titleLink = row.querySelector('td.name a.fz14'); const authors = Array.from(row.querySelectorAll('td.author a.KnowledgeNetLink') || []).map(a => a.innerText?.trim()); const journal = row.querySelector('td.source a')?.innerText?.trim() || ''; const date = row.querySelector('td.date')?.innerText?.trim() || ''; const citations = row.querySelector('td.quote')?.innerText?.trim() || ''; const downloads = row.querySelector('td.download')?.innerText?.trim() || ''; return { n: i + 1, title: titleLink?.innerText?.trim() || '', href: titleLink?.href || '', exportId: checkboxes[i]?.value || '', authors: authors.join('; '), journal, date, citations, downloads }; }); return { query, total: document.querySelector('.pagerTitleCell')?.innerText?.match(/([\d,]+)/)?.[1] || '0', page: document.querySelector('.countPageMark')?.innerText || '1/1', results }; } ``` ### 3. Report Present results as a numbered list: ``` Searched CNKI for "$ARGUMENTS": found {total} results (page {page}). 1. {title} Authors: {authors} | Journal: {journal} | Date: {date} Citations: {citations} | Downloads: {downloads} 2. ... ``` ### 4. Follow-up: navigate to a paper When the user wants to open or download a specific paper, use `navigate_page` with the result's `href` URL directly — do NOT click the link (clicking opens a new tab and wastes 3 extra tool calls for tab management). ## Captcha detection Check `#tcaptcha_transform_dy` element's `getBoundingClientRect().top >= 0`. Tencent captcha SDK preloads DOM at `top: -1000000px` (off-screen, not active). Only return `error: 'captcha'` when `top >= 0` (actually visible to user). ## Verified selectors | Element | Selector | Notes | |---------|----------|-------| | Search input | `input.se