cinii-mcp
Search and retrieve Japanese-language scholarship and related metadata from CiNii Research through eleven MCP tools.
Search journal articles, books/monographs, doctoral dissertations, KAKEN grant projects, research data, researchers, and cross-type records; combine KAKEN projects with their research products.
Look up books by NCID/ISBN and KAKEN projects by project ID; fetch a single record by CiNii URL or CRID.
Find NACSIS-CAT member libraries by name and list libraries holding a book or journal by NCID, with ILL, copy, loan, and journal-holdings filters.
Apply CiNii filters such as language, year range, full text, data source, resource type, author, journal/publisher, institution, degree, dataset format, and researcher ID, with supported sort orders.
Receive typed JSON envelopes with searched term/script, matching mode, result breadth, diagnostics, attribution, and optional hash-chained query receipts for citable and reproducible searches.
Enables searching journal article metadata aggregated from PubMed through the CiNii Research API, returning records such as articles in article and cross-type searches.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@cinii-mcpsearch for recent articles on Japanese history"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
cinii-mcp
A FastMCP stdio server exposing the CiNii Research API — Japan's national academic database, operated by the National Institute of Informatics (NII) — as eleven tools for use with Claude Desktop and other MCP clients.
CiNii Research aggregates metadata from KAKEN, CiNii Articles, CiNii Books, IRDB, Crossref, DataCite, PubMed, and NDL Search. There is no established open MCP tooling for it, so this server fills that gap for researchers querying Japanese-language scholarship.
What this is for
CiNii Research indexes Japanese scholarship across six kinds of record, and this puts all of them inside a Claude conversation: journal articles, books and monographs, doctoral dissertations, research data, KAKEN grant projects, and researcher profiles, plus single-record lookup by CRID and, for books and journals, the libraries in NACSIS-CAT that hold them. Ask a question in English and get Japanese-language scholarship back, with the Japanese term actually sent shown beside the results.
KAKEN repays separate attention — it records what was funded, so it surfaces projects underway, collaborations forming, and research that reached a grant report before it reached print.
Every result carries the term sent, its script, how CiNii matched it, and a receipt fixing the query, so a search standing behind a footnote can be named, cited, and run again by someone else.
Related MCP server: CiNii MCP Server
What the receipts are for
A search you cannot re-run is a claim you cannot check. When a footnote rests on a database query, say that no article in this index uses a term before a certain year, the reader is asked to take the search on trust: which term, in which script, on what date, against which index and which version of it, and how far down the results the author went. Ordinary searching leaves none of that behind. This server leaves all of it. Every query-answering tool returns its envelope through the ledger, which appends one line to an append-only file: the term actually sent and its script, how the source matched it, how many records existed and how many came back, the diagnostics, the tool and its parameters, the server version, a timestamp, and the hash of the previous line. The hash makes the file a chain: a line cannot be altered, removed or reordered afterwards without the verifier saying so.
What that gives a researcher:
A citable search. Name the receipt in the footnote (session slug, server, date, line hash) and a reader can see exactly what was asked and run it again against the same version.
Negative findings that carry weight. "Not found" is evidence only if the search that produced it is on record, with its term, its script and its breadth.
A method section that writes itself.
cinii-mcp-ledgermanifest <folder>summarises every query a project made, by server, script and session: the disclosure a journal, a data-availability statement or a research-integrity review asks for.A record of AI-mediated research. When a model chose the term, the receipt shows the term it chose and what came back, which is the thing to disclose about work done with an assistant.
Nothing interpreted. The receipt is the source's own answer with credentials removed. The server does not summarise, rank or paraphrase, so the record is of the source, not of the tool.
Receipts are off until you name a folder (MCP_RECEIPT_DIR); each server then writes its own
<server>.jsonl inside it, and MCP_RECEIPT_SESSION stamps a project or article slug on every
line so one folder can serve several projects. cinii-mcp-ledger verify-dir <folder> checks the chains.
The mechanics, the variables and what the envelope says when nothing is deposited are in the
receipts section below.
Tools
Tool | Purpose |
| Journal articles (JALC, Crossref, PubMed, IRDB) |
| Books and monographs (NACSIS-CAT, NDL Search); lookup by NCID or ISBN |
| Doctoral dissertations from Japanese universities |
| KAKEN (科研費) funded research projects; lookup by project number |
| Cross-type search across all content types |
| Research data (DataCite, JDCAT, IRDB, data archives, KAKEN research data) |
| KAKEN projects together with their research products |
| Researcher profiles and affiliations |
| Single record lookup by URL or CRID |
| Libraries holding a book or journal, by NCID (NACSIS-CAT) |
| NACSIS-CAT member libraries by name, with their library IDs |
Filters
The search tools take CiNii's own filters where the search type accepts them. Each is sent under CiNii's parameter name, given in brackets.
language(languageType): ISO 639-1 codes, comma-separated:ja,en,zh,ko. It filters by the language catalogued for the record, which is how to put Japanese-language scholarship first, or reach the Chinese and Korean work CiNii indexes. Not on researchers.has_fulltext(hasLinkToFullText),resource_type(resourceType),data_source(dataSourceType, now on every search tool) andresearcher_id(researcherId: a KAKEN researcher number, an NRID, a CiNii author ID or a researcher CRID).Books:
ncid,category,exact_title(isFullTitle). Dissertations:award_institution(awardInstitution),degree. KAKEN:project_id(projectId). Data:publication_title,dataset_format.sorttakes CiNii's eleven v2 sort orders, each where CiNii accepts it:NEWEST,OLDESTandRELEVANCEeverywhere (noOLDESTfor researchers);CITATIONS_DESCon articles;CRID_ASCon the cross search;NAME_ASC/NAME_DESC,PROJECTS_DESC/PROJECTS_ASCandPRODUCTS_DESC/PRODUCTS_ASCon researchers.
Three of these are checked here before anything is sent: a sort outside its search type, an
unknown data_source and a malformed language code. CiNii refuses none of them. It ignores an
out-of-scope sort and returns relevance order under the sort the caller asked for, and it
answers an unknown source with zero records, which would read as an absence.
query is optional when another criterion is given, so a book can be looked up by ncid
alone and a grant by project_id. The envelope then records the criteria as sent
(ncid=BC08431161) in place of a search term, and no SCRIPT_LATIN_QUERY is raised.
Holdings
cinii_get_holdings lists the libraries that have registered a holding of a title in
NACSIS-CAT, through the endpoint CiNii Research opened on 30 March 2026 when it absorbed CiNii
Books. Book results from cinii_search_books carry the NCID (extra.ncid) and ISBNs (extra.isbn)
to pass here. Each item names the library, its NACSIS-CAT library ID (extra.library_id) and, where
the library supplies one, a link into its own catalogue for that title (extra.catalog_url).
Filters narrow the list to one library, to libraries taking ILL, copy or loan requests, to
members of Japan–US or Japan–Korea ILL, or (journals) to libraries holding a given year,
volume or number. CiNii returns the whole list in one response; count and start cut the
window here and result.total keeps CiNii's count.
NACSIS-CAT is a union catalogue of the libraries that catalogue in it, chiefly Japanese
university and research libraries with some overseas ones. It is not a census of copies, so an
empty list is HOLDINGS_NONE_REGISTERED, not an absence. cinii_search_libraries finds a
library's ID by name. Names are catalogued in Japanese with some alternatives, so SOAS
finds ロンドン大学 SOAS図書館 (FA013006). Holdings receipts carry no result_ids, because a
library ID is not among the identifiers the family's receipt records.
Results come from the CiNii Research OpenSearch v2 API as JSON-LD and are returned as one typed JSON response envelope — see Response format below. (Releases before v2.0.1 returned formatted markdown text; that is a breaking change, not a formatting preference.)
Response format
Every tool returns one JSON response envelope, built by mediation.py and defined in response-schema.json. Schema version 2.3.0. The same module and schema are vendored byte-identically across the server family, so an envelope from one server can be read by a consumer written for another.
The envelope reports how the search was made, not only what it found:
searched_for— on search operations, the term actually sent, its detected script, and the matching mode, hoisted to the top of the envelope so a relaying client cannot drop it. Fetch operations (cinii_get_record) omit it: they were handed an identifier and chose no term.query—input_termsas supplied,normalizedas sent, and the detectedscript. This pair is the record of any rendering performed between the caller's language and the corpus.matching_mode—metadata_conjunctionfor this server. It tells you how to readresult.total.result.breadth—none,narrow(1–50),broad(51–1000),very_broad(>1000). Thresholds are low on purpose: a few hundred hits that look like a literature are marked rather than passed through clean.items[].matched_in— which field the match was made in, per record.receipt— an ISO 8601 timestamp, a SHA-256 taken over the normalised query and its parameters, and the identifiers returned. The hash verifies a term you already hold; it cannot be inverted to produce one, so the unit of deposit is the envelope, not the receipt.attribution— the required credit line, in every response.
Diagnostic codes
Typed and closed. A diagnostic is never prose the client has to parse.
Code | Level | Meaning |
| info | Records returned; nothing to flag. |
| warning | No records. CiNii matches catalogued metadata and ANDs a multi-word query, so an un-indexed compound returns zero even where related work exists. Vary the rendering before concluding the literature is absent. |
| warning | The query was Latin-script, so it matched romanised and English metadata only. The Japanese-script form reaches a different, larger corpus. |
| warning | One or more records on the page had fields of the wrong type and could not be read. They are left out and named by position and identifier; the other records are complete. A malformed record is not an absent one. |
| warning |
|
| warning |
|
| error | The API answered, and answered with an error. This includes an HTML page served with status 200, which CiNii sends for some malformed requests. |
| error | The request did not complete. Kept distinct from |
| info | The response was not written to the query ledger, because no receipts destination is configured. The search is unaffected; no receipt survives it. |
| warning | A receipts destination is set, the write was attempted, and it did not land. Distinct from the line above because one is a choice and the other is a fault. |
Query receipts
Every envelope can be deposited to an append-only, hash-chained JSONL log by ledger.py. It is off unless MCP_RECEIPT_DIR (or the legacy MCP_RECEIPT_LOG) is set, and a logging failure is swallowed rather than raised — a search matters more than the record of it. Secrets are redacted before a line is composed.
Since schema 2.3.0 the envelope says so. When a response is not deposited, emit() appends RECEIPT_NOT_DEPOSITED if the variable is unset, or RECEIPT_WRITE_FAILED if it is set and the write did not land. The gap is then visible in the artefact that becomes the record, rather than only in a configuration file. mediation.deposit_enabled() reports the same fact on demand.
MCP_RECEIPT_DIR=C:\path\to\receipts # a folder, not a file
MCP_RECEIPT_SESSION=project-or-article-slug
MCP_RECEIPT_STRICT=1 # optional: make logging failure raise
MCP_RECEIPT_LOG=C:\path\to\receipts.jsonl # legacy single file; ignored when _DIR is setA folder, and one file per server. MCP_RECEIPT_DIR points at a directory
and each server writes its own <server>.jsonl inside it. That is not tidiness.
Appending is read-the-last-hash-then-write, and the lock around it is a threading
lock, which holds within one process and not between several — six servers are
six processes, and two answering at the same moment will both read the same
predecessor and both claim it. Measured, not theorised: six processes writing 150
lines to one file produced fourteen forks. MCP_RECEIPT_LOG still works and is
still correct for a single server; it is the wrong shape for a family.
install.ps1 sets this up for all six and writes a README into the folder.
Verify one chain, or the whole folder:
cinii-mcp-ledger verify receipts/cinii.jsonl
cinii-mcp-ledger verify-dir receipts
cinii-mcp-ledger manifest receipts # writes receipts/manifest.jsonverify exits non-zero on failure and says which kind it found: a fork
(concurrent writers — a configuration fault, and every line is still there), a
missing line, a reordering, or tamper (a line that does not hash to
its own content). Only the last is a claim about honesty, and reporting them
alike would invite a reader to mistake one for the other. The manifest is the
object to cite: one description of the whole deposit — per-file line counts,
first and last timestamps, terminal hashes, and combined totals by server,
script and session.
Prerequisites
Python 3.10 to 3.14 on PATH.
A CiNii Web API application ID (
appid) — free; required.
Getting an application ID
The CiNii Research API requires a registered application ID, sent as a parameter on every request.
Register at the CiNii Web API Developer Registration page and obtain your application ID.
Agree to NII's API regulations: the Academic Content Service Usage Regulations, the CiNii Research Usage Detailed Regulations, and the Academic Content Service Web API Usage Detailed Regulations.
For commercial use, email
ciniiadm@nii.ac.jpbefore applying.
The same application ID also works for the KAKEN API, which cinii_search_kaken uses.
Install
Three routes. All three give you the same server; pick by how much you want to see of it.
Python. The pip and source routes need Python 3.10 to 3.14; 3.10, 3.11, 3.12, 3.13 and 3.14 are tested in CI on Windows, macOS and Linux. The Claude Desktop bundle uses whichever of these is already installed, and has uv download one only if none is.
Getting Python
Every route needs Python 3.10 to 3.14. The Claude Desktop bundle uses one already on the machine
and has uv download one only if none is; the other routes also need the venv module, which the
official installers include.
Windows. Download the 64-bit installer from python.org/downloads and run it; tick "Add python.exe to PATH" on the first screen. Afterwards
py --version(the launcher the installer adds) orpython --versionin a new terminal should print 3.1x. If typingpythonopens the Microsoft Store instead, Windows has no Python yet: that Store page is a stub, and it is also what "'python' is not recognized" usually means.macOS. The python.org installer, or
brew install python@3.13with Homebrew. The/usr/bin/python3that Xcode's command-line tools provide may be older than 3.10;python3 --versionsays.Linux. Your distribution's package:
sudo apt install python3 python3-venvon Debian and Ubuntu,sudo dnf install python3on Fedora. Or let uv provide one (next line).Any platform, with uv. uv installs Python itself:
uv python install 3.13, thenuv venvor theuvxroute below.
One click: the Claude Desktop bundle
Download cinii-mcp-3.3.0.mcpb from the latest release and open it; Claude Desktop installs it. One bundle serves Windows, macOS (Apple Silicon and Intel) and Linux. Claude Desktop asks for CiNii application ID and a receipts folder at install time; the key is stored in the OS keychain.
The bundle carries the server's source and a lock file, nothing compiled, and needs no Python of its own. Claude Desktop builds the bundle's environment when you install it, with uv, a copy already on your PATH if there is one and otherwise one the app downloads for itself: uv takes a Python 3.10 to 3.14 already on the machine, downloads one only if there is none, and installs the locked libraries, roughly 40 MB, behind the install progress bar. Every launch then reuses that environment and takes under a second. Bundles 3.1.0 and 3.1.1 kept pyproject.toml one folder down, which made Claude Desktop skip that install step and download everything during the first connection attempt instead; on a slow or filtered network that attempt never completed and the app reported it could not connect to the extension server. Bundles before 3.1.0 vendored libraries compiled for CPython 3.12 only and failed on every other interpreter. See Troubleshooting.
From GitHub, pinned to a release
pip install "git+https://github.com/ckgerteis/cinii-mcp@v3.3.0"
# or, without an environment of your own:
uvx --from "git+https://github.com/ckgerteis/cinii-mcp@v3.3.0" cinii-mcpinstalls the cinii-mcp console script and cinii-mcp-ledger. The tag is the thing to cite; @main gets whatever is current. Then register it in Claude Desktop (below), or let install.py do that.
The whole family
pip install "git+https://github.com/ckgerteis/bibliograph-mcp@v2.0.0" && bibliograph installinstalls bibliograph-mcp, one server that carries this server's CiNii tools, under the same names, alongside the rest of the family's (CiNii, J-STAGE, NDL, KCI and Open Access Korea, OpenAlex, Semantic Scholar) and sources that have no repository of their own (NDL Digital Collections full text, WARP, Crossref, Japanese name resolution, open-access PDF fetching), with one receipts folder and each credential asked for once. Since bibliograph 2.0.0 its sources are maintained in that package and may be ahead of this repository; bibliograph_status names the version of each. Register this server or bibliograph, not both, or Claude Desktop lists these tools twice. From a checkout of this repository, python install.py installs this server alone and python install.py --all the six separate servers, on Windows, macOS and Linux; install.ps1 remains for Windows.
From source
python3 -m venv .venv
.venv/bin/pip install .On Windows:
py -3.11 -m venv .venv
.venv\Scripts\pip.exe install .Or straight from the repository, without cloning:
uvx --from "git+https://github.com/ckgerteis/cinii-mcp" cinii-mcpVerify the install:
.venv/bin/python -c "import cinii_mcp; print(cinii_mcp.__version__)"That fails loudly if the package or one of its vendored modules is missing. Do
not use cinii-mcp --help as the check: unknown arguments are ignored, the
server starts, reads end-of-input and exits 0, so it reports success whatever
the state of the code.
Installing more than this one
Six independent packages. None imports another, none depends on another, and
each installs and answers on its own — pip install . in this directory is a
complete install of this server and nothing else.
They do share three things: a response envelope, a query ledger, and — if you
run more than one — a receipts folder. install.ps1 is vendored byte-identical
into all six and handles that on Windows; install.py is its cross-platform port. Both install this server by default, because
cloning one repository is not a request for five more.
.\install.ps1 # this server
.\install.ps1 -All # all six
.\install.ps1 -Servers cinii,ndl # a chosen subsetNothing about where things go is decided for you. The script asks where to
install (the virtual environment Claude Desktop will be pointed at), which
folder receives the receipts, and which session slug to stamp on them,
offering a neutral suggestion for each that Enter accepts; run without a
terminal it does not guess, and stops unless --venv and --receipts-dir
(or --no-receipts; -VenvDir and -ReceiptsDir for install.ps1) say
so. Whatever subset you name is registered against one receipts folder, asked for
once. The script prefers a sibling checkout to the network, carries across
credentials already registered rather than asking again, leaves servers it was
not asked about alone, and stops rather than guessing where the servers already
registered disagree about the folder or the session slug. It also asserts that
ledger.py and mediation.py are byte-identical across everything it
installed, so two envelope versions cannot end up in one environment unnoticed.
Any other MCP client
Nothing here is specific to Claude. The server speaks the Model Context Protocol over stdio and nothing else: any client that can start a process and talk JSON-RPC to it (Claude Code, Cursor, VS Code and Continue, Zed, LibreChat, a script of your own using an MCP SDK) can use it. The Claude Desktop bundle and the installers are conveniences for one client; the server underneath is the same console script. Register it anywhere by giving the client the absolute path of the console script and, optionally, the environment:
{
"mcpServers": {
"cinii": {
"command": "/absolute/path/to/.venv/bin/cinii-mcp",
"env": {
"CINII_APPID": "your application ID",
"MCP_RECEIPT_DIR": "/absolute/path/to/receipts",
"MCP_RECEIPT_SESSION": "project-or-article-slug"
}
}
}
}Claude Code takes the same thing on the command line:
claude mcp add cinii -- /absolute/path/to/.venv/bin/cinii-mcpOn Windows the path ends in \.venv\Scripts\cinii-mcp.exe. MCP_RECEIPT_DIR and MCP_RECEIPT_SESSION
are optional; without them the server runs and every envelope says RECEIPT_NOT_DEPOSITED. The
stdio transport is the only one: there is no HTTP endpoint to expose, and nothing to host.
Troubleshooting
"Server disconnected" is all Claude Desktop says when the server process exited before or during the handshake, whatever the reason. The reason is in the log:
Windows:
%LOCALAPPDATA%\Claude\Logs\mcp-server-<name>.log(builds before August 2026:%APPDATA%\Claude\logs) (the extension's display name, or the key undermcpServers), withmcp.logbeside it for the app's side of the conversation.macOS:
~/Library/Logs/Claude/mcp-server-<name>.logandmcp.log.Linux:
~/.config/Claude/logs/.
Read the last launch from the bottom up. Three shapes account for nearly every report:
A Python traceback ending in
ImportErrororModuleNotFoundError(for exampleNo module named 'pydantic_core._pydantic_core'). The interpreter started, the code was found, and a compiled library did not match that interpreter. This is what every bundle before 3.1.0 did on any Python other than 3.12. Install the current bundle, or use the pip route, which resolves wheels for the interpreter you install into.'python' is not recognized,spawn python ENOENT, or a line from the Microsoft Store: no interpreter was found on the PATH Claude Desktop constructs. Nothing of this server ran. The current bundle does not launchpythonat all; for the pip route, register the console script by absolute path as shown above.A line from uv (
error: ..., or a download that never finished), orUnable to connect to extension serverwith nothing from the server in the log: the environment was not built. From 3.1.2 the app builds it at install time; look inmain.logbeside the server log for lines tagged[UV Runtime], which record the download and theuv sync, and formissing pyproject.toml, which means a bundle older than 3.1.2. If the install-time build failed (no network, a proxy that blocks github.com or pypi.org), reinstall the bundle once the network is back; the launch also rebuilds the environment itself, so a second launch on a working network completes.
The bundle's own entry point writes one line naming the interpreter, its path and the supported range before re-raising an import failure, so a log from 3.1.0 onwards says which of these it is.
Configuration
The server reads your application ID from the CINII_APPID environment variable. Copy the example file and fill it in (never commit the real value):
cp .env.example .envCINII_APPID=your_application_id_hereClaude Desktop configuration
Add an entry to %APPDATA%\Claude\claude_desktop_config.json under
mcpServers, pointing at the console script in the environment you installed
into. On macOS or Linux use the absolute path to .venv/bin/cinii-mcp.
{
"mcpServers": {
"cinii": {
"command": "C:\\path\\to\\.venv\\Scripts\\cinii-mcp.exe",
"env": {
"CINII_APPID": "your_application_id_here"
}
}
}
}Changed in 3.0.0. Earlier versions were registered by path —
"command": "…\\python.exe", "args": ["…\\server.py"]. That entry will not
start this version, because server.py is now a module inside a package rather
than a script beside its imports. Replace it with the console script above.
Restart Claude Desktop. The eleven tools should appear under "cinii" in the tool list.
Usage rules
NII enforces usage rules; breaking them can get your access blocked or your registration cancelled. This server sends your appid on every request (required) and is designed to respect the rules, but you remain responsible for use:
Do not issue a high volume of requests in a short time. Excessive access that affects other users may be blocked without notice.
The
appidis for API requests only; do not expose it in user-facing links to CiNii pages.Respect copyright when using retrieved data, per NII's regulations.
Citation
If this software supports your research, please cite it. See CITATION.cff, or use the "Cite this repository" button on GitHub.
Tests
.venv/bin/python tests/smoke_stdio.pyStarts the installed console script over stdio, performs the MCP handshake, and checks tools/list against the tool table above; exits non-zero on a mismatch. RUN_LIVE=1 … <tool> '<json params>' adds one live call and reports the envelope's diagnostic codes.
License
MIT © 2026 Christopher Gerteis.
This license covers the server code only. It grants no rights over CiNii data or the CiNii API, which remain governed by NII's terms linked above.
Disclaimer
A research tool, maintained on a best-effort basis and provided "as is", without warranty. Not affiliated with or endorsed by the National Institute of Informatics.
Author
Dr Christopher Gerteis, SOAS University of London. Data provided by CiNii Research, National Institute of Informatics.
Available Tools
11 toolscinii_get_holdingsARead-onlyIdempotent
List the libraries that hold a book or journal, by its NCID, from NACSIS-CAT through CiNii Research (/opensearch/holder, live since 30 March 2026). Returns the unified envelope (operation 'get_holdings', record_type 'holding'); each item names a library, its page, its NACSIS-CAT library ID (extra.library_id) and, where the library supplies one, a link into its own catalogue for this title (extra.catalog_url).
Filters narrow the list to libraries that take ILL requests, offer copy or loan service, belong to Japan–US or Japan–Korea ILL, or (journals) hold a given year, volume or number. Zero holdings is HOLDINGS_NONE_REGISTERED, not proof that no library has the item.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description focuses on what annotations can't say: the response envelope ('operation get_holdings', 'record_type holding'), the per-item fields including extra.library_id and extra.catalog_url, and the crucial semantic caveat that HOLDINGS_NONE_REGISTERED means zero holdings are registered, not that no library holds the item. That last point materially prevents misreading an empty result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight blocks: purpose first, then what each returned item contains, then filter scope and the zero-holdings caveat. Dense but front-loaded and free of filler; the parenthetical endpoint/date details are the only mildly expendable content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't document return values, and it correctly spends its budget on the empty-result semantics and filter scope instead. Remaining gaps are minor: no mention of how pagination behaves beyond the schema's count/start, and no note on rate limits or whether an NCID lookup can fail for non-NACSIS records.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Reported schema description coverage is 0% at the top level (the sole 'params' wrapper is undocumented), yet the description compensates by grouping the filter families in prose — ILL participation, copy/loan service, Japan–US and Japan–Korea ILL, and journal year/volume/number — and flagging that the last three are journals-only. It does not cover pagination (count/start), which is left entirely to the nested schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'List the libraries that hold a book or journal, by its NCID', plus the upstream source (NACSIS-CAT via CiNii Research) and endpoint. This is clearly distinguishable from every sibling, all of which are search_* or get_record tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the NCID requirement and the reference to 'cinii_search_books' (in the schema) tell an agent this is a follow-up call after a search, and the filter paragraph sketches when to narrow. But the description never explicitly says when to call this instead of cinii_get_record or cinii_search_libraries, and offers no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cinii_get_recordARead-onlyIdempotent
Fetch a single CiNii record by URL or CRID. Returns the unified envelope (operation 'get_record').
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds that it returns the unified envelope with operation 'get_record', which is mild context, but says nothing about error behavior for a bad CRID, unknown URLs, or result size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and resource. The second sentence about the envelope is partly redundant given a full output schema exists, keeping it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with annotations and an output schema present, the description covers the essentials: what it fetches, the input formats accepted, and the return envelope. Only failure modes and CRID format details are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is reported as 0% for the single parameter, so the description must carry some weight; it does clarify that either a full URL or a CRID is accepted. However, it gives no format examples, no valid CRID pattern, and no guidance on the 2000-character limit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch a single CiNii record') and distinguishes itself from the search siblings by emphasizing a single record looked up by URL or CRID rather than a query. It does not name a sibling explicitly, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent infers this is the follow-up call after a search returns a record URL/CRID. There is no explicit statement of when to prefer it over re-searching, and no note about what to do if the lookup fails.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cinii_search_allBRead-onlyIdempotent
Cross-type search across all CiNii content. Returns the unified envelope.
The cross search mixes types. Each record's type is taken from its own dc:type (article, book, dataset, dissertation, project, researcher); a record without one is reported as 'article'.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, open-world behavior, so the description earns credit for disclosing something structured fields cannot: that records carry mixed types drawn from each record's own dc:type and that a missing dc:type is reported as 'article'. This is non-obvious, agent-relevant output behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core purpose and the return shape, then the type caveat. No filler, though the second sentence ('The cross search mixes types') partly restates the first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the type-mapping note is a useful completion. However, for a broad multi-filter search with a notoriously silent-ignore sort parameter, the description gives no guidance on result ordering caveats or how the filters interact with the mixed types.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Reported schema description coverage is 0%, so the description carries the burden of compensating for undocumented parameters, and it adds nothing at all about sort codes, query, date ranges, data_source, or researcher_id. The nested schema does describe most of these fields in reality, but the description itself contributes no parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb and resource: 'Cross-type search across all CiNii content', which implicitly distinguishes it from the type-specific siblings (cinii_search_articles, cinii_search_books, etc.). It does not name any sibling explicitly, so the differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'cross-type' and 'all CiNii content' imply the tool is for broad queries where the type is unknown or mixed, but the description never says when to prefer it over the nine typed siblings, nor whether filters behave differently here. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cinii_search_articlesARead-onlyIdempotent
Search CiNii Research for journal articles. Returns the unified envelope.
CiNii matches catalogued metadata and ANDs a multi-word query, so an un-indexed compound returns zero even when related work exists — a ZERO_CONJUNCTION diagnostic marks this; vary the rendering rather than concluding the literature is absent. A SCRIPT_LATIN_QUERY diagnostic means the query searched romanized metadata only. The same string may behave very differently on J-STAGE (full text). Foundational monographs sit in cinii_search_books, not the article index.
language filters by the language catalogued for the record (languageType):
'ja' for Japanese-language scholarship first, 'zh' or 'ko' for Chinese or
Korean work indexed in CiNii.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, open-world, so the safety profile is free. The description earns its keep beyond that by disclosing that multi-word queries are ANDed, that un-indexed compounds silently return zero, that SCRIPT_LATIN_QUERY means romanized-metadata-only matching, and that results differ from J-STAGE full text — all real behavioral traps not visible in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in sentence one, and the diagnostic paragraph, though long, is dense with non-obvious failure modes rather than filler. Minor waste in "Returns the unified envelope," which is vague enough to add little without the output schema in hand.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description covers the tool-specific gotchas an agent would otherwise get wrong (false negatives, romanized-only matching, cross-database comparison). Only the response-language and paging parameters are left entirely to the schema, a small gap for a single-param wrapper.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although top-level coverage reads 0% (the single `params` object is undocumented), the nested schema documents most fields well, and the description adds meaning the schema does not carry: how `query` is matched (AND, romanization), and that `language` keys off catalogued languageType rather than query language. The `language` explanation partly repeats the schema's own field description, and `lang`/`count`/`start` behavior is left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource ("Search CiNii Research for journal articles") and immediately scopes it against a sibling by stating "Foundational monographs sit in cinii_search_books, not the article index." An agent can tell this apart from the books and other typed-search siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit conditional guidance — a ZERO_CONJUNCTION diagnostic means vary the rendering rather than concluding the literature is absent, and the book alternative is named outright. It does not cover the other eight siblings (dissertations, data, all), so it stops short of a full routing rule set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cinii_search_booksARead-onlyIdempotent
Search CiNii Research for books and monographs (NACSIS-CAT, NDL Search). Returns the unified envelope.
A book can be looked up by ncid or isbn without a query. To find which
libraries hold it, pass its NCID to cinii_get_holdings.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so safety is covered. The description adds that the call returns "the unified envelope" and that identifier-only lookups are permitted, which is genuinely useful. It does not mention the sortorder codes that CiNii silently ignores, which is the main behavioral trap for this tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the verb and resource, then the identifier shortcut and the follow-up routing. Tight overall; "Returns the unified envelope" is the only phrase that is a bit opaque without prior context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description needn't explain return values, and it correctly focuses on entry paths and the holdings hand-off. What it omits (pagination limits, sort-code pitfalls) is documented in the schema, so an agent can still call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Reported schema description coverage is 0%, but the description only clarifies two inputs (ncid, isbn) and says a query is optional alongside them. The other filters (sort, data_source, resource_type, from_year/to_year, has_fulltext) get no mention in the description, relying entirely on the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Search CiNii Research for books and monographs") and names the underlying collections (NACSIS-CAT, NDL Search). It distinguishes itself from search siblings by resource type, though it never explicitly contrasts with cinii_search_articles or cinii_search_all.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete alternate entry path ("A book can be looked up by `ncid` or `isbn` without a query") and explicit routing for the natural follow-up ("To find which libraries hold it, pass its NCID to cinii_get_holdings"). No exclusion rules are given against the other search_* tools, so it stops short of a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cinii_search_dataARead-onlyIdempotent
Search CiNii Research for research data (datasets). Returns the unified envelope.
Covers data deposited through DataCite, JDCAT, IRDB, institutional data archives and, since 21 April 2026, research data recorded in KAKEN. Records are typed from their own dc:type, normally 'dataset'.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds provenance and the fact that records are typed from their own dc:type, but 'Returns the unified envelope' is unexplained and pagination/sort caveats are left to the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Verb and resource are front-loaded in the first clause, and the following sentences add real scope information rather than filler. The KAKEN date note is a slightly odd detail but is genuinely informative about coverage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output shape is covered by an output schema and safety by annotations, so the description's job is scope — which sources are indexed and how records are typed — and it does that. Nothing an agent needs in order to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description contributes nothing about the filters (data_source, dataset_format, has_fulltext, sort, paging), but the nested schema carries rich per-field descriptions for most of them, including the dataSourceType and datasetFormat mappings. With the schema doing the work, this sits at the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search CiNii Research for research data (datasets)'), which is enough to separate it from the articles, books, dissertations and KAKEN siblings by resource type. It stops short of explicitly contrasting itself with cinii_search_all, which overlaps in coverage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied only: the reader can infer 'use this when you want datasets', and the source list (DataCite, JDCAT, IRDB, KAKEN) narrows expectations. There is no explicit when-not-to-use, and no statement about whether cinii_search_all also returns these records.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cinii_search_dissertationsBRead-onlyIdempotent
Search CiNii Research for doctoral dissertations. Returns the unified envelope.
award_institution and degree filter by the degree-granting university and
the degree title as catalogued (博士(文学), 博士(教育学), …).
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so the safety profile is covered. The description adds little beyond that: "Returns the unified envelope" signals a shared response shape (and an output schema exists), and "as catalogued" hints that degree filters are exact catalogue strings rather than fuzzy matches, which is genuinely useful. Rate limits, paging behavior, and empty-result behavior are unmentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded lines: purpose first, then response shape, then the two filter semantics. "Returns the unified envelope" is the weakest sentence because it names a concept the reader may not know, but nothing is bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool takes a 13-field nested parameter object and an output schema exists, so return values need no explanation. However, the description omits that `query` is optional when another criterion is supplied, and says nothing about sort validity scope or the start/count paging limits — all things that affect a correct call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description only touches two of the many nested fields (award_institution, degree), leaving query, author, sort, count, start, from_year/to_year, language, data_source and has_fulltext unaddressed. The example values (博士(文学), 博士(教育学)) are a real addition over the schema, but the coverage gap is too large for the description to compensate at the reported 0% coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Search CiNii Research for doctoral dissertations") and implicitly distinguishes itself from the other cinii_search_* siblings by resource type. It never names a sibling, so the differentiation relies on the reader inferring that dissertations != articles/books/data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the resource name; there is no statement of when to prefer this over cinii_search_all or cinii_search_articles, and no prerequisites or exclusions. Adequate for a single-resource search tool, but no active guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cinii_search_kakenBRead-onlyIdempotent
Search KAKEN (科研費) research projects. Returns the unified envelope (record_type 'project').
A project can be looked up by project_id (e.g. 18K00968) without a query.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds some value by naming the return shape ('unified envelope, record_type project'), but says nothing about pagination (start/count limits), empty-result behavior, or the sort-order validation quirks the schema hints at.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the purpose and followed by the return type and the lookup shortcut. Nothing is padded, though 'unified envelope' is project-specific jargon an outsider may not decode.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be described, and annotations cover safety. What remains thin is filter semantics for a 13-field input model and the lack of sibling routing; the description covers only the identifier shortcut.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The reported schema description coverage is 0% for the top-level parameter, and the description only elaborates on one of the inner fields (project_id, with an example). The other inner options — researcher, institution, from_year/to_year, data_source, lang — get no explanation in the description, so the agent is left working from bare field names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Search KAKEN (科研費) research projects') and states the record type it returns. It does not, however, distinguish itself from the close sibling cinii_search_projects_and_products, which also returns projects — an agent must guess which to pick for a projects-only query.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
One concrete usage path is given: 'A project can be looked up by project_id ... without a query'. That is genuinely useful and would be hard to infer. But there is no guidance on when to prefer this over cinii_search_projects_and_products or cinii_search_all, which is the main routing decision an agent faces.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cinii_search_librariesARead-onlyIdempotent
Find NACSIS-CAT member libraries by name (/opensearch/library, live since 30 March 2026). Returns the unified envelope (record_type 'library'); each item carries the library's NACSIS-CAT ID in extra.library_id, which cinii_get_holdings takes as library_id.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior, so the description does not need to restate safety. It adds useful behavioral context: the live endpoint, the unified envelope with record_type 'library', and where the library ID appears.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences with the core action front-loaded, followed by the useful integration detail. There is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the annotations, input schema, and existing output schema, the description supplies the missing operational context: endpoint currency, envelope shape, and the key output field used by a sibling tool. Nothing needed to call it correctly appears absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema itself documents the name partial-match behavior, page parameter mapping, and sort semantics, so the description does not need to repeat them. The description adds cross-tool meaning for extra.library_id, but it does not add parameter usage details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: finding NACSIS-CAT member libraries by name. It also explicitly relates the tool to cinii_get_holdings via extra.library_id, helping distinguish it from generic search siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly implies use when looking up libraries by name and explains that the returned library ID is consumed by cinii_get_holdings. It does not explicitly say when not to use it versus other cinii_search_* tools, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cinii_search_projects_and_productsBRead-onlyIdempotent
Search KAKEN projects together with their research products (articles, books, data, dissertations) in one result set. Returns the unified envelope.
Useful with researcher_id to list a researcher's grants and outputs
together. Records are typed from their own dc:type.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered. The description adds that results come back as a 'unified envelope' and that records are typed from their own dc:type — genuinely useful, but the envelope's shape, pagination and the fact that unrelated record types share one result list are left implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines, front-loaded with the core purpose before the usage note. The trailing 'Records are typed from their own dc:type.' is a sentence fragment that reads as an afterthought, but nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. Still, for a 15-parameter cross-entity search, the description omits pagination, sort scope interactions and what 'unified envelope' yields — an agent knows roughly what it gets but not how to navigate the results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Top-level coverage is reported at 0%, so the description carries some burden, and it does highlight researcher_id as the key lever for this mode. However it says nothing about sort, count, start, language, data_source or has_fulltext, which are documented only in the nested schema; the description adds one useful hint but does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and a specific resource pairing ('Search KAKEN projects together with their research products ... in one result set'), which is more precise than the sibling cinii_search_kaken or cinii_search_articles alone. It does not name those siblings, leaving the agent to infer that this is the combined-search tool rather than being told so.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
One usage hint is given: 'Useful with researcher_id to list a researcher's grants and outputs together.' There is no statement of when to prefer this over cinii_search_kaken, cinii_search_articles, or cinii_search_all, and no exclusions, so the routing decision is only loosely guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cinii_search_researchersARead-onlyIdempotent
Search for researchers in CiNii. Returns the unified envelope (record_type 'researcher').
Note: researcher affiliation is not carried by the record schema; the researcher name occupies the title field and the profile URL the ids.url_ja field. Researcher sorts: NAME_ASC/NAME_DESC, PROJECTS_DESC/PROJECTS_ASC, PRODUCTS_DESC/PRODUCTS_ASC, NEWEST, RELEVANCE.
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a read-only, idempotent, non-destructive, open-world search. The description adds useful non-obvious behavior: it returns the unified envelope with record_type 'researcher', and it warns that affiliation is absent from the record schema while the researcher name and profile URL appear in specific fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it states the purpose first, then gives the most important schema caveat and sort constraints. Every sentence adds information without filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema and complete safety annotations, so the description need not explain return values in detail. It covers the key researcher-specific schema quirk and sort options, though it leaves usage alternatives and several nested input fields unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Top-level schema description coverage is reported as 0%, so the description should compensate. It does clarify researcher-specific sort options (NAME_ASC/NAME_DESC, PROJECTS_DESC/PROJECTS_ASC, PRODUCTS_DESC/PRODUCTS_ASC, NEWEST, RELEVANCE), but it does not explain other search criteria such as query, institution, or researcher_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Search for researchers in CiNii.' It also states the returned record_type is 'researcher', which clearly distinguishes it from sibling searches for books, articles, projects, libraries, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states what the tool searches but gives no explicit when-to-use guidance, prerequisites, or comparison with alternatives such as cinii_search_all or cinii_search_projects_and_products. Usage is only implied by the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v3.3.0- Added
cinii_get_holdings - Changed
cinii_search_all14 fields changed- added
Input schema / $defs / CrossSearchInput / properties / data_sourceAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Data source(s), comma-separated, e.g. 'JALC', 'IRDB', 'CROSSREF', 'NDL_SEARCH', 'NACSIS_CAT', 'KAKEN', 'CIA', 'CIB', 'DATACITE', 'JDCAT'. Sent as dataSourceType. Unknown values are refused here, because CiNii answers them with zero records.", + "title": "Data Source" +} - added
Input schema / $defs / CrossSearchInput / properties / has_fulltextAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "true: only records CiNii links to full text; false: only records it does not. Sent as hasLinkToFullText.", + "title": "Has Fulltext" +} - added
Input schema / $defs / CrossSearchInput / properties / languageAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Language(s) of the records, as ISO 639-1 codes, comma-separated: 'ja', 'en', 'zh', 'ko', or 'ja,en'. Sent as languageType. Filters by the language catalogued for the record, not the language of the query.", + "title": "Language" +} - added
Input schema / $defs / CrossSearchInput / properties / query / anyOfAdded value: +[ + { + "maxLength": 2000, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / $defs / CrossSearchInput / properties / query / defaultAdded value: +null - added
Input schema / $defs / CrossSearchInput / properties / query / descriptionAdded value: +"Free-text search terms (Japanese or English). Optional when another criterion (an identifier, a title, a filter) is given." - removed
Input schema / $defs / CrossSearchInput / properties / query / maxLengthRemoved value: -2000 - removed
Input schema / $defs / CrossSearchInput / properties / query / minLengthRemoved value: -1 - removed
Input schema / $defs / CrossSearchInput / properties / query / typeRemoved value: -"string" - added
Input schema / $defs / CrossSearchInput / properties / researcher_idAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Researcher identifier(s), comma-separated: a KAKEN researcher number, an NRID, a CiNii author ID (DA…) or a researcher CRID. Sent as researcherId.", + "title": "Researcher Id" +} - added
Input schema / $defs / CrossSearchInput / properties / sortAdded value: +{ + "$ref": "#/$defs/SortOrder", + "default": "4", + "description": "Sort order. NEWEST/OLDEST = by year (publication, degree award or project start); RELEVANCE (default); CITATIONS_DESC = citation count, articles only; CRID_ASC = by CRID, cross search only; NAME_ASC/NAME_DESC, PROJECTS_DESC/PROJECTS_ASC and PRODUCTS_DESC/PRODUCTS_ASC = researcher name, number of related projects and number of related research products, researcher search only (which does not accept OLDEST)." +} - added
Input schema / $defs / CrossSearchInput / properties / start / maximumAdded value: +10000 - removed
Input schema / $defs / CrossSearchInput / requiredRemoved value: -[ - "query" -] - added
Input schema / $defs / SortOrderAdded value: +{ + "description": "CiNii Research OpenSearch v2 `sortorder` codes.\n\nNot every code is valid for every search type, and CiNii does not refuse\none that is not: sortorder=5 on articles is silently ignored and the\nresults come back in relevance order, a page that says it is sorted when\nit is not. Each input model therefore checks its sort against _SORT_SCOPE.", + "enum": [ + "0", + "1", + "4", + "5", + "6", + "10", + "20", + "21", + "30", + "31", + "40" + ], + "title": "SortOrder", + "type": "string" +}
- Changed
cinii_search_articles17 fields changed- added
Input schema / $defs / ArticleSearchInput / properties / data_source / descriptionAdded value: +"Data source(s), comma-separated, e.g. 'JALC', 'IRDB', 'CROSSREF', 'NDL_SEARCH', 'NACSIS_CAT', 'KAKEN', 'CIA', 'CIB', 'DATACITE', 'JDCAT'. Sent as dataSourceType. Unknown values are refused here, because CiNii answers them with zero records." - added
Input schema / $defs / ArticleSearchInput / properties / has_fulltextAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "true: only records CiNii links to full text; false: only records it does not. Sent as hasLinkToFullText.", + "title": "Has Fulltext" +} - added
Input schema / $defs / ArticleSearchInput / properties / journal / descriptionAdded value: +"Journal title. Sent as publicationTitle." - added
Input schema / $defs / ArticleSearchInput / properties / languageAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Language(s) of the records, as ISO 639-1 codes, comma-separated: 'ja', 'en', 'zh', 'ko', or 'ja,en'. Sent as languageType. Filters by the language catalogued for the record, not the language of the query.", + "title": "Language" +} - added
Input schema / $defs / ArticleSearchInput / properties / query / anyOfAdded value: +[ + { + "maxLength": 2000, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / $defs / ArticleSearchInput / properties / query / defaultAdded value: +null - changed
Input schema / $defs / ArticleSearchInput / properties / query / descriptionPrevious value: -"Search query (Japanese or English)"New value: +"Free-text search terms (Japanese or English). Optional when another criterion (an identifier, a title, a filter) is given." - removed
Input schema / $defs / ArticleSearchInput / properties / query / maxLengthRemoved value: -2000 - removed
Input schema / $defs / ArticleSearchInput / properties / query / minLengthRemoved value: -1 - removed
Input schema / $defs / ArticleSearchInput / properties / query / typeRemoved value: -"string" - added
Input schema / $defs / ArticleSearchInput / properties / researcher_idAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Researcher identifier(s), comma-separated: a KAKEN researcher number, an NRID, a CiNii author ID (DA…) or a researcher CRID. Sent as researcherId.", + "title": "Researcher Id" +} - added
Input schema / $defs / ArticleSearchInput / properties / resource_typeAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Resource type(s), comma-separated, as CiNii names them: e.g. 'journal article', 'departmental bulletin paper', 'conference paper', 'review article', 'book', 'Dataset'. Sent as resourceType.", + "title": "Resource Type" +} - added
Input schema / $defs / ArticleSearchInput / properties / sort / descriptionAdded value: +"Sort order. NEWEST/OLDEST = by year (publication, degree award or project start); RELEVANCE (default); CITATIONS_DESC = citation count, articles only; CRID_ASC = by CRID, cross search only; NAME_ASC/NAME_DESC, PROJECTS_DESC/PROJECTS_ASC and PRODUCTS_DESC/PRODUCTS_ASC = researcher name, number of related projects and number of related research products, researcher search only (which does not accept OLDEST)." - added
Input schema / $defs / ArticleSearchInput / properties / start / maximumAdded value: +10000 - removed
Input schema / $defs / ArticleSearchInput / requiredRemoved value: -[ - "query" -] - added
Input schema / $defs / SortOrder / descriptionAdded value: +"CiNii Research OpenSearch v2 `sortorder` codes.\n\nNot every code is valid for every search type, and CiNii does not refuse\none that is not: sortorder=5 on articles is silently ignored and the\nresults come back in relevance order, a page that says it is sorted when\nit is not. Each input model therefore checks its sort against _SORT_SCOPE." - changed
Input schema / $defs / SortOrder / enumPrevious value: -[ - "0", - "1", - "4", - "10" -]New value: +[ + "0", + "1", + "4", + "5", + "6", + "10", + "20", + "21", + "30", + "31", + "40" +]
- Changed
cinii_search_books18 fields changed- added
Input schema / $defs / BookSearchInput / properties / categoryAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Classification, comma-separated (e.g. an NDC number such as 379). Sent as category.", + "title": "Category" +} - added
Input schema / $defs / BookSearchInput / properties / data_sourceAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Data source(s), comma-separated, e.g. 'JALC', 'IRDB', 'CROSSREF', 'NDL_SEARCH', 'NACSIS_CAT', 'KAKEN', 'CIA', 'CIB', 'DATACITE', 'JDCAT'. Sent as dataSourceType. Unknown values are refused here, because CiNii answers them with zero records.", + "title": "Data Source" +} - added
Input schema / $defs / BookSearchInput / properties / exact_titleAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "true: match `title` exactly. Sent as isFullTitle.", + "title": "Exact Title" +} - added
Input schema / $defs / BookSearchInput / properties / has_fulltextAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "true: only records CiNii links to full text; false: only records it does not. Sent as hasLinkToFullText.", + "title": "Has Fulltext" +} - added
Input schema / $defs / BookSearchInput / properties / languageAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Language(s) of the records, as ISO 639-1 codes, comma-separated: 'ja', 'en', 'zh', 'ko', or 'ja,en'. Sent as languageType. Filters by the language catalogued for the record, not the language of the query.", + "title": "Language" +} - added
Input schema / $defs / BookSearchInput / properties / ncidAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "NACSIS-CAT record ID(s), comma-separated (e.g. BC08431161).", + "title": "Ncid" +} - added
Input schema / $defs / BookSearchInput / properties / query / anyOfAdded value: +[ + { + "maxLength": 2000, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / $defs / BookSearchInput / properties / query / defaultAdded value: +null - added
Input schema / $defs / BookSearchInput / properties / query / descriptionAdded value: +"Free-text search terms (Japanese or English). Optional when another criterion (an identifier, a title, a filter) is given." - removed
Input schema / $defs / BookSearchInput / properties / query / maxLengthRemoved value: -2000 - removed
Input schema / $defs / BookSearchInput / properties / query / minLengthRemoved value: -1 - removed
Input schema / $defs / BookSearchInput / properties / query / typeRemoved value: -"string" - added
Input schema / $defs / BookSearchInput / properties / researcher_idAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Researcher identifier(s), comma-separated: a KAKEN researcher number, an NRID, a CiNii author ID (DA…) or a researcher CRID. Sent as researcherId.", + "title": "Researcher Id" +} - added
Input schema / $defs / BookSearchInput / properties / resource_typeAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Resource type(s), comma-separated, as CiNii names them: e.g. 'journal article', 'departmental bulletin paper', 'conference paper', 'review article', 'book', 'Dataset'. Sent as resourceType.", + "title": "Resource Type" +} - added
Input schema / $defs / BookSearchInput / properties / sortAdded value: +{ + "$ref": "#/$defs/SortOrder", + "default": "4", + "description": "Sort order. NEWEST/OLDEST = by year (publication, degree award or project start); RELEVANCE (default); CITATIONS_DESC = citation count, articles only; CRID_ASC = by CRID, cross search only; NAME_ASC/NAME_DESC, PROJECTS_DESC/PROJECTS_ASC and PRODUCTS_DESC/PRODUCTS_ASC = researcher name, number of related projects and number of related research products, researcher search only (which does not accept OLDEST)." +} - added
Input schema / $defs / BookSearchInput / properties / start / maximumAdded value: +10000 - removed
Input schema / $defs / BookSearchInput / requiredRemoved value: -[ - "query" -] - added
Input schema / $defs / SortOrderAdded value: +{ + "description": "CiNii Research OpenSearch v2 `sortorder` codes.\n\nNot every code is valid for every search type, and CiNii does not refuse\none that is not: sortorder=5 on articles is silently ignored and the\nresults come back in relevance order, a page that says it is sorted when\nit is not. Each input model therefore checks its sort against _SORT_SCOPE.", + "enum": [ + "0", + "1", + "4", + "5", + "6", + "10", + "20", + "21", + "30", + "31", + "40" + ], + "title": "SortOrder", + "type": "string" +}
- Added
cinii_search_data - Changed
cinii_search_dissertations15 fields changed- added
Input schema / $defs / DissertationSearchInput / properties / award_institutionAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Degree-granting university (e.g. 東京大学). Sent as awardInstitution.", + "title": "Award Institution" +} - added
Input schema / $defs / DissertationSearchInput / properties / data_sourceAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Data source(s), comma-separated, e.g. 'JALC', 'IRDB', 'CROSSREF', 'NDL_SEARCH', 'NACSIS_CAT', 'KAKEN', 'CIA', 'CIB', 'DATACITE', 'JDCAT'. Sent as dataSourceType. Unknown values are refused here, because CiNii answers them with zero records.", + "title": "Data Source" +} - added
Input schema / $defs / DissertationSearchInput / properties / degreeAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Degree title as catalogued (e.g. 博士(教育学)). Sent as degree.", + "title": "Degree" +} - added
Input schema / $defs / DissertationSearchInput / properties / has_fulltextAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "true: only records CiNii links to full text; false: only records it does not. Sent as hasLinkToFullText.", + "title": "Has Fulltext" +} - added
Input schema / $defs / DissertationSearchInput / properties / languageAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Language(s) of the records, as ISO 639-1 codes, comma-separated: 'ja', 'en', 'zh', 'ko', or 'ja,en'. Sent as languageType. Filters by the language catalogued for the record, not the language of the query.", + "title": "Language" +} - added
Input schema / $defs / DissertationSearchInput / properties / query / anyOfAdded value: +[ + { + "maxLength": 2000, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / $defs / DissertationSearchInput / properties / query / defaultAdded value: +null - added
Input schema / $defs / DissertationSearchInput / properties / query / descriptionAdded value: +"Free-text search terms (Japanese or English). Optional when another criterion (an identifier, a title, a filter) is given." - removed
Input schema / $defs / DissertationSearchInput / properties / query / maxLengthRemoved value: -2000 - removed
Input schema / $defs / DissertationSearchInput / properties / query / minLengthRemoved value: -1 - removed
Input schema / $defs / DissertationSearchInput / properties / query / typeRemoved value: -"string" - added
Input schema / $defs / DissertationSearchInput / properties / sortAdded value: +{ + "$ref": "#/$defs/SortOrder", + "default": "4", + "description": "Sort order. NEWEST/OLDEST = by year (publication, degree award or project start); RELEVANCE (default); CITATIONS_DESC = citation count, articles only; CRID_ASC = by CRID, cross search only; NAME_ASC/NAME_DESC, PROJECTS_DESC/PROJECTS_ASC and PRODUCTS_DESC/PRODUCTS_ASC = researcher name, number of related projects and number of related research products, researcher search only (which does not accept OLDEST)." +} - added
Input schema / $defs / DissertationSearchInput / properties / start / maximumAdded value: +10000 - removed
Input schema / $defs / DissertationSearchInput / requiredRemoved value: -[ - "query" -] - added
Input schema / $defs / SortOrderAdded value: +{ + "description": "CiNii Research OpenSearch v2 `sortorder` codes.\n\nNot every code is valid for every search type, and CiNii does not refuse\none that is not: sortorder=5 on articles is silently ignored and the\nresults come back in relevance order, a page that says it is sorted when\nit is not. Each input model therefore checks its sort against _SORT_SCOPE.", + "enum": [ + "0", + "1", + "4", + "5", + "6", + "10", + "20", + "21", + "30", + "31", + "40" + ], + "title": "SortOrder", + "type": "string" +}
- Changed
cinii_search_kaken14 fields changed- added
Input schema / $defs / KakenSearchInput / properties / data_sourceAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Data source(s), comma-separated, e.g. 'JALC', 'IRDB', 'CROSSREF', 'NDL_SEARCH', 'NACSIS_CAT', 'KAKEN', 'CIA', 'CIB', 'DATACITE', 'JDCAT'. Sent as dataSourceType. Unknown values are refused here, because CiNii answers them with zero records.", + "title": "Data Source" +} - added
Input schema / $defs / KakenSearchInput / properties / languageAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Language(s) of the records, as ISO 639-1 codes, comma-separated: 'ja', 'en', 'zh', 'ko', or 'ja,en'. Sent as languageType. Filters by the language catalogued for the record, not the language of the query.", + "title": "Language" +} - added
Input schema / $defs / KakenSearchInput / properties / project_idAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "KAKEN project or area number(s), comma-separated (e.g. 18K00968). Sent as projectId.", + "title": "Project Id" +} - added
Input schema / $defs / KakenSearchInput / properties / query / anyOfAdded value: +[ + { + "maxLength": 2000, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / $defs / KakenSearchInput / properties / query / defaultAdded value: +null - added
Input schema / $defs / KakenSearchInput / properties / query / descriptionAdded value: +"Free-text search terms (Japanese or English). Optional when another criterion (an identifier, a title, a filter) is given." - removed
Input schema / $defs / KakenSearchInput / properties / query / maxLengthRemoved value: -2000 - removed
Input schema / $defs / KakenSearchInput / properties / query / minLengthRemoved value: -1 - removed
Input schema / $defs / KakenSearchInput / properties / query / typeRemoved value: -"string" - added
Input schema / $defs / KakenSearchInput / properties / researcher_idAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Researcher identifier(s), comma-separated: a KAKEN researcher number, an NRID, a CiNii author ID (DA…) or a researcher CRID. Sent as researcherId.", + "title": "Researcher Id" +} - added
Input schema / $defs / KakenSearchInput / properties / sortAdded value: +{ + "$ref": "#/$defs/SortOrder", + "default": "4", + "description": "Sort order. NEWEST/OLDEST = by year (publication, degree award or project start); RELEVANCE (default); CITATIONS_DESC = citation count, articles only; CRID_ASC = by CRID, cross search only; NAME_ASC/NAME_DESC, PROJECTS_DESC/PROJECTS_ASC and PRODUCTS_DESC/PRODUCTS_ASC = researcher name, number of related projects and number of related research products, researcher search only (which does not accept OLDEST)." +} - added
Input schema / $defs / KakenSearchInput / properties / start / maximumAdded value: +10000 - removed
Input schema / $defs / KakenSearchInput / requiredRemoved value: -[ - "query" -] - added
Input schema / $defs / SortOrderAdded value: +{ + "description": "CiNii Research OpenSearch v2 `sortorder` codes.\n\nNot every code is valid for every search type, and CiNii does not refuse\none that is not: sortorder=5 on articles is silently ignored and the\nresults come back in relevance order, a page that says it is sorted when\nit is not. Each input model therefore checks its sort against _SORT_SCOPE.", + "enum": [ + "0", + "1", + "4", + "5", + "6", + "10", + "20", + "21", + "30", + "31", + "40" + ], + "title": "SortOrder", + "type": "string" +}
- Added
cinii_search_libraries - Added
cinii_search_projects_and_products - Changed
cinii_search_researchers12 fields changed- added
Input schema / $defs / ResearcherSearchInput / properties / data_sourceAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Data source(s), comma-separated, e.g. 'JALC', 'IRDB', 'CROSSREF', 'NDL_SEARCH', 'NACSIS_CAT', 'KAKEN', 'CIA', 'CIB', 'DATACITE', 'JDCAT'. Sent as dataSourceType. Unknown values are refused here, because CiNii answers them with zero records.", + "title": "Data Source" +} - added
Input schema / $defs / ResearcherSearchInput / properties / query / anyOfAdded value: +[ + { + "maxLength": 2000, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / $defs / ResearcherSearchInput / properties / query / defaultAdded value: +null - added
Input schema / $defs / ResearcherSearchInput / properties / query / descriptionAdded value: +"Free-text search terms (Japanese or English). Optional when another criterion (an identifier, a title, a filter) is given." - removed
Input schema / $defs / ResearcherSearchInput / properties / query / maxLengthRemoved value: -2000 - removed
Input schema / $defs / ResearcherSearchInput / properties / query / minLengthRemoved value: -1 - removed
Input schema / $defs / ResearcherSearchInput / properties / query / typeRemoved value: -"string" - added
Input schema / $defs / ResearcherSearchInput / properties / researcher_idAdded value: +{ + "anyOf": [ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Researcher identifier(s), comma-separated: a KAKEN researcher number, an NRID, a CiNii author ID (DA…) or a researcher CRID. Sent as researcherId.", + "title": "Researcher Id" +} - added
Input schema / $defs / ResearcherSearchInput / properties / sortAdded value: +{ + "$ref": "#/$defs/SortOrder", + "default": "4", + "description": "Sort order. NEWEST/OLDEST = by year (publication, degree award or project start); RELEVANCE (default); CITATIONS_DESC = citation count, articles only; CRID_ASC = by CRID, cross search only; NAME_ASC/NAME_DESC, PROJECTS_DESC/PROJECTS_ASC and PRODUCTS_DESC/PRODUCTS_ASC = researcher name, number of related projects and number of related research products, researcher search only (which does not accept OLDEST)." +} - added
Input schema / $defs / ResearcherSearchInput / properties / start / maximumAdded value: +10000 - removed
Input schema / $defs / ResearcherSearchInput / requiredRemoved value: -[ - "query" -] - added
Input schema / $defs / SortOrderAdded value: +{ + "description": "CiNii Research OpenSearch v2 `sortorder` codes.\n\nNot every code is valid for every search type, and CiNii does not refuse\none that is not: sortorder=5 on articles is silently ignored and the\nresults come back in relevance order, a page that says it is sorted when\nit is not. Each input model therefore checks its sort against _SORT_SCOPE.", + "enum": [ + "0", + "1", + "4", + "5", + "6", + "10", + "20", + "21", + "30", + "31", + "40" + ], + "title": "SortOrder", + "type": "string" +}
7 tool updates
v3.2.0- Changed
cinii_get_record1 field changed- added
Input schema / $defs / RecordLookupInput / properties / record_url / maxLengthAdded value: +2000
- Changed
cinii_search_all1 field changed- added
Input schema / $defs / CrossSearchInput / properties / query / maxLengthAdded value: +2000
- Changed
cinii_search_articles5 fields changed- changed
Input schema / $defs / ArticleSearchInput / properties / author / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / $defs / ArticleSearchInput / properties / data_source / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / $defs / ArticleSearchInput / properties / journal / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / $defs / ArticleSearchInput / properties / query / maxLengthAdded value: +2000 - changed
Input schema / $defs / ArticleSearchInput / properties / title / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } +]
- Changed
cinii_search_books5 fields changed- changed
Input schema / $defs / BookSearchInput / properties / author / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / $defs / BookSearchInput / properties / isbn / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / $defs / BookSearchInput / properties / publisher / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / $defs / BookSearchInput / properties / query / maxLengthAdded value: +2000 - changed
Input schema / $defs / BookSearchInput / properties / title / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } +]
- Changed
cinii_search_dissertations2 fields changed- changed
Input schema / $defs / DissertationSearchInput / properties / author / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / $defs / DissertationSearchInput / properties / query / maxLengthAdded value: +2000
- Changed
cinii_search_kaken3 fields changed- changed
Input schema / $defs / KakenSearchInput / properties / institution / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / $defs / KakenSearchInput / properties / query / maxLengthAdded value: +2000 - changed
Input schema / $defs / KakenSearchInput / properties / researcher / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } +]
- Changed
cinii_search_researchers2 fields changed- changed
Input schema / $defs / ResearcherSearchInput / properties / institution / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 2000, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / $defs / ResearcherSearchInput / properties / query / maxLengthAdded value: +2000
7 tool updates
v3.0.0- First observed
cinii_get_record - First observed
cinii_search_all - First observed
cinii_search_articles - First observed
cinii_search_books - First observed
cinii_search_dissertations - First observed
cinii_search_kaken - First observed
cinii_search_researchers
TDQS
Scored across 11 tools
Tools are partitioned mostly by record type (books, articles, dissertations, data, kaken, researchers, libraries, holdings), which gives clear primary boundaries. The main overlap is between cinii_search_all, cinii_search_kaken, and cinii_search_projects_and_products, which all return mixed/project records and require reading descriptions to choose correctly; well-written descriptions mitigate this rather than eliminate it.
Every tool follows the same cinii_<verb>_<noun> snake_case pattern: search_books, search_articles, get_holdings, get_record, etc. Verbs are used consistently (search_ for queries, get_ for single-resource fetches), so the convention is fully predictable.
Eleven tools map cleanly onto the distinct CiNii content types plus the two NACSIS-CAT auxiliary operations (holdings, libraries) and a single-record fetch. Each tool has a recognizable domain slice and none appear redundant enough to remove.
The surface covers search across all major record types, single-record retrieval by CRID/URL, ISBN/NCID lookup, library lookup, and holdings — a coherent discovery lifecycle. Minor gaps exist (no citation/export or bulk record retrieval, no explicit researcher-by-ID fetch aside from search), but agents can work around these.
Maintenance
Related MCP Connectors
Academic research MCP server for paper search, citation checks, graphs, and deep research.
Federated search of books and papers, BibTeX/RIS citations, open-access retrieval and reading.
Read-only MCP tools for AI agent discovery, structured resources, and NIULAI information.
Search and read the aicoolies catalog of AI and developer tools via a remote MCP knowledge graph.
Related MCP Servers
- AlicenseAqualityBmaintenanceAn MCP server for Japanese literature research that provides unified search across NDL, CiNii, J-STAGE, and other Japanese academic databases, with Skills to assist in search planning and result evaluation.30502 npm8MIT
- AlicenseCqualityDmaintenanceEnables searching and retrieving academic articles from CiNii, Japan's largest bibliographic database, with support for advanced filtering, sorting, and search range options.11Apache 2.0
- AlicenseAqualityDmaintenanceEnables searching CiNii Research for academic articles, books, grants, and research data, and retrieving metadata for individual items.2MIT
- FlicenseNot gradedqualityAmaintenanceEnables LLMs and compatible clients to search academic papers, retrieve detailed metadata and abstracts, access full-text content when available, and perform topic searches with optional date filters via MCP tools.-