Skip to main content

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-mcpnpx 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_client is 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 an ask synthesis.
  • 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=p source code is registered in apps/api/src/mcp-sources.ts + mcp-registry/sources.json (PyPI stdio bridge channel).
  • The mcp-name: ai.bowmark/bowmark line 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.toml when 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. Auth is PyPI Trusted Publishing (OIDC) — no token, configured on pypi.org (project → Publishing → GitHub publisher for Metroxe/bowmark / publish-bowmark-mcp.yml); uv publish picks it up automatically. 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bowmark_mcp-1.0.1.tar.gz (60.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bowmark_mcp-1.0.1-py3-none-any.whl (5.6 kB view details)

Uploaded Python 3

File details

Details for the file bowmark_mcp-1.0.1.tar.gz.

File metadata

  • Download URL: bowmark_mcp-1.0.1.tar.gz
  • Upload date:
  • Size: 60.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • 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

Hashes for bowmark_mcp-1.0.1.tar.gz
Algorithm Hash digest
SHA256 b99e5dcca716c4d621717a428a4febc2142fbaf7d1c46b5b8654db48fdf486ab
MD5 4eaca4a731f4aa18e9b5db6bee630862
BLAKE2b-256 3e9d124dcb7bda59f08e43942cbbeef78f76b508a19afb39d2211b88a7dbf4f0

See more details on using hashes here.

File details

Details for the file bowmark_mcp-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: bowmark_mcp-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 5.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • 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

Hashes for bowmark_mcp-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 606a6d2599466d7a5309d1a6240d3bf328df53cf0ec3d10b270d6ab03d591504
MD5 15f403378497225c4d2cd5a395371ad0
BLAKE2b-256 3e7ffcedae767f9fba893a8e79adf6bf31997cd67eaa1125e67f53d87f410079

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page