本文へスキップ

国立国会図書館サーチAPIの使い方:OpenSearch・SRUの検索例とAIエージェント設計

NDLサーチのOpenSearch・SRU・OAI-PMHのエンドポイントと主要パラメータ、利用申請が要る条件、クレジット表示、アクセス制限を公式資料で確認し、書名・著者・ISBN検索を2026年9月14日に実行。AIエージェントで文献調査するときの出典保持も整理しました。

SHAYOUWORLD 更新 約7分

国立国会図書館サーチ(NDLサーチ)の検索APIは、APIキーなしのGETで書誌を検索でき、OpenSearchなら書名・著者・ISBN・NDLの書誌IDがRSS 2.0形式でまとめて返ります。 利用申請は目的で分かれ、収益を得ない個人・非営利の利用なら不要、広告収入などの収益があれば営利目的として申請が必要です。

国会会議録検索APIの使い方で扱った会議録APIとは別のサービスです。この記事は、公式ページと外部提供インタフェース仕様書(第1.4版)を読み、2026年9月14日に数回だけリクエストを投げた結果をもとに書いています。

  1. APIは4種類。 検索用がSRU・OpenSearch・OpenURL、一括収集用がOAI-PMHです。
  2. 1回500件まで。 省略時は200件で、501件目以降はどう指定しても取得できません。
  3. 申請の要否は収益の有無で決まる。 クレジット表示と多重アクセスの回避は共通の条件です。
  4. 同じ資料が複数レコードで返る前提で設計する。 同じ論文がJ-STAGEとCiNii Researchから別々に返り、同名の書籍が2件並びました。

NDLサーチが提供するAPI

仕様書の「アクセスURL」の表と各章から整理すると、次の4つです。

APIエンドポイント返戻形式用途
SRUhttps://ndlsearch.ndl.go.jp/api/sruXML(dc / dcndl / dcndl_v3CQLで条件を組み合わせる検索
OpenSearchhttps://ndlsearch.ndl.go.jp/api/opensearchRSS 2.0を拡張したXMLパラメータを並べるだけの検索
OpenURLhttps://ndlsearch.ndl.go.jp/api/openurlHTML(検索結果画面)画面へのリンク用
OAI-PMHhttps://ndlsearch.ndl.go.jp/api/oaipmhXML(oai_dc / dcndl / dcndl_v3メタデータの一括収集

文字コードはいずれもUTF-8です。仕様書には、検索用APIは同一と見なした資料を同定したメタデータを対象にし、OAI-PMHは同定前の各データプロバイダ由来のメタデータを対象にするという違いも書かれています。検索範囲はデータプロバイダID(dpid)で絞れ、国立国会図書館の蔵書は iss-ndl-opac です(一覧は附録1)。

OpenSearchで書名・著者・ISBNを引く

仕様書の表4-1にある主な引数です。

引数内容一致条件
dpidデータプロバイダIDなど完全一致(空白区切りでOR)
any簡易検索と同じ対象項目部分一致
title / creator / publisherタイトル・作成者・出版者部分一致
isbnISBN10桁・13桁は両形式に変換して完全一致、それ以外は前方一致
ndc分類前方一致
from / until出版年月日(YYYY、YYYY-MM、YYYY-MM-DD)両方指定するときは同じ形式
cnt / idx件数(既定200、最大500)/ 開始位置(既定1)

項目間はすべてANDで、dpid だけの検索はできません。注意したいのは、引数を誤ると検索結果ゼロ件として返ると明記されている点です。エラーにならないので、0件を「該当なし」と即断しない設計が要ります。

書名で検索する

国立国会図書館の蔵書に絞って「大規模言語モデル入門」を検索し、応答から書誌IDを取り出すPythonの例です。

import urllib.parse
import urllib.request
import xml.etree.ElementTree as ET
BASE = "https://ndlsearch.ndl.go.jp/api/opensearch"
XSI_TYPE = "{http://www.w3.org/2001/XMLSchema-instance}type"
NS = {
"dc": "http://purl.org/dc/elements/1.1/",
"dcndl": "http://ndl.go.jp/dcndl/terms/",
"dcterms": "http://purl.org/dc/terms/",
"openSearch": "http://a9.com/-/spec/opensearchrss/1.0/",
}
def search(**params):
url = BASE + "?" + urllib.parse.urlencode(params)
req = urllib.request.Request(url, headers={"User-Agent": "my-research-agent/0.1"})
with urllib.request.urlopen(req, timeout=60) as res:
root = ET.fromstring(res.read())
total = int(root.findtext("channel/openSearch:totalResults", namespaces=NS))
items = []
for item in root.iterfind("channel/item"):
ids = {e.get(XSI_TYPE): e.text for e in item.iterfind("dc:identifier", NS)}
items.append({
"title": item.findtext("title"),
"url": item.findtext("link"),
"volume": item.findtext("dcndl:volume", namespaces=NS),
"issued": item.findtext("dcterms:issued", namespaces=NS),
"publisher": item.findtext("dc:publisher", namespaces=NS),
"isbn": ids.get("dcndl:ISBN"),
"ndlBibId": ids.get("dcndl:NDLBibID"),
})
return total, items
if __name__ == "__main__":
total, items = search(dpid="iss-ndl-opac", title="大規模言語モデル入門", cnt=5)
print("total", total)
for it in items:
print(it)

5件がヒットし、そのうち2件は書名も出版者も同じでした(出力から該当する2件を抜粋)。

total 5
{'title': '大規模言語モデル入門', 'url': 'https://ndlsearch.ndl.go.jp/books/R100000002-I032946287', 'volume': None, 'issued': '2023.8', 'publisher': '技術評論社', 'isbn': '978-4-297-13633-8', 'ndlBibId': '032946287'}
{'title': '大規模言語モデル入門', 'url': 'https://ndlsearch.ndl.go.jp/books/R100000002-I033660006', 'volume': '2', 'issued': '2024.9', 'publisher': '技術評論社', 'isbn': '978-4-297-14393-0', 'ndlBibId': '033660006'}

RSSの各項目には、資料URLの linkdc:identifierdcndl:ISBNdcndl:NDLBibIDdcndl:JPNOdc:subject の分類、他館の蔵書検索ページへの rdfs:seeAlso などが入っていました。

著者と書名を組み合わせる

dpid=iss-ndl-opac&creator=夏目漱石&title=こころ は177件でした。先頭3件は「近代文学館 : 名著複刻全集」(1969年、巻次 [65]、説明に「岩波書店大正3年刊」)、「こころ」(岩波書店 1917年、縮刷版、マイクロ)、「こゝろ」(岩波書店 1914年)です。部分一致なので複刻や版違い、表記違いまで広く当たり、先頭の1件は返ってきたRSSの項目のどこにも「こころ」の文字列がありませんでした。

ISBNで引く

13桁の isbn=9784065415245 と10桁の isbn=4065415241 は、どちらも1件で同じ R100000002-I034489132 を返しました。仕様書のとおり10桁と13桁は相互に変換されます。

1,356件
title=大規模言語モデル
dpid指定なし。論文の記事レベル書誌も含む
177件
著者「夏目漱石」+書名「こころ」
dpid=iss-ndl-opac
1件
ISBNの13桁と10桁
どちらも同じ資料URL
1.1〜6.9秒
1リクエストの応答時間
公式ページはキャッシュにより応答性能が変わりうると注記
OpenSearch / SRU に数秒間隔で1件ずつ実行(2026-09-14)

SRUでDC-NDL形式を取る

より詳しい書誌が要るときはSRUの recordSchema=dcndl を使います。CQLは isbn="9784065415245" をURLエンコードして渡します。

Terminal window
curl -s "https://ndlsearch.ndl.go.jp/api/sru?operation=searchRetrieve&query=isbn%3D%229784065415245%22&recordSchema=dcndl&recordPacking=xml&onlyBib=true&maximumRecords=3"

応答から行を抜粋します(インデントは省略)。

<numberOfRecords>1</numberOfRecords>
<lst name="LIBRARY">
<int name="さいたま市立中央図書館">1</int>
<int name="国立国会図書館">1</int>
<recordSchema>info:srw/schema/1/dc-v1.1</recordSchema>
<dcndl:BibAdminResource rdf:about="https://ndlsearch.ndl.go.jp/books/R100000002-I034489132">
<dcterms:identifier rdf:datatype="http://ndl.go.jp/dcndl/terms/NDLBibID">034489132</dcterms:identifier>
<dcterms:identifier rdf:datatype="http://ndl.go.jp/dcndl/terms/ISBN">978-4-06-541524-5</dcterms:identifier>
<foaf:Agent rdf:about="http://id.ndl.go.jp/auth/entity/034526287">
<foaf:name>高野, 海斗</foaf:name>
<dcndl:record rdf:resource="https://ndlsearch.ndl.go.jp/books/R100000136-I1971995846320139533#item"/>

OpenSearchにない情報として、著者の典拠URI(id.ndl.go.jp/auth/entity/...)、件名、所蔵館のファセット(8館)、そして**同定された他プロバイダのレコード一覧(dcndl:record が11件)**が入っていました。なお recordSchemadcndl で指定しても、応答の recordSchema 要素は info:srw/schema/1/dc-v1.1 で、中身はDC-NDL(RDF)でした。この要素でパーサーを分岐させないほうが安全です。

OpenSearch
SRU
返戻形式
RSS 2.0を拡張したXML
XML(dc / dcndl / dcndl_v3)
条件の書き方
引数を並べる。項目間はAND
CQL。and / or、同一項目は all / any
件数
cnt 既定200・最大500
maximumRecords 既定200・最大500
ISBNの一致
10・13桁は完全一致、それ以外は前方一致
完全一致
引数を誤ったとき
検索結果ゼロ件
Diagnostics のエラーメッセージ
次ページ
idx を進める
nextRecordPosition(次がなければ0)
外部提供インタフェース仕様書(第1.4版)より。応答の中身は2026-09-14の実行結果

CQLには癖があります。仕様書によると、検索語に「and」「or」を含む場合(andyorganic なども)は検索エラーになり、= の前後に空白を入れて title = "andy" の形にすると検索できます。

OAI-PMHでまとめて収集する(未実行)

今回は実行していないため、公式ページと仕様書の記載だけを挙げます。

  • metadataPrefixoai_dcdcndldcndl_v3set にデータプロバイダIDなどを指定できる
  • ListRecords と ListIdentifiers は from が必須で、1年を超える期間は指定できない。1回200件で、続きは resumptionToken
  • 国立国会図書館作成書誌データ(iss-ndl-opac など)の起点日(最も古い更新日)は2023年12月16日

利用条件:申請・クレジット・アクセス頻度

「APIのご利用について」のページの要点です。

  • 営利企業・団体は利用申請が必要です。ただしデータ提供機関が利用目的を問わず許諾しているデータは不要です
  • 個人・非営利団体は、データ利用で収益を得ないなら申請不要です。結果的に赤字でも何らかの経済的な対価を受け取っていれば営利目的に当たり、サイト運営による広告収入も例に挙げられています
  • 継続的にアクセスする場合は、申請の要否にかかわらずフォームから連絡先と利用内容を知らせるよう協力が求められています
  • クレジット表示として、APIを使うサイトやアプリにはNDLサーチのAPIを用いていることを明記します。他機関のデータでは、その機関のクレジット表示が条件になる場合があります
  • アクセスは同時リクエスト数に制限があり、特定のサーバから継続して大量のアクセスがあれば遮断などの措置を取る場合があります。上限の数値は示されておらず、多重アクセスを避けるよう求められています

データごとの条件は「API提供対象データプロバイダ一覧」で確認します。記号は「○:利用申請は不要」「△:利用申請が必要」で、クリエイティブ・コモンズ・ライセンスの表示がある場合はメタデータの二次利用に申請不要(ライセンス条件に従う)とされています。国立国会図書館蔵書(iss-ndl-opac)はCC BY、CiNii Research(ciniir)や出版情報登録センター(jpro)は非営利が○・営利が△でした。いずれも書誌情報の条件で、コンテンツの利用条件は別です。

AIエージェントで文献調査するときの設計

出典は資料URLと書誌IDで残す

引用の根拠には、項目の linkhttps://ndlsearch.ndl.go.jp/books/<リポジトリ番号>-<アイテム番号>)と NDLBibIDISBN を残します。RSSの channel 直下の link は内部向けと思われるホスト名(ios-v2-prod-eks-alb.ndlsearch.ndl.go.jp)で返ってきたので、出典には使いません。リポジトリ番号(例:R100000002)から附録1をたどれば、データ提供機関と利用条件も記録できます。形はMCPの出典情報を欠落させないoutputSchema設計が使えます。

同じ資料の複数レコードを前提にする

今回の実行だけで、重複の出方が3種類ありました。

  1. 同じ論文が別プロバイダから返る。 title=大規模言語モデル の上位2件は同じ論文で、J-STAGE(R000000016-...)とCiNii Research(R100000136-...)の別レコードでした。2件の rdfs:seeAlso に共通するURLはなかったので、タイトル・著者・日付の組で束ねます
  2. 同名で別の本がある。 技術評論社の「大規模言語モデル入門」は2023年8月(321p)と2024年9月(巻次2、220p)の2件で、ISBNも違います。書名だけで同一視しません
  3. 1つの書誌に他プロバイダのレコードがぶら下がる。 SRUの dcndl では、公共図書館の総合目録(R100000001)、CiNii Research、JPROのレコードが dcndl:record で紐づいていました

検索語とリクエストの組み立て

  • ISBNが分かればISBNを最優先にし、なければ書名と著者を別の引数で渡して dpid で範囲を絞る
  • cnt はサーバー側で小さく固定し、500件を超えそうなら条件を足す
  • リクエストは1件ずつ直列にし、継続利用するならフォームで連絡する

エージェントへの指示にすると次の4行です。

- NDLサーチの結果を引用するときは、資料URLと NDLBibID または ISBN を必ず併記する
- 書名が同じでも、ISBN・巻次・出版年が違えば別資料として扱う
- 0件のときは「該当なし」と断定せず、検索条件を見直したことを明記する
- リクエストは1件ずつ順番に送り、並列にしない

キー管理・上限・失敗の形をMCPサーバー側にどう置くかは、公共データAPIをMCP化する設計パターンで他の公共APIと並べて扱っています。

まとめ

  • 検索はSRU・OpenSearch、一括収集はOAI-PMH。キーなしのGETで使え、1回500件、501件目以降は取得不可
  • OpenSearchは引数誤りを0件で返す。ISBNは10桁でも13桁でも同じ資料に当たる
  • 収益を得ない個人・非営利の利用は申請不要。広告収入などがあれば営利目的。クレジット表示と多重アクセスの回避は必須
  • 同じ論文の別プロバイダ重複や同名の別書籍を前提に、資料URLと書誌IDを出典に残す

他の公共データAPIとの比較は日本の公共データAPI 5選にあります。「どの資料のどのレコードか」をIDで残すことが、文献調査をエージェントに任せるときの最初の約束です。

この記事の情報・検証メモ
Tags
公開日
情報確認
参考リンク
7件
更新性
定期更新
更新管理

仕様・料金・提供範囲が変わりやすいテーマは、公開日・更新日・情報確認日を分けて管理します。 導入前には必ず記事末尾の一次情報と公式ドキュメントで最新状況を確認してください。

検証メモ
Python urllib 実行日 2026-09-14(OpenSearch 6回・SRU 1回、キーなし) 外部提供インタフェース仕様書 第1.4版(2026.3.31)
図解を保存・共有

記事の要点を1枚にまとめました。画像は新しいタブで開いて保存できます。

国立国会図書館サーチAPIの使い方:OpenSearch・SRUの検索例とAIエージェント設計 NDLサーチAPIは収益を得ない利用なら申請不要。書誌IDを残し重複前提で設計 提供API:検索はOpenSearch・SRU、収集はOAI-PMH。1回500件まで、501件目以降は取れない。OpenSearchの引数誤りは0件で返る。 利用条件:広告収入など収益があれば営利で申請が必要。APIを使っている旨のクレジット表示が必要。同時リクエスト数に制限、多重アクセスは避ける。 エージェント設計:資料URLとNDLBibID・ISBNを出典に残す。同じ論文が別プロバイダから2件返ることがある。同名書籍は巻次・出版年・ISBNで区別する。
国立国会図書館サーチAPIの使い方:OpenSearch・SRUの検索例とAIエージェント設計 記事の要約 2026.09.14 入門・導入ガイド
Primary sources

一次情報・参考リンク

About the author
SHAYOUWORLD

日本の公共データAPIを使うMCPサーバーを作って公開し、ローカルLLMを自分のGPUで測った記録を、一次情報・検証ログ・失敗例とあわせて整理します。