Workflow
Integrates with Confluence via an MCP server using the same configuration pattern as Jira (base URL plus bearer token or email+API token), exposing Confluence tools to the agent.
Integrates with GitLab via an MCP server enabled with a base URL and token, exposing GitLab tools to the agent within the Studio workspace.
Integrates with Jira via an MCP server (enabled when a base URL plus either a bearer token or email+API token is configured), exposing Jira tools to the agent alongside the Product Studio chat and workflow workspaces.
Integrates with databases (including SQLite via --dialect sqlite with a file path) through the Database MCP server, providing tools to list/upsert/delete/test connections, list databases, schemas, tables and indexes, describe tables, list foreign keys, and request SQL that is queued for explicit approval before execution.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Workflowcreate a workflow that fetches Jira issues and saves them to SQL"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Product Studio
Local Product Owner workspace: a browser chat UI, your company OpenAI-compatible LLM (no Cursor), and optional MCP tools for Jira, Confluence, GitLab, Workflow, Database, and Solver.
Requirements
Node.js 22.13+
Access to your LLM endpoint
Optional: Jira / Confluence / GitLab — the app still runs if any are missing
Related MCP server: MCP OpenAPI Discovery
Install
npm install
npm run buildRun (chat UI)
npm start
# → http://127.0.0.1:8787Or:
npx tsx src/index.ts serve --port 8787Login / members
Access requires a Studio account (httpOnly session cookie). Passwords are stored as scrypt hashes in SQLite — never plaintext.
First admin (pick one):
Open the UI with no users → Create admin setup screen
Or CLI:
npx tsx src/index.ts user bootstrap --username admin --password "your-secure-password"Add a limited member (after admin exists):
npx tsx src/index.ts user create --username alice --password "alice-pass-here" --role limited
npx tsx src/index.ts user listOr in the UI: Settings → Members (admin only).
Role | Access |
admin | Everything + member management |
full | Chat, Workflows (create/edit/delete), Status, Settings integrations |
limited | Chat, run/view workflows + pauses, Status — no Settings, no workflow delete/disable/create |
Configure
Configs persist in SQLite (data/product-studio.sqlite).
In the UI: send /config and follow the menu.
CLI:
npx tsx src/index.ts config llm --base-url "https://your-llm/v1" --api-key "..." --model "..."
npx tsx src/index.ts config jira --base-url "..." --email "..." --api-token "..."
npx tsx src/index.ts config database --dialect sqlite --file-path data/app-data.sqlite --name default
npx tsx src/index.ts statusUI workspaces
Chat — agent conversation (
New chatkeeps past threads;/startclears only the current chat; last 20 messages are sent as context)Workflows — create, edit, run, and visualize HTTP/SQL sequences; approve pending SQL here
Settings — LLM / Jira / Confluence / GitLab / Database forms
Status — connection state and active MCP tools
Workflows
npx tsx src/index.ts workflow create --name "demo" --description "sample" --definition-file data/sample-workflow.json
npx tsx src/index.ts workflow visualize demoHTTP nodes support GET / POST / PUT / PATCH / DELETE with templated headers, query (object or query string), and body (JSON object or raw string). Body is not sent on GET/HEAD by default. Use {{nodeId.path}} and {{secrets.*}} in URL/headers/query/body. SQL nodes use type: "sql" (or "database") with arbitrary sql (and optional params / connectionId). Every SQL statement pauses for approval (including SELECT) until POST /api/approvals/:id/approve.
Return mapping (returns)
Optional top-level returns declares the Output shape of a successful run. Values are templates against node outputs ({{nodeId.path}}). A single template keeps the typed value; missing paths become null and are listed in meta.returnWarnings (set returnsStrict: true to fail instead).
When returns is present, MCP workflow_run / POST /api/workflows/:id/run include returns and omit full outputs unless you pass includeNodes: true (Studio Run always sets this for debugging). Workflows without returns keep the previous full-outputs response.
{
"nodes": [ /* ... */ ],
"returns": {
"response": "{{get_profile.body}}",
"token": "{{exchangeToken.body.access_token}}",
"userId": "{{profile.body.id}}"
}
}HTTP node outputs always include body (parsed JSON or raw text), plus status, ok, text, and response headers. Use {{nodeId.body}} for the full payload object, {{nodeId}} for the entire node bag, or {{nodeId.body.field}} for a leaf. Body object fields are also promoted to the top level for older templates ({{nodeId.field}}), except when they collide with envelope keys (body, status, ok, text, headers).
Example GET (query) and POST (JSON body + headers):
{
"nodes": [
{
"id": "listItems",
"type": "http",
"name": "List items",
"method": "GET",
"url": "https://httpbin.org/get",
"headers": { "Accept": "application/json" },
"query": { "page": "1", "q": "{{input.search}}" }
},
{
"id": "createItem",
"type": "http",
"name": "Create item",
"method": "POST",
"url": "https://httpbin.org/post",
"headers": {
"Content-Type": "application/json",
"Authorization": "Bearer {{secrets.jira.apiToken}}"
},
"body": { "title": "{{input.title}}", "from": "{{listItems.url}}" }
}
]
}Smoke-check HTTP request construction: npx tsx scripts/smoke-http-node.ts
Smoke-check workflow engine (transform, choice, parallel, auth): npm run smoke:workflow
Node cheat-sheet (extras)
Capability | Snippet |
Transform |
|
Choice input |
|
HTTP auth helper |
|
Parallel HTTP |
|
Approval |
|
Example SQL node:
{
"id": "q1",
"type": "sql",
"name": "list users",
"operation": "sql",
"sql": "SELECT id, email FROM users LIMIT 20",
"connectionId": "default"
}Approvals API: GET /api/approvals?status=pending, POST /api/approvals/:id/approve, POST /api/approvals/:id/reject.
MCP servers
Server | When enabled |
Jira | baseUrl + (bearer or email+apiToken) |
Confluence | same pattern |
GitLab | baseUrl + token |
Workflow | always |
Database | always (connections optional); schema inspect needs a connection |
Solver | when LLM is configured |
Database MCP tools (English names): database_list_connections, database_upsert_connection, database_delete_connection, database_test_connection, database_list_databases, database_list_schemas, database_list_tables, database_describe_table, database_list_indexes, database_list_foreign_keys, database_request_sql (queues approval), database_list_approvals.
This server cannot be deployed
Maintenance
Related MCP Connectors
Governed retail, FMCG, and CPG operational tools: runs, cases, approvals, audit-ready execution.
Run multi-step tasks in a real Chrome browser: persistent environments, live view, human takeover.
Human approvals, notifications, inbound webhooks, wake-ups for headless agents. Free trial: /try
Build, validate, deploy — HTTP APIs, cron jobs, webhooks and MCP tools — from your AI client.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables secure read-only access to MySQL databases through SELECT queries via HTTP SSE interface. Provides safe database exploration and data retrieval with configurable timeout settings.-
- AlicenseAqualityBmaintenanceDiscovers, inspects, and executes requests against OpenAPI or Swagger APIs directly from documentation URLs or specification files. It enables users to trace parameter usage across an API and perform authenticated HTTP requests through a structured toolset.8205MIT
- FlicenseNot gradedqualityDmaintenanceOrchestrates multiple MCP tool calls into sequential workflows with conditional logic, data transformation via JSONPath, and workflow templates.-
- AlicenseNot gradedqualityAmaintenanceEnables secure, controlled access to existing relational databases via MCP, with API key authorization, read/write permissions, table-level allow/deny lists, SQL validation, rate limiting, audit logging, and a web management console. Supports PostgreSQL, MySQL, SQLite, SQL Server, and Oracle.91MIT