mcpField
C
cnki-search

cnki-search

github.com/cookjohn生産性1.0k1.2k 回インストール33 週間前に更新
リポジトリ

cnki-search について

中国語または英語のキーワードでCNKIの論文を検索する、ブラウザー操作スキルです。件数と構造化された論文情報を返し、論文への直接移動やZoteroへの一括エクスポートにも対応します。

主な機能

  1. 01キーワードでCNKIを検索
  2. 02件数と論文メタデータを表示
  3. 03論文ページへ直接移動
  4. 04検索結果をZoteroへ一括エクスポート

活用シーン

  1. 01研究テーマに関する論文を検索
  2. 02結果の著者、掲載誌、日付を確認
  3. 03検索結果から指定論文を開く
  4. 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-inputid=txt_search、placeholder「中文文献、外文文献」
検索ボタンinput.search-btntype="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 を参照してください。

ツール呼び出し:2 回(navigate + evaluate_script)

コメント