@render-harness/cap-browser-browserbase 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.js +71 -0
- package/dist/index.js.map +1 -0
- package/package.json +50 -0
- package/skills/browserbase.md +26 -0
package/README.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
## @render-harness/cap-browser-browserbase
|
|
2
|
+
|
|
3
|
+
Wires Browserbase headless-browser into a Render harness entry:
|
|
4
|
+
|
|
5
|
+
```yaml
|
|
6
|
+
capabilities:
|
|
7
|
+
- pack: "@render-harness/cap-browser-browserbase"
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
Set `BROWSERBASE_API_KEY` and `BROWSERBASE_PROJECT_ID` in the entry's environment.
|
|
11
|
+
|
|
12
|
+
The pack contributes:
|
|
13
|
+
|
|
14
|
+
- An MCP server `cap-browser-browserbase.browserbase` (stdio transport, runs `npx -y @browserbasehq/mcp`).
|
|
15
|
+
- A skill (`browserbase`).
|
|
16
|
+
- Two env-schema entries.
|
|
17
|
+
|
|
18
|
+
Browserbase is a hosted service; this pack adds no extra Render services.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as _render_harness_registry from '@render-harness/registry';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* cap-browser-browserbase — wires Browserbase's headless-browser MCP
|
|
5
|
+
* for any harness entry that needs to drive a real browser (login
|
|
6
|
+
* flows, JS-heavy pages, scraping behind paywalls / SPAs).
|
|
7
|
+
*
|
|
8
|
+
* Usage in render-harness.yaml:
|
|
9
|
+
*
|
|
10
|
+
* capabilities:
|
|
11
|
+
* - pack: "@render-harness/cap-browser-browserbase"
|
|
12
|
+
*
|
|
13
|
+
* Surfaces:
|
|
14
|
+
* - One MCP server `browserbase` (stdio transport).
|
|
15
|
+
* - One skill (skills/browserbase.md).
|
|
16
|
+
* - envSchema entries for BROWSERBASE_API_KEY and BROWSERBASE_PROJECT_ID.
|
|
17
|
+
*
|
|
18
|
+
* Config keys:
|
|
19
|
+
* - `apiKeyEnv` (string, default "BROWSERBASE_API_KEY")
|
|
20
|
+
* - `projectIdEnv` (string, default "BROWSERBASE_PROJECT_ID")
|
|
21
|
+
* - `command` (string, default "npx")
|
|
22
|
+
* - `package` (string, default "@browserbasehq/mcp")
|
|
23
|
+
*
|
|
24
|
+
* Browserbase is a hosted browser pool, so this pack does NOT declare
|
|
25
|
+
* any extra Render services — sessions live on Browserbase's side.
|
|
26
|
+
*/
|
|
27
|
+
declare const pack: _render_harness_registry.CapabilityPack;
|
|
28
|
+
|
|
29
|
+
export { pack as default };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { dirname, join } from 'path';
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
import { definePack } from '@render-harness/registry';
|
|
4
|
+
|
|
5
|
+
// src/index.ts
|
|
6
|
+
var HERE = dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
var SKILLS_DIR = join(HERE, "..", "skills");
|
|
8
|
+
function readConfig(ctx) {
|
|
9
|
+
const cfg = ctx.config;
|
|
10
|
+
return {
|
|
11
|
+
apiKeyEnv: cfg.apiKeyEnv ?? "BROWSERBASE_API_KEY",
|
|
12
|
+
projectIdEnv: cfg.projectIdEnv ?? "BROWSERBASE_PROJECT_ID",
|
|
13
|
+
command: cfg.command ?? "npx",
|
|
14
|
+
pkg: cfg.package ?? "@browserbasehq/mcp"
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
var pack = definePack({
|
|
18
|
+
name: "cap-browser-browserbase",
|
|
19
|
+
version: "0.1.0",
|
|
20
|
+
envSchema: [
|
|
21
|
+
{
|
|
22
|
+
name: "BROWSERBASE_API_KEY",
|
|
23
|
+
required: true,
|
|
24
|
+
secret: true,
|
|
25
|
+
description: "API key for Browserbase (https://browserbase.com)."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: "BROWSERBASE_PROJECT_ID",
|
|
29
|
+
required: true,
|
|
30
|
+
secret: false,
|
|
31
|
+
description: "Project ID in your Browserbase workspace."
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
mcpServers(ctx) {
|
|
35
|
+
const cfg = readConfig(ctx);
|
|
36
|
+
const apiKey = ctx.env(cfg.apiKeyEnv);
|
|
37
|
+
const projectId = ctx.env(cfg.projectIdEnv);
|
|
38
|
+
if (!apiKey || !projectId) {
|
|
39
|
+
throw new Error(
|
|
40
|
+
`cap-browser-browserbase: missing ${cfg.apiKeyEnv} or ${cfg.projectIdEnv}. Set both before starting the agent.`
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
return [
|
|
44
|
+
{
|
|
45
|
+
name: "browserbase",
|
|
46
|
+
transport: "stdio",
|
|
47
|
+
command: cfg.command,
|
|
48
|
+
args: ["-y", cfg.pkg],
|
|
49
|
+
env: {
|
|
50
|
+
BROWSERBASE_API_KEY: apiKey,
|
|
51
|
+
BROWSERBASE_PROJECT_ID: projectId
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
];
|
|
55
|
+
},
|
|
56
|
+
skills(_ctx) {
|
|
57
|
+
return [
|
|
58
|
+
{
|
|
59
|
+
name: "browserbase",
|
|
60
|
+
description: "Drive a real browser via Browserbase when scraping isn't enough.",
|
|
61
|
+
whenToUse: "When the page requires JS execution, login, click flows, or screenshots that aren't possible with HTTP scraping.",
|
|
62
|
+
contentPath: join(SKILLS_DIR, "browserbase.md")
|
|
63
|
+
}
|
|
64
|
+
];
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
var src_default = pack;
|
|
68
|
+
|
|
69
|
+
export { src_default as default };
|
|
70
|
+
//# sourceMappingURL=index.js.map
|
|
71
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;AA8BA,IAAM,IAAA,GAAO,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AACnD,IAAM,UAAA,GAAa,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,QAAQ,CAAA;AAS5C,SAAS,WAAW,GAAA,EAAkB;AACpC,EAAA,MAAM,MAAM,GAAA,CAAI,MAAA;AAChB,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,IAAI,SAAA,IAAa,qBAAA;AAAA,IAC5B,YAAA,EAAc,IAAI,YAAA,IAAgB,wBAAA;AAAA,IAClC,OAAA,EAAS,IAAI,OAAA,IAAW,KAAA;AAAA,IACxB,GAAA,EAAK,IAAI,OAAA,IAAW;AAAA,GACtB;AACF;AAEA,IAAM,OAAO,UAAA,CAAW;AAAA,EACtB,IAAA,EAAM,yBAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,SAAA,EAAW;AAAA,IACT;AAAA,MACE,IAAA,EAAM,qBAAA;AAAA,MACN,QAAA,EAAU,IAAA;AAAA,MACV,MAAA,EAAQ,IAAA;AAAA,MACR,WAAA,EAAa;AAAA,KACf;AAAA,IACA;AAAA,MACE,IAAA,EAAM,wBAAA;AAAA,MACN,QAAA,EAAU,IAAA;AAAA,MACV,MAAA,EAAQ,KAAA;AAAA,MACR,WAAA,EAAa;AAAA;AACf,GACF;AAAA,EACA,WAAW,GAAA,EAAqC;AAC9C,IAAA,MAAM,GAAA,GAAM,WAAW,GAAG,CAAA;AAC1B,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,SAAS,CAAA;AACpC,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,YAAY,CAAA;AAC1C,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,SAAA,EAAW;AACzB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,iCAAA,EAAoC,GAAA,CAAI,SAAS,CAAA,IAAA,EAAO,IAAI,YAAY,CAAA,qCAAA;AAAA,OAC1E;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,aAAA;AAAA,QACN,SAAA,EAAW,OAAA;AAAA,QACX,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,IAAA,EAAM,CAAC,IAAA,EAAM,GAAA,CAAI,GAAG,CAAA;AAAA,QACpB,GAAA,EAAK;AAAA,UACH,mBAAA,EAAqB,MAAA;AAAA,UACrB,sBAAA,EAAwB;AAAA;AAC1B;AACF,KACF;AAAA,EACF,CAAA;AAAA,EACA,OAAO,IAAA,EAAoC;AACzC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,aAAA;AAAA,QACN,WAAA,EAAa,kEAAA;AAAA,QACb,SAAA,EACE,kHAAA;AAAA,QACF,WAAA,EAAa,IAAA,CAAK,UAAA,EAAY,gBAAgB;AAAA;AAChD,KACF;AAAA,EACF;AACF,CAAC,CAAA;AAED,IAAO,WAAA,GAAQ","file":"index.js","sourcesContent":["/**\n * cap-browser-browserbase — wires Browserbase's headless-browser MCP\n * for any harness entry that needs to drive a real browser (login\n * flows, JS-heavy pages, scraping behind paywalls / SPAs).\n *\n * Usage in render-harness.yaml:\n *\n * capabilities:\n * - pack: \"@render-harness/cap-browser-browserbase\"\n *\n * Surfaces:\n * - One MCP server `browserbase` (stdio transport).\n * - One skill (skills/browserbase.md).\n * - envSchema entries for BROWSERBASE_API_KEY and BROWSERBASE_PROJECT_ID.\n *\n * Config keys:\n * - `apiKeyEnv` (string, default \"BROWSERBASE_API_KEY\")\n * - `projectIdEnv` (string, default \"BROWSERBASE_PROJECT_ID\")\n * - `command` (string, default \"npx\")\n * - `package` (string, default \"@browserbasehq/mcp\")\n *\n * Browserbase is a hosted browser pool, so this pack does NOT declare\n * any extra Render services — sessions live on Browserbase's side.\n */\n\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { McpServerConfig, SkillMetadata } from \"@render-harness/core\";\nimport { definePack, type PackContext } from \"@render-harness/registry\";\n\nconst HERE = dirname(fileURLToPath(import.meta.url));\nconst SKILLS_DIR = join(HERE, \"..\", \"skills\");\n\ninterface BrowserbaseConfig {\n apiKeyEnv?: string;\n projectIdEnv?: string;\n command?: string;\n package?: string;\n}\n\nfunction readConfig(ctx: PackContext) {\n const cfg = ctx.config as BrowserbaseConfig;\n return {\n apiKeyEnv: cfg.apiKeyEnv ?? \"BROWSERBASE_API_KEY\",\n projectIdEnv: cfg.projectIdEnv ?? \"BROWSERBASE_PROJECT_ID\",\n command: cfg.command ?? \"npx\",\n pkg: cfg.package ?? \"@browserbasehq/mcp\",\n };\n}\n\nconst pack = definePack({\n name: \"cap-browser-browserbase\",\n version: \"0.1.0\",\n envSchema: [\n {\n name: \"BROWSERBASE_API_KEY\",\n required: true,\n secret: true,\n description: \"API key for Browserbase (https://browserbase.com).\",\n },\n {\n name: \"BROWSERBASE_PROJECT_ID\",\n required: true,\n secret: false,\n description: \"Project ID in your Browserbase workspace.\",\n },\n ],\n mcpServers(ctx: PackContext): McpServerConfig[] {\n const cfg = readConfig(ctx);\n const apiKey = ctx.env(cfg.apiKeyEnv);\n const projectId = ctx.env(cfg.projectIdEnv);\n if (!apiKey || !projectId) {\n throw new Error(\n `cap-browser-browserbase: missing ${cfg.apiKeyEnv} or ${cfg.projectIdEnv}. Set both before starting the agent.`,\n );\n }\n return [\n {\n name: \"browserbase\",\n transport: \"stdio\",\n command: cfg.command,\n args: [\"-y\", cfg.pkg],\n env: {\n BROWSERBASE_API_KEY: apiKey,\n BROWSERBASE_PROJECT_ID: projectId,\n },\n },\n ];\n },\n skills(_ctx: PackContext): SkillMetadata[] {\n return [\n {\n name: \"browserbase\",\n description: \"Drive a real browser via Browserbase when scraping isn't enough.\",\n whenToUse:\n \"When the page requires JS execution, login, click flows, or screenshots that aren't possible with HTTP scraping.\",\n contentPath: join(SKILLS_DIR, \"browserbase.md\"),\n },\n ];\n },\n});\n\nexport default pack;\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@render-harness/cap-browser-browserbase",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Browserbase headless-browser capability pack for the Render agent harness.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"skills"
|
|
18
|
+
],
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"render-harness-cap",
|
|
24
|
+
"render-harness",
|
|
25
|
+
"browser",
|
|
26
|
+
"browserbase",
|
|
27
|
+
"mcp"
|
|
28
|
+
],
|
|
29
|
+
"renderHarness": {
|
|
30
|
+
"gallery": {
|
|
31
|
+
"label": "Browserbase remote browser",
|
|
32
|
+
"envHint": "BROWSERBASE_API_KEY"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsup",
|
|
37
|
+
"typecheck": "tsc --noEmit",
|
|
38
|
+
"test": "vitest run --passWithNoTests"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@render-harness/registry": "workspace:*"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@render-harness/core": "workspace:*",
|
|
45
|
+
"@types/node": "^25.6.2",
|
|
46
|
+
"tsup": "^8.5.1",
|
|
47
|
+
"typescript": "^6.0.3",
|
|
48
|
+
"vitest": "^4.1.5"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: browserbase
|
|
3
|
+
description: Drive a real browser via Browserbase when scraping isn't enough.
|
|
4
|
+
when_to_use: When the page requires JS execution, login, click flows, or screenshots that aren't possible with HTTP scraping.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Browser automation with Browserbase
|
|
8
|
+
|
|
9
|
+
The `cap-browser-browserbase.browserbase` MCP exposes Browserbase's full tool set: create sessions, navigate, click, type, screenshot, and read DOM state. Sessions are hosted on Browserbase's infrastructure; nothing runs locally on the agent.
|
|
10
|
+
|
|
11
|
+
## When to use Browserbase
|
|
12
|
+
|
|
13
|
+
- The target page is a single-page app whose content only renders after JS executes.
|
|
14
|
+
- You need to log in, click through a flow, or fill a form to get the data the user asked for.
|
|
15
|
+
- You need a screenshot for the final reply.
|
|
16
|
+
|
|
17
|
+
## When not to use Browserbase
|
|
18
|
+
|
|
19
|
+
- A simple `firecrawl_scrape` would do. Browser sessions are expensive — try the cheaper path first.
|
|
20
|
+
- The target is rate-limited or detection-aware. Browserbase resists most bot detection but isn't a license to abuse a site.
|
|
21
|
+
|
|
22
|
+
## Hard rules
|
|
23
|
+
|
|
24
|
+
- Always close the session when you're done (`browserbase_session_close`). Open sessions cost money.
|
|
25
|
+
- Never enter credentials that aren't explicitly provided in the run input or stored under a deliberate "credential" key in long-term memory. If you need a login and don't have one, ask.
|
|
26
|
+
- If you're scraping at scale, use `firecrawl_scrape` and batch — Browserbase is for interactive flows, not crawling.
|