diff --git a/examples/butterbase-agent.pipe b/examples/butterbase-agent.pipe new file mode 100644 index 000000000..da851a103 --- /dev/null +++ b/examples/butterbase-agent.pipe @@ -0,0 +1,158 @@ +{ + "components": [ + { + "id": "chat_1", + "provider": "chat", + "name": "Chat", + "config": { + "hideForm": true, + "mode": "Source", + "parameters": {}, + "type": "chat" + }, + "ui": { + "position": { + "x": 20, + "y": 200 + }, + "nodeType": "default", + "formDataValid": true + } + }, + { + "id": "agent_rocketride_1", + "provider": "agent_rocketride", + "name": "RocketRide Wave", + "config": { + "instructions": [ + "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.", + "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.", + "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\".", + "When you build a frontend for the app: use the ABSOLUTE data API base https://api.butterbase.ai/v1/, and the auth base https://api.butterbase.ai/auth/ 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.", + "Inspect available butterbase tools before acting, prefer dry-run/preview where offered, and confirm destructive changes." + ], + "max_waves": 20, + "parameters": {} + }, + "ui": { + "position": { + "x": 240, + "y": 200 + }, + "nodeType": "default", + "formDataValid": true + }, + "input": [ + { + "lane": "questions", + "from": "chat_1" + } + ] + }, + { + "id": "memory_internal_1", + "provider": "memory_internal", + "name": "Memory (Internal)", + "config": { + "type": "memory_internal" + }, + "ui": { + "position": { + "x": 300, + "y": 360 + }, + "nodeType": "default", + "formDataValid": true + }, + "control": [ + { + "classType": "memory", + "from": "agent_rocketride_1" + } + ] + }, + { + "id": "tool_butterbase_1", + "provider": "tool_butterbase", + "name": "Butterbase MCP Client", + "config": { + "type": "tool_butterbase", + "transport": "streamable-http", + "endpoint": "https://api.butterbase.ai/mcp", + "serverName": "butterbase", + "bearer": "${ROCKETRIDE_BUTTERBASE_API_KEY}" + }, + "ui": { + "position": { + "x": 500, + "y": 360 + }, + "nodeType": "default", + "formDataValid": true + }, + "control": [ + { + "classType": "tool", + "from": "agent_rocketride_1" + } + ] + }, + { + "id": "response_answers_1", + "provider": "response_answers", + "name": "Return Answers", + "config": { + "laneName": "answers" + }, + "ui": { + "position": { + "x": 460, + "y": 200 + }, + "nodeType": "default", + "formDataValid": true + }, + "input": [ + { + "lane": "answers", + "from": "agent_rocketride_1" + } + ] + }, + { + "id": "llm_anthropic_1", + "provider": "llm_anthropic", + "name": "Anthropic", + "config": { + "profile": "claude-sonnet-4-6", + "claude-sonnet-4-6": { + "apikey": "${ROCKETRIDE_ANTHROPIC_KEY}" + }, + "parameters": {} + }, + "ui": { + "position": { + "x": 80, + "y": 360 + }, + "nodeType": "default", + "formDataValid": true + }, + "control": [ + { + "classType": "llm", + "from": "agent_rocketride_1" + } + ] + } + ], + "project_id": "b5c8c9fa-a05d-4c9c-b7e0-fd250ee5b679", + "version": 1, + "isLocked": false, + "snapToGrid": true, + "snapGridSize": [ + 10, + 10 + ], + "docRevision": 13 +} \ No newline at end of file diff --git a/nodes/src/nodes/tool_mcp_client/butterbase.svg b/nodes/src/nodes/tool_mcp_client/butterbase.svg new file mode 100644 index 000000000..b031f5385 --- /dev/null +++ b/nodes/src/nodes/tool_mcp_client/butterbase.svg @@ -0,0 +1 @@ +Butterbase diff --git a/nodes/src/nodes/tool_mcp_client/services.butterbase.json b/nodes/src/nodes/tool_mcp_client/services.butterbase.json new file mode 100644 index 000000000..83b3771cf --- /dev/null +++ b/nodes/src/nodes/tool_mcp_client/services.butterbase.json @@ -0,0 +1,121 @@ +{ + // + // Required: + // The displayable name of this node + // + "title": "Butterbase MCP Client", + // + // Required: + // The protocol is the endpoint protocol + // + "protocol": "tool_butterbase://", + // + // Required: + // Class type of the node - what it does + // + "classType": ["tool"], + // + // Required: + // Capabilities are flags that change the behavior of the underlying engine + // + "capabilities": ["invoke"], + // + // Optional: + // Register is either filter, endpoint or ignored if not specified + // + "register": "filter", + // + // Optional: + // The node is the actual physical node to instantiate + // + "node": "python", + // + // Optional: + // Reuses the generic MCP client implementation — this is a branded preset, + // not a separate node (no duplicated code). + // + "path": "nodes.tool_mcp_client", + // + // Required: + // The prefix map when converting URLs <=> paths (tools surface as .) + // + "prefix": "butterbase", + // + // Optional: + // The icon to display in the UI for this node (a URL renders via ) + // + "icon": "butterbase.svg", + "documentation": "https://docs.butterbase.ai", + // + // Optional: + // Description of this node shown in the pipeline builder + // + "description": ["Connects to the Butterbase MCP server and exposes its backend tools for agent tool-calling.", "Butterbase is an AI-optimized Backend-as-a-Service (managed database, authentication, object storage, serverless functions, RAG). The agent can create apps, evolve schemas, configure auth, deploy functions, and more — as tools named butterbase..", "This is a branded preset of the generic MCP Client (Streamable HTTP), so it shares the same implementation. Prerequisite: enable Developer Mode on your Butterbase app so the agent can create/modify resources."], + // + // Optional: + // Rendering hints for the UI: which config fields to surface on the node tile + // + "tile": ["Server: ${parameters.mcp_client.serverName}"], + // + // Optional: + // As a pipe component, define what this component takes and produces. + // This is a control-plane tool node (no data lanes). + // + "lanes": {}, + // + // Optional: + // Profile section - configuration options used by the driver itself. + // The default profile pins the Butterbase Streamable HTTP endpoint. + // + "preconfig": { + "default": "butterbase", + "profiles": { + "butterbase": { + "title": "Butterbase MCP server", + "serverName": "butterbase", + "transport": "streamable-http", + "endpoint": "https://api.butterbase.ai/mcp" + } + } + }, + // + // Optional: + // Local field definitions. These define the config fields exposed in the UI. + // "secure: true" fields are encrypted at rest and masked in the UI. + // + "fields": { + "mcp_client.bearer": { + "type": "string", + "title": "API Key", + "description": "Butterbase API key (bb_sk_...). Create one in the Butterbase dashboard: dashboard.butterbase.ai → API Keys. Sent as an Authorization Bearer token.", + "default": "", + "secure": true, + "ui": { + "ui:widget": "ApiKeyWidget" + } + }, + "mcp_client.endpoint": { + "type": "string", + "title": "Endpoint", + "description": "Butterbase MCP Streamable HTTP endpoint. Defaults to the production server.", + "default": "https://api.butterbase.ai/mcp" + }, + "mcp_client.serverName": { + "type": "string", + "title": "Server name", + "description": "Namespace prefix for the discovered tools: . (example: butterbase.init_app).", + "default": "butterbase" + } + }, + // + // Required: + // Defines the fields (shape) shown in the pipeline builder side panel. + // + "shape": [ + { + "section": "Pipe", + "title": "Butterbase MCP Client", + "properties": ["type", "mcp_client.bearer", "mcp_client.endpoint", "mcp_client.serverName"] + } + ] +}