NASA SciX MCP Server
This MCP server lets an LLM search and analyze astronomical literature through the SciX API, manage personal libraries and their sharing/annotations, and export bibliographic data.
Literature search: Solr-syntax queries (author, title, abstract, year ranges, Boolean operators) with pagination, sorting (score, citations, date, reads), and markdown or JSON output.
Paper details: Fetch metadata for a specific paper by its SciX bibcode.
Citation metrics: Compute h-index, citation counts, and usage statistics for up to 2000 bibcodes.
Citation network: List papers that cite a given paper (forward citations) or that it references (backward citations).
Export: Generate citations in 25+ formats (BibTeX, AASTeX, EndNote, RIS, IEEE, MNRAS, etc.), including custom templates, key/journal formatting, and author limits.
Library management: List, view, create, delete, and edit libraries; add or remove documents; add documents from a search query; and run set operations (union, intersection, difference, copy, empty).
Permissions & sharing: View library permissions, grant or modify user access, and transfer library ownership.
Annotations: Get, add/update, or delete notes on documents within a library.
Documentation search: Search SciX help docs for search syntax, features, and API usage guidance.
Provides access to the NASA Astrophysics Data System (SciX) for searching astronomical literature, retrieving paper metadata, calculating citation metrics, exploring citation networks, exporting bibliographic data in multiple formats, and managing personal libraries of papers.
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., "@NASA SciX MCP Serverfind top cited exoplanet papers from 2023"
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.
SciX MCP Server
A Model Context Protocol (MCP) server for the SciX API. This server enables LLMs to search astronomical literature, retrieve paper metadata, analyze citation metrics, and export bibliographic data.
Quick Start (MCP clients)
Get an API Key
Create an account at SciX
Generate an API token at https://scixplorer.org/user/settings/token
Set the environment variable:
export SCIX_API_TOKEN=your_api_key_hereOr create a .env file:
cp .env.example .env
# Edit .env and add your keyConfigure your MCP client (Claude, Codex, etc.)
Add to your MCP client configuration:
{
"mcpServers": {
"scix": {
"command": "npx",
"args": ["scix-mcp"],
"env": {
"SCIX_API_TOKEN": "your_api_key_here"
}
}
}
}Common locations: Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %AppData%\\Claude\\claude_desktop_config.json on Windows) and Codex CLI (~/.config/codex/config.json). Restart your client after editing.
Local MCP clients that read .mcp/server.json can also pick up the packaged config in .mcp/server.json; just drop in your SCIX_API_TOKEN.
Environment variables
SCIX_API_TOKEN(required for stdio): your SciX API key. Not used by the HTTP transport, which takes the token from each request.SCIX_API_BASE(optional): override the API base URL. Defaults tohttps://api.scixplorer.org/v1when unset. Primarily used to point the server at a local mock during the e2e test suite.SCIX_WEB_BASE(optional): override the host used when building the scixplorer.org links in tool output. Defaults tohttps://scixplorer.org.PORT/HOST(HTTP only): where the HTTP transport listens. Default8000on0.0.0.0.
Related MCP server: Scopus MCP Server
HTTP transport
scix-mcp-http serves the same tools over Streamable HTTP instead of stdio:
POST /mcp for JSON-RPC, GET /healthz as an unauthenticated probe.
Unlike stdio, the server holds no token of its own — each request must carry the caller's, and requests without one get a 401:
Authorization: Bearer <your SciX API token>Tool calls act as the calling user and spend that user's rate limit. Clients that cannot set the header (ChatGPT connectors, which need OAuth or no auth) cannot use this endpoint.
Example Prompts
- Find refereed JWST exoplanet papers from 2022-2024 sorted by citation_count, return the top 5 in markdown with bibcodes, titles, first author, and citation counts.
- Build a query for gravitational wave kilonova follow-ups since 2017 (fielded abstract search), add the first 50 results to library <library_id>, and then give me metrics (h-index, total cites) for those bibcodes in JSON.
- Fetch paper 2020ApJ...905....3A, list its first 10 references with titles, and also list the first 10 forward citations with publication years.
- Create a public library named “Cosmic Web Reviews”, seeded with bibcodes [...], then share the public URL and export the contents in BibTeX.
- For bibcodes [...], return citation metrics plus a ranked list of which papers cite the most recent one (rows=25) in markdown.
- Get all my libraries, pick the one with the most documents, and return its metadata plus the first 5 document titles in JSON.Features
Literature Search: Full-text search with advanced Solr query syntax
Faceting: Break a result set down by any of the 16 SciX facets and feed the counts back as filters via the
get_facetstoolPaper Details: Retrieve metadata for any publication
Citation Metrics: Calculate h-index, citation counts, and usage statistics
Citation Network: Explore forward and backward citations
Export: Generate citations in 23 bibliographic formats (BibTeX, AASTeX, EndNote, RIS, and more) — see the
exporttool'sformatenum insrc/types.tsfor the full listDocumentation Search: Query SciX help/docs content via the
search_docstoolHealth Check: Diagnose setup (token, API reachability, tool registry) via the
health_checktoolDual Format: Support for both human-readable Markdown and machine-readable JSON
Available Tools
Search & Metadata
search: Solr-powered search across SciX. Params:query(required),filter_query(up to 20 Solrfqstrings, each sent as its own repeated parameter and ANDed together),rows(1-100, default 10),start(offset, default 0),sort(score desc|citation_count desc|date desc|date asc|read_count desc, defaultscore desc),response_format(markdown|json, defaultmarkdown).Example queries:
author:"Einstein, A." title:relativity,black holes year:2020-2023,author:^Smith,dark energy AND galaxy clusters.
get_facets: Count how a result set breaks down across facets, so a search can be narrowed. Params:query(required),filter_query,facets(defaultauthor,year,publications,keywords,refereed,collections),limit(1-200 buckets per facet, default 10),sort(count desc|count asc|index asc|index desc),prefix(drill into a hierarchy; only valid with exactly one facet),response_format.Every bucket carries a
filterstring ready to pass straight back as asearchfilter_queryentry.Available facets, with the Solr field each one counts:
Facet
Solr field
Hierarchical
authorauthor_facet_hieryes (2 levels)
collectionsdatabaseno
refereedpropertyno
institutionsaff_facet_hieryes (2 levels)
keywordskeyword_facetno
publicationspub_abbrevno
bibgroupsbibgroup_facetno
simbadsimbad_object_facet_hieryes (2 levels)
nedned_object_facet_hieryes (2 levels)
awardgrant_facet_hieryes (2 levels)
datadata_facetno
viziervizier_facetno
pubtypedoctype_facet_hieryes (2 levels)
planetaryplanetary_feature_facet_hier_3levelyes (3 levels)
uatuatno
yearyearno
Hierarchical facet values are prefixed with their level, e.g.
0/Smith, Jat the root and1/Smith, J/Smith, Johnone level down. Expandable buckets report achild_prefixto pass back asprefix.
get_paper: Fetch a paper bybibcode, DOI, arXiv ID, or SciX ID (scix:...) with optionalresponse_format.get_metrics: Metrics forbibcodes(1-2000) with optionalresponse_format; returns h-index, g-index, citation counts, usage stats.
Citation Network
get_citations: Forward citations for a paper (bibcode, DOI, arXiv ID, or SciX ID); optionalrows(1-100, default 20) andresponse_format.get_references: Backward references for a paper (bibcode, DOI, arXiv ID, or SciX ID); optionalrows(1-100, default 20) andresponse_format.
Export
export: Exportbibcodes(1-2000) informat— one of the 23 formats in theExportInputSchemaenum insrc/types.ts(e.g.bibtex,aastex,endnote,ris,ieee,mnras). Usecustom_formatwithformat: customfor a template. Returns plain text in the chosen format.
Documentation
search_docs: Search SciX help documentation. Params:query(required, natural language),limit(1-20, default 5). Returns a ranked list with title, section/subsection, source URL, relevance score, and a focused snippet.
Libraries
get_libraries: List libraries; optionaltype(all|owner|collaborator, defaultall) andresponse_format.get_library: Metadata + documents forlibrary_id; optionalresponse_format.create_library: Create withname(required), optionaldescription,public(defaultfalse),bibcodes, andresponse_format.delete_library: Permanently delete bylibrary_id; optionalresponse_format.edit_library: Updatename,description, orpublicforlibrary_id; optionalresponse_format.manage_documents: Add/remove documents withlibrary_id,bibcodes(1-2000),action(add|remove), and optionalresponse_format.add_documents_by_query: Add search results to a library withlibrary_id,query, optionalrows(1-2000, default 25), andresponse_format.library_operation: Run set ops on a library withlibrary_id,operation(union|intersection|difference|copy|empty), optionalsource_library_ids,name/description(for copy), andresponse_format.
Permissions & Sharing
get_permissions: View owners/collaborators forlibrary_id; optionalresponse_format.update_permissions: Grant/change a user's access withlibrary_id,email,permission(owner|admin|write|read), and optionalresponse_format.transfer_library: Transfer ownership withlibrary_id,email, and optionalresponse_format.
Annotations
get_annotation: Fetch note content forlibrary_id+bibcode; optionalresponse_format.manage_annotation: Add/update note withlibrary_id,bibcode,content, and optionalresponse_format.delete_annotation: Remove note forlibrary_id+bibcode; optionalresponse_format.
Diagnostics
health_check: Diagnose the server setup. No required params (optionalresponse_format). Reports server name/version, API base URL, whether a token is configured, an authentication probe result (ok|unauthorized|rate_limited|unreachable|skipped), and the registered tool names. Never emits the token value. Runs without a token (probe isskipped); use it to tell setup problems apart from ordinary API errors.
Rate Limits
5000 requests per day per API key
Rate limit info is returned in response headers
Request higher limits at https://scixplorer.org/feedback/general
SciX Search Syntax
The SciX search supports Solr query syntax:
Syntax | Description | Example |
| Exact author |
|
| First author |
|
| Title search |
|
| Abstract search |
|
| Year range |
|
| Refereed only |
|
| Papers citing X |
|
| Papers cited by X |
|
| Boolean operators |
|
Values discovered through get_facets are better applied as filter_query
entries than folded into query: Solr caches filters separately, and the
facet/filter split is what the SciX web UI does.
Outbound request tagging
Every request this server makes to the SciX API carries:
X-Client-Source: scix-mcp— a stable, low-cardinality tag so SciX access logs can attribute MCP traffic without parsing User-Agent.User-Agent: scix-mcp/<version> (transport=stdio|http)— version and transport detail.
Development
Install & Build
pnpm install
pnpm buildLocal commands
# Watch mode
pnpm dev
# Test with MCP Inspector
npx @modelcontextprotocol/inspector node build/index.jsTesting
The project uses Vitest.
Running Tests
# Run all tests
pnpm test
# Run tests in watch mode
pnpm test:watch
# Run tests with coverage
pnpm test:coverage
# Run the end-to-end protocol smoke suite (builds first, then drives the
# built server over stdio against a local mock SciX API)
pnpm test:e2eThe e2e suite (test/e2e/protocol.test.ts) spawns node build/index.js,
connects a real MCP client over stdio, and asserts the live tool/prompt/
resource surface plus one canned call per tool. It points the server at a
local mock via the SCIX_API_BASE environment variable (see below); no real
network access is required.
Test Structure
Tests are organized in the test/ directory:
test/
├── helpers/
│ └── mockFetch.ts # Fetch mocking utilities
├── client.test.ts # HTTP client tests
├── search-docs.test.ts # Documentation search tests
└── tools/
├── search.test.ts # Search tool tests
├── facets.test.ts # Facet counts tool tests
├── paper.test.ts # Paper details tests
├── metrics.test.ts # Metrics tests
├── citations.test.ts # Citations/references tests
├── export.test.ts # Export tests
└── library.test.ts # Library management testsTest Coverage
The test suite covers:
HTTP Client: GET/POST/PUT/DELETE methods, error handling (401/404/429), timeouts, request formatting
Search Tools: Query parameter encoding, repeated
fqfilters, pagination, result limiting, response formattingFacets: Registry/field mapping,
json.facetrequest bodies, hierarchical prefix handling, bucket parsingPaper Tools: Bibcode validation, field selection, error handling for missing papers
Metrics Tools: Batch bibcode processing, MAX_BIBCODES limits, metric type selection
Citation Tools: Forward/backward citations, sorting, row limits
Export Tools: Multiple export formats (BibTeX, AASTeX, EndNote, etc.), batch processing
Library Tools: All CRUD operations, permissions, annotations, library operations
API Token for Tests
Tests use mock fetch and don't require a real API token. Individual tests set SCIX_API_TOKEN='test-api-key' as needed.
Project Structure
src/
├── index.ts # Main server entry point
├── client.ts # SciX API client wrapper
├── types.ts # TypeScript/Zod type definitions
├── formatters.ts # Response formatting utilities
├── config.ts # Configuration constants
├── identifier-query.ts # Identifier (bibcode/DOI/arXiv/SciX) resolution
├── facets.ts # Facet registry, json.facet building, bucket parsing
├── scix-urls.ts # scixplorer.org link builders
├── search-docs.ts # Offline docs search (search_docs tool)
└── tools/
├── search.ts # Search tool
├── facets.ts # Facet counts tool
├── paper.ts # Paper details tool
├── metrics.ts # Metrics tool
├── citations.ts # Citation network tools
├── export.ts # Export tool
└── library.ts # Library management toolsExample Usage
Search for papers
Use search with query "supernova 2023" to find recent supernova papersNarrow a search with facets
Use get_facets with query "exoplanet atmospheres" to see the top authors,
journals and years, then call search with the filter_query values it returns.Get paper details
Use get_paper with bibcode "2023ApJ...950..123S"Calculate metrics
Use get_metrics with bibcodes ["2023ApJ...950..123S", "2022MNRAS.517.1234T"]Export citations
Use export with bibcodes ["2023ApJ...950..123S"] and format "bibtex"Error Handling
The server provides clear error messages:
401: Token missing or rejected - check
SCIX_API_TOKEN(stdio) or theAuthorization: Bearerheader (HTTP)404: Resource not found - check bibcode format
429: Rate limit exceeded - wait until reset
Timeout: Request took > 30 seconds
Resources
License
MIT
Support
For API issues: https://scixplorer.org/feedback/general For server issues: Open an issue on GitHub
Available Tools
23 toolsadd_documents_by_queryC
Add documents to a library from a SciX search query.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | No | Number of results to add | |
| query | Yes | SciX search query | |
| library_id | Yes | Library identifier | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and idempotentHint=false, so the write and repeatability profile is covered. The description adds nothing beyond that: it doesn't state whether duplicate documents are skipped or re-added, whether the operation is cancellable/undoable, or what happens when the query matches more than 'rows' results.
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?
A single front-loaded sentence with no filler, which is appropriate for a terse tool. It is arguably too terse given the mutation semantics, but it wastes no words.
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 non-idempotent mutation with no output schema and no annotations explaining side effects, the description should say what the call returns (count added?) and how duplicates are handled. Those gaps leave the agent unable to predict the outcome of a 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?
Schema description coverage is 75%, so most parameters (query, library_id, rows) are self-documented in the schema. The description itself adds no syntax, format, or default information beyond what the schema provides, so it sits at the baseline.
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 (Add) and resource (documents to a library) plus the source (SciX search query), which is more informative than a bare name. It does not, however, differentiate itself from siblings like manage_documents or search_docs, so an agent must infer the boundary.
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?
There is no when-to-use guidance, no mention of prerequisites (e.g. that the library must exist or that permission is required), and no routing to alternatives such as manage_documents for other document-editing modes. The agent is left to infer the context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_libraryB
Create a new library with optional initial documents.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Library name | |
| public | No | Whether library is public | |
| bibcodes | No | Initial bibcodes to add | |
| description | No | Library description | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, and openWorldHint=true, so the mutation/safety profile is covered. The description contributes only the fact that documents may be attached at creation time; it says nothing about permission requirements, name uniqueness behavior, or whether duplicate calls create duplicate libraries.
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?
A single front-loaded sentence with no filler. It is efficient, though the brevity is partly under-specification rather than deliberate tightness.
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 non-idempotent mutation tool with five parameters and no output schema, the description omits what is returned (e.g., the new library's identifier) and any error or permission conditions. An agent can call it, but cannot anticipate the result or failure modes.
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 80%, so the schema already documents name, public, bibcodes, and description. The description echoes 'name' and the initial-documents concept without adding format, limits, or interaction details, so the baseline 3 applies.
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 ('Create a new library') and adds scope ('with optional initial documents'), which is clear enough to separate it from get_library, delete_library, and edit_library. It stops short of naming any sibling or the boundary between create_library and add_documents_by_query for seeding documents.
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?
There is no when-to-use guidance, no prerequisites (authentication, ownership), and no mention of alternatives such as edit_library for modifying an existing library. The agent must infer that this is the creation path purely from the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_annotationCDestructive
Delete an annotation/note for a document in a library.
| Name | Required | Description | Default |
|---|---|---|---|
| bibcode | Yes | Bibcode to remove annotation from | |
| library_id | Yes | Library identifier | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is covered by structured data. The description adds nothing beyond restating the deletion: no indication that the removal is permanent, whether it requires write permission, or whether deleting the note affects the annotation object itself.
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?
A single front-loaded sentence with zero filler. It is arguably too terse for a destructive mutation tool, but nothing in it is wasted.
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 destructive, non-idempotent mutation with no output schema and an ambiguous sibling (manage_annotation), the description is too thin: it omits reversibility, permission requirements, and any routing guidance to the correct sibling.
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 coverage is 67%: bibcode and library_id are described in the schema, while response_format has only an enum and default with no description. The description mentions the document/library context but adds no parameter-level meaning, so it neither compensates nor regresses.
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 (delete) and resource (annotation/note) scoped to a document in a library, so the core action is unambiguous. However, siblings get_annotation and especially manage_annotation exist, and the description does nothing to distinguish this targeted delete from whatever manage_annotation covers.
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?
No when-to-use guidance, no prerequisites, and no named alternative despite manage_annotation sitting in the sibling list. The agent must infer that this is the single-annotation delete path rather than the bulk/management path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_libraryCDestructive
Delete a library permanently.
| Name | Required | Description | Default |
|---|---|---|---|
| library_id | Yes | Library identifier | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false and readOnlyHint=false, so 'permanently' largely restates structured data. The description adds nothing about cascade effects (e.g. what happens to documents in the deleted library), permission requirements, or confirmation behavior that the annotations do not already convey.
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?
A single front-loaded sentence with no filler or repetition. It is efficient, though the brevity reflects under-specification rather than disciplined editing.
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 destructive, non-idempotent, open-world operation with no output schema and partial parameter documentation, the description is too thin. It omits side effects, required permissions, and any indication of what the caller gets back.
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 only 50%: library_id has a description, but response_format carries no description in the schema and the tool description says nothing about either parameter. With the description adding zero parameter meaning, it fails to 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 resource ('Delete a library') plus the irreversible scope ('permanently'), which cleanly separates it from edit_library and delete_annotation. It does not, however, name any sibling or contrast itself with alternatives like delete_annotation.
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?
No when-to-use guidance, no prerequisites, no mention of alternatives such as edit_library for non-destructive changes or transfer_library for ownership changes. The agent must infer all of this from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_libraryADestructiveIdempotent
Edit library metadata (name, description, public status). Overwrites the current values, and changing public status can expose a private library.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New library name | |
| public | No | Whether library is public | |
| library_id | Yes | Library identifier | |
| description | No | New library description | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds real context beyond them: it specifies that existing values are overwritten (so partial-vs-full semantics matter) and warns that flipping public status can expose a private library. That risk disclosure is not derivable from the annotation set.
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 sentences, front-loaded with purpose and followed by the two behavioral caveats. No filler, no repetition of schema fields beyond what the risk warning requires.
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?
Covers purpose, mutation semantics, and the privacy hazard, which is most of what an agent needs; no output schema exists so return values need not be explained. It does leave one gap: whether omitting a field leaves it untouched or clears it, which matters given the 'overwrites' wording.
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 coverage is 80%, so the schema already documents the parameters, and 3 of 5 (name, description, public) are echoed in prose. library_id and response_format receive no added meaning, and no format/syntax detail is offered, so this lands at the baseline.
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 (Edit) and resource (library metadata) and enumerates the mutable fields (name, description, public status), which cleanly separates it from get_library, create_library, and delete_library. It does not explicitly name those siblings, 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?
No when-to-use guidance, prerequisites, or named alternatives are provided. An agent must infer from the name and the sibling list that this is the update path versus create_library/delete_library, which is exactly the 'no guidance' case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
exportBRead-only
Export citations in 23 bibliographic formats (BibTeX, AASTeX, EndNote, IEEE, MNRAS, etc.) with support for custom formatting templates.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Optional sort order (e.g., "date desc") | |
| format | Yes | Export format | |
| bibcodes | Yes | List of bibcodes to export | |
| keyformat | No | Citation key format | |
| maxauthor | No | Maximum authors to show before et al. | |
| authorcutoff | No | Author cutoff threshold | |
| custom_format | No | Custom format string (required when format is custom) | |
| journalformat | No | Journal format style code |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, destructiveHint=false, openWorld=true and idempotentHint=false, covering the safety profile. The description adds that custom templates are supported, which is useful context, but omits practical traits like the 2000-bibcode cap and behavior of the 'custom' format path.
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?
A single front-loaded sentence that names the action, the resource, and the breadth of formats without filler. Efficient, though it could have traded a few format examples for usage 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?
With 8 parameters, 100% schema coverage, and no output schema, the description covers the core capability but says nothing about what is returned (raw text vs structured) or the custom_format requirement, leaving some gaps for an agent to infer.
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 coverage is 100%, so every parameter is already documented in structured form. The description reinforces the format dimension and custom-template concept but adds no syntax or semantics beyond what the schema/enum provides, so the baseline 3 applies.
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 (Export) and resource (citations) plus the breadth of output formats. An agent can see this is the citation-formatting tool, distinct from data-retrieval siblings like get_citations or get_references, though the description never explicitly contrasts with them.
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 word 'export' and the format enumeration; there is no explicit guidance on when to choose this over retrieving citations directly, nor any noted preconditions such as obtaining bibcodes first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_annotationCRead-onlyIdempotent
Get annotation/note for a document in a library.
| Name | Required | Description | Default |
|---|---|---|---|
| bibcode | Yes | Bibcode to get annotation for | |
| library_id | Yes | Library identifier | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, giving the safety profile. The description adds no further behavioral context such as return format, missing annotation behavior, or permissions, and does not contradict the annotations.
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?
A single front-loaded sentence with zero wasted words. It is appropriately sized for the tool's simple retrieval purpose.
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 description states the core retrieval action and scope, which is minimally adequate for a simple read tool with annotations. However, it omits response_format semantics and any guidance about missing annotations or alternatives, leaving gaps.
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 coverage is 67%, with descriptions for bibcode and library_id but none for response_format. The description only restates 'document in a library' and adds no meaning beyond the schema, failing to compensate for the undocumented response_format parameter.
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 gives a specific verb (Get), resource (annotation/note), and scope (for a document in a library), so an agent can tell it apart from delete_annotation and manage_annotation by verb. It does not explicitly name sibling tools, but the purpose is clear.
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?
There is no guidance on when to use this tool versus alternatives, nor any prerequisites or exclusions. The implied usage is retrievable from the verb, but no explicit when/when-not context is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_citationsBRead-onlyIdempotent
Get papers that cite a given paper (forward citations). Accepts a bibcode, DOI, arXiv ID, or SciX ID.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | No | Number of citations to return | |
| bibcode | Yes | Paper identifier: bibcode, DOI, arXiv ID, or SciX ID (scix:...) | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so safety is covered. The description adds nothing behavioral beyond that: no ordering, pagination, or result-count behavior, and no note on what happens with an unresolvable identifier. It does not contradict the annotations, but it contributes no behavioral context.
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 tight sentences with zero filler; the core action and the accepted identifier forms are both front-loaded. Nothing in it wastes the agent's reading budget.
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?
No output schema exists, yet the description never characterizes the return (list of papers, ordering, fields), though it does cover the identifier input forms required to call it. For a simple read-only list tool this is nearly complete, with only return-shape details 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 67% and the schema already documents the identifier formats verbatim ('bibcode, DOI, arXiv ID, or SciX ID'), so the description's identifier sentence is largely a restatement. 'rows' and 'response_format' semantics come from the schema, not the description. Baseline 3 is appropriate.
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 (get) and resource (papers that cite a given paper) and disambiguates direction with '(forward citations)', which separates it from the references-style sibling. It does not, however, name the sibling tool (e.g. get_references) the way the highest-scoring definitions do.
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 '(forward citations)' qualifier implies when this tool applies versus a backward-citation tool, but there is no explicit when-to-use statement, no mention of get_references or get_paper as alternatives, and no preconditions. Usage is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_facetsARead-onlyIdempotent
Count how SciX search results break down across facets, to narrow a search. Covers author, collections, refereed, institutions, keywords, publications, bibgroups, SIMBAD objects, NED objects, award, data, Vizier tables, publication type, planetary features, UAT concepts, and year. Each returned bucket carries a ready-to-use filter_query value to pass back to search, and hierarchical facets (author, institutions, objects, award, publication type, planetary) report a child_prefix for drilling deeper.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Bucket ordering: by count, or by value ("index") | count desc |
| limit | No | Maximum buckets returned per facet | |
| query | Yes | SciX search query to facet over, using Solr syntax | |
| facets | No | Facets to count. Available: author, collections, refereed, institutions, keywords, publications, bibgroups, simbad, ned, award, data, vizier, pubtype, planetary, uat, year | |
| prefix | No | Drill into a hierarchical facet by restricting buckets to this prefix, e.g. "1/Smith, J/". Use the `child_prefix` returned for an expandable bucket. Only valid when exactly one facet is requested. | |
| filter_query | No | Solr filter queries (fq), each applied independently and ANDed together, e.g. author_facet_hier:"0/Smith, J". Use the `filter` value returned by get_facets. | |
| response_format | No | markdown |
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 bar is lower. The description adds real behavioral value by explaining the return shape: each bucket carries a ready-to-use filter_query and hierarchical facets report a child_prefix for drilling deeper. It omits any mention of limits/rate behavior, keeping it from a 5.
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 sentences, front-loaded with the purpose before the facet enumeration and return-value note. The long facet list duplicates the schema enum, which is mildly wasteful, but overall the structure is efficient.
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 no output schema, the description carries the burden of explaining returns, and it does so for the key fields (filter_query, child_prefix). For a read-only facet tool whose annotations cover safety, this is nearly complete, missing only limit/defaults context.
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 coverage is 86%, so the schema already documents nearly every parameter, and the enum of facets is duplicated verbatim in prose. The description does add the drill-down semantics of `prefix`/`child_prefix`, but this is largely reinforced by the schema's own prefix description, so a baseline 3 is appropriate.
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 ('Count how SciX search results break down across facets') and states the goal ('to narrow a search'). It clearly distinguishes itself from the sibling `search` tool by describing an aggregation/breakdown role rather than retrieval.
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 a clear usage context ('to narrow a search') and explicitly routes the agent back to the `search` sibling by noting buckets carry a filter_query to pass back, plus child_prefix for drill-down. It stops short of stating when NOT to use this tool or explicit preconditions, so it is not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_librariesBRead-onlyIdempotent
Get all libraries for the authenticated user. Can filter by type (all, owner, collaborator).
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by library type | all |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered without the description. The description adds only the 'authenticated user' scoping, and says nothing about pagination, result size, or ordering for a potentially large list.
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 with the core action front-loaded and no filler. The second sentence is somewhat redundant with the schema enum, but the overall size is appropriate.
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 two-parameter read-only list tool with no output schema, the description covers the action and filter but omits anything about return shape, ordering, or limits. Adequate but with visible gaps.
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 coverage is 50%: the 'type' parameter is already documented in the schema, and the description merely repeats its enum values rather than adding meaning. The 'response_format' parameter has no description anywhere, and the description does not compensate for that 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 resource ('Get all libraries') plus scope ('for the authenticated user'), which implicitly separates it from the singular get_library sibling. It does not explicitly name or rule out any sibling, so it falls 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: the tool enumerates the user's libraries, and the type filter hints at a use case (owned vs shared). There is no statement of when to prefer this over get_library or search, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_libraryBRead-onlyIdempotent
Get details about a specific library including metadata and list of documents.
| Name | Required | Description | Default |
|---|---|---|---|
| library_id | Yes | Library identifier | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds the return content (metadata and document list), which matters because there is no output schema, but says nothing about pagination, truncation, or access restrictions on private libraries.
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?
A single front-loaded sentence with no filler. It is efficient, though it uses its brevity to omit any routing or scoping detail that would have earned its place.
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 simple two-parameter read tool with full annotation coverage, the description covers what the tool returns, which is useful given no output schema. It leaves unclear whether the document list is paginated or complete, and what response_format changes about the result.
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 50%: library_id is documented in the schema while response_format is an enum with a default, largely self-explanatory. The description adds no parameter meaning beyond the schema, so the baseline 3 applies.
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?
Clear verb+resource: retrieves details for a single library and names the payload (metadata plus document list). It does not explicitly distinguish itself from the sibling get_libraries (plural listing) or from search_docs, so it is clear but not sibling-differentiating.
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 'specific' implies a single-identifier lookup rather than a listing, which weakly routes an agent away from get_libraries. However, no explicit when-to-use, prerequisites, or named alternatives are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_metricsBRead-onlyIdempotent
Get citation metrics including h-index, citation counts, and paper statistics for a list of bibcodes.
| Name | Required | Description | Default |
|---|---|---|---|
| bibcodes | Yes | List of bibcodes | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety/behavior profile is covered and the description need not restate it. The description adds the batch framing ('for a list of bibcodes') but omits practical traits such as the 2000-bibcode ceiling and any rate/latency behavior for large lists.
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?
A single efficient sentence that front-loads the verb and the returned fields with no filler. It is appropriately sized for a two-parameter tool, though it could have spent one clause on the response_format choice.
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 no output schema, the description usefully names the returned metric types, which is the main thing an agent needs. However, it is silent on the response_format parameter's markdown/json behavior and the 2000-item input limit, so it is adequate but not complete for a batch tool.
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 50%: 'bibcodes' is documented inline, but 'response_format' (enum markdown/json with default markdown) has no description anywhere. The description reinforces the bibcode-list input but adds nothing about output format selection, so it neither compensates for the gap nor regresses below the baseline.
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+resource ('Get citation metrics') and enumerates the return payload (h-index, citation counts, paper statistics), so the agent knows what it gets. It does not explicitly differentiate itself from citation-oriented siblings like get_citations or get_references, which is the only gap.
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?
No when-to-use guidance, no prerequisites, and no named alternative among the 22 sibling tools. The reader must infer that this is the batch-metrics tool versus get_citations/get_references, and nothing states whether bibcodes must already exist or how many calls are appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_paperBRead-onlyIdempotent
Get detailed information about a specific paper by identifier: bibcode, DOI, arXiv ID, or SciX ID (scix:...).
| Name | Required | Description | Default |
|---|---|---|---|
| bibcode | Yes | Paper identifier: bibcode, DOI, arXiv ID, or SciX ID (scix:...) | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so safety behavior is fully covered. The description adds no behavioral context beyond restating the identifier types already in the schema; it says nothing about error behavior, lookup breadth, or what 'detailed information' includes.
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?
A single front-loaded sentence with no wasted words. It leads with the action and resource immediately, then specifies accepted identifier formats.
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 simple two-parameter read tool with rich annotations and no output schema, the description is minimally adequate. However, it omits any mention of response_format or the shape of the returned 'detailed information,' leaving an agent to discover those through the schema alone.
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 50%, and the description only repeats the bibcode parameter's accepted identifier types exactly as written in the schema. The second parameter, response_format, is an enum with no description in the schema and is not mentioned at all, so the description 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 ('Get') and resource ('detailed information about a specific paper') and enumerates accepted identifier types. It does not explicitly differentiate itself from the sibling 'search' tool, but the purpose is clear without opening the 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?
Usage is implied: call this when you have a specific paper identifier and need details. However, it never states when to use this instead of 'search' or what to do if the identifier type is unknown, leaving alternatives to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_permissionsCRead-onlyIdempotent
Get permission information for a library.
| Name | Required | Description | Default |
|---|---|---|---|
| library_id | Yes | Library identifier | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, covering the safety profile. The description adds nothing beyond that: no note on permissions required to view permissions, no indication of whether results are cached or scoped to the caller's role.
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?
A single short sentence with the resource front-loaded and zero filler. It is appropriately sized for its content, though the content itself is thin rather than the structure being wasteful.
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 simple, read-only, idempotent lookup with annotations covering safety, the description is minimally sufficient. However, with no output schema, an agent gets no sense of what 'permission information' contains (roles, users, groups) or how response_format changes the result.
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 coverage is only 50%: library_id is documented in the schema while response_format (an enum with a markdown default) has no description anywhere. The description mentions no parameters at all, so it fails to compensate for the undocumented response_format and its effect on output.
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 (Get) and resource (permission information) scoped to a library, which implicitly separates it from the sibling update_permissions. It does not explicitly name or contrast with any sibling, so an agent must infer the read-vs-write distinction from the verb alone.
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?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as update_permissions or library_operation. The description gives only what the tool returns, leaving the agent to guess the triggering context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_referencesARead-onlyIdempotent
Get papers referenced by a given paper (backward citations). Accepts a bibcode, DOI, arXiv ID, or SciX ID.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | No | Number of citations to return | |
| bibcode | Yes | Paper identifier: bibcode, DOI, arXiv ID, or SciX ID (scix:...) | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds no behavioral detail beyond that (no pagination, result limits, or auth notes), so it neither adds value nor contradicts the annotations.
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 tightly written sentences with the core action front-loaded and the accepted identifier formats placed after. No filler or redundancy.
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 simple read-only lookup the description is adequate, but with no output schema it omits what a result contains and ignores the rows (default 20, max 100) and response_format parameters entirely. An agent gets the gist but not the full call contract.
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 coverage is 67% and the listed identifier types ('bibcode, DOI, arXiv ID, or SciX ID') duplicate what the bibcode property description already says. The rows and response_format parameters get no mention in the description, so it adds no meaning 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?
States a specific verb+resource ('Get papers referenced by a given paper') and adds the parenthetical '(backward citations)' which meaningfully clarifies direction. It implicitly separates itself from the sibling get_citations, though it never names that sibling explicitly.
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 'backward citations' phrasing implies when this applies versus forward citations, but no when-to-use/when-not guidance or named alternative (get_citations) is given. Usage is left to inference from the parenthetical.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_checkARead-onlyIdempotent
Diagnose the SciX MCP server setup: reports server name and version, the API base URL, whether an API token is configured, an authentication probe result, and the registered tool names. Takes no required arguments. Use this to distinguish setup problems (missing/invalid token, unreachable API) from ordinary API errors.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered; the description adds genuine context by listing the exact diagnostic fields returned and confirming no required arguments. It does not mention that the auth probe may make a network call or how failures are surfaced, but openWorldHint plus the enumerated fields largely fill that gap.
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 sentences, each earning its place: the first enumerates the diagnostic output, the second routes the agent's decision. Nothing is padded or repeated from the schema.
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 no output schema, the description correctly takes on the burden of describing return contents via its field enumeration, which is adequate. The only minor gap is the unmentioned response_format option, which would have completed the picture.
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?
There is one optional parameter (response_format) with an enum and default, and schema coverage is 0% — the description never mentions it. The parameter is self-documenting via its enum+default, so an agent can still use it, but the description adds nothing here and 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 ("Diagnose") and resource ("SciX MCP server setup"), then enumerates exactly what the report contains (server name/version, base URL, token presence, auth probe, registered tool names). This is unmistakable against the sibling set, all of which are data-access tools like search, get_paper, and export.
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?
Explicitly frames the use case: "Use this to distinguish setup problems (missing/invalid token, unreachable API) from ordinary API errors," which is a clear trigger condition. It does not name exclusion alternatives, but none of the siblings overlap in purpose, so the guidance is sufficient in practice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
library_operationBDestructive
Perform set operations on libraries (union, intersection, difference, copy, empty). The empty, difference and intersection actions replace or discard the contents of the target library.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Name for new library (for copy operation) | |
| operation | Yes | Operation to perform | |
| library_id | Yes | Target library identifier | |
| description | No | Description for new library (for copy operation) | |
| response_format | No | markdown | |
| source_library_ids | No | Source library IDs for union/intersection/difference |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations give a blanket destructiveHint=true, but the description adds granular value by specifying that empty, difference, and intersection replace or discard target library contents, while union and copy do not. This per-operation destructive detail goes beyond the annotations, though it omits permission requirements and reversibility.
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 tight sentences with no filler; the purpose is front-loaded and the destructive caveat follows immediately. It could have been slightly more efficient by tying the destructive note directly to the operation names, but it is well-structured.
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 6-parameter, multi-mode, destructive, open-world tool with no output schema, the description covers purpose and destructiveness but omits which parameters each operation requires (e.g., source_library_ids for union) and what the call returns. Adequate but with clear gaps.
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 83%, so the schema already documents name/description (copy-only) and source_library_ids (union/intersection/difference). The description adds no parameter-level detail beyond mapping operations to destructiveness, so the baseline 3 is appropriate.
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+resource (set operations on libraries) and enumerates the five supported operations, which is more than a restatement of the tool name. It does not explicitly differentiate itself from siblings such as create_library, edit_library, or delete_library, so it falls 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?
There is no explicit guidance on when to choose this tool over the sibling library tools (get_library, create_library, edit_library, delete_library, transfer_library), nor any stated prerequisites. The operation list implies usage, but no alternatives or conditions are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_annotationADestructiveIdempotent
Add or update an annotation/note for a document in a library. Updating replaces the existing note content.
| Name | Required | Description | Default |
|---|---|---|---|
| bibcode | Yes | Bibcode to annotate | |
| content | Yes | Annotation content | |
| library_id | Yes | Library identifier | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and idempotentHint=true. The description adds real behavioral context by disclosing that an update replaces the prior note content, which is exactly the destructive semantic an agent needs to see before overwriting. It still omits whether the target document must already be in the library and what the response contains.
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, with the core action stated first and the destructive overwrite caveat immediately after. No filler and nothing redundant with the title or schema.
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 annotations covering write/destructive/idempotent signals and no output schema to explain, the main open questions are permissions on the library and what the call returns. The description addresses the update semantics but leaves those gaps, making it adequate rather than complete.
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 75% with three self-explanatory required fields (library_id, bibcode, content), so the schema carries most of the semantic load. The description adds the replace-vs-append behavior of content but says nothing about response_format, which has an enum and no schema description.
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 gives a specific verb pair and resource: add or update an annotation/note for a document in a library. The write orientation implicitly separates it from the read/delete siblings get_annotation and delete_annotation, but it never names them, so 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?
Usage is implied by 'Add or update' plus the note that updating replaces existing content, so an agent can tell this is the create/overwrite path. There is no explicit guidance on when to prefer it over get_annotation, delete_annotation, or manage_documents, and no stated prerequisites such as required library permissions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_documentsADestructiveIdempotent
Add or remove documents from a library. Removal discards the record of those documents in that library.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform (add or remove) | |
| bibcodes | Yes | List of bibcodes | |
| library_id | Yes | Library identifier | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true. The description adds genuinely non-redundant context: removal 'discards the record of those documents in that library,' clarifying that the deletion is library-scoped rather than a global document delete. It stops short of noting permission requirements or the behavior of duplicate adds.
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, no waste, with the add/remove capability front-loaded and the destructive caveat immediately after. Every clause earns its place.
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 4-parameter destructive mutation with no output schema, the definition covers the core operation and the consequence of removal, but omits prerequisite permissions, partial-failure behavior when some bibcodes fail, and why removal is marked idempotent. Adequate but with clear gaps.
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 75% and the description itself adds nothing about parameters — it never mentions bibcodes, library_id, action, or response_format. With the schema already documenting three of four parameters, the baseline 3 applies.
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 pair (add/remove) and resource (documents in a library), so the agent immediately knows this is a bulk membership operation keyed on bibcodes. It does not, however, distinguish itself from the sibling add_documents_by_query, which is the closest overlapping tool.
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?
There is no when-to-use guidance and no mention of alternatives such as add_documents_by_query (query-driven addition) or library_operation. The agent must infer from the parameter names that this is the explicit-bibcode path rather than the query path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchARead-onlyIdempotent
Search SciX for astronomical literature. Supports full Solr query syntax including author:"Last, F.", title:keyword, abstract:keyword, year:2020-2023, and Boolean operators (AND, OR, NOT). Pass filter_query to narrow results by facet values obtained from get_facets.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | No | Number of results to return | |
| sort | No | Sort order for results | score desc |
| query | Yes | SciX search query using Solr syntax | |
| start | No | Starting offset for pagination | |
| filter_query | No | Solr filter queries (fq), each applied independently and ANDed together, e.g. author_facet_hier:"0/Smith, J". Use the `filter` value returned by get_facets. | |
| response_format | No | Output format | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered without the description. The description adds useful context about query syntax support and the facet-filtering workflow, but says nothing about pagination behavior, result counts, or rate limits beyond what annotations and schema provide.
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 sentences, front-loaded with purpose then query capability then sibling workflow. Every sentence carries information an agent needs; nothing is redundant with the schema or annotations.
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?
No output schema exists, but the description focuses on the one thing the agent most needs to get right: constructing valid queries and filters. Return format, pagination, and sort behavior are delegated to the schema, which documents them adequately, so the definition is nearly complete for a search tool.
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 coverage is 100%, so the baseline is 3. The description goes beyond the schema by showing concrete Solr syntax examples (author:"Last, F.", year:2020-2023, Boolean operators) and by tying filter_query to get_facets output, adding real meaning not present in the terse schema descriptions.
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 SciX for astronomical literature') and immediately identifies the query dialect, which distinguishes it from sibling tools like search_docs or get_paper. An agent can tell what this tool retrieves without opening the 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?
Explicitly routes the agent to get_facets for obtaining facet values and tells it to pass them via filter_query, which is a genuine usage instruction. It lacks explicit when-not guidance or alternatives (e.g., when to prefer search_docs), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_docsARead-onlyIdempotent
Search SciX help documentation for information about search syntax, features, API usage, and best practices.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return | |
| query | Yes | Natural language search query for documentation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered structurally. The description adds no behavioral context beyond that — no note on result freshness, ranking, or whether an empty result is possible.
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?
A single front-loaded sentence with zero filler; the resource and supported topics are stated immediately and nothing is repeated from the schema or annotations.
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 simple two-parameter read-only search with no output schema, the description is nearly sufficient. It could have named the sibling `search` tool to prevent confusion, but no critical invocation detail 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?
Schema description coverage is 100%, with both `query` and `limit` documented in the schema, so the baseline is 3. The description adds nothing about query phrasing or result count behavior beyond what the schema states.
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 names a specific verb (Search) and resource (SciX help documentation) and enumerates the content covered (search syntax, features, API usage, best practices). It is clear this targets docs rather than the sibling `search` tool, but it never explicitly states that distinction.
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 can infer it should call this when it needs documentation help, but there is no explicit when-to-use statement, no prerequisites, and no mention of the sibling `search` tool as an alternative for actual paper retrieval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transfer_libraryADestructive
Transfer ownership of a library to another user. The current owner loses ownership and this server cannot undo it.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Email of new owner | ||
| library_id | Yes | Library identifier | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the bar is lower, yet the description still adds real value by naming the specific consequence: the current owner loses ownership. It also states the server cannot undo the change, which sharpens the destructiveness beyond the boolean hint. Missing: whether the target user must already exist and any permission requirements.
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 sentences, zero filler, with the action front-loaded and the irreversible consequence immediately after. Every clause earns its place.
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 destructive mutation with no output schema, the description covers the key behavioral risk (ownership loss, no undo) and annotations cover the rest of the safety profile. It falls short only on prerequisites such as target-user existence and required permissions.
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 coverage is 67%: email and library_id carry descriptions while response_format is undocumented in both places. The description's 'to another user' loosely maps to the email parameter but adds no format or validation detail beyond the schema's email pattern, so it lands at the baseline.
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 (transfer) and resource (ownership of a library) plus the recipient, so the operation is unambiguous. It does not, however, distinguish itself from potentially confusable siblings like update_permissions or edit_library, so an agent must infer the boundary.
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 by the irreversible framing ('the current owner loses ownership'), which tells the agent this is a deliberate hand-off rather than a routine edit. No explicit when-not or alternative tool (e.g., update_permissions for access changes) is named, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_permissionsBDestructiveIdempotent
Grant or modify permissions for a user on a library. Can revoke access that an existing collaborator currently has.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | User email to grant/modify permissions | ||
| library_id | Yes | Library identifier | |
| permission | Yes | Permission level to grant | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false and openWorldHint=true, so the safety profile is largely covered. The description adds that existing collaborator access can be revoked, which sharpens the destructive implication, but it omits guardrails like permission requirements or effects on the last owner.
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 with the core action front-loaded and the revocation note placed second. Every clause carries information and 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?
For a destructive permissions mutation with no output schema, the description covers what changes and that existing access can be removed, but says nothing about authorization requirements, precedence when downgrading, or failure behavior. Adequate but with clear gaps.
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?
With 75% schema coverage, the schema already documents email, library_id and permission; the description only frames permission as grantable/modifiable without explaining the owner/admin/write/read hierarchy. response_format is undocumented in both places. This is the baseline 3 – no real value added beyond the structured fields.
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 ('Grant or modify permissions for a user on a library') and extends scope with the revocation capability. It does not explicitly differentiate itself from siblings such as get_permissions or transfer_library, so it falls 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?
It characterizes the operation but never says when to reach for this tool versus get_permissions or transfer_library, nor what prerequisites (e.g., caller must be owner/admin) apply. Usage is only inferable from the verb.
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.
23 tool updates
v1.3.0- Changed
add_documents_by_query7 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / library_id / minLengthAdded value: +1 - added
Input schema / properties / query / minLengthAdded value: +1 - changed
Input schema / properties / rows / descriptionPrevious value: -"Number of results to add (1-2000, default 25)"New value: +"Number of results to add" - added
Input schema / properties / rows / maximumAdded value: +2000 - added
Input schema / properties / rows / minimumAdded value: +1 - changed
Input schema / properties / rows / typePrevious value: -"number"New value: +"integer"
- Changed
create_library7 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - changed
Input schema / properties / bibcodes / descriptionPrevious value: -"Initial bibcodes to add (optional)"New value: +"Initial bibcodes to add" - changed
Input schema / properties / description / descriptionPrevious value: -"Library description (optional)"New value: +"Library description" - added
Input schema / properties / description / maxLengthAdded value: +1000 - changed
Input schema / properties / name / descriptionPrevious value: -"Library name (1-255 characters)"New value: +"Library name" - added
Input schema / properties / name / maxLengthAdded value: +255 - added
Input schema / properties / name / minLengthAdded value: +1
- Changed
delete_annotation3 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / bibcode / minLengthAdded value: +1 - added
Input schema / properties / library_id / minLengthAdded value: +1
- Changed
delete_library2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / library_id / minLengthAdded value: +1
- Changed
edit_library8 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - changed
Input schema / properties / description / descriptionPrevious value: -"New library description (optional)"New value: +"New library description" - added
Input schema / properties / description / maxLengthAdded value: +1000 - added
Input schema / properties / library_id / minLengthAdded value: +1 - changed
Input schema / properties / name / descriptionPrevious value: -"New library name (optional)"New value: +"New library name" - added
Input schema / properties / name / maxLengthAdded value: +255 - added
Input schema / properties / name / minLengthAdded value: +1 - changed
Input schema / properties / public / descriptionPrevious value: -"Whether library is public (optional)"New value: +"Whether library is public"
- Changed
export20 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / authorcutoff / anyOfAdded value: +[ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "items": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "type": "array" + } +] - changed
Input schema / properties / authorcutoff / descriptionPrevious value: -"Number of authors before using \"et al.\""New value: +"Author cutoff threshold" - removed
Input schema / properties / authorcutoff / typeRemoved value: -"number" - changed
Input schema / properties / bibcodes / descriptionPrevious value: -"List of SciX bibcodes to export (1-2000)"New value: +"List of bibcodes to export" - added
Input schema / properties / bibcodes / maxItemsAdded value: +2000 - added
Input schema / properties / bibcodes / minItemsAdded value: +1 - changed
Input schema / properties / custom_format / descriptionPrevious value: -"Custom format string using field specifiers (required when format is custom)"New value: +"Custom format string (required when format is custom)" - added
Input schema / properties / journalformat / anyOfAdded value: +[ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "items": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "type": "array" + } +] - changed
Input schema / properties / journalformat / descriptionPrevious value: -"Journal name format: 1 (AASTeX macros), 2 (abbreviations), 3 (full names)"New value: +"Journal format style code" - removed
Input schema / properties / journalformat / typeRemoved value: -"number" - added
Input schema / properties / keyformat / anyOfAdded value: +[ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } +] - changed
Input schema / properties / keyformat / descriptionPrevious value: -"BibTeX key format template (e.g., \"%1H%Y\" for FirstAuthorYear)"New value: +"Citation key format" - removed
Input schema / properties / keyformat / typeRemoved value: -"string" - added
Input schema / properties / maxauthor / anyOfAdded value: +[ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "items": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "type": "array" + } +] - changed
Input schema / properties / maxauthor / descriptionPrevious value: -"Maximum number of authors to display (default: 200)"New value: +"Maximum authors to show before et al." - removed
Input schema / properties / maxauthor / typeRemoved value: -"number" - added
Input schema / properties / sort / anyOfAdded value: +[ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } +] - changed
Input schema / properties / sort / descriptionPrevious value: -"Sort order for bibcodes (e.g., \"date desc\", \"first_author asc\")"New value: +"Optional sort order (e.g., \"date desc\")" - removed
Input schema / properties / sort / typeRemoved value: -"string"
- Changed
get_annotation3 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / bibcode / minLengthAdded value: +1 - added
Input schema / properties / library_id / minLengthAdded value: +1
- Changed
get_citations8 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - changed
Input schema / properties / bibcode / descriptionPrevious value: -"SciX bibcode identifier"New value: +"Paper identifier: bibcode, DOI, arXiv ID, or SciX ID (scix:...)" - added
Input schema / properties / bibcode / maxLengthAdded value: +200 - added
Input schema / properties / bibcode / minLengthAdded value: +1 - changed
Input schema / properties / rows / descriptionPrevious value: -"Number of citations to return (1-100, default 20)"New value: +"Number of citations to return" - added
Input schema / properties / rows / maximumAdded value: +100 - added
Input schema / properties / rows / minimumAdded value: +1 - changed
Input schema / properties / rows / typePrevious value: -"number"New value: +"integer"
- Added
get_facets - Changed
get_libraries1 field changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#"
- Changed
get_library2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / library_id / minLengthAdded value: +1
- Changed
get_metrics4 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - changed
Input schema / properties / bibcodes / descriptionPrevious value: -"List of SciX bibcodes (1-2000)"New value: +"List of bibcodes" - added
Input schema / properties / bibcodes / maxItemsAdded value: +2000 - added
Input schema / properties / bibcodes / minItemsAdded value: +1
- Changed
get_paper4 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - changed
Input schema / properties / bibcode / descriptionPrevious value: -"SciX bibcode identifier"New value: +"Paper identifier: bibcode, DOI, arXiv ID, or SciX ID (scix:...)" - added
Input schema / properties / bibcode / maxLengthAdded value: +200 - added
Input schema / properties / bibcode / minLengthAdded value: +1
- Changed
get_permissions2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / library_id / minLengthAdded value: +1
- Changed
get_references8 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - changed
Input schema / properties / bibcode / descriptionPrevious value: -"SciX bibcode identifier"New value: +"Paper identifier: bibcode, DOI, arXiv ID, or SciX ID (scix:...)" - added
Input schema / properties / bibcode / maxLengthAdded value: +200 - added
Input schema / properties / bibcode / minLengthAdded value: +1 - changed
Input schema / properties / rows / descriptionPrevious value: -"Number of references to return (1-100, default 20)"New value: +"Number of citations to return" - added
Input schema / properties / rows / maximumAdded value: +100 - added
Input schema / properties / rows / minimumAdded value: +1 - changed
Input schema / properties / rows / typePrevious value: -"number"New value: +"integer"
- Added
health_check - Changed
library_operation5 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - changed
Input schema / properties / description / descriptionPrevious value: -"Description for new library (for copy operation, optional)"New value: +"Description for new library (for copy operation)" - added
Input schema / properties / library_id / minLengthAdded value: +1 - changed
Input schema / properties / name / descriptionPrevious value: -"Name for new library (for copy operation, optional)"New value: +"Name for new library (for copy operation)" - changed
Input schema / properties / source_library_ids / descriptionPrevious value: -"Source library IDs for set operations (optional)"New value: +"Source library IDs for union/intersection/difference"
- Changed
manage_annotation6 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / bibcode / minLengthAdded value: +1 - changed
Input schema / properties / content / descriptionPrevious value: -"Annotation content (1-10000 characters)"New value: +"Annotation content" - added
Input schema / properties / content / maxLengthAdded value: +10000 - added
Input schema / properties / content / minLengthAdded value: +1 - added
Input schema / properties / library_id / minLengthAdded value: +1
- Changed
manage_documents6 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - changed
Input schema / properties / action / descriptionPrevious value: -"Action to perform"New value: +"Action to perform (add or remove)" - changed
Input schema / properties / bibcodes / descriptionPrevious value: -"List of bibcodes (1-2000)"New value: +"List of bibcodes" - added
Input schema / properties / bibcodes / maxItemsAdded value: +2000 - added
Input schema / properties / bibcodes / minItemsAdded value: +1 - added
Input schema / properties / library_id / minLengthAdded value: +1
- Changed
search14 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / filter_queryAdded value: +{ + "description": "Solr filter queries (fq), each applied independently and ANDed together, e.g. author_facet_hier:\"0/Smith, J\". Use the `filter` value returned by get_facets.", + "items": { + "maxLength": 500, + "minLength": 1, + "type": "string" + }, + "maxItems": 20, + "type": "array" +} - changed
Input schema / properties / query / descriptionPrevious value: -"Search query using SciX/Solr syntax"New value: +"SciX search query using Solr syntax" - added
Input schema / properties / query / maxLengthAdded value: +1000 - added
Input schema / properties / query / minLengthAdded value: +1 - changed
Input schema / properties / rows / descriptionPrevious value: -"Number of results (1-100, default 10)"New value: +"Number of results to return" - added
Input schema / properties / rows / maximumAdded value: +100 - added
Input schema / properties / rows / minimumAdded value: +1 - changed
Input schema / properties / rows / typePrevious value: -"number"New value: +"integer" - changed
Input schema / properties / sort / descriptionPrevious value: -"Sort order"New value: +"Sort order for results" - changed
Input schema / properties / start / descriptionPrevious value: -"Starting offset for pagination (default 0)"New value: +"Starting offset for pagination" - added
Input schema / properties / start / maximumAdded value: +9007199254740991 - added
Input schema / properties / start / minimumAdded value: +0 - changed
Input schema / properties / start / typePrevious value: -"number"New value: +"integer"
- Changed
search_docs8 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of results to return (1-20, default 5)"New value: +"Maximum number of results to return" - added
Input schema / properties / limit / maximumAdded value: +20 - added
Input schema / properties / limit / minimumAdded value: +1 - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer" - changed
Input schema / properties / query / descriptionPrevious value: -"Natural language search query (e.g., \"how to search by author\", \"export formats\", \"library permissions\")"New value: +"Natural language search query for documentation" - added
Input schema / properties / query / maxLengthAdded value: +500 - added
Input schema / properties / query / minLengthAdded value: +1
- Changed
transfer_library4 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / email / formatAdded value: +"email" - added
Input schema / properties / email / patternAdded value: +"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" - added
Input schema / properties / library_id / minLengthAdded value: +1
- Changed
update_permissions5 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - changed
Input schema / properties / email / descriptionPrevious value: -"User email"New value: +"User email to grant/modify permissions" - added
Input schema / properties / email / formatAdded value: +"email" - added
Input schema / properties / email / patternAdded value: +"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" - added
Input schema / properties / library_id / minLengthAdded value: +1
21 tool updates
v1.0.14- First observed
add_documents_by_query - First observed
create_library - First observed
delete_annotation - First observed
delete_library - First observed
edit_library - First observed
export - First observed
get_annotation - First observed
get_citations - First observed
get_libraries - First observed
get_library - First observed
get_metrics - First observed
get_paper - First observed
get_permissions - First observed
get_references - First observed
library_operation - First observed
manage_annotation - First observed
manage_documents - First observed
search - First observed
search_docs - First observed
transfer_library - First observed
update_permissions
TDQS
Scored across 23 tools
Tools are mostly distinct by resource and action: search vs search_docs, get_citations vs get_references, and the library CRUD/permission/annotation tools target different operations. A few library-modification tools (manage_documents, add_documents_by_query, library_operation) could be confused without reading descriptions, but the descriptions clarify boundaries.
The set follows a predictable snake_case pattern, mostly verb_noun (get_paper, create_library, delete_annotation, update_permissions). Minor deviations like search, export, health_check, and library_operation are readable but not strictly verb_noun.
23 tools is heavy for a literature API client, though the breadth of library lifecycle, permissions, annotations, citations, metrics, export, and diagnostics explains much of it. Some library-document operations could be consolidated, so the count borders on over-scoped.
Core literature workflows (search, paper retrieval, facets, citations/references, metrics, export) and library lifecycle including documents, permissions, annotations, and transfer are well covered. Minor gaps exist, such as a direct list-all-annotations operation, but agents can work around them.
Maintenance
Related MCP Connectors
Search arXiv/Semantic Scholar/OpenAlex + medical evidence (PubMed/Europe PMC) + LaTeX/PDF tools.
Federated search of books and papers, BibTeX/RIS citations, open-access retrieval and reading.
Search INSPIRE-HEP papers, authors, experiments, HEPData records; get citation metrics and BibTeX.
Academic literature search, retrieval, and private library management on top of OpenAlex.
Related MCP Servers
- AlicenseAqualityAmaintenanceProvides seamless access to the NASA Astrophysics Data System (ADS) for searching astronomical papers, tracking citations and metrics, managing paper libraries, and exporting BibTeX references through natural language conversation.119MIT
- AlicenseAqualityFmaintenanceProvides access to the Elsevier Scopus API, enabling AI assistants to search for academic papers, retrieve detailed abstracts, and look up author profiles. It facilitates bibliometric research and scholarly data analysis through natural language commands.588 PyPI50MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to interact with the SciX (formerly NASA ADS) API to search scientific literature, export citations, and analyze bibliometric data. It supports advanced tools for managing libraries, resolving astronomical object names, and exploring citation networks.69 PyPI2MIT
- AlicenseNot gradedqualityCmaintenanceEnables agents to search, analyze, and explore arXiv academic papers with advanced multi-field search, author lookup, category browsing, citation extraction, and bibliography export.39 npmApache 2.0