cnki-search について
中国語または英語のキーワードでCNKIの論文を検索する、ブラウザー操作スキルです。件数と構造化された論文情報を返し、論文への直接移動やZoteroへの一括エクスポートにも対応します。
主な機能
- 01キーワードでCNKIを検索
- 02件数と論文メタデータを表示
- 03論文ページへ直接移動
- 04検索結果をZoteroへ一括エクスポート
活用シーン
- 01研究テーマに関する論文を検索
- 02結果の著者、掲載誌、日付を確認
- 03検索結果から指定論文を開く
- 04検索結果をまとめてZoteroに保存
MCP 対応
Chrome DevToolsのブラウザーツールを使ってCNKIへ移動し、検索します。MCPサーバーではなくスキルです。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ cookjohn/ cnki-skills --skill cnki-searchインストール後、Claude Code で/cnki-searchを入力して読み込まれたか確認します。
詳細
CNKI 基本検索
キーワードを使用して CNKI を検索します。1 回の呼び出しで、検索結果数と構造化された結果リスト(タイトル、URL、著者、ジャーナル、日付)を返します。
引数
$ARGUMENTS には、中国語または英語の検索キーワードが含まれます。
手順
1. 移動
mcp__chrome-devtools__navigate_page → https://kns.cnki.net/kns8s/search を使用します。
2. 検索と結果の抽出(単一の evaluate_script、wait_for は使用しない)
YOUR_KEYWORDS を実際の検索語に置き換えます。
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. 報告
結果を番号付きリストで提示します。
Searched CNKI for "$ARGUMENTS": found {total} results (page {page}).
1. {title}
Authors: {authors} | Journal: {journal} | Date: {date}
Citations: {citations} | Downloads: {downloads}
2. ...
4. フォローアップ:論文への移動
ユーザーが特定の論文を開く、またはダウンロードすることを希望した場合は、結果の href URL を直接指定して navigate_page を使用します。リンクはクリックしないでください(クリックすると新しいタブが開き、タブ管理のために追加で 3 回のツール呼び出しが必要になります)。
CAPTCHA の検出
#tcaptcha_transform_dy 要素の getBoundingClientRect().top >= 0 を確認します。
Tencent CAPTCHA SDK は DOM を top: -1000000px(画面外、非アクティブ)で事前読み込みします。
top >= 0(ユーザーに実際に表示されている)の場合に限り、error: 'captcha' を返します。
検証済みセレクター
| 要素 | セレクター | 備考 |
|---|---|---|
| 検索入力欄 | input.search-input | id=txt_search、placeholder「中文文献、外文文献」 |
| 検索ボタン | input.search-btn | type="button" |
| 結果数 | .pagerTitleCell | テキスト「共找到 X 条结果」 |
| ページインジケーター | .countPageMark | テキスト「1/300」 |
| 結果行 | .result-table-list tbody tr | 各行が 1 件の論文 |
| タイトルリンク | td.name a.fz14 | 論文タイトルと href |
| 著者 | td.author a.KnowledgeNetLink | 著者名リンク |
| ジャーナル | td.source a | ジャーナル/ソースのリンク |
| 日付 | td.date | 出版日テキスト |
| 被引用数 | td.quote | 被引用数 |
| ダウンロード数 | td.download | ダウンロード数 |
Zotero への一括エクスポート
ユーザーが検索結果を Zotero に保存することを希望した場合は、検索結果ページから直接一括エクスポートします。各詳細ページには移動しないでください。 検索結果の exportId は詳細ページの #export-id と同じです。cnki-export スキルを一括モード(ステップ 1B)で呼び出します。詳細については、cnki-export SKILL.md を参照してください。