Bowmark MCP over stdio — a thin bridge to the hosted Bowmark MCP at https://api.bowmark.ai/mcp
Project description
bowmark-mcp — Bowmark MCP over stdio
Bowmark gives agents pre-computed navigation recipes for public websites (skip
explore-and-discover). The canonical server is hosted, streamable HTTP, no auth
required: https://api.bowmark.ai/mcp.
This package is a thin stdio bridge to that hosted server, for MCP hosts
whose client only speaks stdio (for example browser-use's MCPClient). Tool
schemas, descriptions, and results pass through verbatim — the hosted server
stays the single source of truth; nothing is reimplemented here.
(Node-flavored environments: the same bridge exists on npm as bowmark-mcp —
npx bowmark-mcp, packages/bowmark-mcp/node/ in the monorepo.)
mcp-name: ai.bowmark/bowmark
Use
uvx bowmark-mcp # or: pipx run bowmark-mcp / python -m bowmark_mcp
Example — browser-use:
from browser_use.mcp.client import MCPClient
bowmark = MCPClient(server_name="bowmark", command="uvx", args=["bowmark-mcp"])
Example — any MCP host config:
{ "mcpServers": { "bowmark": { "command": "uvx", "args": ["bowmark-mcp"] } } }
If your host speaks streamable HTTP, skip this bridge and connect directly to
https://api.bowmark.ai/mcp.
Environment
| Var | Meaning |
|---|---|
BOWMARK_MCP_URL |
Target MCP URL. Default https://api.bowmark.ai/mcp?s=p (?s=p attributes the install to the PyPI bridge). Point at http://localhost:3001/mcp for a local Bowmark API. |
BOWMARK_API_KEY |
Optional. Forwarded as X-Bowmark-Key; a free key (bowmark.ai dashboard) raises the anonymous per-IP daily synthesis cap to your plan budget. |
Design notes (repo-internal)
- One remote session per request, retried once.
streamablehttp_clientis an anyio-scoped context manager; holding one session across handler tasks trips "exit cancel scope in a different task". The hosted MCP is stateless, so a fresh session per request is semantically identical and costs one initialize round-trip — noise next to anasksynthesis. - 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. ?s=psource code is registered inapps/api/src/mcp-sources.ts+mcp-registry/sources.json(PyPI stdio bridge channel).- The
mcp-name: ai.bowmark/bowmarkline above is load-bearing: the official MCP Registry validates PyPI package ownership by finding that marker in the package README. Don't remove it. - Versioning is manual (this is a thin bridge, not the api): bump
pyproject.tomlwhen it changes. Not wired into release-please.
Tests
cd packages/bowmark-mcp/python
uv run --with pytest --with-editable . pytest -q
Network-free (the remote hop is monkeypatched). A live smoke against prod:
uv run --with-editable . python - <<'EOF'
import asyncio, bowmark_mcp
async def main():
tools = await bowmark_mcp.list_tools_impl()
print([t.name for t in tools])
asyncio.run(main())
EOF
Publishing to PyPI
Live since 2026-07-03 (v0.1.0, published + cold-verified via
uvx bowmark-mcp against prod). To ship a new version: bump version in
pyproject.toml and merge — .github/workflows/publish-bowmark-mcp.yml
compares the manifest against live PyPI on every merge touching this folder
and publishes only when the version is new (requires the
PYPI_TOKEN_BOWMARK_MCP Actions secret). Not release-please; the bump IS the
release action. If the registry surface changed, also bump
packages[0].version in mcp-registry/server.json (rides the next
api-release republish — the registry validates ownership via the mcp-name
marker above).
Manual fallback (creds: 1Password item "PyPI", vault
Christopher-Macbook-CLI, token in the Christopher_Bowmark_API_Key field;
service-account op read requires the vault in the path):
cd packages/bowmark-mcp/python && rm -rf dist && uv build && UV_PUBLISH_TOKEN="$(op read 'op://Christopher-Macbook-CLI/PyPI/Christopher_Bowmark_API_Key')" uv publish
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bowmark_mcp-1.0.0.tar.gz.
File metadata
- Download URL: bowmark_mcp-1.0.0.tar.gz
- Upload date:
- Size: 60.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b606bbdaf69381a7b66fecc88e2987a3deb0c710449b84c600e00e553f45d916
|
|
| MD5 |
432e49498176d4cf9ae904a3e87d1161
|
|
| BLAKE2b-256 |
81664841555c2e8d38e2f472c5163d6caa34af24d6ece5c177be00fb134368a4
|
File details
Details for the file bowmark_mcp-1.0.0-py3-none-any.whl.
File metadata
- Download URL: bowmark_mcp-1.0.0-py3-none-any.whl
- Upload date:
- Size: 5.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
09c1b70803f75b56e9b8bb14668940d1c3db59f8c09882ad1e1be2ab0b60bab8
|
|
| MD5 |
c8da48ed6f285afd57c7f406613ed066
|
|
| BLAKE2b-256 |
5838c1e2214005954ebf7752b2fe43cd2dfecadcf6808eed35706567ca59db04
|