Bowmark AIdocs

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.

HostShortest pathWhat it installs
Claude Codeclaude plugin marketplace add bowmark-ai/plugin then claude plugin install bowmark@bowmark-aiMCP and the skill, in the host's plugin list
Codexcodex plugin marketplace add bowmark-ai/plugin, then codex /pluginsMCP and the skill
Claude DesktopDownload bowmark.mcpb and double-click itMCP, no settings pane, no URL to paste
Gemini CLIgemini extensions install https://github.com/bowmark-ai/pluginMCP over Streamable HTTP, plus the context file
ChatGPTPaste https://api.bowmark.ai/mcp/chatgpt-app as a custom connector — steps belowMCP. There is no one-click path; OpenAI has no deeplink
CursorPaste the JSON into Settings → MCP — belowMCP
Anything with a shellNothing at all — point it at https://bowmark.ai/skill.mdNothing; it uses the HTTP API directly
Your own programnpm i @bowmark/web · pip install bowmark-webThe 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.

The ChatGPT Plugins page, with an arrow pointing at the plus button in the top right.
The + is top right, beside the search box — not in the Featured list below it. Captured 2026-07.

Name it Bowmark, choose Server URL, and paste:

https://api.bowmark.ai/mcp/chatgpt-app

Set No Auth, tick the confirmation box, and hit Create.

ChatGPT's New Plugin dialog, filled in with the name Bowmark, the server URL https://api.bowmark.ai/mcp/chatgpt-app, No Auth selected, and the risk checkbox ticked.
Leave Description blank — ChatGPT falls back to the server's own name. Create stays greyed out until the risk box is ticked. Captured 2026-08.

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.

ChatGPT's connect screen, headed 'Add Bowmark to ChatGPT', with a Connect button.
No sign-in step follows this — the connector is No Auth, so Connect is the last click. Captured 2026-08.

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

The ChatGPT composer with @bow typed, showing Bowmark in the plugin picker beneath it.
You have to do this every turn. A custom connector is inert until you attach it. Captured 2026-08.

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/mcp

Run 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-ai

Every project picks it up automatically — there is no per-project step.

codex plugin marketplace add bowmark-ai/plugin

Then 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/mcp
gemini extensions install https://github.com/bowmark-ai/plugin

The 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/skill

Nothing 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.md

That 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.json

A 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/web
import { bowmark } from "@bowmark/web";

const { tracks } = await bowmark.music.search("aphex twin", 3);
pip install bowmark-web bowmark-web-stubs
from 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.