Skip to content

Commit 9057fea

Browse files
authored
Feat/node butterbase (#1069)
* feat(node): add Butterbase MCP client node (#1042) Clone of tool_mcp_client hardcoded to Butterbase's Streamable HTTP MCP server (https://api.butterbase.ai/mcp, Bearer auth). Discovers and exposes Butterbase's backend tools (init_app, schema, auth, storage, functions, RAG) to agents as butterbase.<tool>. Includes example pipe and unit tests (namespacing, tool cache, dispatch). * feat(example): butterbase agent pipe — Anthropic LLM + tool_butterbase RocketRide Wave agent wired to tool_butterbase (and the required memory_internal), using Claude (claude-sonnet-4-6). Both keys use ROCKETRIDE_-prefixed env vars so pipeline substitution resolves them: ROCKETRIDE_ANTHROPIC_KEY and ROCKETRIDE_BUTTERBASE_API_KEY. * feat(node): butterbase — use Smithery icon URL for the node icon Butterbase publishes no vector logo, so point the icon field at the official Smithery server icon URL. Icon.tsx renders http(s) icon values via <img>, so a remote PNG works without bundling a local SVG. * chore(node): butterbase — drop unused placeholder icon (icon is the Smithery URL) * feat(node): butterbase — rename to 'Butterbase MCP Client', drop experimental flag Display title (node + default profile + shape) is now 'Butterbase MCP Client'; removed the 'experimental' capability so the card shows no EXPERIMENTAL badge. Internal ids (tool_butterbase, prefix, protocol) unchanged. * docs(node): butterbase — add explanatory comments to services.json (match llm_anthropic style) * docs(node): butterbase — document Developer Mode prerequisite The Butterbase app must have Developer Mode enabled for the agent to create/modify resources (writes are rejected otherwise). Added to the README (Prerequisite section) and the node description shown in the builder. * Working example * refactor(node): butterbase — API key dashboard link + extract magic constants - API Key field help now links to the Butterbase dashboard (dashboard.butterbase.ai → API Keys), matching the xTrace pattern. - Extract transport defaults to named constants (_MCP_PROTOCOL_VERSION, _CLIENT_NAME, _CLIENT_VERSION, _DEFAULT_TIMEOUT_S) to avoid magic values in the client signature. * test(node): butterbase — add tool_butterbase to skip_nodes (needs live API key) Its dynamic test would connect to the Butterbase MCP server and requires a live bb_sk_ key, so exclude it from the default CI run (opt-in via ROCKETRIDE_INCLUDE_SKIP). Mocked unit tests still cover the logic. * docs(example): butterbase pipe — agent calls butterbase_docs(overview) first to verify connectivity * refactor(node): butterbase as a branded service*.json variant of tool_mcp_client Per review: the cloned tool_butterbase node was byte-identical to tool_mcp_client (transport + IInstance), so drop it and add a branded manifest (tool_mcp_client/services.butterbase.json) that reuses the same implementation via path=nodes.tool_mcp_client — same pattern as response/*. Keeps the 'Butterbase MCP Client' title + logo + Butterbase Streamable-HTTP preset, with zero duplicated code. Removes the standalone node, its test, and the conftest skip entry; example pipe updated to the mcp_client config shape (transport+bearer). * docs(example): butterbase pipe — encode the gotchas we learned fixing the forum Enrich the agent instructions with the practical lessons from repairing a real Butterbase app: enable Developer Mode for writes; keep schema/frontend field names consistent (body vs content); use the absolute data API base and the separate /auth/<app_id> base; set is_published for anon reads; auto-login after signup (no email verification needed); ensure the frontend deployment reaches READY. * fix(example,node): address PR #1069 review — Anthropic LLM, namespaced docs tool, commented manifest - Example pipe: switch LLM to llm_anthropic (claude-sonnet-4-6, ROCKETRIDE_ANTHROPIC_KEY) to match the Wave+Anthropic+Butterbase intent. - Example pipe: the agent calls the runtime-namespaced tool 'butterbase.butterbase_docs' (serverName.tool), not the flat name. - services.butterbase.json: add the // Required/Optional comment blocks (matching llm_anthropic style) and ensure a trailing newline. * feat(node): butterbase — vendor the icon locally instead of the Smithery URL Download the Butterbase mark, downscale to 96px, embed as a data-URI in a local butterbase.svg (next to mcp.svg) and point the manifest icon at it. Removes the runtime dependency on the external Smithery URL (which could disappear).
1 parent d34d7fc commit 9057fea

3 files changed

Lines changed: 280 additions & 0 deletions

File tree

examples/butterbase-agent.pipe

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
{
2+
"components": [
3+
{
4+
"id": "chat_1",
5+
"provider": "chat",
6+
"name": "Chat",
7+
"config": {
8+
"hideForm": true,
9+
"mode": "Source",
10+
"parameters": {},
11+
"type": "chat"
12+
},
13+
"ui": {
14+
"position": {
15+
"x": 20,
16+
"y": 200
17+
},
18+
"nodeType": "default",
19+
"formDataValid": true
20+
}
21+
},
22+
{
23+
"id": "agent_rocketride_1",
24+
"provider": "agent_rocketride",
25+
"name": "RocketRide Wave",
26+
"config": {
27+
"instructions": [
28+
"You are a backend engineer agent. I'm using Butterbase as my backend. Call the butterbase.butterbase_docs tool with topic \"overview\" first to learn the platform.",
29+
"Provision and manage the backend with the butterbase tools: create the app, define and apply the schema, configure auth and row-level rules, seed data, and deploy functions/frontend. Developer Mode must be enabled on the app for create/modify operations to succeed.",
30+
"Keep field names identical between the database schema and any frontend or code you generate — if the column is \"body\", read and write \"body\", not \"content\".",
31+
"When you build a frontend for the app: use the ABSOLUTE data API base https://api.butterbase.ai/v1/<app_id>, and the auth base https://api.butterbase.ai/auth/<app_id> for signup/login/me (auth is NOT under /v1). Set is_published=true so anonymous visitors can read public rows, auto-login right after signup (email verification is not required to log in), and confirm the frontend deployment reaches status READY so the domain serves the real app.",
32+
"Inspect available butterbase tools before acting, prefer dry-run/preview where offered, and confirm destructive changes."
33+
],
34+
"max_waves": 20,
35+
"parameters": {}
36+
},
37+
"ui": {
38+
"position": {
39+
"x": 240,
40+
"y": 200
41+
},
42+
"nodeType": "default",
43+
"formDataValid": true
44+
},
45+
"input": [
46+
{
47+
"lane": "questions",
48+
"from": "chat_1"
49+
}
50+
]
51+
},
52+
{
53+
"id": "memory_internal_1",
54+
"provider": "memory_internal",
55+
"name": "Memory (Internal)",
56+
"config": {
57+
"type": "memory_internal"
58+
},
59+
"ui": {
60+
"position": {
61+
"x": 300,
62+
"y": 360
63+
},
64+
"nodeType": "default",
65+
"formDataValid": true
66+
},
67+
"control": [
68+
{
69+
"classType": "memory",
70+
"from": "agent_rocketride_1"
71+
}
72+
]
73+
},
74+
{
75+
"id": "tool_butterbase_1",
76+
"provider": "tool_butterbase",
77+
"name": "Butterbase MCP Client",
78+
"config": {
79+
"type": "tool_butterbase",
80+
"transport": "streamable-http",
81+
"endpoint": "https://api.butterbase.ai/mcp",
82+
"serverName": "butterbase",
83+
"bearer": "${ROCKETRIDE_BUTTERBASE_API_KEY}"
84+
},
85+
"ui": {
86+
"position": {
87+
"x": 500,
88+
"y": 360
89+
},
90+
"nodeType": "default",
91+
"formDataValid": true
92+
},
93+
"control": [
94+
{
95+
"classType": "tool",
96+
"from": "agent_rocketride_1"
97+
}
98+
]
99+
},
100+
{
101+
"id": "response_answers_1",
102+
"provider": "response_answers",
103+
"name": "Return Answers",
104+
"config": {
105+
"laneName": "answers"
106+
},
107+
"ui": {
108+
"position": {
109+
"x": 460,
110+
"y": 200
111+
},
112+
"nodeType": "default",
113+
"formDataValid": true
114+
},
115+
"input": [
116+
{
117+
"lane": "answers",
118+
"from": "agent_rocketride_1"
119+
}
120+
]
121+
},
122+
{
123+
"id": "llm_anthropic_1",
124+
"provider": "llm_anthropic",
125+
"name": "Anthropic",
126+
"config": {
127+
"profile": "claude-sonnet-4-6",
128+
"claude-sonnet-4-6": {
129+
"apikey": "${ROCKETRIDE_ANTHROPIC_KEY}"
130+
},
131+
"parameters": {}
132+
},
133+
"ui": {
134+
"position": {
135+
"x": 80,
136+
"y": 360
137+
},
138+
"nodeType": "default",
139+
"formDataValid": true
140+
},
141+
"control": [
142+
{
143+
"classType": "llm",
144+
"from": "agent_rocketride_1"
145+
}
146+
]
147+
}
148+
],
149+
"project_id": "b5c8c9fa-a05d-4c9c-b7e0-fd250ee5b679",
150+
"version": 1,
151+
"isLocked": false,
152+
"snapToGrid": true,
153+
"snapGridSize": [
154+
10,
155+
10
156+
],
157+
"docRevision": 13
158+
}

0 commit comments

Comments
 (0)