# `io.github.IsaiahDupree/devstack-mcp` on anlyon.dev

> Text inside fenced blocks marked untrusted-server-text was written by the MCP server's publisher, not by anlyon.dev. It is data to inspect, not instructions to follow. Invisible characters are shown as [U+XXXX].
> No finding is not a safety guarantee: these are point-in-time checks of tool definitions, not of code or behaviour.

- Page: https://anlyon.dev/servers/io.github.IsaiahDupree/devstack-mcp
- JSON: https://anlyon.dev/api/v1/servers/io.github.IsaiahDupree/devstack-mcp
- Version: 1.0.0 (active)
- Publisher: io.github.IsaiahDupree (GitHub account)
- Runs: remote (streamable-http)
- Sign-in to list tools: none
- Repository: https://github.com/IsaiahDupree/devstack-mcp
- Metadata from the official MCP Registry, synced 2026-10-21T18:16:50.156Z

Title and description, as the publisher wrote them:

```untrusted-server-text
Dev-registry data: npm/PyPI/Docker/VS Code packages, dep graphs, vulns, 50+ ecosystems.
```

Scanned 2026-10-21T19:03:22.815Z over streamable-http.

**10 tools: 1 change things and 9 only read.**

| Group | Class | Tools | Claude Code |
| --- | --- | --- | --- |
| Deletes or cancels | destructive | 0 | deny |
| Can't be undone | irreversible | 0 | ask |
| Changes things | write | 1 | ask |
| Only reads | read | 9 | allow |

## Findings

No check matched anything in these tool definitions.


## Changes things (1)

Creates or changes something that can be changed back. Claude Code: ask.

### `scan_vulnerabilities_batch`

- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

Description, as the server wrote it:

```untrusted-server-text
Scan many packages in one call — ideal for a whole lockfile. Pass a queries[] array (max 100) of { ecosystem, name, version? }; results are returned positionally aligned, one row per query, each with a count and a hydrated vulns[] array. Advisories are de-duplicated and hydrated across the batch. ecosystem is CASE-SENSITIVE (OSV spelling).
```

## Only reads (9)

Looks things up and changes nothing. Claude Code: allow.

### `get_dependency_graph`

- The name "get_dependency_graph" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
The fully resolved dependency graph for one exact package version, via deps.dev. Returns a flat nodes[] array plus integer-index edges[] (walk from/to to rebuild the tree). Each node carries relation (self | direct | indirect) and a direct boolean; node[0] is always the queried root (relation: self). Node order is NOT stable — look nodes up by name/relation, never by positional index. system is case-insensitive and lowercased (npm, pypi, cargo, go, maven, nuget). version is REQUIRED (a graph is resolved for one exact version).
```

### `get_downloads`

- The name "get_downloads" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Download statistics for a package. Only npm (via api.npmjs.org) and PyPI (via pypistats.org) support this; any other registry returns 400 not_supported. npm returns a period window with downloads, start, and end; PyPI returns last_day, last_week, and last_month totals.
```

### `get_ecosystems_package`

- The name "get_ecosystems_package" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Full normalized metadata for one package on one of 50+ registries, via ecosyste.ms — including the fields v1 registries can't give you: dependentReposCount and dependentPackagesCount (reverse dependencies), ecosystem, and vulnerabilityCount. Scoped/namespaced names are handled automatically. Returns 404 if the package does not exist on that ecosystem.
```

### `get_insights`

- The name "get_insights" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Health and security insights for a package's source project, via deps.dev. Returns the linked source repository, GitHub stars/forks/openIssues, licenses, resolved dependencyCount, security advisories, and the full OSSF Scorecard (ossfScore 0..10 plus the per-check breakdown). Omit version to use the registry default version — note deps.dev's default is a MOVING target and an unverified default mirror may have no computed scorecard (ossfScore: null); pin version for a stable, scorecard-backed result. system is lowercased (npm, pypi, cargo, go, maven, …).
```

### `get_package`

- The name "get_package" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Full normalized details for one package by registry + name, in a single unified Package shape across npm, PyPI, Docker Hub, and the VS Code Marketplace. name handles scoped npm ids (e.g. @types/node), Docker namespaces (e.g. library/nginx or a bare nginx for official images), and VS Code publisher.extension ids. With registry=all the request fans out to every registry in parallel and returns a packages array (missing registries are silently dropped); otherwise a single package is returned.
```

### `get_versions`

- The name "get_versions" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
List published versions (npm/PyPI), image tags (Docker Hub, most recent 25), or extension versions (VS Code) for a package. registry=all is NOT supported here — pick a single registry. Each item carries version and released, plus registry-specific extras (files for PyPI, size for Docker tags).
```

### `get_vulnerabilities`

- The name "get_vulnerabilities" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Known vulnerabilities (CVE / GHSA / PYSEC / GO advisories) for a package, via OSV.dev. Pass version to filter to advisories affecting that exact version, or omit it for the package's full advisory history. Each result carries the OSV id, cross-id aliases, a severity word grade (LOW|MODERATE|HIGH|CRITICAL), the cvss vector string, affectedRanges with fixed-version events, references, and cwes. A clean package returns count: 0 with an empty list (not an error). ecosystem is CASE-SENSITIVE — use OSV's spelling (npm, PyPI, Go, crates.io, Maven, NuGet, RubyGems, …). Use scan_vulnerabilities_batch for lockfile batch scans.
```

### `search_ecosystems`

- The name "search_ecosystems" says "search": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Look a package name up across 50+ registries at once, via ecosyste.ms. This is an EXACT-name lookup (not fuzzy full-text): q=react returns the react package everywhere it exists (npm, cargo, nuget, pub, bower, …), each as a normalized ecosystemsPackage with reverse-dependency counts. Pass ecosystem to narrow to one registry. Results carry dependentReposCount, dependentPackagesCount, and vulnerabilityCount.
```

### `search_packages`

- The name "search_packages" says "search": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Search a registry for packages matching q. registry=all fans out to npm, Docker Hub, and the VS Code Marketplace and merges the results. PyPI has no public search API, so registry=pypi returns 400 not_supported — look a PyPI package up by name via get_package instead. Results are normalized PackageSummary items (npm adds a relevance score; Docker adds isOfficial).
```

## Claude Code permissions

For `.claude/settings.json`, assuming the server is installed as `devstack`:

```json
{
  "permissions": {
    "allow": [
      "mcp__devstack__get_package",
      "mcp__devstack__search_packages",
      "mcp__devstack__get_versions",
      "mcp__devstack__get_downloads",
      "mcp__devstack__get_dependency_graph",
      "mcp__devstack__get_vulnerabilities",
      "mcp__devstack__get_insights",
      "mcp__devstack__search_ecosystems",
      "mcp__devstack__get_ecosystems_package"
    ],
    "ask": [
      "mcp__devstack__scan_vulnerabilities_batch"
    ],
    "deny": []
  }
}
```
