Installation
Wire Bowmark into ChatGPT, Claude Code, Cursor, Codex, or any MCP client. No account, no API key.
Bowmark's hosted MCP is at https://api.bowmark.ai/mcp. It needs no auth, so
every path below is a config change and nothing else.
Want proof before you edit a config? Quickstart gets a real
answer out of Bowmark with one curl and nothing installed. Come back here once you
have seen it work.
The shortest path for your host
Most hosts have something better than pasting a URL into a settings pane. Take the row for yours and skip the rest of this page.
| Host | Shortest path | What it installs |
|---|---|---|
| Claude Code | claude plugin marketplace add bowmark-ai/plugin then claude plugin install bowmark@bowmark-ai | MCP and the skill, in the host's plugin list |
| Codex | codex plugin marketplace add bowmark-ai/plugin, then codex /plugins | MCP and the skill |
| Claude Desktop | Download bowmark.mcpb and double-click it | MCP, no settings pane, no URL to paste |
| Gemini CLI | gemini extensions install https://github.com/bowmark-ai/plugin | MCP over Streamable HTTP, plus the context file |
| ChatGPT | Paste https://api.bowmark.ai/mcp/chatgpt-app as a custom connector — steps below | MCP. There is no one-click path; OpenAI has no deeplink |
| Cursor | Paste the JSON into Settings → MCP — below | MCP |
| Anything with a shell | Nothing at all — point it at https://bowmark.ai/skill.md | Nothing; it uses the HTTP API directly |
| Your own program | npm i @bowmark/web · pip install bowmark-web | The typed client — not an MCP at all |
The plugin is the recommended path wherever it exists. It is the only one that wires the MCP and installs the skill that teaches an agent when to reach for it, and it shows up in the host's own plugin list so it can be turned off the same way everything else is.
You do not need an account to start
Anonymous calls are capped per IP. A key raises the cap and unlocks runs on sites that need you signed in — it is additive everywhere, never a gate on getting started. See API keys at the bottom.
ChatGPT
Go to chatgpt.com/plugins and click the + in the top right.
If the option is missing, turn on Developer mode first: Settings → Apps & Connectors → Advanced. The free tier works.

Name it Bowmark, choose Server URL, and paste:
https://api.bowmark.ai/mcp/chatgpt-appSet No Auth, tick the confirmation box, and hit Create.

ChatGPT is the one host with a path on the end
Every other host on this page uses the bare https://api.bowmark.ai/mcp. Same
server, same tools. ChatGPT needs the /chatgpt-app destination because it is
the only client that demands OAuth discovery metadata before it will create a
connector, and that document is published on that path alone.
On the next screen, hit Connect.

In a chat, type @ and pick Bowmark from the list. Then ask away.

In ChatGPT you must type @Bowmark every turn
A custom connector is never invoked on a bare prompt. It is inert until you attach it for that turn, no matter how the tools are described or which plan you are on — this is documented, intended OpenAI behaviour, not something wording can fix. If you do not attach it, the model does not even see that Bowmark exists, and will browse or answer from memory instead.
Only Apps reviewed and listed in OpenAI's App Directory surface on their own. Custom connectors are excluded from that.
Claude Code
claude mcp add bowmark --transport http https://api.bowmark.ai/mcpRun it from any terminal. Every project picks Bowmark up automatically — there is no per-project step.
Unlike ChatGPT, you do not have to name it. The tools are in scope on every turn and Claude reaches for them on its own when a task needs the live web. Saying "use bowmark to…" just makes it deterministic when you want a specific call.
Want the skill bundled in as well? Use the Plugin path below — one install wires the MCP and the skill.
Plugin — the all-in-one path
One install pulls the skill and wires the MCP, and Bowmark shows up in the host's plugin list. This is the recommended path on Claude Code and Codex.
claude plugin marketplace add bowmark-ai/plugin
claude plugin install bowmark@bowmark-aiEvery project picks it up automatically — there is no per-project step.
codex plugin marketplace add bowmark-ai/pluginThen run codex /plugins and install Bowmark from the list.
Every other host
Same server, same URL, no auth.
Edit ~/.codex/config.toml, or run codex mcp to manage servers. No auth required:
[mcp_servers.bowmark]
url = "https://api.bowmark.ai/mcp"Settings → MCP → Add new MCP server, then paste:
{
"mcpServers": {
"bowmark": { "url": "https://api.bowmark.ai/mcp" }
}
}One click: download
bowmark.mcpb
and double-click it with Claude installed. That URL always serves the current build. An
.mcpb is a desktop-extension bundle wrapping the published stdio bridge, so there is
no settings pane and no URL to paste.
Prefer to wire it by hand, or on claude.ai where a bundle cannot be installed:
Launch the app (or open claude.ai) and go to Settings → Connectors.
Click Add custom connector.
Name it Bowmark and paste this URL:
https://api.bowmark.ai/mcpgemini extensions install https://github.com/bowmark-ai/pluginThe extension declares the server under httpUrl rather than url — that is Gemini
CLI's key for Streamable HTTP — so no stdio bridge is involved and nothing is spawned
locally.
Some hosts only speak stdio — browser-use, and many self-built Python or Node agents.
bowmark-mcp on PyPI bridges stdio to the same hosted MCP. Same tools, no auth.
Needs uv.
{
"mcpServers": {
"bowmark": { "command": "uvx", "args": ["bowmark-mcp"] }
}
}No Python toolchain? The same bridge ships on npm:
{
"mcpServers": {
"bowmark": { "command": "npx", "args": ["@bowmark/mcp"] }
}
}For browser-use, register it with the stock MCP client:
from browser_use.mcp.client import MCPClient
bowmark = MCPClient(server_name="bowmark",
command="uvx", args=["bowmark-mcp"])
await bowmark.connect()
await bowmark.register_to_tools(tools)Works with Windsurf, Perplexity, and any MCP-capable client. Hand your agent this prompt and it wires the connection itself:
Connect the Bowmark MCP at https://api.bowmark.ai/mcp.
No auth required. After it's connected, call the
`get_library` tool before browsing any site.Skill only
For a host that supports the standard skill format but has no MCP client. Works with Claude Code, Claude Desktop, Cursor, Codex, and Windsurf.
npx skills add bowmark-ai/skillNothing installed at all
An agent with a shell or a fetch tool needs no install. Point it at the bootstrap document and it can use Bowmark immediately over plain HTTP:
https://bowmark.ai/skill.mdThat page teaches the api.bowmark.ai/v1/* loop and then offers install as an
upgrade. Two discovery URLs resolve to the same thing:
npx skills add https://bowmark.ai
claude plugin marketplace add https://bowmark.ai/marketplace.jsonA skill should ask before it installs itself
Bowmark's own skill tells the agent to ask before writing to your agent configuration. Silently editing a user's config is the behaviour that gets this whole pattern classified as a prompt-injection payload. If you are building something similar, ship the consent line.
Your own code, not an agent
Everything above wires Bowmark into an agent. If you are writing the program yourself, you want the client library instead — real control flow on your machine, full autocomplete, no MCP involved.
npm i @bowmark/webimport { bowmark } from "@bowmark/web";
const { tracks } = await bowmark.music.search("aphex twin", 3);pip install bowmark-web bowmark-web-stubsfrom bowmark_web import bowmark
found = await bowmark.music.search("aphex twin", 3)Both are MIT with zero runtime dependencies, generated from the same library manifest, released at the same version. Full detail — sessions, errors, the Node TypeScript-source gotcha, and the no-install HTTP path — is on Scripting.
Verify it works
Two checks, in order. The first proves the wiring, the second proves the wiring does something.
Wiring. Ask your agent to run this. It touches no site and costs nothing:
const library = await get_library({ query: "flights" });An unrecognized query returns a one-line index of the whole library rather than an error, so this check can never dead-end. If you get a library back, you are wired up.
A real result. Then ask it, in plain English:
Price an RTX 5080 across every retailer you can reach, and tell me
which store is cheapest and what it costs right now.A working agent calls get_library, then run, then answers with a store, a price
and a clickable link — about ten seconds in total. If it answers with no tool call,
it did not use Bowmark; it answered from memory or browsed.
In ChatGPT, type @ and pick Bowmark first — otherwise the model has no idea the
tool exists and will answer from memory or browse instead. Everywhere else the tools
are in scope on every turn.
Then read How it works for the two-call flow, and Scripting for the language you write against the library.
API keys
A key is additive. Anonymous requests omit the Authorization header and get a
per-IP cap; keyed requests include it and draw on your plan budget.
curl -s https://api.bowmark.ai/v1/library?query=flights \
-H "Authorization: Bearer $BOWMARK_API_KEY"Create one at the dashboard. Keys are shown once, at creation, and stored hashed — there is no way to read one back later.
Two things a key unlocks beyond the cap:
- Runs that pause for a login. A script that hits a signed-in site returns
status: "needs_user"with a single-use handoff URL. Without a key you are told to add one instead of being handed the link. - Metered billing. 1,000 calls a month are free; past that it is $5 per 1,000.