国立国会図書館サーチAPIの使い方:OpenSearch・SRUの検索例とAIエージェント設計
NDLサーチのOpenSearch・SRU・OAI-PMHのエンドポイントと主要パラメータ、利用申請が要る条件、クレジット表示、アクセス制限を公式資料で確認し、書名・著者・ISBN検索を2026年9月14日に実行。AIエージェントで文献調査するときの出典保持も整理しました。
国立国会図書館サーチ(NDLサーチ)の検索APIは、APIキーなしのGETで書誌を検索でき、OpenSearchなら書名・著者・ISBN・NDLの書誌IDがRSS 2.0形式でまとめて返ります。 利用申請は目的で分かれ、収益を得ない個人・非営利の利用なら不要、広告収入などの収益があれば営利目的として申請が必要です。
国会会議録検索APIの使い方で扱った会議録APIとは別のサービスです。この記事は、公式ページと外部提供インタフェース仕様書(第1.4版)を読み、2026年9月14日に数回だけリクエストを投げた結果をもとに書いています。
- APIは4種類。 検索用がSRU・OpenSearch・OpenURL、一括収集用がOAI-PMHです。
- 1回500件まで。 省略時は200件で、501件目以降はどう指定しても取得できません。
- 申請の要否は収益の有無で決まる。 クレジット表示と多重アクセスの回避は共通の条件です。
- 同じ資料が複数レコードで返る前提で設計する。 同じ論文がJ-STAGEとCiNii Researchから別々に返り、同名の書籍が2件並びました。
NDLサーチが提供するAPI
仕様書の「アクセスURL」の表と各章から整理すると、次の4つです。
| API | エンドポイント | 返戻形式 | 用途 |
|---|---|---|---|
| SRU | https://ndlsearch.ndl.go.jp/api/sru | XML(dc / dcndl / dcndl_v3) | CQLで条件を組み合わせる検索 |
| OpenSearch | https://ndlsearch.ndl.go.jp/api/opensearch | RSS 2.0を拡張したXML | パラメータを並べるだけの検索 |
| OpenURL | https://ndlsearch.ndl.go.jp/api/openurl | HTML(検索結果画面) | 画面へのリンク用 |
| OAI-PMH | https://ndlsearch.ndl.go.jp/api/oaipmh | XML(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 | タイトル・作成者・出版者 | 部分一致 |
isbn | ISBN | 10桁・13桁は両形式に変換して完全一致、それ以外は前方一致 |
ndc | 分類 | 前方一致 |
from / until | 出版年月日(YYYY、YYYY-MM、YYYY-MM-DD) | 両方指定するときは同じ形式 |
cnt / idx | 件数(既定200、最大500)/ 開始位置(既定1) | ― |
項目間はすべてANDで、dpid だけの検索はできません。注意したいのは、引数を誤ると検索結果ゼロ件として返ると明記されている点です。エラーにならないので、0件を「該当なし」と即断しない設計が要ります。
書名で検索する
国立国会図書館の蔵書に絞って「大規模言語モデル入門」を検索し、応答から書誌IDを取り出すPythonの例です。
import urllib.parseimport urllib.requestimport 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の link、dc:identifier の dcndl:ISBN・dcndl:NDLBibID・dcndl:JPNO、dc: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桁は相互に変換されます。
SRUでDC-NDL形式を取る
より詳しい書誌が要るときはSRUの recordSchema=dcndl を使います。CQLは isbn="9784065415245" をURLエンコードして渡します。
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件)**が入っていました。なお recordSchema を dcndl で指定しても、応答の recordSchema 要素は info:srw/schema/1/dc-v1.1 で、中身はDC-NDL(RDF)でした。この要素でパーサーを分岐させないほうが安全です。
CQLには癖があります。仕様書によると、検索語に「and」「or」を含む場合(andy、organic なども)は検索エラーになり、= の前後に空白を入れて title = "andy" の形にすると検索できます。
OAI-PMHでまとめて収集する(未実行)
今回は実行していないため、公式ページと仕様書の記載だけを挙げます。
metadataPrefixはoai_dc、dcndl、dcndl_v3。setにデータプロバイダ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で残す
引用の根拠には、項目の link(https://ndlsearch.ndl.go.jp/books/<リポジトリ番号>-<アイテム番号>)と NDLBibID・ISBN を残します。RSSの channel 直下の link は内部向けと思われるホスト名(ios-v2-prod-eks-alb.ndlsearch.ndl.go.jp)で返ってきたので、出典には使いません。リポジトリ番号(例:R100000002)から附録1をたどれば、データ提供機関と利用条件も記録できます。形はMCPの出典情報を欠落させないoutputSchema設計が使えます。
同じ資料の複数レコードを前提にする
今回の実行だけで、重複の出方が3種類ありました。
- 同じ論文が別プロバイダから返る。
title=大規模言語モデルの上位2件は同じ論文で、J-STAGE(R000000016-...)とCiNii Research(R100000136-...)の別レコードでした。2件のrdfs:seeAlsoに共通するURLはなかったので、タイトル・著者・日付の組で束ねます - 同名で別の本がある。 技術評論社の「大規模言語モデル入門」は2023年8月(321p)と2024年9月(巻次2、220p)の2件で、ISBNも違います。書名だけで同一視しません
- 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で残すことが、文献調査をエージェントに任せるときの最初の約束です。
この記事の情報・検証メモ
- 公開日
- 情報確認
- 参考リンク
- 7件
- 更新性
- 定期更新
仕様・料金・提供範囲が変わりやすいテーマは、公開日・更新日・情報確認日を分けて管理します。 導入前には必ず記事末尾の一次情報と公式ドキュメントで最新状況を確認してください。
一次情報・参考リンク
- NDLサーチ: APIのご利用について https://ndlsearch.ndl.go.jp/help/api
- NDLサーチ: API仕様の概要 https://ndlsearch.ndl.go.jp/help/api/specifications
- 国立国会図書館サーチ 外部提供インタフェース仕様書(第1.4版) https://ndlsearch.ndl.go.jp/file/help/api/specifications/ndlsearch_api_20260331.pdf
- 外部提供インタフェース仕様書 附録1 データプロバイダ一覧と外部提供インタフェース対応表 https://ndlsearch.ndl.go.jp/file/help/api/specifications/ndlsearch_api_ap1_20260624.pdf
- NDLサーチ: API提供対象データプロバイダ一覧 https://ndlsearch.ndl.go.jp/help/api/provider
- NDLサーチ: 国立国会図書館サーチが提供するOAI-PMH https://ndlsearch.ndl.go.jp/help/api/oai_pmh
- NDLサーチ: サイトポリシー(著作権・免責事項) https://ndlsearch.ndl.go.jp/help/sitepolicy