SCRIPTMASTERLABS — ScriptDocs
Server Details
Live npm, PyPI and crates.io package facts, READMEs and vulnerability checks for coding agents.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 5 tools
Each tool occupies a distinct slot in the workflow: fuzzy name resolution (docs_resolve_library), exact metadata lookup (docs_get_package_info), full document retrieval (docs_get_readme), in-document keyword search (docs_search_docs), and vulnerability checking (docs_check_vulnerabilities). The only near-neighbor pair is get_readme vs. search_docs, but the descriptions make the boundary explicit (whole verbatim document vs. matching snippets with context). No two tools could plausibly be selected interchangeably.
All five tools use the same docs_ prefix followed by a verb_noun pattern: check_vulnerabilities, get_package_info, get_readme, resolve_library, search_docs. Verbs are meaningful and never duplicated ambiguously across the set, and argument naming (ecosystem, package_name, version, query) is also uniform.
Five tools is well-scoped for a package-documentation server: resolve, inspect, read, search, and audit. Nothing feels padded or redundant, and each tool corresponds to a real step an agent would take when answering a question about an npm/PyPI/Cargo package.
Core workflows (find the package, get metadata, read docs, search docs, check advisories) are fully covered with no dead ends, and the tools degrade gracefully (empty results, explicit errors) rather than fabricating. Minor gaps remain: no version enumeration/release-history tool, no dependency or changelog lookup, and docs_resolve_library explicitly does not work for PyPI, forcing exact-name lookups there.
Available Tools
5 toolsdocs_check_vulnerabilitiesCheck Package VulnerabilitiesARead-onlyIdempotentInspect
Check a real, specific package version against OSV.dev (Google-run, aggregates GitHub/PyPA/npm/RustSec advisories) — and, when a fix exists, automatically fetch that fixed version's README in the same call, so the result is "here's what's wrong" AND "here's exactly what upgrading looks like," not just a CVE list you have to research further yourself.
This is a live query against OSV.dev's public API for the exact package+version given. It never estimates or guesses risk — if OSV has no advisories on record for that version, this correctly reports zero vulnerabilities rather than implying danger that isn't documented. Note: this tool is more limited than dedicated vulnerability-intelligence tools (e.g. VulnCheck, Snyk) — it reports what OSV.dev has on file, not exploit activity or threat intelligence.
Args:
ecosystem ('npm' | 'pypi' | 'cargo')
package_name (string): exact package name
version (string, optional): specific version to check; defaults to the latest published version
include_fix_docs (boolean, default true): also fetch the README for the version that fixes the found vulnerabilities
Returns JSON with: vulnerability_count, vulnerabilities (array of {id, summary, severity, aliases, fixed_in, references}), recommended_fix (null, or {version, readme, truncated, source_url} for the version that resolves the found issues), source_url, fetched_at.
Error Handling:
Returns "Error: ..." if the package doesn't exist or OSV.dev can't be reached
vulnerability_count: 0 with an empty array is a normal, valid result — not an error
If fetching the fix's README fails, recommended_fix is null rather than the whole call failing — the vulnerability data itself is never withheld because of it [PAID: $0.009 USDC per call via x402 on Base - send a PAYMENT-SIGNATURE header on the /mcp request; unpaid calls return an HTTP 402 x402 challenge (amount 9000 atomic USDC). The other ScriptDocs tools are free.]
| Name | Required | Description | Default |
|---|---|---|---|
| version | No | Specific version to check. Defaults to the current latest published version if omitted. | |
| ecosystem | Yes | Which package registry the version belongs to: 'npm', 'pypi', or 'cargo'. | |
| package_name | Yes | Exact package name as published on the registry. | |
| include_fix_docs | No | When a vulnerability is found with a known fixed version, also fetch that version's README so the response includes what upgrading actually looks like. Set false to skip the extra fetch. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/idempotent/non-destructive, yet the description still adds substantial behavior: no-risk-inference policy, partial-failure semantics (failed README fetch yields null recommended_fix rather than failing the call), 'Error: ...' surface, and the $0.009 x402 payment/402 flow. That is exactly the kind of context annotations cannot carry.
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?
Front-loaded and sectioned (Args / Returns / Error Handling) which aids scanning, but it is padded with marketing phrasing ('not just a CVE list you have to research further yourself', the 'here's what's wrong' quoting) and the payment notice is buried in brackets at the tail of the error section.
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?
Despite no output schema, the description fully enumerates return fields, null conditions for recommended_fix, error behavior, and cost/auth preconditions. Nothing an agent needs to invoke this correctly or interpret the response 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%, so the baseline is 3. The description restates the four args and their defaults but adds no syntax, format or validation detail beyond what the schema already documents — the one mildly useful addition is clarifying include_fix_docs' purpose operationally, which the schema also covers.
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 — check a real, exact package+version against OSV.dev — and adds the distinctive second behavior (auto-fetching the fixed version's README). An agent can immediately tell this apart from the docs_* lookup siblings, which only retrieve documentation.
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?
Explains the context clearly: live exact-version query, never estimates, zero results are valid, and explicitly scopes it below dedicated vuln-intel tools (VulnCheck, Snyk). It never names or routes to a sibling tool, and gives no explicit 'use X instead when…' rule, 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.
docs_get_package_infoGet Package InfoARead-onlyIdempotentInspect
Fetch real, current metadata for a package directly from the npm registry, PyPI JSON API, or crates.io.
This tool makes a live HTTP request to the actual registry (registry.npmjs.org, pypi.org, or crates.io) at call time. It never returns cached, guessed, or simulated data — if the package doesn't exist, it returns an explicit error rather than a plausible-looking fabrication.
Args:
ecosystem ('npm' | 'pypi' | 'cargo'): which registry to query
package_name (string): exact package name, e.g. "zod", "fastapi", or "serde"
Returns JSON with: name, latest_version, description, homepage, repository, source_url (the exact registry URL the data came from, for verification), fetched_at (ISO timestamp).
Error Handling:
Returns "Error: package not found" if the registry has no such package
Returns "Error: registry request failed" on network/HTTP errors
| Name | Required | Description | Default |
|---|---|---|---|
| ecosystem | Yes | Which package registry to query: 'npm', 'pypi', or 'cargo' (Rust/crates.io). | |
| package_name | Yes | Exact package name as published on the registry, e.g. 'express', 'requests', or 'serde'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial context beyond the annotations: it makes a live HTTP request, never returns cached/guessed/simulated data, returns explicit errors for missing packages or network failures, and provides verification fields. This complements the readOnly/idempotent hints without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear purpose sentence, an Args block, a Returns line, and an Error Handling section. It is information-dense without redundancy, earning its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and the rich schema/annotations, the description fully covers return fields and error behavior despite lacking an output schema. It tells the agent exactly what to expect, making it complete for safe invocation.
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?
Both parameters are fully described in the schema with 100% coverage, so the description's Args section mostly reiterates the schema. It adds example package names but no additional semantic constraints beyond what the schema already provides.
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 clearly states it fetches real, current package metadata from npm, PyPI, or crates.io, with a specific verb and resource. It distinguishes itself from sibling tools by focusing on metadata retrieval rather than vulnerabilities, readmes, or search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool (when live, accurate metadata is needed) and emphasizes its live HTTP behavior. However, it does not explicitly compare against sibling tools or state when not to use it, so alternatives are not named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
docs_get_readmeGet Package READMEARead-onlyIdempotentInspect
Fetch the real README/description for a package, straight from the registry — not a summary, not a paraphrase, not AI-generated.
For npm this reads the registry's stored README, falling back to the published README.md file via jsDelivr if the registry copy is missing (verbatim markdown). For PyPI this reads the exact long_description shown on the package's PyPI page (verbatim). For Cargo (Rust/crates.io) this reads crates.io's stored README — note: crates.io only stores a pre-rendered HTML version, not the original markdown source, so this is that HTML converted to plain text, not byte-for-byte source.
Args:
ecosystem ('npm' | 'pypi' | 'cargo')
package_name (string): exact package name
version (string, optional): specific version; defaults to latest
Returns JSON with: readme (truncated to 12000 chars if longer — check 'truncated'), truncated (boolean), source_url (exact URL fetched, for verification), fetched_at.
Error Handling:
Returns "Error: ..." if the package or its README cannot be found — never fabricates content to fill the gap. [PAID: $0.009 USDC per call via x402 on Base - send a PAYMENT-SIGNATURE header on the /mcp request; unpaid calls return an HTTP 402 x402 challenge (amount 9000 atomic USDC). The other ScriptDocs tools are free.]
| Name | Required | Description | Default |
|---|---|---|---|
| version | No | Specific version to fetch. Defaults to the latest published version if omitted. | |
| ecosystem | Yes | Which package registry to query: 'npm', 'pypi', or 'cargo'. | |
| package_name | Yes | Exact package name as published on the registry. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial context beyond the annotations: npm registry-vs-jsDelivr fallback, PyPI long_description sourcing, Cargo pre-rendered HTML caveat, 12,000-character truncation, exact URL for verification, and a strong no-fabrication error policy. It also discloses the paid x402 $0.009 USDC requirement and the HTTP 402 challenge behavior, which is essential operational information an agent cannot get from the schema or 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?
The description is front-loaded with the core purpose and per-ecosystem behavior, then structured into Args, Returns, Error Handling, and payment notes. It is somewhat long and the Args section duplicates the schema, but no sentence is wasted and the payment disclosure is high-value.
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?
Although there is no output schema, the description documents the return JSON fields (readme, truncated, source_url, fetched_at) and explains truncation. It also covers error behavior and payment prerequisites, so an agent has everything needed to call this tool correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents ecosystem, package_name, and version. The description's Args section largely restates those fields and adds only the emphasis that package_name must be exact and version defaults to latest, both already present in the schema. 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: 'Fetch the real README/description for a package, straight from the registry,' and explicitly rules out summaries or AI-generated content. It is clearly distinct from a generic search, but it never names which sibling (e.g., docs_get_package_info or docs_search_docs) to use instead for adjacent needs.
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 usage context is strongly implied — use this when you need verbatim README content — and per-ecosystem behavior is explained in detail. However, there is no explicit when-to-use versus when-not guidance against the sibling tools like docs_get_package_info or docs_search_docs, leaving the agent to infer routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
docs_resolve_libraryResolve Library NameARead-onlyIdempotentInspect
Turn a fuzzy or partial name into real, ranked candidate package names, using the registry's own live search index — not a guess at what the package is probably called.
For npm this queries registry.npmjs.org's actual search API (the same one npmjs.com uses). For Cargo this queries crates.io's real search endpoint. For PyPI: there is currently no official PyPI search API (XML-RPC search was permanently disabled in 2022 and never replaced) — calling this with ecosystem 'pypi' returns an explicit message saying so rather than a fabricated or scraped result, along with a suggestion to use the exact package name with docs_get_package_info instead.
Args:
ecosystem ('npm' | 'pypi' | 'cargo')
query (string): the name or description to resolve, e.g. "react" or "async http client"
max_results (number, 1-10, default 5)
Returns JSON with: candidates (array of {name, version, description, score, url}), source_url, fetched_at.
Error Handling:
ecosystem 'pypi' always returns an explanatory message, not an error and not fabricated results
Returns "Error: ..." only for actual npm/crates.io request failures
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Natural-language or partial name to resolve, e.g. 'react', 'http client for python', 'serde'. | |
| ecosystem | Yes | Which registry to search: 'npm', 'pypi', or 'cargo'. Note: PyPI has no official search API (see limitation below). | |
| max_results | No | Maximum number of candidates to return. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds detail beyond the readOnly/idempotent hints by specifying the exact live search endpoints (npmjs.com and crates.io) and explaining that PyPI calls return an explicit explanatory message rather than fabricated results. It also specifies the exact error condition ('Error: ...' only on real request failures) and the return JSON shape, which is not available from an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a clear one-sentence purpose, then uses labeled sections (Args, Returns, Error Handling) to keep details scannable. Although it goes into depth on the pypi limitation, each sentence earns its place, and the structure prevents it from feeling bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description fully specifies the return JSON structure (candidates, source_url, fetched_at) and covers error handling and ecosystem-specific behavior. It also provides a fallback suggestion for PyPI, making the tool's behavior predictable and 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?
The input schema already provides 100% coverage with descriptions for all three parameters, so the baseline is 3. The description adds concrete query examples ('react' or 'async http client'), the per-ecosystem search API mapping, and the note that max_results defaults to 5. This adds practical color, but the schema already captures the essential constraints, so a 4 rather than 5 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, action-oriented statement ('Turn a fuzzy or partial name into real, ranked candidate package names, using the registry's own live search index'), which clearly defines the tool's output and approach. It also differentiates this from the sibling docs_get_package_info by naming it as the alternative for exact lookups, distinguishing this tool's search/resolution purpose.
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 explicitly says when to use this tool (fuzzy or partial name → real candidates) and when not to: for PyPI it states there is no official search API and recommends using docs_get_package_info with the exact package name instead. It also clarifies per-ecosystem behavior, giving agents actionable context for choosing this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
docs_search_docsSearch Package DocsARead-onlyIdempotentInspect
Search for keywords inside a package's real README/docs and return verbatim matching snippets with surrounding context.
This does keyword matching over the actual fetched document (registry README for npm, long description for PyPI, README-derived text for Cargo) — it does not summarize or paraphrase, and it does not answer from general knowledge. If no matches are found, it says so rather than guessing at an answer.
Args:
ecosystem ('npm' | 'pypi' | 'cargo')
package_name (string): exact package name
query (string): keyword(s) to search for, e.g. "rate limit" or "async client"
max_snippets (number, 1-20, default 5): cap on returned matches
version (string, optional): specific version to search; defaults to latest
Returns JSON with: snippets (array of {match, context, line_hint}), source_url, fetched_at.
Error Handling:
Returns "Error: ..." if the package/docs can't be fetched
Returns an empty snippets array (not an error) if the docs were fetched successfully but the query has no matches
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Keyword(s) to search for inside the package's real documentation, e.g. 'authentication middleware'. | |
| version | No | Specific version to search within. Defaults to the latest published version if omitted. | |
| ecosystem | Yes | Which package registry to query: 'npm', 'pypi', or 'cargo'. | |
| max_snippets | No | Maximum number of matching snippets to return. | |
| package_name | Yes | Exact package name as published on the registry. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnly, idempotent, openWorld), the description adds meaningful behavioral details: it matches keywords over actual fetched docs, does not summarize/paraphrase, returns empty array on no matches, and returns an error if the package/docs cannot be fetched. This gives the agent a clear model of what to expect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with bolded section headers and front-loaded purpose, but the Args list largely duplicates the input schema, making it slightly longer than necessary. It remains clear and every non-Args sentence carries important behavioral 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 no output schema, the description fully specifies the return JSON structure (snippets array with match/context/line_hint, source_url, fetched_at) and error handling (error string vs empty array). It covers all five parameters' semantics via schema plus the tool's overall behavior, making it complete for an AI agent.
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%, so the baseline is 3. The description's Args section repeats schema information (exact name, max cap, default version) without adding new parameter-level semantics; the main added value is return-format and error-handling context rather than richer parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Search for keywords inside a package's real README/docs' and immediately distinguishes itself by promising 'verbatim matching snippets with surrounding context' and explicitly ruling out summarization or general knowledge. This clearly differentiates it from sibling tools like docs_get_readme or docs_resolve_library.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes clear context for when the tool is appropriate: keyword matching over real fetched documents, with a note that it does not summarize or answer from general knowledge. However, it does not explicitly name alternative tools or state when not to use it, so it stops short of the 'explicit when/when-not' standard.
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.
5 tool updates
- First observed
docs_check_vulnerabilities - First observed
docs_get_package_info - First observed
docs_get_readme - First observed
docs_resolve_library - First observed
docs_search_docs
Related MCP Connectors
Package intelligence for AI agents across npm, PyPI, crates.io and deps.dev. No API keys.
Package intelligence for AI agents across npm, PyPI, crates.io and deps.dev. No API keys.
Real-time Python package and vulnerability data for AI coding agents.
Search GitHub, npm, PyPI, StackOverflow, ArXiv from one MCP — built for coding agents.
Related MCP Servers
- AlicenseAqualityBmaintenanceProvides software supply-chain intelligence for AI agents, enabling them to query package metadata, versions, downloads, dependencies, and health signals for npm, PyPI, and crates.io packages without API keys.623 npmMIT
- AlicenseAqualityDmaintenancePackage intelligence for AI coding agents that checks npm and PyPI package health, deprecation, vulnerabilities, bundle size, and compares alternatives.5MIT
- AlicenseNot gradedqualityBmaintenanceEnables coding agents to retrieve maintainer-written release notes and compare installed versus target dependency versions, search packages, and report on projects pushed to a dashboard.MIT
- AlicenseNot gradedqualityBmaintenanceVerified, dated facts for AI coding agents: what breaks between npm package versions (diffed from TypeScript types), per-version vulnerabilities, the newest version compatible with a given Node/Python/Rust/PHP, end-of-life dates of ~480 runtimes and frameworks, and AI model prices. Covers npm, PyPI, crates.io and Packagist.1AGPL 3.0
Glama MCP Gateway
Add one secure layer between your agents and this server.