@bowmark/mcp

中文文档
2.1.2发布于 2026/11/05UNLICENSEDES Module构建来源已验证近 30 天下载 6819

Bowmark MCP for stdio hosts: web scraping and automation for AI agents. Live prices, quotes, bookings, anything behind a login. Starts with a free $10.

原始使用文档
文档目录5 节
  1. Use
  2. Environment
  3. Design notes (repo-internal)
  4. Tests
  5. Publishing to npm

@bowmark/mcp — Bowmark MCP over stdio (Node)

Bowmark lets your AI agent use live websites: prices, quotes, bookings, anything behind a login. Sites come as a typed function library. An agent reads the library (get_library), writes a short JavaScript script against it, and sends it to run. Bowmark runs it on the live sites and hands back the result. The canonical server is hosted, streamable HTTP: https://api.bowmark.ai/mcp. Reading the library needs no key; run needs a Bowmark account, which starts with a free $10.

This package is a thin stdio bridge to that hosted server, for MCP hosts whose client only speaks stdio, in Node-flavored environments. Tool schemas, descriptions, and results pass through verbatim — the hosted server stays the single source of truth; nothing is reimplemented here. (Python-flavored environments: the same bridge exists on PyPI as bowmark-mcp — uvx bowmark-mcp. The npm name is scoped and the PyPI one is not, deliberately — PyPI cannot be scoped and has no rename mechanism.)

Renamed from bowmark-mcp on 2026-08-05. That name still works: it is published from ../node-compat/ as a package whose bin re-execs this one. Nothing breaks, and nothing is unpublished.

mcp-name: ai.bowmark/bowmark

Use

npx @bowmark/mcp

Any MCP host config:

{ "mcpServers": { "bowmark": { "command": "npx", "args": ["@bowmark/mcp"] } } }

Installed globally, the command is bowmark, not bowmark-mcp:

npm i -g @bowmark/mcp && bowmark

npx @bowmark/mcp works despite the mismatch because npm falls back to a package's only bin when no bin matches the requested name. Do not add a second bin here — that fallback is what makes the documented install line resolve, and a second entry silently breaks it. bowmark-mcp is the FORWARDER's bin and may not also be this package's: when both declared it, installing the forwarder linked node_modules/.bin/bowmark-mcp at THIS cli (npm hoists a transitive dependency's bin over the direct one, and says nothing), so the forwarder's notice silently never printed. Measured 2026-08-05. tests/unit/mcp-stdio-node.test.ts holds both halves.

If your host speaks streamable HTTP, skip this bridge and connect directly to https://api.bowmark.ai/mcp.

Environment

VarMeaning
BOWMARK_MCP_URLTarget MCP URL. Default https://api.bowmark.ai/mcp/npm (the /npm destination attributes the install to this bridge). Point at http://localhost:3001/mcp for a local Bowmark API.
BOWMARK_API_KEYRequired. Your key from https://bowmark.ai/dashboard/keys (sign up at https://bowmark.ai/sign-up). Forwarded as X-Bowmark-Key. Without it the bridge still starts, warns on stderr, and every call returns the sign-up steps.

Design notes (repo-internal)

  • One remote session per request, retried once. The hosted MCP is stateless, so a fresh connection is semantically identical and its cost (one initialize round-trip) is noise next to a run on live sites, and it sidesteps long-lived-connection failure modes without reconnect bookkeeping. Mirrors packages/bowmark-mcp/python (the PyPI bridge) exactly.
  • The real host's name is relayed upstream. The api tailors its operating guidance per host and detects the host from clientInfo on the handshake — but through a bridge that names the BRIDGE, so every install here would read the platform-neutral text. So the host's own clientInfo.name (from OUR stdio handshake) is forwarded as X-Bowmark-Client on every proxied request, and the api ranks that above its own handshake. Best-effort: an unknown or missing name simply falls back to the neutral text, never an error.
  • Pass-through only. No tool logic lives here; the agent-surfaces sync rule in the root CLAUDE.md is unaffected because descriptions/schemas ride through from apps/api/src/routes/mcp.ts. callTool results are returned verbatim (content, structuredContent, isError).
  • The /npm destination is registered in apps/api/src/mcp-destinations.ts + mcp-registry/sources.json (npm stdio bridge channel; the PyPI bridge is /pypi). It carries the channel and deliberately pins NO platform, because the relayed X-Bowmark-Client above is a better answer than any pin. The old ?s=n query form still resolves for installs already in the wild. Adding a destination: .claude/rules/mcp-destinations.md.
  • npm ownership verification needs BOTH markers — the registry checks the published package.json, not just the README. The mcp-name: ai.bowmark/bowmark line above and the "mcpName": "ai.bowmark/bowmark" field in package.json are both load-bearing; don't remove either. Learned the hard way 2026-07-04: release-mcp.yml's registry republish failed for five straight api releases (server returned status 400: ... "NPM package 'bowmark-mcp' is missing required 'mcpName' field") because only the README marker was present — the package.json field is what mcp-publisher publish actually validates against the live npm package.
  • Versioning is manual (thin bridge, not the api): bump package.json when it changes. Not wired into release-please; private is deliberately absent so npm publish works — release-please doesn't manage this package. Three manifests move together and gate:facts-agree refuses a skew: this one, ../python/pyproject.toml (the bridges are interchangeable by contract), and ../node-compat/package.json plus its @bowmark/mcp dependency pin (a forwarder on an old version silently serves an old bridge to everyone who never migrated).
  • exports is load-bearing and narrow on purpose. ./cli exists so node-compat/bin/bowmark-mcp.mjs can import("@bowmark/mcp/cli") as a declared entry point rather than deep-importing someone's dist/. Adding exports at all closed off every other subpath — which is the intent, but it means a new consumer needs a new entry here, not just a new file.

Tests

Network-free unit tests live in the monorepo suite: tests/unit/mcp-stdio-node.test.ts (pnpm test:unit). The remote hop is injected at the callRemote/buildServer seams.

Publishing to npm

Live since 2026-07-04 (published by CI + cold-verified via npx -y bowmark-mcp against prod, back when that was this package's own name). To ship a version: bump version in package.json (and the two version literals in src/bridge.ts, and ../node-compat/package.json's version AND its @bowmark/mcp pin, and ../python/pyproject.toml) and merge. The actual publish does NOT run in this monorepo's CI — this repo is private, and npm Trusted Publishing (OIDC) validates against package.json's repository.url, which (correctly) points at the public mirror github.com/bowmark-ai/mcp, not Metroxe/bowmark. So merging here only lands the version bump; release-bowmark-mcp.yml mirror-syncs it to bowmark-ai/mcp, and THAT repo's own .github/workflows/publish.yml (source-controlled at packages/bowmark-mcp/.github/workflows/publish.yml in this monorepo, mirrored in like any other file) does the real npm publish. Auth is npm Trusted Publishing (OIDC) — no token, configured on npmjs.com (package Settings → Trusted Publisher → GitHub Actions, repo bowmark-ai/mcp, workflow publish.yml). Publishing from the public mirror also auto-generates provenance attestations, which npm only produces for public-repo publishes — impossible from this private monorepo regardless of repository.url. Not release-please; the bump IS the release action.

mcp-registry/server.json carries the matching npm packages entry (landed after the first publish per the mcp-name ordering rule), and the website stdio tab's Node step points at npx @bowmark/mcp.

The scoped name needs its own trusted-publisher configuration. OIDC trust is per PACKAGE, not per org, and npm cannot configure a trusted publisher for a package that does not exist — so @bowmark/mcp has to be reserved by a manual first publish and then configured, exactly the way Phase 8 of docs/decisions/2026-08-05-the-npm-bridge-is-scoped-and-the-old-name-forwards.md records. Until that happens the npm job here fails on auth, and it is a registry-configuration problem rather than a workflow one. The forwarder in ../node-compat/ publishes under the EXISTING bowmark-mcp name and keeps its existing trust configuration, so it is unaffected.

版本与发布记录

@bowmark/mcp 共发布 4 个版本,首次发布于 2026/08/06;过去 12 个月发布了 4 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
2.1.2latest2026/11/053 天前
2.1.12026/10/318 天前
2.1.02026/08/063 个月前
0.0.02026/08/063 个月前

关于 @bowmark/mcp 的常见问题

@bowmark/mcp 是什么?

Bowmark MCP for stdio hosts: web scraping and automation for AI agents. Live prices, quotes, bookings, anything behind a login. Starts with a free $10.

如何安装 @bowmark/mcp?

在项目目录运行 npm install @bowmark/mcp,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 bowmark,可以用 npx bowmark 直接运行。

@bowmark/mcp 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/bowmark__mcp 是否存在。

@bowmark/mcp 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@bowmark/mcp 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=20。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@bowmark/mcp 可以商用吗?

@bowmark/mcp 使用 UNLICENSED 许可。作者声明为 UNLICENSED,即不授予公开使用许可(与公共领域的 Unlicense 不同)。使用前需获得作者授权。以上为概括,不构成法律意见,请以许可原文为准。

@bowmark/mcp 的下载量有多少?

根据 npm 官方下载统计,@bowmark/mcp 在 2026/10/09 – 2026/11/07 这 30 天内被下载 6,819 次,日均约 227 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@bowmark/mcp 还在维护吗?

最新版本 2.1.2 发布于 2026/11/05(3 天前);至今共发布 4 个版本,其中过去 12 个月发布了 4 个;首次发布于 2026/08/06。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。