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 分

    請在儲存庫或註冊中心條目中宣告授權條款。