Devstack Mcp

io.github.IsaiahDupree由 GitHub 账号 IsaiahDupree 发布v1.0.0更新于 Oct 24, 2026

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

已验证Streamable HTTP可网页运行开发者工具安全与监控数据与分析

概览

AI 生成的概览

面向开发者仓库数据的远程 MCP 连接器:可搜索和查看 npm、PyPI、Docker Hub、VS Code 包,以及依赖图、漏洞和 OSSF 评分。

可以做什么
  • 在 npm、Docker Hub 和 VS Code Marketplace 中搜索并获取统一格式的包详情,并可在 50 多个生态中按精确名称查找
  • 列出已发布版本、镜像标签和扩展版本,以及 npm 与 PyPI 的下载统计
  • 获取某个确切版本的完整依赖图
  • 查询某个包或版本的已知 CVE 与安全公告,并一次批量扫描最多 100 个包
  • 获取项目健康信息:源码仓库、GitHub 星标与议题、许可证、依赖数量及 OSSF Scorecard
适用场景
适合在依赖升级、锁文件审计或选型时,让助手核对包的元数据、版本、下载热度、依赖树和已知漏洞。它是只读的公共仓库数据查询层,不负责构建或安装。
运行要求
以远程 streamable-HTTP 端点运行,调用方无需账号、OAuth 或 API 密钥。托管部署通过服务端代理密钥访问上游 API,并按 IP 施加软性速率限制(默认每小时 30 次工具调用)。自行部署需要 Node.js 以及环境变量 DEVSTACK_MCP_API_BASE_URL、DEVSTACK_MCP_PROXY_SECRET 和 DEVSTACK_MCP_RATE_LIMIT。
安装前请注意
十个工具均为只读查询,不会修改任何数据。托管版本按 IP 限流,大量或批量使用可能被限速。请求和包名会转发给第三方服务(DevStack API、deps.dev、OSV.dev、ecosyste.ms、npm 与 pypistats),查询内容会离开客户端。自行部署时需将 DEVSTACK_MCP_PROXY_SECRET 的值作为机密妥善保管。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Devstack Mcp,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.IsaiahDupree%2Fdevstack-mcp/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "mcpServers": {
    "devstack": {
      "type": "http",
      "url": "https://devstack-mcp.vercel.app/mcp"
    }
  }
}

README

devstack-mcp

A remote MCP (Model Context Protocol) connector for DevStack API — the libraries.io successor: one keyless, normalized view of the whole developer registry across npm, PyPI, Docker Hub, and the VS Code Marketplace (search, package details, versions, download/pull stats), plus resolved dependency graphs (deps.dev), per-version vulnerabilities (OSV.dev), OSSF Scorecard insights (deps.dev), and cross-registry lookups over 50+ ecosystems (ecosyste.ms).

Target deploy: https://devstack-mcp.vercel.app/mcp — 10 tools. Since the upstream DevStack deployment is metered (RapidAPI/Apify) and gates /v1/* behind a RapidAPI proxy-secret guard, this connector authenticates its own outbound calls with that same proxy secret (DEVSTACK_MCP_PROXY_SECRET, sent as the X-RapidAPI-Proxy-Secret header) and applies a soft per-IP rate limit (DEVSTACK_MCP_RATE_LIMIT, default 30 tool-calls/hour, in-memory) so the free MCP tier stays a discovery channel rather than an unmetered bypass of the paid listing — see lib/ratelimit.js.

What this is, and why it's a separate connector

DevStack API is a plain REST API. Any HTTP client can already call it directly. This repo exists because MCP clients (Claude, ChatGPT, and other MCP-aware agents) don't consume arbitrary REST APIs — they consume MCP tools. devstack-mcp is a thin adapter layer that:

  • Exposes each DevStack endpoint as a discoverable, typed MCP tool (name, description, zod input schema, annotations) that an LLM can reason about and call directly, instead of having to be taught the REST surface out-of-band.
  • Speaks the MCP streamable-HTTP transport at a single /mcp endpoint, so it can be registered as a connector in Claude, ChatGPT, or any other MCP client with one URL.
  • Does nothing else. It has no business logic of its own — every tool call is a pass-through fetch to DevStack, and the JSON response DevStack returns is handed back verbatim as the tool result.

Authentication: None on the MCP side (deliberate)

DevStack's data has no per-user dimension at all — it's public developer-registry metadata (package listings, versions, download counts, dependency graphs, published CVEs). There is nothing to gate per-caller, so this connector intentionally ships with:

  • No OAuth, no login, no per-user bearer tokens
  • No Supabase / database
  • No demo-vs-real account split — every caller gets the same real, live data

The one server-side secret it carries (DEVSTACK_MCP_PROXY_SECRET) is not per-caller auth — it's how this connector, as a single consumer, gets past the upstream's RapidAPI proxy-secret guard to reach real data. Combined with the soft per-IP rate limit, that keeps this a free discovery tier over the metered DevStack product rather than an unmetered bypass of the paid RapidAPI/Apify listing.

Tool list

One tool per DevStack /v1 endpoint (from devstack-api/openapi.yaml):

ToolDevStack endpointDescription
get_packageGET /v1/packageNormalized package details by registry + name (registry=all fans out).
search_packagesGET /v1/searchSearch npm/Docker/VS Code (or all); PyPI has no search API.
get_versionsGET /v1/versionsPublished versions / image tags / extension versions.
get_downloadsGET /v1/downloadsDownload / pull statistics (npm + PyPI only).
get_dependency_graphGET /v1/depsFully resolved dependency graph for one exact version (deps.dev).
get_vulnerabilitiesGET /v1/vulnsKnown CVEs/GHSAs per package/version (OSV.dev).
scan_vulnerabilities_batchPOST /v1/vulnsBatch/lockfile vulnerability scan — up to 100 queries in one call (OSV.dev).
get_insightsGET /v1/insightsOSSF Scorecard + repo signal + licenses/advisories (deps.dev).
search_ecosystemsGET /v1/ecosystems/searchCross-registry exact-name lookup across 50+ ecosystems (ecosyste.ms).
get_ecosystems_packageGET /v1/ecosystems/packageOne package on one registry, with reverse-dependency counts (ecosyste.ms).

All 10 tools are read-only and annotated { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }. scan_vulnerabilities_batch is an HTTP POST but is a read-only query (it mutates nothing), so it carries the same read-only annotations.

How it wraps devstack-api

Each tool handler does a plain fetch(\${DEVSTACK_MCP_API_BASE_URL}${path}`, ...)` against the real DevStack REST API and returns the parsed JSON as MCP tool-result content:

js
{ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }

Upstream HTTP errors (4xx/5xx) are caught and surfaced as a typed MCP error result via an asError helper rather than crashing the request.

Environment variables

Env varPurposeDefault
DEVSTACK_MCP_API_BASE_URLUpstream DevStack base URL.https://devstack-api.vercel.app
DEVSTACK_MCP_PROXY_SECRETRapidAPI proxy secret, sent as X-RapidAPI-Proxy-Secret to pass the upstream /v1/* guard."" (omitted)
DEVSTACK_MCP_RATE_LIMITSoft per-IP tool-calls/hour cap for this free tier.30

Project layout

api/mcp.js       MCP endpoint (StreamableHTTPServerTransport, stateless, no per-caller auth)api/health.js    GET /api/healthlib/tools.js     All 10 tool definitions (zod schemas + fetch-and-forward handlers)lib/ratelimit.js Soft per-IP tools/call cap (free discovery tier)local-server.js  Plain-Node http server for local dev / smoke testing (not deployed)test/smoke.mjs   Real end-to-end smoke test (initialize, tools/list, tools/call)vercel.json      Routes /mcp -> api/mcp.js, /health -> api/health.jsserver.json      MCP registry publish manifest

Local development

bash
npm installnpm run dev          # starts local-server.js on http://localhost:3900

Endpoints locally: POST http://localhost:3900/mcp, GET http://localhost:3900/health.

To point at a self-hosted / open DevStack instance instead of production (useful for a fully keyless end-to-end run, since production's /v1/* is behind the RapidAPI proxy-secret guard):

bash
# In devstack-api (guard is inert when RAPIDAPI_PROXY_SECRET is unset):node server.js                                   # listens on :8080
# In devstack-mcp:DEVSTACK_MCP_API_BASE_URL=http://localhost:8080 npm run dev

Smoke test

bash
npm run dev &                 # terminal 1npm run smoke                 # terminal 2

test/smoke.mjs drives the running server over real HTTP/JSON-RPC and verifies:

  1. GET /health returns { ok: true, ... }
  2. initialize succeeds and reports serverInfo.name === "devstack"
  3. tools/list returns all 10 tools with their zod-derived JSON schemas
  4. tools/call for get_package with { registry: "npm", name: "react" } returns real package data fetched live (not mocked)

Against production, step 4 needs DEVSTACK_MCP_PROXY_SECRET set (the RapidAPI proxy guard); against a locally self-hosted devstack-api with no RAPIDAPI_PROXY_SECRET, the guard is inert and real data flows keyless.

Deploy

Not deployed by this build. Once ready:

bash
cd /Users/isaiahdupree/Software/devstack-mcpnpx vercel --yes --prod

After deploy, set DEVSTACK_MCP_PROXY_SECRET in the Vercel project so the connector can reach the guarded production /v1/*, then register the MCP connector URL in Claude/ChatGPT/any MCP client:

https://<deployment-domain>/mcp

来源:README.md,提交 4154a5f

工具

10

get_package

Get normalized package details

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.

输入参数name必填registry必填

search_packages

Search packages across registries

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).

输入参数q必填limitregistry必填

get_versions

Get published versions / tags

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).

输入参数name必填registry必填

get_downloads

Get download / pull statistics

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.

输入参数name必填registry必填

get_dependency_graph

Get resolved dependency graph

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).

输入参数name必填system必填version必填

get_vulnerabilities

Get vulnerabilities for a package

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.

输入参数name必填versionecosystem必填

scan_vulnerabilities_batch

Batch vulnerability scan (lockfile)

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).

输入参数queries必填

get_insights

Get project insights — OSSF Scorecard + repo signal

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, …).

输入参数name必填system必填version

search_ecosystems

Cross-registry package lookup (50+ ecosystems)

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.

输入参数q必填limitecosystem

get_ecosystems_package

Get one package on one registry (with reverse-dep counts)

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.

输入参数name必填ecosystem必填

版本历史

1
  1. v1.0.0最新Sep 16, 2026

评分

已满足适用检查项的 90%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分

    请在仓库或注册中心条目中声明许可证。