# What is Jinba?
Source: https://carnot.mintlify.app/en/introduction
Build, run, and deploy AI-powered workflows with natural language
Jinba is a platform that enables you to build, run, and deploy reusable business workflows with AI—all in one seamless experience.
Jinba consists of three products:
***
## Jinba Flow
Jinba Flow lets you design and build workflows. Generate flows automatically through chat, then visually review and edit them with an intuitive flowchart interface. Workflows can be published as APIs or batch processes for easy reuse.
Detailed features of Jinba Flow, workflow automation in 3 steps, and use cases
***
## Jinba App
Jinba App is the product for invoking and executing your created workflows and external services. Execute via chat, with auto-generated input forms (UI) when needed, providing a safe execution experience even for non-engineers.
Through MCP (Model Context Protocol), AI can access workflows built in Jinba Flow and external services to achieve user goals.
Learn about Jinba App's screen layout, main features, and how to use MCP
Its successor, **Jinba App Neo** Beta, is also available — an agent-centric AI platform built on Anthropic's Claude. Create an agent per use case, attach skills, connectors, and knowledge to it, and put it to work through chat.
Agents, skills, connectors, knowledge, and memory in the next-generation Jinba App
***
## Jinba Toolbox Beta
Jinba Toolbox is a centralized tool management and execution platform for AI agents. Register, version, and share tools across your organization, then execute them in isolated sandbox environments.
Learn about Jinba Toolbox's centralized registry, sandbox execution, and AI integration
# Execution Model
Source: https://carnot.mintlify.app/en/pages/architecture/execution-model
How workflows execute from trigger to completion
Understanding the execution model helps you design reliable workflows and debug issues effectively.
## Build Time vs Run Time
Workflows have two distinct phases:
Design your workflow in the editor. Define steps, configure tools, and set up dependencies.
The runner interprets and executes the manifest. Steps run in dependency order as data flows through.
## Execution Timeline
When a workflow runs, it follows this timeline:
Execution begins via API call, schedule, MCP, or manual run
Input parameters validated, manifest loaded
Steps run according to dependency graph
Errors caught, retries attempted if configured
Final result returned to caller
## Step Execution Patterns
Steps with dependencies run one after another
Independent steps run simultaneously
Steps run only when `when` condition is true
Steps repeat for each item via `forEach`
### Sequential Execution
Steps with `needs` wait for their dependencies:
```yaml theme={null}
steps:
- id: step_a
tool: TOOL_A
- id: step_b
tool: TOOL_B
needs: [step_a] # Waits for step_a
- id: step_c
tool: TOOL_C
needs: [step_b] # Waits for step_b
```
**Execution order:** `step_a` → `step_b` → `step_c`
### Parallel Execution
Steps without shared dependencies run in parallel:
```yaml theme={null}
steps:
- id: input
tool: INPUT_TEXT
- id: branch_a
tool: TOOL_A
needs: [input]
- id: branch_b
tool: TOOL_B
needs: [input] # Runs parallel with branch_a
- id: merge
tool: TOOL_C
needs: [branch_a, branch_b] # Waits for both
```
**Execution order:** `input` → (`branch_a` ∥ `branch_b`) → `merge`
### Conditional Execution
Use `when` for conditional logic:
```yaml theme={null}
steps:
- id: classify
tool: GEMINI_CHAT
input:
- name: prompt
value: "Classify as 'urgent' or 'normal': {{inputs.message}}"
- id: urgent_handler
tool: SLACK_POST_MESSAGE
needs: [classify]
when: "'{{steps.classify.result.content}}' == 'urgent'"
input:
- name: message
value: "URGENT: {{inputs.message}}"
- id: normal_handler
tool: GMAIL_SEND
needs: [classify]
when: "'{{steps.classify.result.content}}' == 'normal'"
input:
- name: body
value: "{{inputs.message}}"
```
Only one handler executes based on the classification result.
### Loop Execution (forEach)
Process collections with `forEach`:
```yaml theme={null}
steps:
- id: get_items
tool: INPUT_JSON
input:
- name: value
value: '[{"name": "Alice"}, {"name": "Bob"}, {"name": "Carol"}]'
- id: greet_each
tool: GEMINI_CHAT
forEach: "{{steps.get_items.result}}"
needs: [get_items]
input:
- name: prompt
value: "Write a greeting for {{item.name}}"
```
The step executes once for each item in the collection.
## Failure Modes
| Failure Type | Cause | Handling |
| - | - | - |
| **Validation Error** | Invalid input parameters or manifest | Execution stops immediately |
| **Tool Error** | External service failure or timeout | Step marked failed |
| **Timeout Error** | Step exceeds configured time limit | Step terminated |
| **Dependency Error** | Required step failed | Dependent steps skipped |
| **Condition Error** | Invalid `when` expression | Step skipped with warning |
## Step Status States
Each step transitions through these states:
| Status | Description |
| - | - |
| **Pending** | Waiting for dependencies to complete |
| **Running** | Currently executing |
| **Success** | Completed successfully |
| **Failed** | Execution failed with error |
| **Skipped** | Condition not met or dependency failed |
## Variable Resolution
Variables are resolved at execution time:
| Pattern | Resolved To |
| - | - |
| `{{inputs.name}}` | Input parameter value |
| `{{steps.step_id.result}}` | Full result of completed step |
| `{{steps.step_id.result.field}}` | Specific field from step result |
| `{{secrets.KEY_NAME}}` | Credential from workspace secrets |
| `{{item}}` | Current item in forEach loop |
| `{{item.field}}` | Field from current loop item |
## Error Handling Best Practices
1. **Validate Early**: Use INPUT\_\* tools to validate data at the start
2. **Check Outputs**: Add validation steps after critical operations
3. **Use Conditions**: Handle different outcomes with `when` clauses
4. **Design for Failure**: Consider what happens when external services fail
5. **Review History**: Use execution history to analyze failures
## Debugging Tips
| Issue | Solution |
| - | - |
| Step not running | Check `needs` dependencies are satisfied |
| Wrong data | Verify variable reference syntax |
| Condition not working | Test `when` expression with actual values |
| Loop not iterating | Ensure `forEach` target is an array |
| Timeout | Increase step timeout or optimize logic |
## What's Next?
Learn debugging techniques
Complete manifest syntax reference
# System Architecture
Source: https://carnot.mintlify.app/en/pages/architecture/system-architecture
How Jinba Flow components work together
Jinba Flow consists of four main components that work together to enable workflow automation.
## Component Overview
Visual interface for creating workflows using Chat, Graph, or YAML
YAML representation of your workflow definition
Execution engine that processes manifests and runs steps
External interfaces for triggering and integrating workflows
## Data Flow
```mermaid theme={null}
flowchart LR
Editor["Editor
(Design)"] --> Manifest["Manifest
(YAML)"]
Manifest --> Runner["Runner
(Execute)"]
Runner --> API["API / MCP
(Deploy)"]
API -.->|Feedback Loop| Editor
```
## Component Details
### 1. Flow Editor (Design Time)
The Flow Editor provides three methods to create workflows:
| Method | Interface | Best For |
| - | - | - |
| **Chat Panel** | Natural language | Quick prototyping, non-technical users |
| **Graph Editor** | Visual drag-and-drop | Understanding flow structure |
| **YAML Panel** | Direct code editing | Precise control, version control |
All three methods produce the same output: a **Manifest**.
### 2. Manifest (Bridge)
The Manifest is a YAML document that defines your workflow:
```yaml theme={null}
steps:
- id: step_id
tool: TOOL_NAME
input:
- name: param
value: "{{reference}}"
needs: [dependency_step]
when: "condition"
forEach: "{{collection}}"
```
| Field | Purpose |
| - | - |
| `id` | Unique identifier for the step |
| `tool` | The tool to execute |
| `input` | Parameters passed to the tool |
| `needs` | Dependencies on other steps |
| `when` | Conditional execution |
| `forEach` | Loop over a collection |
### 3. Runner (Execution Time)
The Runner interprets manifests and executes workflows:
Load and validate the manifest YAML
Build dependency graph from `needs` fields
Run steps in topological order, parallelizing when possible
Manage errors, retries, and conditional skips
Collect results and return to caller
**Key Capabilities:**
* Parallel execution of independent steps
* Variable resolution (`{{steps.*.result}}`)
* Credential injection from workspace secrets
* Timeout and retry management
### 4. API / MCP (Deployment)
Published workflows expose two integration interfaces:
| Interface | Endpoint | Use Case |
| - | - | - |
| **REST API** | `POST /api/v2/external/flows/{flowId}/published-run` | Programmatic integration |
| **MCP Server** | Model Context Protocol | AI agent tools |
**Authentication:**
* API Key required for all external calls
* Keys scoped to workspace
* Rate limiting applied
## Execution Flow
API call, schedule, MCP invocation, or manual run starts execution
Runner loads the published manifest version
Input parameters validated against defined schema
Steps run according to dependency graph
Results returned via API response or MCP result
## Security Boundaries
| Boundary | Protection |
| - | - |
| **Editor → Manifest** | Schema validation prevents invalid YAML |
| **API → Runner** | API key authentication required |
| **Runner → Tools** | Credential isolation per workspace |
| **Runner → External** | Secure sandbox execution environment |
## Workspace Isolation
Each workspace maintains:
* **Credentials**: API keys and OAuth tokens
* **Flows**: Workflow definitions
* **Versions**: Published snapshots
* **Execution History**: Run logs and artifacts
Workspaces are completely isolated from each other.
## What's Next?
Deep dive into how steps execute
Learn about API endpoints
# API
Source: https://carnot.mintlify.app/en/pages/basics/api
Learn how to call your published workflows via API
## Overview
Jinba Flow provides REST API endpoints that allow you to execute published workflows programmatically. Once a workflow is published, you can call it from external systems, webhooks, or any application that can make HTTP requests.
## API Access
### Prerequisites
To use the API, you need:
1. **Published Workflow**: The workflow must be published (see [Publish](/en/pages/basics/publish))
2. **API Key**: An API key is automatically generated when you publish a workflow
3. **Authentication**: Use the API key in the Authorization header
### API Endpoints
#### Run Published Workflow
**Endpoint**: `POST /api/v2/external/flows/{flowId}/published-run`
**Authentication**: Bearer token (API key)
**Request Body**:
```json theme={null}
{
"args": [
{
"name": "input1",
"value": "example value"
}
],
"mode": "sync" // or "async"
}
```
**Response**: Workflow execution result
## Authentication
### API Keys
When you publish a workflow, an API key is automatically generated:
* **Automatic Generation**: Created when you first publish
* **Flow-Scoped**: Each workflow has its own API key
* **Secure Storage**: Keys are stored securely in your workspace
* **Viewing Keys**: Access keys from workflow settings
### Using API Keys
Include your API key in the Authorization header:
```bash theme={null}
Authorization: Bearer YOUR_API_KEY
```
**Security Best Practices**:
* Never share API keys publicly
* Store keys securely in environment variables
* Rotate keys regularly if compromised
* Use different keys for different environments
## Calling Workflows via API
### Synchronous Execution
Synchronous execution waits for the workflow to complete before returning:
```bash theme={null}
curl -X POST https://api.jinba.dev/api/v2/external/flows/{flow-id}/published-run \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"args": [
{"name": "input1", "value": "example"}
],
"mode": "sync"
}'
```
**Characteristics**:
* **Blocking**: Request waits for completion
* **Immediate Response**: Returns result when workflow finishes
* **Timeout**: May timeout for long-running workflows
* **Use Case**: When you need immediate results
### Asynchronous Execution
Asynchronous execution returns immediately and runs the workflow in the background:
```bash theme={null}
curl -X POST https://api.jinba.dev/api/v2/external/flows/{flow-id}/published-run \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"args": [
{"name": "input1", "value": "example"}
],
"mode": "async"
}'
```
**Characteristics**:
* **Non-Blocking**: Returns immediately with run ID
* **Background Execution**: Workflow runs asynchronously
* **Status Check**: Use run ID to check status later
* **Use Case**: For long-running workflows or fire-and-forget scenarios
## Input Arguments
### Argument Format
Arguments are passed as an array of name-value pairs:
```json theme={null}
{
"args": [
{
"name": "parameter_name",
"value": "parameter_value"
}
]
}
```
### Argument Types
Arguments can be:
* **Strings**: Text values
* **Numbers**: Numeric values
* **Booleans**: True/false values
* **Objects**: Complex nested data structures
* **Arrays**: Lists of values
### Example Arguments
```json theme={null}
{
"args": [
{
"name": "email",
"value": "user@example.com"
},
{
"name": "count",
"value": 10
},
{
"name": "options",
"value": {
"includeMetadata": true,
"format": "json"
}
}
]
}
```
## Response Format
### Success Response
```json theme={null}
{
"status": "success",
"result": {
// Workflow output
},
"stepOutputs": {
"step_1": {
"status": "success",
"result": {}
}
}
}
```
### Error Response
```json theme={null}
{
"status": "failed",
"error": {
"name": "ErrorType",
"value": "Error message",
"traceback": "Stack trace"
},
"stepOutputs": {
"step_1": {
"status": "failed",
"error": {
"name": "StepError",
"value": "Step error message"
}
}
}
}
```
## API Usage Examples
### Python Example
```python theme={null}
import requests
url = "https://api.jinba.dev/api/v2/external/flows/{flow-id}/published-run"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
data = {
"args": [
{"name": "input1", "value": "example"}
],
"mode": "sync"
}
response = requests.post(url, headers=headers, json=data)
result = response.json()
print(result)
```
### JavaScript/Node.js Example
```javascript theme={null}
const fetch = require('node-fetch');
const url = 'https://api.jinba.dev/api/v2/external/flows/{flow-id}/published-run';
const headers = {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
};
const body = {
args: [
{ name: 'input1', value: 'example' }
],
mode: 'sync'
};
fetch(url, {
method: 'POST',
headers: headers,
body: JSON.stringify(body)
})
.then(res => res.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
```
### Webhook Integration
You can call workflows from webhooks:
```bash theme={null}
# Example webhook payload
curl -X POST https://api.jinba.dev/api/v2/external/flows/{flow-id}/published-run \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"args": [
{"name": "webhook_data", "value": "{\"event\": \"user_signup\", \"user_id\": 123}"}
]
}'
```
## Error Handling
### Common Errors
#### 401 Unauthorized
**Cause**: Invalid or missing API key
**Solution**: Verify your API key is correct and included in the Authorization header
#### 404 Not Found
**Cause**: Workflow not found or not published
**Solution**:
* Verify the workflow ID is correct
* Ensure the workflow is published
* Check that the workflow is not archived
#### 403 Forbidden
**Cause**: API key doesn't have access to this workflow
**Solution**: Verify the API key is scoped to the correct workflow or workspace
#### 400 Bad Request
**Cause**: Invalid request format or missing required arguments
**Solution**:
* Check request body format
* Verify all required arguments are provided
* Validate argument types match workflow expectations
### Retry Logic
For production applications, implement retry logic:
```python theme={null}
import time
import requests
def call_workflow_with_retry(url, headers, data, max_retries=3):
for attempt in range(max_retries):
try:
response = requests.post(url, headers=headers, json=data, timeout=30)
if response.status_code == 200:
return response.json()
elif response.status_code == 429: # Rate limit
time.sleep(2 ** attempt) # Exponential backoff
continue
else:
response.raise_for_status()
except requests.exceptions.RequestException as e:
if attempt == max_retries - 1:
raise
time.sleep(2 ** attempt)
return None
```
## Rate Limiting
API requests may be subject to rate limiting:
* **Rate Limits**: Limits may apply based on your subscription plan
* **429 Status**: Returns 429 Too Many Requests when limit exceeded
* **Retry-After**: Header indicates when to retry
* **Best Practice**: Implement exponential backoff for retries
## API Key Management
### Viewing API Keys
1. Open your published workflow
2. Navigate to workflow settings
3. Go to **API** or **Publish Settings** section
4. View your API key
### Regenerating API Keys
If your API key is compromised:
1. Go to workflow settings
2. Navigate to API section
3. Regenerate the API key
4. Update all applications using the old key
**Important**: Regenerating a key invalidates the old key immediately.
## Best Practices
1. **Use Environment Variables**: Store API keys in environment variables, not in code
2. **Error Handling**: Implement proper error handling and retry logic
3. **Timeout Configuration**: Set appropriate timeouts for API calls
4. **Logging**: Log API calls for debugging and monitoring
5. **Security**: Never commit API keys to version control
6. **Async for Long Tasks**: Use async mode for long-running workflows
7. **Input Validation**: Validate inputs before sending to API
## Related Features
* [Publish](/en/pages/basics/publish) - Learn about publishing workflows
* [Scheduling](/en/pages/basics/scheduling) - Learn about scheduling workflows
* [Workspace](/en/pages/basics/workspace) - Learn about workspace management
# Archive Feature
Source: https://carnot.mintlify.app/en/pages/basics/archive
How to archive and restore flows
# Archive Feature
The archive feature allows you to hide flows that are no longer needed without deleting them permanently. Archived flows can be restored within 30 days, so you don't have to worry about accidental deletion.
## What is Archive
Archive is a "soft delete" feature for flows. Instead of permanently deleting a flow, it temporarily hides it so you can restore it if needed later.
### Characteristics of Archived Flows
* **Cannot edit**: Flows cannot be edited while archived
* **Cannot run**: Flow execution is disabled while archived
* **Can view**: Flow contents can still be viewed
* **Restorable**: Can be restored to its original state within 30 days
### What Happens When You Archive
* **Removed from MCP**: If registered as an MCP tool, it will be automatically removed
* **Unpublished**: Published flows will be unpublished
### Permanent Deletion After 30 Days
Archived flows are **permanently deleted after 30 days**. Please note that restoration is not possible after permanent deletion.
## Archiving a Flow
1. Find the flow you want to archive in the flow list
2. Click the menu (...) in the top right of the flow card
3. Select "Archive"
4. Click "Archive" in the confirmation dialog
You can also archive multiple flows at once:
1. Select the checkboxes of the flows you want to archive
2. Click "Delete" from the bulk action menu that appears at the top
3. Click "Archive" in the confirmation dialog
## Viewing Archived Flows
Archived flows are not displayed in the list by default. To view them:
1. Click the filter button on the flow list page
2. Check "Include archived" in the "Archived" section
3. Archived flows will appear in the list
Archived flows are displayed with an "Archived" badge.
## Restoring a Flow
To restore an archived flow:
1. Enable "Include archived" in the filter
2. Find the flow you want to restore
3. Select "Restore" from the flow card menu
The restored flow becomes editable and executable again. However, MCP registration and published status removed during archiving are not automatically restored, so you'll need to reconfigure them if needed.
## Important Notes
* Archiving unpublishes the flow and removes MCP registration
* Scheduled executions are also stopped
* **Permanently deleted after 30 days** - restore needed flows before the deadline
* Restoration is not possible after permanent deletion
# Method 1: Chat Panel
Source: https://carnot.mintlify.app/en/pages/basics/chat
Create flows using the Jinba Copilot through natural language conversation. If you need help creating or editing your flow, you can use the Jinba Copilot to help. It can help you make edits based on your conversation, and if tools require you to set up API keys or credentials from other services, it will also alert you.
## How It Works
The Jinba Copilot uses natural language processing to understand your requirements and automatically generates the appropriate flow structure. Simply describe what you want to accomplish, and the copilot will:
* Suggest appropriate tools and configurations
* Create the necessary manifest structure
* Help you set up API keys and credentials
* Guide you through the process step by step
## Step-by-Step Process
### 1. Generate Your Workflow
**Jinba Flow uses AI to generate workflows from scratch**. Simply:
* Go to the chat input screen on the main page
* Enter your requirements in natural language
* The AI will automatically start generating your workflow
The chat screen also includes several sample templates to help you get started. For example, you can try creating a Gmail draft workflow.
### 2. Review and Accept Changes
When the workflow generation is complete, you'll see a screen asking you to accept the changes. Click **"Accept Changes"** to proceed.
### 3. Configure Details
Once the workflow is generated, you can:
* Click on each module to access detailed settings
* Modify content, email addresses, or other parameters
* Select your Google account (if you set up OAuth in step 1)
### 4. Execute Your Workflow
After configuring the details:
* Click the **"Execute"** button in the top right
* The system will automatically process your workflow
* Results will appear in the bottom right corner
### 5. View Results
Once execution is complete, you can see the actual results. For example, if you created a Gmail draft, you'll find the email saved in your Gmail drafts folder.
## Getting Started
1. Open the chat interface in your Jinba Flow editor
2. Describe your workflow in natural language
3. Follow the copilot's suggestions and prompts
4. Review and refine the generated flow
5. Test and iterate as needed
This method is perfect for beginners or when you want to quickly prototype ideas without diving into technical details.
# CLI
Source: https://carnot.mintlify.app/en/pages/basics/cli
Install the Jinba CLI and operate Jinba Flow from your terminal
## Overview
The Jinba CLI (`jinba`) is the official command-line interface for Jinba. It lets you call the Jinba Flow API from your terminal — list workspaces, create and update flows, upload files, and more — without writing HTTP requests by hand.
## Installation
### Requirements
* Node.js 20 or later
### Install
The CLI is published to npm as a public package. Install it globally:
```bash theme={null}
npm install -g @jinba/cli
```
### Verify the installation
```bash theme={null}
jinba --version
jinba --help
```
### Update
```bash theme={null}
npm install -g @jinba/cli@latest
```
When a newer version is available, the CLI also prints an update notice in interactive terminal sessions. Older versions may eventually stop being supported; in that case the API asks you to upgrade with the same command.
## Authentication
Most API commands require a Jinba user API key. Run any API command and the CLI will prompt for the key if one has not been saved yet:
```bash theme={null}
jinba flow api workspace list
```
Get your key from your [profile page](https://flow.jinba.io/profile). The key is stored locally at `~/.config/jinba/config.json`. To remove the saved key:
```bash theme={null}
jinba logout
```
You can also configure the CLI via environment variables — useful in CI:
| Variable | Purpose |
| - | - |
| `JINBAFLOW_API_KEY` | API key to use instead of the saved one |
| `JINBAFLOW_API_BASE_URL` | Override the API base URL |
| `JINBAFLOW_DISABLE_UPDATE_CHECK` | Disable the update notice |
## Usage
Commands follow this pattern:
```bash theme={null}
jinba flow api [options]
```
Examples:
```bash theme={null}
jinba flow api workspace list
jinba flow api flow create --workspace-id ws_123 --name "My Flow" --description "Example description"
jinba flow api flow create --workspace-id ws_123 --stdin < payload.json
jinba flow api workspace archive --workspace-id ws_123 --dry-run
jinba flow api file upload --workspace-id ws_123 --file ./report.pdf
```
Every command includes help:
```bash theme={null}
jinba flow api flow create --help
```
## Notes
* Path parameters can be passed as positional arguments or as flags such as `--workspace-id`.
* `--stdin` reads a JSON object and merges it with explicit flags.
* Mutating commands support `--dry-run` and automatically send an `Idempotency-Key`.
* Destructive commands (archive, delete, revoke, etc.) prompt for confirmation by default; pass `--yes` or `--force` to skip it.
* File upload commands accept a local file path (e.g. `--file ./report.pdf`); the CLI infers the content type from the extension.
# Core Concepts
Source: https://carnot.mintlify.app/en/pages/basics/core-concepts
Essential terminology and concepts for understanding Jinba Flow
Understanding these core concepts will help you build effective workflows in Jinba Flow.
## Key Terms
| Term | Definition | Example |
| - | - | - |
| **Flow** | A workflow that connects multiple Steps with dependencies | Email received → AI summarizes → Slack notification. This refers to the entire sequence of processing. |
| **Step** | An individual unit of processing that makes up a Flow | Each individual process like receiving email, AI summarization, Slack notification. |
| **Tool** | A component that performs a specific action | AI models, API integrations, file processing |
| **Secrets** | Securely stored sensitive values | API keys, OAuth tokens |
| **Workspace** | A space to organize your Flows, Secrets, and team resources | Project workspace |
The diagram below shows how these concepts relate to each other:
* A single **Workspace** can be shared by multiple **Accounts**, and one Account can belong to several Workspaces.
* Each Workspace contains one or more **Flows**, and every Flow is composed of ordered **Steps**.
* Each Step implements its functionality through exactly one **Tool**.
* **Secrets** live at the Workspace level, but the same Secret can be reused across multiple Flows and Steps inside that Workspace.
* Secrets are how Steps reach **External Services** (APIs, OAuth integrations) without exposing credentials in flow definitions.
## What's Next?
Learn about the three ways to create workflows
Create workflows using natural language
# Credit Costs
Source: https://carnot.mintlify.app/en/pages/basics/credit-costs
Understand the credit costs for different tools in Jinba Flow
## Overview
Jinba Flow uses two types of credits: **Jinba Credits** and **Copilot Credits**. Each credit type serves different purposes and has different reset periods.
> Note: Credits and subscription tiers are managed at the **organization** level.
> All members of an organization share the same subscription plan and pooled credits.
### At a Glance
* Some tools consume **Jinba Credits** when you run them.
* For tools that support it, you can **bring your own API key** to skip Jinba Credit consumption.
* The **required credits** for Jinba-enabled tools are shown as a badge on the tool configuration page.
## Credit Types
### Jinba Credits
**Jinba Credits** are used for executing tools in workflows. They allow you to use Jinba's API keys without needing your own credentials. Credits are pooled per organization.
* **Reset Period**: Monthly (resets on subscription renewal or every 30 days for enterprise users)
* **Usage**: Deducted when running workflow tools like AI models, search APIs, and data processing services
* **Cost Variation**: Tools are priced in one of three ways — a flat cost per run, per-token metering, or a price computed from the media the run produces
* **Custom API Key Bypass**: You can provide your own API keys to bypass credit charges for certain tools
* **Subscription Limits**:
* Free: 1,000 credits/month
* Standard: 8,000 credits/month
* Professional: 100,000 credits/month
* Enterprise: Unlimited
### Copilot Credits
**Copilot Credits** are used for AI assistance features and copilot functionality, such as generating step descriptions, summaries, and metadata. Credits are pooled per organization.
* **Reset Period**: Daily (resets every day at midnight)
* **Usage**: Deducted when using copilot features (1 credit per request)
* **Cost**: 1 credit per copilot request
* **Subscription Limits**:
* Free: 100 credits/day
* Standard: 300 credits/day
* Professional: 500 credits/day
* Enterprise: Unlimited
## Jinba Credit Cost Structure
Tools are priced in one of three ways: **per token** for the LLM tools,
**per unit of media produced** for image and video generation, and a **flat
cost per run** for everything else. The credits a tool requires are shown as
a badge on its configuration page.
### Per-Token Pricing (LLM Tools)
These tools are billed from the tokens a run actually uses:
* **OPENAI\_INVOKE** / **OPENAI\_INVOKE\_WITH\_FILE**
* **ANTHROPIC\_INVOKE** / **ANTHROPIC\_INVOKE\_WITH\_FILE**
* **GEMINI\_INVOKE** / **GEMINI\_INVOKE\_WITH\_FILE** / **GEMINI\_INVOKE\_WITH\_IMAGE**
* **GROK\_CHAT**
* **OPENAI\_DEEP\_RESEARCH**
* **WORD\_TEMPLATE\_GENERATE**
* **ANTHROPIC\_AGENT**
* **BROWSER\_USE\_SANDBOX\_RUN\_TASK**
**How it works:**
1. The cost is calculated from the model you select and the tokens the run reports — input, output, and, on models that support prompt caching, cached reads and cache writes at their own rates.
2. Before the step runs, a **reservation** is held against your balance, so a run cannot start unless you can cover it. When the step finishes, the reservation is replaced by the real cost, which is usually lower.
3. Each tool has a **fallback charge**. It is the least a step settles at when
a run reports no token usage at all, or when the model it ran has no
published rate. It is also a *lower* bound on the reservation in step 2 —
several tools hold considerably more than their fallback before they
start, so read the reservation table below, not this one, to know what
balance a run needs.
| Tool | Fallback charge |
| - | - |
| **GEMINI\_INVOKE** / **\_WITH\_FILE** / **\_WITH\_IMAGE** | 20 credits |
| **ANTHROPIC\_INVOKE** / **\_WITH\_FILE** | 20 credits |
| **OPENAI\_INVOKE** / **\_WITH\_FILE** | 20 credits |
| **GROK\_CHAT** | 20 credits |
| **OPENAI\_DEEP\_RESEARCH** | 60 credits |
| **WORD\_TEMPLATE\_GENERATE** | 60 credits |
| **BROWSER\_USE\_SANDBOX\_RUN\_TASK** | 160 credits |
| **ANTHROPIC\_AGENT** | 300 credits |
A run that does report tokens on a priced model settles at its actual token
cost, with no floor applied — usually well below the fallback. A short
`GEMINI_INVOKE` on `gemini-flash-latest` at roughly 1,500 input and 750 output
tokens settles at **1 credit**, not 20. Long contexts, long answers and
multi-step agent runs cost proportionally more, and can run well above the
fallback.
#### What a run holds before it starts
Four tools can consume far more than their fallback, so they reserve a
realistic — or worst-case — figure up front rather than the fallback. This is
the balance the run needs to *start*; the reservation is released and replaced
by the actual token cost when the step finishes, which is normally much lower.
| Tool | Held to start |
| - | - |
| **OPENAI\_DEEP\_RESEARCH** | **1,280** on `o4-mini-deep-research` (the default), **6,400** on `o3-deep-research` |
| **BROWSER\_USE\_SANDBOX\_RUN\_TASK** | Scales with `max_steps`: **160** at the 20-step default, up to **3,072** at the 100-step maximum |
| **WORD\_TEMPLATE\_GENERATE** | **276** — sized from the tool's own 16,000-token output limit |
| **GROK\_CHAT** | **96** on the default `grok-4.3`, **180** on `grok-4.5` |
Every other tool in the table above reserves close to its fallback.
A run that cannot cover its reservation fails to start with an
insufficient-credits error, even when the work itself would have cost far
less than the amount held.
### Media Generation Pricing
These tools produce no tokens, so they are priced from what they generate.
The cost is fully determined by the step's settings, which means you can work
it out before you run it.
**OPENAI\_SORA2** is billed per second of video, at a rate set by the model and
the output resolution:
| Model | Resolution | Per second | 4s | 8s | 12s |
| - | - | - | - | - | - |
| `sora-2` | 720x1280 / 1280x720 | 160 credits | 640 | 1,280 | 1,920 |
| `sora-2-pro` | 720x1280 / 1280x720 | 480 credits | 1,920 | 3,840 | 5,760 |
| `sora-2-pro` | 1024x1792 / 1792x1024 | 800 credits | 3,200 | 6,400 | 9,600 |
**GEMINI\_GENERATE\_IMAGE** is billed per image generated:
| Model | Per image |
| - | - |
| `gemini-3.1-flash-image` (default) | 108 credits |
| `gemini-2.5-flash-image` (retires 2026-10-02) | 63 credits |
| `gemini-3-pro-image` | 215 credits |
A step keeps running on the model it names until Google shuts that model
down, and is charged at that model's rate. Once the model is retired, the
step runs on its successor and is charged the successor's rate instead — so
`gemini-2.5-flash-image` is 63 credits today and 108 from 2026-10-02.
New steps default to `gemini-3.1-flash-image`.
If a cost-driving setting (a model, a duration, a resolution) is filled in
by an expression such as `{{ steps.plan.output.model }}`, the reservation
assumes the most expensive option it could resolve to, because the value is
not known until the step runs. The final charge is the price of what
actually ran.
### 1 Credit Per Use
These tools consume **1 credit** each time they are executed:
* **PYTHON\_SANDBOX\_RUN** - Execute Python code in a secure sandbox (always requires credits)
### 10 Credits Per Use
These tools consume **10 credits** each time they are executed:
* **EXAAI\_SEARCH** - AI-powered search using Exa (can use your own API key)
* **PERPLEXITY\_SEARCH** - Search using Perplexity AI (can use your own API key)
* **SERPAPI\_SEARCH** - Search using SerpAPI (can use your own API key)
* **FIRECRAWL\_SCRAPE** - Scrape web content using Firecrawl (can use your own API key)
* **ARXIV\_INVOKE\_AGENT** - Access research papers from arXiv (always requires credits)
* **YOUTUBE\_GET\_TRANSCRIPT** - Extract transcripts from YouTube videos (always requires credits)
### 20 Credits Per Use
These tools consume **20 credits** each time they are executed:
* **LLAMA\_CLOUD\_PARSE** - Parse documents with LlamaCloud (can use your own API key)
### 100 Credits Per Use
These tools consume **100 credits** each time they are executed:
* **JINBA\_FLEX\_PARSER** - Flexible document parsing (can use your own API key)
## Copilot Credit Usage
Copilot Credits are consumed when using AI assistance features:
* **Step Description Generation**: 1 credit per request
* **Flow Summary Generation**: 1 credit per request
* **Metadata Generation**: 1 credit per request
* **Cron Expression Parsing**: 1 credit per request
* **Chat/Copilot Conversations**: 1 credit per request
## Bring Your Own API Key
For tools that support it, you can provide your own API keys to avoid paying credits:
When a tool supports "bring your own API key," you can configure your own credentials to bypass credit charges. Tools marked with "always requires credits" will consume credits regardless of configuration.
### How to Configure Your API Keys
1. Navigate to the **Credentials** section in your workspace settings
2. Select the appropriate service (e.g., Anthropic, OpenAI, Gemini)
3. Enter your API key
4. Save your configuration
Once configured, the system will use your API key instead of consuming credits when you use those tools.
### Tools That Always Require Credits
Some tools always require credits because they use Jinba's infrastructure or specialized services:
* **ARXIV\_INVOKE\_AGENT** (10 credits) - Uses OpenAI API + E2B sandbox
* **YOUTUBE\_GET\_TRANSCRIPT** (10 credits) - Uses Smartproxy residential proxy
* **PYTHON\_SANDBOX\_RUN** (1 credit) - Uses E2B code interpreter sandbox
These tools cannot use external API keys and will always deduct from your credit balance.
# Debug
Source: https://carnot.mintlify.app/en/pages/basics/debug
Learn how to debug your workflows and troubleshoot issues
## Overview
Jinba Flow provides several debugging features to help you identify and fix issues in your workflows. You can run individual steps, view execution history, inspect step outputs, and analyze errors to quickly resolve problems.
## Debugging Features
### Single Step Execution
Test individual steps in isolation to verify they work correctly:
* **Isolated Testing**: Run a single step without executing the entire workflow
* **Previous Outputs**: Use outputs from previous workflow runs as input
* **Quick Validation**: Verify step configuration and logic before full execution
* **Error Isolation**: Identify which specific step is causing issues
### Flow Run History
View and analyze past workflow executions:
* **Execution Logs**: See detailed logs of all workflow runs
* **Step Status**: Check which steps succeeded, failed, or were skipped
* **Timing Information**: View execution time for each step
* **Output Inspection**: Examine outputs from each step
### Error Messages
Comprehensive error reporting helps identify issues:
* **Step-Level Errors**: See exactly which step failed and why
* **Error Details**: View error messages, stack traces, and context
* **Validation Errors**: Get clear messages about configuration issues
## Running a Single Step
### Step 1: Open Your Workflow
1. Open your workflow in the Flow Editor
2. Navigate to the step you want to debug
3. Ensure the step is properly configured
### Step 2: Run Single Step
1. Click on the step you want to test
2. Look for the **Run Step** or **Test Step** option
3. If previous outputs are available, they will be used as input
4. Click to execute the step
### Step 3: Review Results
1. Check the step output in the step panel
2. Verify the output matches your expectations
3. If there are errors, review the error message
4. Make adjustments and test again
**Note**: Single step execution uses outputs from your most recent workflow run. If no previous run exists, the step will run with empty or default inputs.
## Using Previous Outputs
When debugging a step, you can use outputs from previous workflow executions:
1. **Automatic Detection**: The system automatically detects available previous outputs
2. **Output Selection**: Previous step outputs are used as inputs for the step being tested
3. **Manual Override**: You can manually specify inputs if needed
This allows you to test steps in the context of actual workflow data without running the entire workflow.
## Viewing Flow Run History
### Accessing Run History
1. Open your workflow in the Flow Editor
2. Navigate to the **Runs** or **History** tab
3. View a list of all workflow executions
### Analyzing Run Results
Each run shows:
* **Status**: Success, failure, or in progress
* **Execution Time**: How long the workflow took to complete
* **Step Status**: Individual status for each step
* **Outputs**: Final workflow output
* **Errors**: Any errors that occurred during execution
### Inspecting Step Outputs
1. Click on a specific run in the history
2. Expand individual steps to see their outputs
3. Review input and output data for each step
4. Identify where issues occurred
## Understanding Error Messages
### Common Error Types
#### Validation Errors
These occur when step configuration is incorrect:
* **Missing Required Fields**: Required inputs or configs are not provided
* **Invalid Values**: Input values don't match expected types or formats
* **Missing Dependencies**: Referenced steps or secrets don't exist
**Example**: "Missing required input: 'api\_key'"
#### Execution Errors
These occur during step execution:
* **API Errors**: External service returned an error
* **Timeout Errors**: Step execution exceeded time limit
* **Permission Errors**: Insufficient permissions for the operation
**Example**: "API request failed: 401 Unauthorized"
#### Dependency Errors
These occur when step dependencies aren't met:
* **Missing Previous Outputs**: Required previous step outputs are not available
* **Circular Dependencies**: Steps have circular dependency chains
* **Invalid References**: Referenced step IDs don't exist
**Example**: "Step 'step\_2' depends on 'step\_1' which was not executed"
### Reading Error Messages
Error messages typically include:
1. **Error Type**: What kind of error occurred
2. **Step ID**: Which step failed
3. **Error Message**: Human-readable description
4. **Stack Trace**: Technical details for debugging (if available)
5. **Context**: Additional information about the error
## Debugging Workflow
### Step-by-Step Debugging Process
1. **Identify the Problem**: Review error messages and failed steps
2. **Isolate the Issue**: Use single step execution to test individual steps
3. **Check Inputs**: Verify that step inputs are correct
4. **Review Configuration**: Ensure step configs (API keys, settings) are valid
5. **Test Fixes**: Make changes and test again with single step execution
6. **Run Full Workflow**: Once individual steps work, run the full workflow
### Common Debugging Scenarios
#### Scenario 1: Step Fails Immediately
**Problem**: A step fails as soon as it starts executing.
**Debugging Steps**:
1. Check step configuration (API keys, settings)
2. Verify input values are correct
3. Test the step in isolation using single step execution
4. Review error message for specific issues
#### Scenario 2: Step Produces Unexpected Output
**Problem**: Step executes successfully but output is incorrect.
**Debugging Steps**:
1. Review step inputs to ensure they're correct
2. Check step logic and tool configuration
3. Test with different input values
4. Compare with expected output format
#### Scenario 3: Workflow Fails Mid-Execution
**Problem**: Workflow starts successfully but fails partway through.
**Debugging Steps**:
1. Identify which step failed from run history
2. Check if previous steps produced correct outputs
3. Verify step dependencies are correct
4. Test the failing step in isolation
#### Scenario 4: Conditional Logic Issues
**Problem**: Steps with `when` conditions aren't executing as expected.
**Debugging Steps**:
1. Verify condition expressions are correct
2. Check that referenced step outputs exist
3. Test condition evaluation with actual data
4. Review step execution order
## Best Practices
1. **Test Incrementally**: Build and test workflows step by step
2. **Use Single Step Execution**: Test individual steps before running full workflow
3. **Review Run History**: Regularly check execution history for patterns
4. **Validate Inputs**: Ensure inputs are correct before execution
5. **Check Error Messages**: Read error messages carefully for specific guidance
6. **Test with Real Data**: Use actual data when possible for more accurate testing
7. **Document Expected Behavior**: Note expected outputs for easier debugging
## Troubleshooting Tips
### Step Not Executing
* **Check Dependencies**: Ensure all required previous steps completed successfully
* **Verify Conditions**: If step has `when` condition, ensure condition is met
* **Review Execution Order**: Check that steps are ordered correctly
### Unexpected Outputs
* **Inspect Inputs**: Verify inputs to the step are what you expect
* **Check Tool Configuration**: Ensure tool settings are correct
* **Review Tool Documentation**: Confirm you're using the tool correctly
### Performance Issues
* **Check Execution Time**: Review step execution times in run history
* **Identify Slow Steps**: Find steps that take longest to execute
* **Optimize Configuration**: Adjust settings to improve performance
### API Errors
* **Verify Credentials**: Check that API keys and credentials are valid
* **Review Rate Limits**: Ensure you're not exceeding API rate limits
* **Check Service Status**: Verify external services are operational
## Related Features
* [Publish](/en/pages/basics/publish) - Learn about publishing workflows
* [Workspace](/en/pages/basics/workspace) - Learn about workspace management
* [Credit Costs](/en/pages/basics/credit-costs) - Understand workflow execution costs
# Method 2: Graph Editor (Drag & Drop)
Source: https://carnot.mintlify.app/en/pages/basics/drag_and_drop
Create flows using the visual drag-and-drop graph editor with pre-built modules. Click on the + icon in the graph view of the editor in order to see a full list of our available tools. By clicking on the created node, you can see the inputs and configuration needed for it and create basic flows in the side panel.
## How It Works
The Graph Editor uses a visual drag-and-drop interface where you can:
* Browse available tools and modules
* Drag them onto the canvas
* Connect them using the connection points
* Configure each module through the side panel
* Visualize the flow structure in real-time
## Key Features
You can use the top and bottom dots to connect tools to each other to form dependencies, and you can click on the three dots to the right of the tool name to delete it.
## Advanced Options
You may want to learn to use the manifest editor view in order to make more advanced flows, but advanced options are also available in the `Advanced Options` tab of the side panel.
This method is ideal for those who prefer to work with existing tools rather than writing code from scratch.
# History and Versions
Source: https://carnot.mintlify.app/en/pages/basics/history-versions
Learn about workflow version history and execution history
## Overview
Jinba Flow automatically tracks versions of your workflows and maintains a complete execution history. This allows you to view past changes, restore previous versions, and analyze workflow execution patterns.
## Workflow Versions
### What are Versions?
Every time you make significant changes to a workflow, Jinba Flow creates a new version:
* **Automatic Versioning**: Versions are created automatically when you publish, restore, or accept copilot changes
* **Version History**: All versions are preserved, allowing you to see the evolution of your workflow
* **Version Labels**: Versions are labeled to indicate their purpose (PUBLISH, RESTORE, COPILOT\_CHANGE\_ACCEPTION)
### Version Types
#### Published Version
The version that is currently published and accessible via API or MCP:
* **Stable Reference**: This version remains unchanged even if you edit the workflow
* **API Access**: External systems use this version
* **MCP Tools**: AI assistants use this version when invoking the workflow
#### Current/Editable Version
The version you're currently editing:
* **Active Development**: This is your working version
* **Unpublished Changes**: May have changes not yet published
* **Preview Mode**: You can preview other versions while keeping this as your working version
#### Previous Versions
All other versions in the workflow's history:
* **Historical Record**: Complete history of all workflow changes
* **Restoration**: Can be restored to become the current editable version
* **Comparison**: Can be compared with current version
## Viewing Version History
### Accessing Versions
1. Open your workflow in the Flow Editor
2. Navigate to the **Versions** panel (usually in the right sidebar)
3. View the list of all workflow versions
### Version Information
Each version shows:
* **Creation Date**: When the version was created
* **Label**: Version type (PUBLISH, RESTORE, COPILOT\_CHANGE\_ACCEPTION)
* **Status**: Whether it's published, current, or previous
* **Steps**: The workflow steps at that point in time
### Previewing Versions
You can preview any version without making it your current version:
1. Click on a version in the versions list
2. The workflow editor shows that version's steps
3. You can see how the workflow looked at that point
4. Click the current version again to exit preview mode
**Note**: Previewing a version doesn't change your current editable version. You can preview and compare without affecting your work.
## Restoring Versions
### When to Restore
You might want to restore a previous version if:
* **Recent Changes Caused Issues**: Recent edits broke the workflow
* **Revert to Stable Version**: Go back to a known working version
* **Undo Accidental Changes**: Recover from unintended modifications
### How to Restore
1. Open the **Versions** panel
2. Find the version you want to restore
3. Click the **Restore** button (or similar action)
4. Confirm the restoration
5. The selected version becomes your current editable version
**Important Notes**:
* Restoring creates a new version with label "RESTORE"
* Your current editable version is preserved in history
* The restored version becomes your working version
* You can restore again if needed
## Version Labels
Versions are automatically labeled based on how they were created:
### PUBLISH
Created when you publish a workflow:
* **Purpose**: Marks the version that was published
* **Stability**: This version remains stable for API/MCP access
* **Updates**: New publishes create new PUBLISH versions
### RESTORE
Created when you restore a previous version:
* **Purpose**: Marks a version that was restored from history
* **Recovery**: Indicates you went back to a previous state
* **History**: Preserves the restoration action in history
### COPILOT\_CHANGE\_ACCEPTION
Created when you accept changes suggested by the Copilot:
* **Purpose**: Marks versions created through AI assistance
* **Collaboration**: Tracks AI-assisted workflow improvements
* **Learning**: Helps identify patterns in AI suggestions
## Execution History
### What is Execution History?
Execution history tracks all workflow runs:
* **Complete Record**: Every workflow execution is recorded
* **Version Tracking**: Each run is linked to the version that was executed
* **Performance Data**: Execution times and results are tracked
* **Error Logging**: Failed executions include error details
### Viewing Execution History
1. Navigate to your workflow
2. Open the **Runs** or **History** tab
3. View a chronological list of all executions
### Execution Information
Each execution shows:
* **Execution Date**: When the workflow was run
* **Status**: Success, failure, or in progress
* **Version**: Which workflow version was executed
* **Execution Time**: How long the workflow took
* **Inputs**: Arguments passed to the workflow
* **Outputs**: Results from the execution
* **Errors**: Any errors that occurred (if failed)
### Filtering Execution History
You can filter execution history by:
* **Status**: Show only successful, failed, or running executions
* **Date Range**: Filter by when executions occurred
* **Version**: View executions of a specific version
* **Source**: Filter by how the workflow was triggered (manual, API, scheduled, etc.)
### Execution History Retention
By default, execution history is kept with no time limit. An organization owner or admin can set a retention period in Jinba Auth, under **Organization → Run history retention**: keep forever (the default), 7, 30 or 90 days, or a custom number of days.
Once an execution is older than the retention period:
* **Deleted**: The inputs and outputs of every step, including large outputs kept in file storage. Deletion is permanent.
* **Not deleted**:
* The record of the execution itself — when it ran, who ran it, which workflow, whether it succeeded or failed, and how many credits it used.
* Files that a workflow read, or saved to the workspace's files.
Things to know before setting a period:
* The setting applies to every workspace in the organization.
* Deletion runs once a day, so data is removed within about a day of passing the retention period.
* Shortening the period also deletes the data of existing executions that are already older than the new period. This cannot be undone.
* Executions that are still running, including ones waiting for an approval, are not affected until they finish.
* When you re-run a workflow from a step, outputs of an execution whose data was deleted cannot be reused, so the earlier steps run again.
* If an execution re-used the outputs of an older one (re-run from a step), the older execution's data is kept until every execution re-using it has passed the retention period. There is no upper limit: as long as the workflow keeps being re-run from a step, large outputs of the execution that first produced them can be kept indefinitely. To bound how long data is kept, run the workflow from the start from time to time.
## Using History for Debugging
### Version Comparison
Compare different versions to understand changes:
1. Preview a previous version
2. Compare with your current version
3. Identify what changed between versions
4. Understand the impact of modifications
### Execution Analysis
Use execution history to:
* **Identify Patterns**: Find recurring issues or successes
* **Performance Tracking**: See which versions performed better
* **Error Analysis**: Review failed executions to identify problems
* **Usage Patterns**: Understand how the workflow is being used
### Debugging Workflow
1. **Find Problematic Version**: Identify when issues started
2. **Compare Versions**: See what changed between working and broken versions
3. **Review Executions**: Check execution history for that version
4. **Restore if Needed**: Restore a working version if current version has issues
## Best Practices
1. **Regular Publishing**: Publish stable versions regularly to create checkpoints
2. **Meaningful Changes**: Make significant changes before creating new versions
3. **Version Review**: Periodically review version history to understand evolution
4. **Execution Monitoring**: Regularly check execution history for issues
5. **Restore Strategically**: Use restoration when needed, but understand it creates new versions
6. **Document Changes**: Use workflow descriptions or notepads to document major changes
## Version Management
### Version Lifecycle
1. **Creation**: Version created automatically on significant actions
2. **Development**: Current editable version is where you work
3. **Publishing**: Publishing creates a stable PUBLISH version
4. **History**: All versions are preserved in history
5. **Restoration**: Previous versions can be restored
### Version Limits
* **Storage**: All versions are stored indefinitely
* **Access**: You can access any version in history
* **Performance**: Large version histories may take longer to load
## Related Features
* [Publish](/en/pages/basics/publish) - Learn about publishing workflows
* [Debug](/en/pages/basics/debug) - Learn about debugging workflows
* [Archive Feature](/en/pages/basics/archive) - Learn about archiving workflows
# Knowledge
Source: https://carnot.mintlify.app/en/pages/basics/knowledge
Learn about knowledge bases, vector search, and how to build RAG systems
## Overview
Jinba Flow's Knowledge feature provides powerful vector database capabilities for building RAG (Retrieval-Augmented Generation) systems. You can create knowledge bases, upload documents, perform semantic search, and integrate AI-powered question-answering into your workflows.
## What are Knowledge Bases?
Knowledge Bases are vector databases that store documents with automatic chunking and vectorization. They enable semantic search capabilities, allowing you to find information based on meaning rather than exact text matches.
### Key Features
* **Document Storage**: Upload PDFs, DOCX, text files, and other formats
* **Automatic Processing**: Documents are automatically chunked and vectorized
* **Semantic Search**: Find relevant information using natural language queries
* **RAG Support**: Perfect for building AI-powered question-answering systems
* **Vector Embeddings**: Uses OpenAI's text-embedding-3-large for high-quality embeddings
## Creating a Knowledge Base
1. Navigate to **Storage** in the workspace sidebar
2. Click on the **Knowledge Bases** tab
3. Click **Create Knowledge Base**
4. Enter a name and description for your knowledge base
5. The knowledge base is created and ready for file uploads
## Adding Files to Knowledge Base
### Using the UI
1. Open your knowledge base from the Storage page
2. Click **Upload File** or **Add File**
3. Select files from your computer or provide a URL
4. Files are automatically processed:
* **Parsing**: Extract text content from documents
* **Chunking**: Split documents into manageable chunks (configurable)
* **Embedding**: Convert chunks to vector embeddings
* **Indexing**: Store vectors for fast similarity search
### Using Workflows
You can also add files to knowledge bases programmatically using the `JINBA_KNOWLEDGE_BASE_FILE_ADD` tool:
```yaml theme={null}
- id: add_file_to_kb
name: add_file_to_kb
tool: JINBA_KNOWLEDGE_BASE_FILE_ADD
config:
- name: token
value: "{{secrets.JINBA_API_TOKEN}}"
input:
- name: knowledgeBaseId
value: "{{secrets.KNOWLEDGE_BASE_ID}}"
- name: file
value: "https://example.com/document.pdf"
- name: filename
value: "document.pdf"
- name: executionMode
value: "SYNCHRONOUS"
- name: chunkerSettings
value:
chunkSize: 512
chunkOverlap: 128
chunkingIdentifier: "\\n\\n"
```
**File Processing Status**:
* **pending**: File uploaded, waiting for processing
* **processing**: File is being chunked and vectorized
* **completed**: File is ready for search
* **failed**: Processing encountered an error
## Vector Search
Vector search enables semantic search across your knowledge base using natural language queries.
### How It Works
1. **Query Vectorization**: Your search query is converted to a vector using OpenAI's text-embedding-3-large
2. **Similarity Search**: The system finds chunks with similar vectors
3. **Ranking**: Results are ranked by similarity score
4. **Filtering**: Results below the threshold are filtered out
### Using Vector Search
```yaml theme={null}
- id: search_kb
name: search_kb
tool: JINBA_VECTOR_SEARCH
config:
- name: token
value: "{{secrets.JINBA_API_TOKEN}}"
input:
- name: query
value: "How do I configure authentication?"
- name: knowledgeBaseId
value: "{{secrets.KNOWLEDGE_BASE_ID}}"
- name: topK
value: 5
- name: threshold
value: 0.3
```
**Parameters**:
| Parameter | Type | Required | Default | Description |
| - | - | - | - | - |
| `query` | string | Yes | - | Natural language search query |
| `knowledgeBaseId` | string | Yes | - | ID of the knowledge base to search |
| `topK` | number | No | 3 | Number of results to return (1-50) |
| `threshold` | number | No | 0.3 | Similarity threshold (0-1) |
## Building RAG (Retrieval-Augmented Generation) Systems
RAG combines retrieval of relevant information from knowledge bases with AI generation to create accurate, context-aware responses.
### What is RAG?
RAG (Retrieval-Augmented Generation) is a technique that:
1. **Retrieves** relevant information from a knowledge base using semantic search
2. **Augments** the AI prompt with retrieved context
3. **Generates** responses based on both the query and retrieved context
This approach allows AI models to answer questions using your own documents and data, rather than relying solely on their training data.
### Step-by-Step: Building a RAG System
#### Step 1: Create a Knowledge Base
1. Go to **Storage** → **Knowledge Bases**
2. Create a new knowledge base (e.g., "Company Documentation")
3. Note the knowledge base ID for later use
#### Step 2: Upload Documents
1. Open your knowledge base
2. Upload relevant documents (PDFs, DOCX, text files)
3. Wait for processing to complete (files show "completed" status)
#### Step 3: Build the RAG Workflow
Create a workflow that combines vector search with AI generation:
```yaml theme={null}
- id: user_question
name: user_question
tool: INPUT_TEXT
input:
- name: description
value: "Enter your question"
- id: search_knowledge_base
name: search_knowledge_base
tool: JINBA_VECTOR_SEARCH
config:
- name: token
value: "{{secrets.JINBA_API_TOKEN}}"
input:
- name: query
value: "{{steps.user_question.result}}"
- name: knowledgeBaseId
value: "{{secrets.KNOWLEDGE_BASE_ID}}"
- name: topK
value: 5
- name: threshold
value: 0.3
- id: generate_answer
name: generate_answer
tool: ANTHROPIC_INVOKE
config:
- name: version
value: claude-3-5-sonnet-20241022
input:
- name: prompt
value: |
Based on the following information from our knowledge base, answer the user's question.
Question: {{steps.user_question.result}}
Relevant Information:
{{#each steps.search_knowledge_base.result.results}}
**Source: {{file.filename}}** (Relevance: {{score}})
{{chunk.content}}
---
{{/each}}
Please provide a comprehensive and accurate answer based on the information above.
If the information doesn't contain enough details to answer the question, say so.
```
#### Step 4: Configure Secrets
1. Go to **Credentials** in your workspace
2. Add your **Jinba API Token** as a secret
3. Store your **Knowledge Base ID** as a secret (or use it directly in the workflow)
### Advanced RAG Patterns
#### Multi-Step RAG with Refinement
```yaml theme={null}
- id: initial_search
name: initial_search
tool: JINBA_VECTOR_SEARCH
config:
- name: token
value: "{{secrets.JINBA_API_TOKEN}}"
input:
- name: query
value: "{{steps.user_question.result}}"
- name: knowledgeBaseId
value: "{{secrets.KNOWLEDGE_BASE_ID}}"
- name: topK
value: 10
- id: refine_query
name: refine_query
tool: ANTHROPIC_INVOKE
config:
- name: version
value: claude-3-5-sonnet-20241022
input:
- name: prompt
value: |
Based on the initial search results, generate a more specific search query.
Original Query: {{steps.user_question.result}}
Initial Results:
{{#each steps.initial_search.result.results}}
- {{file.filename}}: {{chunk.content}}
{{/each}}
Generate a refined search query that will find more specific information.
- id: refined_search
name: refined_search
tool: JINBA_VECTOR_SEARCH
config:
- name: token
value: "{{secrets.JINBA_API_TOKEN}}"
input:
- name: query
value: "{{steps.refine_query.result.text}}"
- name: knowledgeBaseId
value: "{{secrets.KNOWLEDGE_BASE_ID}}"
- name: topK
value: 5
- name: threshold
value: 0.4
- id: final_answer
name: final_answer
tool: ANTHROPIC_INVOKE
config:
- name: version
value: claude-3-5-sonnet-20241022
input:
- name: prompt
value: |
Answer the user's question using the refined search results.
Question: {{steps.user_question.result}}
Refined Search Results:
{{#each steps.refined_search.result.results}}
**{{file.filename}}** (Score: {{score}})
{{chunk.content}}
{{/each}}
Provide a detailed, accurate answer.
```
## Managing Knowledge Base Files
### Updating Files
You can update existing files in a knowledge base using the `JINBA_KNOWLEDGE_BASE_UPDATE` tool:
```yaml theme={null}
- id: update_kb_file
name: update_kb_file
tool: JINBA_KNOWLEDGE_BASE_UPDATE
config:
- name: token
value: "{{secrets.JINBA_API_TOKEN}}"
input:
- name: knowledgeBaseId
value: "{{secrets.KNOWLEDGE_BASE_ID}}"
- name: knowledgeBaseFileId
value: "{{secrets.FILE_ID}}"
- name: fileUrl
value: "https://example.com/updated-document.pdf"
- name: updateType
value: "FULL_REFRESH"
- name: executionMode
value: "SYNCHRONOUS"
```
**Update Types**:
* **FULL\_REFRESH**: Replaces the entire file with new content
* Other update modes may be available depending on your configuration
## Chunking Configuration
When adding files to knowledge bases, you can configure how documents are chunked:
* **chunkSize**: Size of each chunk in tokens (default: 512, max: 8192)
* **chunkOverlap**: Overlap between chunks in tokens (default: 128, max: 2048)
* **chunkingIdentifier**: String used to identify chunk boundaries (default: "\n\n")
**Best Practices**:
* **Smaller chunks (256-512)**: Better for precise information retrieval
* **Larger chunks (1024-2048)**: Better for maintaining context
* **Overlap**: Helps maintain context across chunk boundaries
## RAG Best Practices
1. **Quality Knowledge Base**: Upload high-quality, relevant documents
2. **Appropriate Chunking**: Use appropriate chunk sizes (typically 512-1024 tokens)
3. **Threshold Tuning**: Adjust similarity thresholds based on your use case
4. **TopK Selection**: Retrieve enough context (typically 3-10 chunks) for comprehensive answers
5. **Prompt Engineering**: Craft prompts that clearly instruct the AI to use retrieved context
6. **Source Attribution**: Always cite sources for transparency and verification
7. **Error Handling**: Handle cases where no relevant information is found
## Use Cases for RAG
* **Customer Support**: Answer questions using product documentation
* **Internal Knowledge**: Access company policies and procedures
* **Research Assistant**: Search through research papers and documents
* **Legal Document Q\&A**: Answer questions about contracts and legal documents
* **Technical Documentation**: Help developers find information in technical docs
* **Product Information**: Answer questions about product specifications
## Related Features
* [Workspace](/en/pages/basics/workspace) - Learn about workspace management and file storage
* [Vector Search Tool](/en/pages/tools/jinba/vector_search) - Detailed vector search documentation
* [Knowledge Base Tool](/en/pages/tools/jinba/knowledge_base) - Knowledge base management tools
# Method 3: YAML Coding Panel
Source: https://carnot.mintlify.app/en/pages/basics/manifest
Write manifests directly in YAML format for complete control over your flows. A manifest in your site defines the execution flow of tools and scripts, specifying dependencies and data transformations. This document outlines how to structure and write a manifest following the format used in your system.
## How It Works
Direct coding creation gives you complete control over your flows by writing YAML manifests directly. This method offers:
* Full control over every aspect of your flow
* Ability to create complex workflows
* Integration with custom tools and APIs
* Precise control over execution order and conditions
* Advanced features like conditional execution and loops
## Writing Your Own Manifest
To create a manifest:
1. **Define an `id` and `name`** for each step.
2. **Choose the appropriate `tool`**, such as `INPUT_JSON` or `PYTHON_SANDBOX`.
3. **Specify input values** under `input`.
4. **List dependencies** using `needs` to ensure correct execution order.
By following this structure, you can build a clear, modular workflow for processing data efficiently.
## Step Components
Each step in a Jinba Flow manifest is composed of several key components that define its behavior and relationship with other steps. Here's a detailed breakdown:
### 1. Basic Step Structure
```yaml theme={null}
- id: step_id # Unique identifier for the step
tool: TOOL_NAME # The tool to use (e.g., LLM, PYTHON_SANDBOX)
input: # Input parameters required by the tool
- name: parameter_name # Name of the input parameter
value: parameter_value # Value for the parameter
config: # Optional: Tool-specific configuration
- name: config_name # Name of the configuration parameter
value: config_value # Value for the configuration
needs: # Optional: List of step IDs that must complete first
- step_id1 # Step that must complete before this one
- step_id2 # Another dependency
when: "condition" # Optional: Condition that must be true for step to run
forEach: "items" # Optional: Run step for each item in a collection
```
Each field serves a specific purpose:
* `id`: Required unique identifier for referencing the step
* `tool`: Required name of the tool to execute (must be one of the available tools)
* `input`: Required list of input parameters specific to the tool
* `config`: Optional tool-specific configuration (e.g., API tokens, temperature for LLM)
* `needs`: Optional list of step IDs that must complete before this step runs
* `when`: Optional condition that must evaluate to true for the step to execute
* `forEach`: Optional field to execute the step multiple times over a collection
### 2. Configuration
Used to set tool-specific settings:
```yaml theme={null}
config:
- name: config_name
value: config_value
```
Example:
```yaml theme={null}
config:
- name: temperature
value: 0.7
- name: token
value: "{{secrets.API_TOKEN}}"
```
### 3. Dependencies
Specify which steps must complete before this step can run:
```yaml theme={null}
needs:
- step_id1
- step_id2
```
Example:
```yaml theme={null}
- id: summarize
tool: LLM
needs:
- fetch_content
- analyze_sentiment
```
### 4. Conditional Execution
Control whether a step should run based on conditions:
```yaml theme={null}
when: ""
```
Examples:
```yaml theme={null}
when: "'{{steps.check_genre.result.content}}' == 'General'"
when: "{{steps.count_items.result}} > 5"
```
### 5. Loop Execution
Execute a step for each item in a collection:
```yaml theme={null}
forEach: "{{steps.input_list.result}}"
```
Example:
```yaml theme={null}
- id: process_items
tool: PYTHON_SANDBOX_RUN
forEach: "{{steps.get_items.result}}"
input:
- name: code
value: "process_item('{{item}}')"
- name: data_type
value: "STRING"
```
### 6. Result Reference
Reference results from previous steps:
```yaml theme={null}
value: "{{steps.step_id.result}}" # Access entire result
value: "{{steps.step_id.result.content}}" # Access specific property
```
### Important Notes
* **Step IDs**: Must be unique within the workflow
* **Dependencies**:
* Create an implicit execution order
* Can form complex graphs (including diamond patterns)
* Circular dependencies are not allowed
* **Conditions**:
* Support basic comparisons and logical operators
* Can reference results from previous steps
* Evaluated before step execution
* **Variable References**:
* Use `{{steps.step_id.result}}` to access previous step results
* Use `{{secrets.SECRET_NAME}}` to access configured secrets
* Use `{{item}}` in forEach loops to access the current item
* **YAML Syntax**:
* Use `|` for a multi-line string until the indentation ends.
## Jinja2 Template Syntax
Jinba Flow supports Jinja2 templating for dynamic value generation and complex logic in manifest files. This powerful feature allows you to create more flexible and reusable workflows. When using templates, you have access to:
* `steps`: Results from previous steps
* `item`: Current item in forEach loops
* `secrets`: Configured secrets
* Built-in functions like `zip()`, `range()`, etc.
Use `{%-` and `-%}` to control whitespace in the output, where the `-` removes whitespace before or after the block.
### Basic Syntax
1. **Variable Interpolation**
```yaml theme={null}
value: "{{ variable }}"
```
2. **Control Structures**
```yaml theme={null}
# For loops
{%- for item in items %}
{{ item }}
{%- endfor %}
# Conditional statements
{%- if condition %}
{{ value }}
{%- endif %}
```
3. **Accessing Step Results**
```yaml theme={null}
value: "{{ steps.step_id.result }}"
value: "{{ steps.step_id.result.content }}"
```
### Common Use Cases
1. **Processing Lists**
```yaml theme={null}
- id: process_items
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |-
items = []
{%- for item in steps.input_list.result %}
items.append({
"id": "{{item.id}}",
"value": "{{item.value}}"
})
{%- endfor %}
- name: data_type
value: "STRING"
```
2. **Conditional Logic**
```yaml theme={null}
- id: conditional_step
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |-
{%- if steps.check.result.status == 'success' %}
print("Processing successful case")
{%- else %}
print("Handling error case")
{%- endif %}
- name: data_type
value: "STRING"
```
3. **Combining Multiple Lists**
```yaml theme={null}
- id: combine_data
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |-
results = []
{%- for item1, item2 in zip(list1, list2) %}
results.append(f"{item1}: {item2}")
{%- endfor %}
- name: data_type
value: "STRING"
```
### Common Patterns
1. **Filtering Lists**
```yaml theme={null}
{%- for item in items if item.status == 'active' %}
{{ item.name }}
{%- endfor %}
```
2. **Setting Default Values**
```yaml theme={null}
{{ variable | default('default_value') }}
```
3. **String Manipulation**
```yaml theme={null}
{{ variable | upper }}
{{ variable | trim }}
{{ variable | replace('old', 'new') }}
```
## Example Manifest
Below is an example manifest that processes numerical data through multiple steps:
```yaml theme={null}
{- id: input_data
name: input_data
tool: INPUT_JSON
config: []
input:
- name: value
value: "[1, 2, 3, 4, 5]"
- id: branch_a1
name: branch_a1
tool: PYTHON_SANDBOX
config: []
input:
- name: code
value: |
data = {{steps.input_data.result}}
result = sum([x for x in data if x % 2 == 0])
result # even numbers sum
needs:
- input_data
- id: branch_a2
name: branch_a2
tool: PYTHON_SANDBOX
config: []
input:
- name: code
value: |
result = {{steps.branch_a1.result.text}} * 2
result # double the sum
needs:
- branch_a1}
```
## Breakdown of Each Step
### 1. **Input Data (`input_data`)**
* Uses the `INPUT_JSON` tool to define an array of numbers `[1, 2, 3, 4, 5]`.
### 2. **Branch A1 (`branch_a1`)**
* Uses `PYTHON_SANDBOX` to compute the sum of even numbers from `input_data`.
* Depends on `input_data`.
### 3. **Branch A2 (`branch_a2`)**
* Doubles the result from `branch_a1`.
* Depends on `branch_a1`.
### 4. **Branch B1 (`branch_b1`)**
* Computes the sum of odd numbers from `input_data`.
* Depends on `input_data`.
# Model Context Protocol
Source: https://carnot.mintlify.app/en/pages/basics/mcp
Learn how to set up your workspace MCP server.
# What is Model Context Protocol (MCP)?
MCP is an open protocol that standardizes how applications provide context to LLMs. Think of MCP like a USB-C port for AI applications. Just as USB-C provides a standardized way to connect your devices to various peripherals and accessories, MCP provides a standardized way to connect AI models to different data sources and tools.
Read more [here.](https://modelcontextprotocol.io/introduction?utm_source=chatgpt.com)
# Setting Up Your Workspace MCP server
When you set up a flow, you can use tools beginning with `INPUT_` to set the inputs that your tool will have. For example,
```yaml theme={null}
- id: word_1
tool: INPUT_TEXT
input:
- name: value
value: DEFAULT_VALUE
- name: data_type
value: STRING
- id: word_2
tool: INPUT_TEXT
input:
- name: value
value: DEFAULT_VALUE
- name: data_type
value: STRING
- id: concat
tool: PYTHON_SANDBOX_RUN
needs:
- word_1
- word_2
input:
- name: code
value: |
word_1 = steps.word_1.result.output
word_2 = steps.word_2.result.output
f"{word_1} {word_2}"
- name: data_type
value: STRING
```
The above flow would show the parameters `word_1` and `word_2` for the MCP tool. Please note that tool IDs, not names, are used to reference the tools in the flow. After you add these `INPUT_` tools, you can navigate to the MCP tab of your workspace to configure flows to be used for MCP, set prompts for the flows to describe what they do, and set the prompts for the parameters of your configured flows as well.
# Connecting to LLM
To connect your workspace MCP to an LLM, use the sample configuration found on the MCP tab of your workspace. Remember to replace the secret key! If you have no other MCP servers, you can paste the whole file, otherwise, you can add just the `jinbaflow` section (for Jinba Flow) to your file.
Here is an example of a configuration file:
Set `YOUR_TOKEN` to a workspace API key or a personal API key (`sk-user-…`) created in your profile settings.
Personal key owners must be members of the target workspace and have permission to run flows. Frozen and archived workspaces cannot be accessed with personal keys.
With a personal key, runs are attributed to the key owner, and flows use that owner's personal secrets. Credits are charged to the organization that owns the flow's workspace.
A personal key can access multiple workspaces, so do not share it with others. Revoking the key or leaving the workspace blocks subsequent requests.
```JSON theme={null}
{
"mcpServers": {
"jinbaflow": {
"command": "npx",
"args": [
"-y",
"supergateway",
"--streamableHttp",
"https://api.jinba.io/api/v2/workspaces/uuid-here-1234-5678-foobar/mcp",
"--header",
"Authorization: Bearer YOUR_TOKEN"
]
}
}
}
```
# Overview
Source: https://carnot.mintlify.app/en/pages/basics/overview
Jinba Flow provides three different interfaces for creating workflows. By utilizing the characteristics of each interface appropriately, you can build workflows exactly as you envision.
## Chat Panel
Use the Jinba Copilot to create flows through natural language conversation. This method is perfect for beginners or when you want to quickly prototype ideas.
**Best for:**
* Beginners learning Jinba Flow
* Quick prototyping
* Natural language interaction
* Getting started without technical knowledge
[Learn more about Chat Panel →](./chat)
## Graph Editor (Drag & Drop)
Use the visual drag-and-drop graph editor to build flows by connecting pre-built modules. This method provides a visual approach to flow creation.
**Best for:**
* Building flows with existing tools
* Understanding flow structure
* Quick assembly of common patterns
[Learn more about Graph Editor (Drag & Drop) →](./drag_and_drop)
## YAML Coding Panel
Write manifests directly in YAML format for complete control over your flows. This method offers the most flexibility and power.
**Best for:**
* Advanced users
* Custom tool integration
* Complex workflows
* Complete control over execution
[Learn more about YAML Coding Panel →](./manifest)
## Choosing Your Method
* **Start with Chat Panel** if you're new to Jinba Flow or want to quickly explore possibilities
* **Use Graph Editor (Drag & Drop)** if you prefer visual interfaces and want to work with existing tools
* **Choose YAML Coding Panel** if you need full control and are comfortable with YAML configuration
All three methods can be used together - you might start with chat to prototype, then refine with the graph editor, and finally optimize with YAML coding.
# Publish
Source: https://carnot.mintlify.app/en/pages/basics/publish
Learn how to publish your workflows and make them available via API or MCP
## Overview
Publishing a workflow in Jinba Flow makes it available for execution via API calls or as an MCP (Model Context Protocol) tool. When you publish a workflow, you create a stable version that can be accessed by external systems, other workflows, or AI assistants.
## What is Publishing?
Publishing a workflow:
* **Creates a Version**: Saves the current workflow state as a published version
* **Generates API Access**: Creates an API key that allows external access to your workflow
* **Enables API Execution**: Makes the workflow callable via REST API endpoints
* **Enables MCP Integration**: Allows the workflow to be used as an MCP tool for AI assistants
* **Locks the Version**: The published version remains stable even if you make changes to the workflow
## Publishing a Workflow
### Step 1: Prepare Your Workflow
Before publishing, ensure your workflow is:
1. **Valid**: All steps are properly configured
2. **Tested**: Run the workflow to verify it works correctly
3. **Complete**: All required inputs and outputs are defined
### Step 2: Publish from the Flow Editor
1. Open your workflow in the Flow Editor
2. Review your workflow to ensure it's ready
3. Click the **Publish** button in the editor toolbar
4. If validation passes, the workflow will be published
**Note**: The publish button may show different states:
* **Publish**: Workflow is not published
* **Republish**: Workflow is published but has unpublished changes
* **Published**: Workflow is published and up to date
### Step 3: Publishing Options
When publishing, you can choose how your workflow is made available:
#### Publish as API
Publishing as API makes your workflow accessible via REST API:
* **API Endpoint**: Your workflow can be called using HTTP requests
* **API Key**: An API key is automatically generated for authentication
* **Use Cases**: Integration with external systems, webhooks, scheduled tasks
#### Publish as MCP Tool
Publishing as MCP makes your workflow available as a tool for AI assistants:
* **MCP Integration**: The workflow appears as a tool in MCP-compatible AI assistants
* **Parameter Configuration**: Define input parameters that AI assistants can use
* **Use Cases**: AI-powered automation, assistant workflows, conversational interfaces
**Note**: You can publish a workflow as both API and MCP simultaneously.
## Publishing Process
### Direct Publishing
For most workspaces, publishing is immediate:
1. Click **Publish** in the flow editor
2. The workflow is validated
3. A new version is created and marked as published
4. An API key is generated (if not already exists)
5. The workflow becomes available via API/MCP
### Approval Process (Enterprise)
For Enterprise workspaces with approval processes enabled:
1. Click **Publish** in the flow editor
2. Enter an optional comment explaining the changes
3. Submit an approval request
4. The workflow version is created but not immediately published
5. An approver reviews and approves the request
6. Once approved, the workflow is automatically published
**Approval Workflow**:
* Approval requests appear in the approver's dashboard
* Approvers can review changes and comments
* Approvers can approve or reject the request
* Approved workflows are automatically published
## Unpublishing a Workflow
You can unpublish a workflow to make it unavailable:
1. Open the published workflow in the Flow Editor
2. Click the **Publish** toggle to turn it off
3. Confirm the unpublish action
4. The workflow is no longer accessible via API or MCP
**Important Notes**:
* Unpublishing does not delete the workflow or its versions
* You can republish at any time
* If the workflow is published as MCP, unpublishing will remove it from MCP tools
* API keys remain but the workflow won't be accessible
## Published Versions
### Version Management
When you publish a workflow:
* **Version Created**: A new flow version is created with label "PUBLISH"
* **Version History**: All published versions are saved in version history
* **Stable Reference**: The published version remains unchanged even if you edit the workflow
* **Version Comparison**: You can compare different versions to see changes
### Republishing
When you make changes to a published workflow:
1. The workflow shows "unpublished changes" indicator
2. Click **Republish** to publish the new version
3. The new version replaces the previous published version
4. The old version remains in history for reference
## Using Published Workflows
### Via API
Once published, you can call your workflow via API:
```bash theme={null}
curl -X POST https://api.jinba.dev/api/v1/flows/{flow-id}/run \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"args": [
{"name": "input1", "value": "example"}
]
}'
```
### Via MCP
Published workflows appear as tools in MCP-compatible AI assistants:
* **Tool Name**: Based on your workflow name
* **Parameters**: Defined input parameters from your workflow
* **Description**: Uses your workflow description
* **Usage**: AI assistants can invoke your workflow as a tool
### Via JINBA\_FLOW\_RUN Tool
You can also call published workflows from other workflows using the `JINBA_FLOW_RUN` tool:
```yaml theme={null}
- id: call_published_flow
name: call_published_flow
tool: JINBA_FLOW_RUN
config:
- name: token
value: "{{secrets.JINBA_API_TOKEN}}"
input:
- name: id
value: "{{secrets.PUBLISHED_FLOW_ID}}"
- name: args
value:
- name: input1
value: "example value"
```
## API Keys
### Automatic Generation
When you publish a workflow:
* An API key is automatically generated
* The key is scoped to the specific workflow
* The key is stored securely in your workspace
* You can view the key in workflow settings
### Managing API Keys
1. Go to your workflow settings
2. Navigate to the **API** or **Publish Settings** section
3. View or regenerate your API key
4. Use the key in API requests for authentication
**Security Best Practices**:
* Never share API keys publicly
* Rotate keys regularly
* Use different keys for different environments
* Revoke keys if compromised
## Publishing Best Practices
1. **Test Before Publishing**: Always test your workflow thoroughly before publishing
2. **Version Control**: Use meaningful version labels and comments
3. **Documentation**: Document your workflow's inputs, outputs, and behavior
4. **Error Handling**: Implement proper error handling in your workflows
5. **Security**: Review permissions and access controls before publishing
6. **Monitoring**: Monitor published workflow usage and performance
7. **Gradual Rollout**: Test with a small audience before full deployment
## Publishing Status Indicators
The flow editor shows different states:
* **Unpublished**: Workflow is not published (gray indicator)
* **Published**: Workflow is published and up to date (green indicator)
* **Unpublished Changes**: Workflow has changes not yet published (yellow indicator)
* **Publishing**: Workflow is currently being published (loading indicator)
## Troubleshooting
### Cannot Publish
* **Validation Errors**: Fix any validation errors in your workflow
* **Missing Permissions**: Ensure you have publish permissions
* **Approval Required**: Submit an approval request if required
### Published Workflow Not Accessible
* **Check API Key**: Verify the API key is correct
* **Check Permissions**: Ensure the API key has proper permissions
* **Verify Endpoint**: Confirm you're using the correct API endpoint
* **Check Status**: Verify the workflow is actually published
### MCP Tool Not Appearing
* **Publish Required**: The workflow must be published to appear as MCP tool
* **MCP Configuration**: Ensure MCP is properly configured in workspace settings
* **Parameter Definition**: Define input parameters for MCP tool usage
## Related Features
* [Workspace](/en/pages/basics/workspace) - Learn about workspace management
* [MCP](/en/pages/basics/mcp) - Learn about Model Context Protocol integration
* [Archive Feature](/en/pages/basics/archive) - Learn about archiving workflows
# Quickstart
Source: https://carnot.mintlify.app/en/pages/basics/quickstart
Create and run your first workflow in 10 minutes
Get started with Jinba Flow by building a simple workflow that searches the web and summarizes results using AI.
## What You'll Build
A workflow that:
1. Searches Google for a topic you specify
2. Summarizes the results using AI
3. Returns a concise summary
## Prerequisites
* A Jinba Flow account ([Sign up here](https://flow.jinba.io/))
* No coding experience required
## Steps
Go to [flow.jinba.io](https://flow.jinba.io/) and sign in to your account.
In the chat panel, type a natural language description of what you want to accomplish:
```
Search Google for "AI productivity tools" and summarize the top results
```
Click "Create Flow" (or press Enter) to let the AI generate your workflow.
The flow is created in the left chat panel, and a manifest defining the step structure is automatically generated in the right YAML coding panel.
Review the AI-generated flow and click **"Accept Changes"** to confirm the generated workflow.
Once the flow is confirmed, the workflow will be displayed in the central graph editor.
Click the "Execute" button in the top right to run the workflow.
Once execution completes successfully, click "View Details" displayed at the bottom right to check the execution results.
Once the flow has executed successfully, click the "Deploy" button in the top right to publish your workflow.
## What's Next?
Learn the key terms and concepts used in Jinba Flow
Explore the three ways to create workflows
Browse the catalog of tools you can use
Connect your external services
# Scheduling
Source: https://carnot.mintlify.app/en/pages/basics/scheduling
Learn how to schedule workflows to run automatically
## Overview
Jinba Flow allows you to schedule workflows to run automatically at specified times using cron expressions. Scheduled workflows execute the published version, making them perfect for automated tasks, periodic data processing, and scheduled reports.
## What is Scheduling?
Scheduling enables automatic execution of workflows:
* **Automatic Execution**: Workflows run automatically based on a schedule
* **Cron Expressions**: Use standard cron syntax to define execution times
* **Published Version**: Scheduled workflows always use the published version
* **Timezone Support**: Specify timezones for accurate scheduling
## Prerequisites
To schedule a workflow:
1. **Published Workflow**: The workflow must be published (see [Publish](/en/pages/basics/publish))
2. **Schedule Permission**: You need permission to schedule workflows in the workspace
3. **Cron Expression**: Define when the workflow should run
## Setting Up Scheduling
### Step 1: Open Workflow Settings
1. Open your published workflow in the Flow Editor
2. Navigate to the **Runs** or **Settings** section
3. Find the **Schedule** section
### Step 2: Enable Scheduling
1. Toggle the **Enable Schedule** switch to ON
2. The schedule configuration form appears
### Step 3: Configure Schedule
1. Enter a cron expression or use the visual schedule builder
2. Optionally specify a timezone
3. Review the schedule description (e.g., "Every day at midnight")
4. Save the schedule
### Step 4: Verify Schedule
1. Check that the schedule is active
2. View the next scheduled execution time
3. Monitor scheduled executions in the execution history
## Cron Expressions
### Basic Cron Syntax
Cron expressions consist of five fields:
```
┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of month (1 - 31)
│ │ │ ┌───────────── month (1 - 12)
│ │ │ │ ┌───────────── day of week (0 - 6) (Sunday to Saturday)
│ │ │ │ │
* * * * *
```
### Common Cron Examples
#### Every Minute
```
* * * * *
```
#### Every Hour
```
0 * * * *
```
#### Daily at Midnight
```
0 0 * * *
```
#### Daily at Noon
```
0 12 * * *
```
#### Every Monday at 9 AM
```
0 9 * * 1
```
#### First Day of Every Month at Midnight
```
0 0 1 * *
```
#### Every 15 Minutes
```
*/15 * * * *
```
#### Every Day at 2:30 AM
```
30 2 * * *
```
#### Weekdays at 9 AM
```
0 9 * * 1-5
```
#### First Day of Every Quarter at Midnight
```
0 0 1 */3 *
```
## Timezone Support
### Specifying Timezone
You can specify a timezone using the `CRON_TZ` prefix:
```
CRON_TZ=America/New_York 0 9 * * *
```
This runs the workflow at 9 AM Eastern Time every day.
### Common Timezones
* `UTC`: Coordinated Universal Time
* `America/New_York`: Eastern Time
* `America/Chicago`: Central Time
* `America/Los_Angeles`: Pacific Time
* `Europe/London`: Greenwich Mean Time
* `Asia/Tokyo`: Japan Standard Time
* `Australia/Sydney`: Australian Eastern Time
**Note**: If no timezone is specified, the schedule uses UTC.
## Schedule Management
### Enabling a Schedule
1. Open workflow settings
2. Navigate to the Schedule section
3. Toggle **Enable Schedule** to ON
4. Configure the cron expression
5. Save the schedule
### Disabling a Schedule
1. Open workflow settings
2. Navigate to the Schedule section
3. Toggle **Enable Schedule** to OFF
4. The schedule is immediately disabled
**Note**: Disabling a schedule stops all future executions but doesn't affect currently running workflows.
### Updating a Schedule
1. Open workflow settings
2. Navigate to the Schedule section
3. Modify the cron expression
4. Save the changes
**Important**: Schedule updates take effect immediately. The next execution uses the new schedule.
## Scheduled Execution Behavior
### Published Version
Scheduled workflows always execute the **published version**:
* **Stability**: Uses the stable published version, not your current edits
* **Consistency**: Ensures scheduled executions use the same version
* **Updates**: Republish to update the scheduled workflow version
### Execution Context
Scheduled executions:
* **Source**: Marked as "SCHEDULE" in execution history
* **Arguments**: Use default or empty arguments (unless configured)
* **Permissions**: Run with workspace permissions
* **Logging**: All executions are logged in execution history
### Execution Monitoring
Monitor scheduled executions:
1. View execution history
2. Filter by source "SCHEDULE"
3. Check execution status and results
4. Review any errors that occurred
## Best Practices
1. **Test Before Scheduling**: Test your workflow thoroughly before scheduling
2. **Publish Stable Versions**: Only schedule workflows with stable published versions
3. **Timezone Awareness**: Always specify timezones for accurate scheduling
4. **Monitor Executions**: Regularly check execution history for scheduled runs
5. **Error Handling**: Implement error handling in workflows for scheduled execution
6. **Resource Management**: Consider resource usage for frequently scheduled workflows
7. **Documentation**: Document schedule purpose and timing in workflow description
## Common Use Cases
### Daily Reports
Schedule workflows to generate daily reports:
```
# Every day at 8 AM
0 8 * * *
```
### Data Synchronization
Schedule periodic data synchronization:
```
# Every 6 hours
0 */6 * * *
```
### Weekly Summaries
Schedule weekly summary generation:
```
# Every Monday at 9 AM
0 9 * * 1
```
### Monthly Processing
Schedule monthly data processing:
```
# First day of every month at midnight
0 0 1 * *
```
### Frequent Monitoring
Schedule frequent monitoring tasks:
```
# Every 5 minutes
*/5 * * * *
```
## Troubleshooting
### Schedule Not Running
**Possible Causes**:
* Schedule is disabled
* Workflow is not published
* Cron expression is invalid
* Workflow is archived
**Solutions**:
1. Verify schedule is enabled
2. Ensure workflow is published
3. Validate cron expression syntax
4. Check workflow is not archived
### Wrong Execution Time
**Possible Causes**:
* Timezone not specified
* Incorrect cron expression
* Timezone conversion issues
**Solutions**:
1. Specify timezone explicitly
2. Verify cron expression
3. Test with a simple schedule first
### Execution Failures
**Possible Causes**:
* Workflow errors
* Missing credentials
* Resource limitations
**Solutions**:
1. Check execution history for errors
2. Verify credentials are configured
3. Review workflow logic
4. Check resource availability
## Schedule Validation
### Cron Expression Validation
The system validates cron expressions:
* **Syntax Check**: Ensures valid cron syntax
* **Range Validation**: Validates field ranges
* **Error Messages**: Provides clear error messages for invalid expressions
### Visual Schedule Builder
Many interfaces provide visual schedule builders:
* **Point-and-Click**: Select schedule options visually
* **Preview**: See schedule description before saving
* **Validation**: Automatic validation of schedule settings
## Related Features
* [Publish](/en/pages/basics/publish) - Learn about publishing workflows
* [API](/en/pages/basics/api) - Learn about calling workflows via API
* [History and Versions](/en/pages/basics/history-versions) - Learn about execution history
# Step Module Options
Source: https://carnot.mintlify.app/en/pages/basics/step-options
Learn how to use advanced step options like loops (forEach), conditions (when), and dependencies (needs) in your workflows
## Overview
Each step in a Jinba Flow can be configured with advanced options that control how and when it executes. These options allow you to create sophisticated workflows with conditional logic, loops, and complex dependencies.
## Step Dependencies (needs)
The `needs` option specifies which steps must complete before the current step can run. This creates an execution order and ensures data is available when needed.
### Basic Usage
```yaml theme={null}
- id: analyze_data
tool: PYTHON_SANDBOX_RUN
needs:
- fetch_data
- validate_input
input:
- name: code
value: "process({{steps.fetch_data.result}})"
```
### Key Points
* **Execution Order**: Steps with `needs` wait for all specified dependencies to complete
* **Parallel Execution**: Steps without dependencies run in parallel automatically
* **Failure Handling**: If a dependency fails or is skipped, dependent steps are also skipped
* **Diamond Patterns**: Complex dependency graphs are supported (A→B, A→C, B→D, C→D)
### Example: Multi-Branch Workflow
```yaml theme={null}
- id: input_data
tool: INPUT_JSON
input:
- name: value
value: "[1, 2, 3, 4, 5]"
- id: process_even
tool: PYTHON_SANDBOX_RUN
needs:
- input_data
input:
- name: code
value: |
data = {{steps.input_data.result}}
result = [x for x in data if x % 2 == 0]
- id: process_odd
tool: PYTHON_SANDBOX_RUN
needs:
- input_data
input:
- name: code
value: |
data = {{steps.input_data.result}}
result = [x for x in data if x % 2 != 0]
- id: combine_results
tool: PYTHON_SANDBOX_RUN
needs:
- process_even
- process_odd
input:
- name: code
value: |
even = {{steps.process_even.result}}
odd = {{steps.process_odd.result}}
result = {"even": even, "odd": odd}
```
## Conditional Execution (when)
The `when` option allows a step to execute only if a specified condition is true. This enables dynamic workflow behavior based on previous step results.
### Basic Syntax
```yaml theme={null}
- id: conditional_step
tool: TOOL_NAME
when: ""
input:
- name: param
value: "value"
```
### Condition Expressions
Conditions support:
* **String Comparison**: `"{{steps.check.result.status}}" == "success"`
* **Numeric Comparison**: `{{steps.count.result}} > 5`
* **Boolean Evaluation**: `{{steps.validate.result.isValid}} == true`
### Example: Conditional Branching
```yaml theme={null}
- id: check_type
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
result = {"type": "premium"}
- id: premium_processing
tool: PYTHON_SANDBOX_RUN
when: "'{{steps.check_type.result.type}}' == 'premium'"
needs:
- check_type
input:
- name: code
value: |
result = "Processing premium user..."
- id: standard_processing
tool: PYTHON_SANDBOX_RUN
when: "'{{steps.check_type.result.type}}' == 'standard'"
needs:
- check_type
input:
- name: code
value: |
result = "Processing standard user..."
```
### Important Notes
* Conditions are evaluated **before** step execution
* If the condition is false, the step status becomes `skipped`
* Skipped steps don't affect downstream steps that depend on them (they will also be skipped)
* Use single quotes around template variables in string comparisons
## Loop Execution (forEach)
The `forEach` option executes a step multiple times, once for each item in a collection. This is useful for batch processing lists of data.
### Basic Syntax
```yaml theme={null}
- id: process_items
tool: TOOL_NAME
forEach: "{{steps.get_list.result}}"
input:
- name: item
value: "{{item}}"
```
### How It Works
1. The `forEach` value is evaluated to get a list/array
2. The step executes once for each item in the list
3. Inside the step, `{{item}}` refers to the current item
4. Results are collected as an array
### Example: Processing Multiple Items
```yaml theme={null}
- id: get_users
tool: INPUT_JSON
input:
- name: value
value: |
[
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"},
{"id": 3, "name": "Charlie"}
]
- id: greet_users
tool: PYTHON_SANDBOX_RUN
forEach: "{{steps.get_users.result}}"
needs:
- get_users
input:
- name: code
value: |
user = {{item}}
result = f"Hello, {user['name']}!"
- id: combine_greetings
tool: PYTHON_SANDBOX_RUN
needs:
- greet_users
input:
- name: code
value: |
greetings = {{steps.greet_users.result}}
result = "\n".join([g['result'] for g in greetings])
```
### Accessing Item Properties
```yaml theme={null}
forEach: "{{steps.items.result}}"
input:
- name: id
value: "{{item.id}}"
- name: name
value: "{{item.name}}"
```
### forEach with Index
If you need the index of the current item, you can use Jinja2 loops in the input:
```yaml theme={null}
- id: process_with_index
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
items = {{steps.get_items.result}}
results = []
{%- for item in items %}
results.append({"index": {{loop.index}}, "value": "{{item}}"})
{%- endfor %}
result = results
```
## Combining Options
You can combine `needs`, `when`, and `forEach` in a single step:
```yaml theme={null}
- id: process_active_items
tool: PYTHON_SANDBOX_RUN
needs:
- get_items
- check_enabled
when: "{{steps.check_enabled.result.active}} == true"
forEach: "{{steps.get_items.result}}"
input:
- name: code
value: |
item = {{item}}
result = f"Processed: {item}"
```
**Evaluation Order**:
1. Wait for all `needs` dependencies to complete
2. Check if `when` condition is true
3. If true, execute `forEach` loop (or single execution if no forEach)
## Best Practices
### Dependencies
* Keep dependency chains shallow when possible
* Use parallel execution to improve performance
* Clearly name steps to make dependencies readable
### Conditions
* Use meaningful condition expressions
* Consider all possible outcomes (success, failure, edge cases)
* Test conditions with various input values
### Loops
* Limit loop iterations to avoid long execution times
* Handle empty arrays gracefully
* Consider memory usage for large datasets
## Related
* [YAML Coding Panel](/en/pages/basics/manifest) - Complete YAML syntax reference
* [Variables & Templates](/en/pages/basics/variables) - Variable placeholders and Jinja2 templates
* [Debug](/en/pages/basics/debug) - Debugging workflow execution
# Variables & Templates
Source: https://carnot.mintlify.app/en/pages/basics/variables
Learn how to use variable placeholders and Jinja2 templates to create dynamic workflows
## Overview
Jinba Flow supports powerful templating capabilities that allow you to:
* Reference results from previous steps
* Access configured secrets securely
* Use Jinja2 templates for complex logic
* Create dynamic, reusable workflows
## Variable Placeholders
### Basic Syntax
Variables are enclosed in double curly braces: `{{ variable }}`
### Available Variables
| Variable | Description | Example |
| - | - | - |
| `steps..result` | Result from a previous step | `{{steps.fetch_data.result}}` |
| `steps..result.` | Specific property from result | `{{steps.api_call.result.content}}` |
| `secrets.` | Configured workspace secret | `{{secrets.API_KEY}}` |
| `item` | Current item in forEach loop | `{{item}}` |
| `item.` | Property of current item | `{{item.id}}` |
### Accessing Step Results
```yaml theme={null}
# Access entire result
- name: data
value: "{{steps.previous_step.result}}"
# Access specific property
- name: content
value: "{{steps.llm_response.result.content}}"
# Access nested property
- name: user_email
value: "{{steps.get_user.result.user.email}}"
# Access array element
- name: first_item
value: "{{steps.get_list.result[0]}}"
```
### Using Secrets
Secrets are configured at the workspace level and accessed securely:
```yaml theme={null}
config:
- name: api_key
value: "{{secrets.OPENAI_API_KEY}}"
- name: token
value: "{{secrets.GITHUB_TOKEN}}"
```
**Security Notes**:
* Secrets are encrypted at rest
* Never hardcode sensitive values in workflows
* Use secrets for API keys, tokens, and credentials
## Jinja2 Templates
Jinba Flow supports full Jinja2 templating for advanced logic. Templates are processed before step execution.
### Control Structures
#### For Loops
```yaml theme={null}
value: |
items = []
{%- for user in steps.get_users.result %}
items.append({
"id": "{{user.id}}",
"name": "{{user.name}}"
})
{%- endfor %}
```
#### Conditional Statements
```yaml theme={null}
value: |
{%- if steps.check.result.status == 'success' %}
print("Processing successful")
{%- else %}
print("Handling error")
{%- endif %}
```
#### Loop with Index
```yaml theme={null}
value: |
{%- for item in items %}
{{loop.index}}: {{item}}
{%- endfor %}
```
### Built-in Functions
Jinja2 provides useful built-in functions:
```yaml theme={null}
# zip - Combine multiple lists
{%- for a, b in zip(list1, list2) %}
{{a}}: {{b}}
{%- endfor %}
# range - Generate number sequence
{%- for i in range(5) %}
Item {{i}}
{%- endfor %}
# length/count
Total: {{items|length}}
```
### Filters
Apply transformations to values:
```yaml theme={null}
# String manipulation
{{ variable | upper }}
{{ variable | lower }}
{{ variable | trim }}
{{ variable | replace('old', 'new') }}
# Default values
{{ variable | default('fallback_value') }}
# JSON handling
{{ data | tojson }}
# List operations
{{ items | first }}
{{ items | last }}
{{ items | join(', ') }}
```
### Whitespace Control
Use `{%-` and `-%}` to control whitespace:
```yaml theme={null}
value: |
{%- for item in items -%}
{{item}}
{%- endfor -%}
```
* `{%-` removes whitespace before the tag
* `-%}` removes whitespace after the tag
## Common Patterns
### Processing Lists
```yaml theme={null}
- id: process_items
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
results = []
{%- for item in steps.input_list.result %}
results.append({
"id": "{{item.id}}",
"processed": True
})
{%- endfor %}
result = results
```
### Conditional Data Selection
```yaml theme={null}
- id: select_data
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
{%- if steps.config.result.mode == 'full' %}
data = {{steps.full_data.result}}
{%- else %}
data = {{steps.summary_data.result}}
{%- endif %}
result = data
```
### Combining Multiple Sources
```yaml theme={null}
- id: merge_data
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
combined = []
{%- for user, order in zip(steps.users.result, steps.orders.result) %}
combined.append({
"user": "{{user.name}}",
"order": "{{order.id}}"
})
{%- endfor %}
result = combined
```
### Filtering Lists
```yaml theme={null}
value: |
active_items = []
{%- for item in items if item.status == 'active' %}
active_items.append("{{item.name}}")
{%- endfor %}
```
### Building Dynamic Prompts
```yaml theme={null}
- id: generate_prompt
tool: LLM
input:
- name: prompt
value: |
Analyze the following items:
{%- for item in steps.items.result %}
- {{item.name}}: {{item.description}}
{%- endfor %}
Provide insights based on the above data.
```
## Best Practices
### Variable References
* Use descriptive step IDs for clarity
* Access only the properties you need
* Handle potential null/undefined values with defaults
### Templates
* Keep templates readable with proper indentation
* Use whitespace control for clean output
* Break complex logic into multiple steps
### Secrets
* Never log or expose secret values
* Use workspace-level secrets for team sharing
* Rotate secrets regularly
### Performance
* Avoid deeply nested templates
* Limit loop iterations
* Pre-process data when possible
## Troubleshooting
### Common Issues
**Variable not found**
* Check step ID spelling
* Ensure the referenced step runs before current step
* Verify the property path is correct
**Template syntax error**
* Check for balanced braces `{{ }}`
* Verify Jinja2 tag syntax `{% %}`
* Look for missing quotes in strings
**Unexpected output**
* Use debug steps to inspect intermediate values
* Check whitespace handling
* Verify data types (string vs object)
## Related
* [Step Module Options](/en/pages/basics/step-options) - forEach, when, needs
* [YAML Coding Panel](/en/pages/basics/manifest) - Complete YAML syntax
* [Debug](/en/pages/basics/debug) - Debugging workflows
# What is Jinba Flow?
Source: https://carnot.mintlify.app/en/pages/basics/what-is-jinba-flow
A product for designing and building workflows
Jinba Flow is a product for designing and building workflows. Generate flows automatically through chat, then visually review and edit them with an intuitive flowchart interface. Workflows can be published as APIs or batch processes for easy reuse.
## Workflow Automation in 3 Steps
**Auto-generate workflows with natural language**
Describe what you want and get instant flow generation
Intuitive drag & drop for flexible editing and building
Supports complex logic: branches, loops, and more
**Diverse tools & secure AI integration**
Connect Slack, Gmail, Notion, GitHub, Python, and more
Easily integrate GPT, Claude, Gemini via MCP
Safe execution environment for advanced business tasks
**One-click publish and operate**
Deploy instantly as REST API
Publish as MCP server for agent integration
Easy to call from existing systems and apps
## Use Cases
Monitor channels, summarize discussions, and post updates automatically
Extract, transform, and load data across multiple sources
Process documents with AI for extraction, summarization, and insights
## Enterprise Features
For organizations requiring advanced security and control:
* **Private Hosting**: On-premises or private cloud deployment
* **SSO & RBAC**: Single Sign-On and role-based access control
* **Audit Logs**: Detailed tracking for compliance
* **Dedicated Support**: Engineering support for workflow development
* **Private Models**: Use AWS Bedrock, Azure AI, or custom models
## Get Started
Build your first workflow in 10 minutes
Learn the key terms and concepts
# Workspace
Source: https://carnot.mintlify.app/en/pages/basics/workspace
Learn about workspaces in Jinba Flow and how to manage them
## What is a Workspace?
A workspace in Jinba Flow is your personal or team environment where you create, manage, and execute workflows. Think of it as your dedicated space for organizing all your automation projects, credentials, and configurations.
## Key Features of Workspaces
### Flow Management
* **Create and Organize Flows**: Build multiple workflows within a single workspace
* **Version Control**: Track changes and manage different versions of your flows
* **Flow Sharing**: Share flows with team members or make them public
* **Flow Templates**: Save and reuse common workflow patterns
### Credentials Management
* **Secure Storage**: Store API keys and OAuth credentials securely
* **Service Integration**: Configure credentials for various external services
* **Access Control**: Manage who can access which credentials
* **Credential Organization**: Organize credentials by service type or project
### Settings and Configuration
* **Workspace Settings**: Customize workspace preferences and behavior
* **Team Management**: Invite team members and manage permissions
* **Billing and Subscriptions**: Manage your subscription plan and billing information
* **Usage Monitoring**: Track credit usage and workflow execution statistics
### Files and Storage Management
* **File Storage**: Upload, organize, and manage files in your workspace
* **File Sharing**: Share files using temporary links or permanent URIs
* **Knowledge Bases**: Create and manage vector databases for RAG systems
* **Output Files**: Access files generated by workflow executions from the flow editor
### MCP Integration
* **MCP Server Setup**: Configure your workspace as an MCP server
* **Flow Exposure**: Expose your flows as MCP tools for use with LLMs
* **Parameter Configuration**: Set up input parameters for MCP-enabled flows
## Workspace Types
### Personal Workspace
A personal workspace is your individual space where you can:
* Create and manage your own workflows
* Store personal credentials
* Track your own usage and credits
* Access all basic features
### Team Workspace (Enterprise)
Team workspaces provide additional collaboration features:
* **Shared Resources**: Share flows, credentials, and configurations with team members
* **Role-Based Access**: Assign different roles and permissions to team members
* **Team Analytics**: View team-wide usage statistics and performance metrics
* **Approval Workflows**: Implement approval processes for critical operations
* **Organization Management**: Manage multiple teams and workspaces under one organization
## Getting Started with Your Workspace
1. **Access Your Workspace**: Log in to Jinba Flow and navigate to your workspace dashboard
2. **Create Your First Flow**: Use the Chat Panel, Graph Editor, or YAML Coding Panel to create workflows
3. **Configure Credentials**: Set up API keys and OAuth connections for the services you want to use
4. **Upload Files** (Optional): Upload files to your workspace storage for use in workflows
5. **Set Up MCP** (Optional): Configure your workspace MCP server to expose flows to LLMs
6. **Monitor Usage**: Keep track of your credit consumption and workflow executions
## Files and Storage
### File Management
Your workspace includes a Storage section where you can:
* **Upload Files**: Store documents, data files, and other resources
* **Organize Files**: Search, sort, and manage your file collection
* **Share Files**: Generate temporary links or permanent URIs for file sharing
* **Use in Workflows**: Reference files using permanent URIs (`jinbaflow://{file-id}`)
### Storage Access
Access storage from the workspace sidebar:
1. Click **Storage** in the sidebar
2. Use the **Files** tab for file management
3. Use the **Knowledge Bases** tab for vector database management
### Files in Workflows
Files stored in your workspace can be:
* **Referenced as Input**: Use permanent URIs to reference files in workflow steps
* **Generated as Output**: Save workflow results as files
* **Processed**: Use file processing tools to extract, convert, or analyze content
### Knowledge Bases
Knowledge bases enable RAG (Retrieval-Augmented Generation) functionality:
* **Create Knowledge Bases**: Set up vector databases for semantic search
* **Upload Documents**: Add PDFs, DOCX, and text files for indexing
* **Automatic Processing**: Documents are automatically chunked and vectorized
* **Vector Search**: Use semantic search to find relevant information
For detailed information on building RAG systems, see [Knowledge](/en/pages/basics/knowledge).
## Workspace Members and Roles
### Understanding Workspace Roles
Workspaces support different roles that determine what members can do:
#### Owner
The **Owner** role has full access to the workspace:
* **Full Workspace Control**: Manage all workspace settings and configurations
* **Member Management**: Invite new members, remove members, and change member roles
* **Resource Management**: Create, update, delete, and manage all flows, credentials, and files
* **Workspace Deletion**: Can delete the workspace (requires at least one owner to remain)
* **MCP Configuration**: Full access to MCP server configuration
* **Operation Logs**: View operation logs and audit trails
**Important**: Every workspace must have at least one owner. You cannot remove the last owner from a workspace.
#### Member
The **Member** role has standard access to workspace resources:
* **Flow Management**: Create, run, update, and delete flows
* **Resource Access**: View and use shared credentials and files
* **Limited Settings**: Cannot modify workspace settings or manage members
* **No Member Management**: Cannot invite or remove other members
#### Viewer (Enterprise)
The **Viewer** role has read-only access:
* **View Only**: Can view flows, credentials, and files but cannot modify them
* **No Execution**: Cannot run flows or create new resources
* **No Settings Access**: Cannot access workspace settings
### Adding Members to Your Workspace
To add members to your workspace:
1. **Navigate to Workspace Settings**: Go to your workspace settings page
2. **Open Members Section**: Click on the "Members" or "Team" tab
3. **Invite Member**: Click the "Invite Member" button
4. **Enter Email**: Enter the email address of the user you want to invite
5. **Select Role**: Choose the appropriate role (Owner, Member, or Viewer)
6. **Send Invitation**: The user will be added to the workspace with the selected role
**Requirements for Inviting Members**:
* You must be an **Owner** of the workspace to invite members
* The user must already have a Jinba Flow account (they will be found by email)
* Your subscription plan must support the number of team members you're adding
* Enterprise plans have higher member limits
### Managing Member Roles
As a workspace owner, you can:
* **Change Roles**: Update a member's role at any time
* **Remove Members**: Remove members from the workspace (except the last owner)
* **View Member List**: See all current members and their roles
* **Monitor Activity**: View member activity and usage statistics
**Note**: When you change a member's role, their permissions are updated immediately. Be careful when removing owner access, as owners have critical permissions.
### Workspace Ownership
* **Initial Owner**: The user who creates a workspace automatically becomes the first owner
* **Multiple Owners**: You can have multiple owners in a workspace for shared management
* **Owner Requirements**: A workspace must always have at least one owner
* **Transfer Ownership**: You can promote other members to owner role, but cannot remove the last owner
## Workspace Best Practices
* **Organize by Project**: Create separate flows for different projects or use cases
* **Use Descriptive Names**: Name your flows and credentials clearly for easy identification
* **Regular Cleanup**: Archive unused flows to keep your workspace organized
* **Monitor Credits**: Regularly check your credit usage to optimize workflow costs
* **Secure Credentials**: Never share API keys and regularly rotate them for security
* **Manage Access**: Regularly review member roles and remove access for users who no longer need it
* **Role Assignment**: Assign the minimum necessary role to members (principle of least privilege)
## Related Features
* [Model Context Protocol (MCP)](/en/pages/basics/mcp) - Learn how to set up MCP for your workspace
* [Credit Costs](/en/pages/basics/credit-costs) - Understand how credits work and are consumed
* [Archive Feature](/en/pages/basics/archive) - Learn how to archive and restore flows
# Overview
Source: https://carnot.mintlify.app/en/pages/enterprise/index
Learn about enterprise features available in Jinba Flow
## Overview
Jinba Flow Enterprise provides advanced features designed for organizations that require enhanced security, compliance, and management capabilities. These features are available exclusively with the Enterprise plan.
## Enterprise Features
* Workspace permission management by team and individual
* Automatic archiving of inactive workspaces
* Approval and restrictions for tool publishing
* Feature selection through on/off flags
* Access restrictions to external tools
* On-premises and private cloud support
* Audit logs
* Role-based access with SSO authentication
* Private LLM model support
### On-premises or Private Cloud Hosting
Run Jinba in your own environment with complete data control.
* **Complete Data Control**: All data remains within your infrastructure
* **Custom Deployment**: Deploy on your own servers or private cloud
* **Network Isolation**: Keep your workflows and data isolated from public cloud
* **Compliance Ready**: Meet strict regulatory requirements with on-premises deployment
### Advanced Access Control
Enhanced security and management through role-based permissions and Single Sign-On (SSO) integration.
* **Role-Based Access Control (RBAC)**: Define custom roles with granular permissions
* **Single Sign-On (SSO)**: Integrate with your existing identity provider (SAML, OAuth, etc.)
* **Multi-Factor Authentication (MFA)**: Add an extra layer of security
* **Session Management**: Control user sessions and access tokens
### Audit Logs
Detailed tracking capabilities for compliance and security monitoring.
* **Comprehensive Activity Logging**: Track all user actions and system events
* **Compliance Reporting**: Generate reports for regulatory compliance
* **Security Monitoring**: Detect and alert on suspicious activities
* **Data Retention**: Configure log retention policies according to your requirements
### Organization Management
Team spaces, roles, and approval workflows for efficient organization-wide management.
* **Team Workspaces**: Organize users and workflows into dedicated spaces
* **Approval Workflows**: Implement multi-level approval processes for critical operations
* **Resource Quotas**: Set limits and quotas for teams and users
* **Centralized Administration**: Manage all aspects of your organization from a single dashboard
### Pre-built and Custom Integrations
Access to 100+ pre-built integrations plus custom connectors for internal systems.
* **100+ Pre-built Integrations**: Connect with popular services out of the box
* **Custom Connectors**: Build integrations for your internal systems and APIs
* **API Gateway**: Secure access to your internal services
* **Integration Support**: Get assistance from our team for complex integrations
### Dedicated Engineer Support
Dedicated engineers provide workflow development support to remove development barriers.
* **Technical Support**: Direct access to our engineering team
* **Workflow Development**: Get help building and optimizing your workflows
* **Best Practices**: Learn industry best practices and optimization techniques
* **Priority Support**: Faster response times for critical issues
### Private Model Hosting
Securely use AWS Bedrock, Azure AI, or your own models.
* **AWS Bedrock Integration**: Use Amazon Bedrock models securely
* **Azure AI Integration**: Connect to Azure OpenAI and other Azure AI services
* **Custom Model Hosting**: Deploy and use your own AI models
* **Model Governance**: Control which models are available to your organization
## Getting Started with Enterprise
To learn more about Enterprise features and pricing, please contact our sales team:
* **Email**: [contact@carnot.ai](mailto:contact@carnot.ai)
* **Support**: Reach out through your account dashboard
## Additional Resources
* [Security Documentation](/en/pages/security/index)
* [SSO Setup Guide](https://github.com/carnot-technologies/jinba-flow/tree/main/docs/sso)
* [Deployment Guide](https://github.com/carnot-technologies/jinba-flow/blob/main/README-DEPLOYMENT.md)
# Organizations & Member Invitations
Source: https://carnot.mintlify.app/en/pages/enterprise/organization
The user journey from inviting a member to an organization to them joining it
## Overview
Jinba has an "Organization" layer that spans multiple products (Jinba Flow, Jinba App, and others), which centrally manages the invitation and joining of members.
* There are two roles within an organization: **MEMBER** and **OWNER**.
* Only global administrators can create new organizations. Regular users cannot create organizations.
## Inviting a member (as the owner)
From the Members section on the organization detail page, use "Invite Member" to select a role (MEMBER / OWNER) and send an invitation to an email address.
* Invitations expire after **7 days**. An invitation can only be resent after it has expired.
* To cancel an invitation, use the "Cancel Invitation" button on the pending row in the member list.
* The SSO section on the organization detail page contains sign-in links for each product (such as Jinba Flow). The link format is `{product URL}/signin?tenant={organization slug}`.
## Signing up after receiving an invitation (invitee without an existing account)
The invitation email does not contain a unique invitation link. Instead, it explains to log in and open the organization list (/organizations) to accept the invitation, and includes the URL of the signup page.
If the invitee does not have an account, they register a name, email address, and password on the signup page. At this point they are not automatically signed in, and a confirmation (verification) email is sent instead.
## Verifying email and joining the organization
Opening the link in the verification email (valid for 1 hour) automatically signs the user in and takes them to the organization list page.
The organization list shows a card for any pending invitation whose email address matches the signed-in user's email. Clicking "Accept" completes the join and navigates to the organization page.
* Accepting an invitation requires the user's email to already be verified.
* An invitation cannot be accepted if the invited email address does not match the signed-in account's email address (case-insensitive).
* Only shared organizations are shown in the organization list. The Personal Organization automatically created at signup is not shown.
This page describes the flow from the administrator's side. For the invitee's walkthrough of first access to Jinba App Neo — from the invitation email through to opening a workspace — see [First Login](/en/pages/jinba_app_neo/first-login).
When SSO is enabled for an organization, its members sign in through SSO and join without going through this individual invitation flow. Deployments without SSO (including the standard Jinba App Neo deployment) use the invitation flow described above.
# Security
Source: https://carnot.mintlify.app/en/pages/security/index
Security policies and controls for Jinba Flow
## Overview
* Physical and operational security of our data centers follows AWS/GCP standards
* Network communications use TLS encryption with IDS/IPS, firewalls, and traffic distribution to mitigate DoS attacks
* Virtualization is used to isolate data between users
* Service access is protected with ID/password authentication
* ID/password authentication temporarily locks an account after repeated failed attempts, mitigating brute-force and credential-stuffing attacks (locks are released automatically over time)
* Logs are retained for at least six months
* Vulnerability assessments are performed at least once per year
* The SOC 2 Type 2 audit has been completed
## System Architecture
Jinba Flow and Jinba App are deployed on a public cloud (AWS in the example below; GCP and Azure are also supported) as separate, but structurally similar, environments. Both products follow the same security pattern:
* **Public traffic** terminates at an Application Load Balancer (**ALB**) with TLS, behind which application containers run on **ECS**. For Jinba Flow the API and Web tier run as separate containers; Jinba App ships them as a single combined container.
* **Container images** are pulled from a private **ECR** registry. Application secrets (API keys, OAuth tokens, signing keys) are not baked into images — they are fetched at runtime from **AWS Secrets Manager**.
* **Persistent state** is stored in **Amazon RDS** (relational data) and **Amazon S3** (file storage). Both are private to the VPC and accessed only by the application tier.
* **Asynchronous and scheduled work** (flow runs triggered by webhooks, crons, etc.) is dispatched via a **Qstash** background-job queue that calls back into the ALB.
* **Audit and operational logs** from every container are written to **CloudWatch** for retention, alerting, and incident review.
The AWS topology shown here is one example. The same architecture pattern is supported on **Google Cloud (GCP)** and **Microsoft Azure** using equivalent managed services — for example, Cloud Run / GKE or Container Apps / AKS in place of ECS, Artifact Registry or Azure Container Registry in place of ECR, Cloud SQL or Azure Database for PostgreSQL in place of RDS, Google Cloud Storage or Azure Blob Storage in place of S3, Secret Manager or Azure Key Vault in place of AWS Secrets Manager, and Cloud Logging or Azure Monitor in place of CloudWatch. Security boundaries (private network, runtime-only secrets, application-tier-only data access) are preserved across all three clouds.
The diagram below shows both topologies side by side:
> **Note**: This diagram shows the AWS configuration as a representative example; equivalent GCP and Azure deployments follow the same pattern. Updated August 2025.
# Anthropic
Source: https://carnot.mintlify.app/en/pages/tools/ai/anthropic
Invoke responses from Claude
## Overview
The Anthropic tool allows you to interact with the Claude AI model. It provides a simple interface to send prompts and receive responses.
## Key Features
* `ANTHROPIC_INVOKE`
* Send prompts to Claude AI
* Receive structured responses via JSON
* `ANTHROPIC_INVOKE_WITH_FILE`
* Send PDFs and images (PNG, JPEG, GIF, WEBP) to Claude together with a prompt
* Receive text or structured responses via JSON
* `ANTHROPIC_AGENT`
* Run a Claude Managed Agent loop as a single workflow step, with file read/write/edit and web tools
* Mounts input files for the agent and returns files the agent produces
## Authentication
For further details, [click here](/en/pages/credentials/anthropic).
To get an Anthropic API key, please sign up at the [official Anthropic website](https://www.anthropic.com/) and follow the developer documentaiton.
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: Asking Claude a Question
```yaml theme={null}
- id: claude
tool: ANTHROPIC_INVOKE
config:
- name: version
value: claude-3-7-sonnet-20250219
- name: token
value: "{{secrets.ANTHROPIC_API_KEY}}"
input:
- name: prompt
value: What is the capital of France?
```
### Example: Analyzing a PDF or image
`ANTHROPIC_INVOKE_WITH_FILE` sends the files in `file_link` to Claude with the prompt. Claude reads charts, tables and scanned pages, not only text. Limits: up to 20 files and 20 MB in total per request; each image up to 3.75 MB and 8000 px per side. `prompt` is required. Temperature ranges from 0 to 1.
```yaml theme={null}
- id: read_invoice
tool: ANTHROPIC_INVOKE_WITH_FILE
config:
- name: version
value: claude-sonnet-4-6
input:
- name: prompt
value: Extract the invoice number and the total amount.
- name: file_link
value: "{{steps.input_file.result.url}}"
- name: json_schema
value: |
{"type":"object","properties":{"invoice_number":{"type":"string"},"total":{"type":"number"}},"required":["invoice_number","total"]}
```
### Example: Running a Claude Managed Agent
`ANTHROPIC_AGENT` runs a Claude Managed Agent that can read, write, and edit files and use web tools autonomously. Input files (up to 20, passed via `files`) are mounted under `/workspace/inputs/` for the agent, and files the agent writes to `/mnt/session/outputs/` are returned as `result.files` — each entry has `content`, `filename`, and `fileType`, shaped so it can be passed directly to a downstream `OUTPUT_FILE` step. The agent's final text output is returned as `result.content`, along with `stop_reason` and `timed_out`.
Available models are `claude-opus-4-7` (default), `claude-sonnet-4-6`, and `claude-haiku-4-5-20251001`. The `timeout_sec` input sets a hard wall-clock timeout in seconds (60–1800, default 600). If you bring your own Anthropic API key, you must also supply your own `agent_id` and `environment_id` in config; in that case the model is fixed on your Anthropic-side Agent and the `model` selector is ignored.
```yaml theme={null}
- id: agent
tool: ANTHROPIC_AGENT
config:
- name: model
value: claude-opus-4-7
input:
- name: prompt
value: |
Read the attached CSV, analyze monthly sales trends,
and write a summary report to /mnt/session/outputs/report.md
- name: files
value: "{{steps.input_file.result.url}}"
- name: timeout_sec
value: 900
```
# Azure OpenAI
Source: https://carnot.mintlify.app/en/pages/tools/ai/azure_openai
Generate text, structured outputs, and analyze files using Azure OpenAI Service deployments
## Overview
Azure OpenAI tools let you run prompts against your own Azure OpenAI Service deployments. They support plain text generation, structured output validated by a JSON schema, and document/image analysis, all against the deployment, endpoint, and API key you configure.
## Key Features
* `AZURE_OPENAI_INVOKE`
* Send a prompt (`prompt`) to an Azure OpenAI deployment for text generation
* Optional structured output with a JSON schema (`json_schema`) — the schema must have `"type": "object"` at the top level
* `AZURE_OPENAI_INVOKE_WITH_FILE`
* Send files along with a prompt for document and image analysis
* `file_link` accepts up to 30 file URLs; supported types are PDF, PNG, JPEG/JPG, WEBP, and GIF, up to 100MB per file
* Also supports structured output via `json_schema` (object-type schemas only)
## Authentication
Azure OpenAI tools are configured per step (or fall back to environment variables):
* `deployment` — the Azure OpenAI deployment name (not the model name). Falls back to `AZURE_OPENAI_MODEL_DEPLOYMENT_NAME` / `AZURE_OPENAI_DEPLOYMENT_NAME`.
* `endpoint` — the resource endpoint, e.g. `https://my-resource.openai.azure.com/`. Falls back to `AZURE_OPENAI_ENDPOINT`. Alternatively, set `resource_name` (the resource subdomain, e.g. `my-resource`); it is derived from the endpoint when omitted.
* `api_key` — the Azure OpenAI API key (stored as a secret). Falls back to `AZURE_OPENAI_API_KEY`.
* `api_version` — the API version. Falls back to `AZURE_OPENAI_API_VERSION`, then `preview`. Use `preview` for the rolling v1 surface, or a dated value such as `2025-04-01-preview`.
Optional settings: `temperature` (0–2, default 0.7), `is_reasoning_model` (see Notes), and `timeout_seconds` (default 300).
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
## Usage Examples
### Example: Structured Output with JSON Schema
```yaml theme={null}
- id: extract_entities
name: extract_entities
tool: AZURE_OPENAI_INVOKE
config:
- name: deployment
value: gpt-4o
- name: endpoint
value: https://my-resource.openai.azure.com/
- name: api_key
value: "{{secrets.AZURE_OPENAI_API_KEY}}"
- name: temperature
value: 0.1
input:
- name: prompt
value: |
Extract the names of people and organizations from the text:
{{steps.input.result.content}}
- name: json_schema
value: |
{
"type": "object",
"properties": {
"people": {
"type": "array",
"items": {"type": "string"}
},
"organizations": {
"type": "array",
"items": {"type": "string"}
}
}
}
```
### Example: Document Analysis
```yaml theme={null}
- id: analyze_document
name: analyze_document
tool: AZURE_OPENAI_INVOKE_WITH_FILE
config:
- name: deployment
value: gpt-4o
- name: endpoint
value: https://my-resource.openai.azure.com/
- name: api_key
value: "{{secrets.AZURE_OPENAI_API_KEY}}"
input:
- name: prompt
value: |
Please analyze this document and provide:
1. A brief summary
2. Key topics discussed
3. Any action items or recommendations
- name: file_link
value: "{{steps.upload_file.result.url}}"
```
## Notes
* The `json_schema` must have `"type": "object"` at the top level. Wrap arrays in an object property, e.g. `{ "type": "object", "properties": { "items": { "type": "array", "items": { "type": "string" } } } }`. Without `json_schema`, the result is returned as a string.
* Reasoning models (o-series / GPT-5) reject the `temperature` parameter. Since Azure deployment names are user-chosen, this is inferred from the deployment name; set `is_reasoning_model` explicitly to override the heuristic.
* Requests time out after `timeout_seconds` (default 300 seconds / 5 minutes).
* `AZURE_OPENAI_INVOKE_WITH_FILE` accepts at most 30 files per call, 100MB per file. Unsupported file types cause the step to fail with an error.
# Gemini
Source: https://carnot.mintlify.app/en/pages/tools/ai/gemini
Invoke responses from Gemini
## Overview
Interact with Gemini with prompts or by sending images. The Gemini tool also allows you to send prompts and receive structured responses.
## Key Features
* `GEMINI_INVOKE`
* Send prompts to Gemini AI
* `GEMINI_INVOKE_WITH_IMAGE`
* Send images to Gemini AI for analysis
* `GEMINI_GENERATE_IMAGE`
* Generate images from text descriptions using Gemini image generation models (Nano Banana)
## Authentication
For further details, [click here](/en/pages/credentials/gemini).
If you do not have an API key, you can still run Gemini tools by using Jinba API credit. If you'd like to use your own API key, you can obtain one from the [official Gemini website](https://ai.google.dev/gemini-api/docs/api-key).
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: Image Analysis and Spreadsheet Export
```yaml theme={null}
- id: analyze_image
name: analyze_image
tool: GEMINI_INVOKE_WITH_IMAGE
config:
- name: version
value: gemini-flash-latest
- name: token
value: "{{secrets.GEMINI_API_KEY}}"
input:
- name: prompt
value: Please analyze this image in detail. If there is any text, extract it as well. Please provide as much detail as possible.
- name: base64_image
value: YOUR_IMAGE_URL_OR_BASE64
- id: structure_information
name: structure_information
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Please organize the following image analysis results into a structured format.
==Image Analysis Results==
{{steps.analyze_image.result.content}}
==Instructions==
1. Extract and organize important information by category
2. Format the output suitable for spreadsheets
3. Output in the following JSON array format:
[
["Category", "Item", "Content"],
["Text", "Detected Text 1", "..."],
["Object", "Detected Object 1", "..."],
...
]
```
### Example: Image Generation
`GEMINI_GENERATE_IMAGE` generates an image from a text description and returns a downloadable image URL (`result.image_url`, valid for 24 hours). Three models are available: `gemini-3.1-flash-image` (Nano Banana, fast and efficient, the default), `gemini-2.5-flash-image` (its predecessor, retiring 2026-10-02 — steps that select it keep running on it, and are priced at its rate, until that date; from then on they run on `gemini-3.1-flash-image` and are priced at that model's rate) and `gemini-3-pro-image` (Nano Banana Pro, high-fidelity professional output). The `aspect_ratio` input accepts `1:1` (Square, the default), `3:4` (Portrait), `4:3` (Standard), `9:16` (Mobile Portrait), or `16:9` (Landscape).
```yaml theme={null}
- id: generate_image
name: generate_image
tool: GEMINI_GENERATE_IMAGE
config:
- name: model
value: gemini-3.1-flash-image
input:
- name: prompt
value: A watercolor illustration of Mount Fuji at sunrise, with cherry blossoms in the foreground
- name: aspect_ratio
value: "16:9"
```
# Gemini with File
Source: https://carnot.mintlify.app/en/pages/tools/ai/gemini_with_file
Use Gemini to generate text with files (PDF, image, audio, video, etc.)
## Overview
Gemini with File allows you to use Google's Gemini AI to analyze and generate text based on various file types including PDFs, images, audio, and video files. This multimodal AI capability enables comprehensive document analysis and content generation.
## Key Features
* `GEMINI_INVOKE_WITH_FILE`
* Analyze PDF documents with AI
* Process images and extract information
* Handle audio and video files
* Generate structured responses based on file content
* Support for multiple file formats
## Authentication
If you do not have an API key, you can still run Gemini tools by using Jinba API credit. If you'd like to use your own API key, you can obtain one from the [official Gemini website](https://ai.google.dev/gemini-api/docs/api-key).
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
## Example: Document Analysis
```yaml theme={null}
- id: analyze_document
name: analyze_document
tool: GEMINI_INVOKE_WITH_FILE
config:
- name: version
value: gemini-1.5-flash
- name: token
value: "{{secrets.GEMINI_API_KEY}}"
input:
- name: prompt
value: |
Please analyze this document and extract the following information:
1. Main topics and themes
2. Key data points and statistics
3. Any actionable insights
4. Summary of conclusions
- name: file_url
value: "{{steps.input_file.result.file_url}}"
```
## Use Cases
* **Document Review**: Analyze contracts, reports, and proposals
* **Content Extraction**: Extract key information from research papers
* **Data Analysis**: Process charts and graphs in images
* **Media Processing**: Analyze video and audio content
* **Compliance Checking**: Review documents for specific criteria
# Grok
Source: https://carnot.mintlify.app/en/pages/tools/ai/grok
Invoke responses from Grok
## Overview
The Grok tool allows you to interact with the Grok AI model. It provides a simple interface to send prompts and receive responses.
## Key Features
* `GROK_CHAT`
* Send prompts to Grok AI
* Configurable system prompt and model selection (default: `grok-4.3`)
## Authentication
For further details, [click here](/en/pages/credentials/grok).
If you do not have an API key, you can still run Grok tools by using Jinba API credit. If you'd like to use your own API key, you can obtain one from the [official Grok website](https://x.ai/api) and follow the developer documentation.
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: Ask Grok a Question
```yaml theme={null}
- id: grok_chat
tool: GROK_CHAT
input:
- name: system_prompt
value: You're an assistant
- name: model
value: grok-4.3
- name: prompt
value: why am I here
config:
- name: api_key
value: "{{secrets.GROK_CHAT}}"
```
# LlamaCloud
Source: https://carnot.mintlify.app/en/pages/tools/ai/llama_cloud
Advanced document processing and search with LlamaCloud
## Overview
LlamaCloud tools provide advanced document processing, parsing, and intelligent search capabilities. These tools leverage LlamaCloud's powerful document understanding and retrieval-augmented generation (RAG) features for complex document workflows.
## Key Features
* `LLAMA_CLOUD_PARSE`
* Parse various file formats to markdown using advanced extraction
* `LLAMA_CLOUD_QUERY`
* Query documents with intelligent retrieval
## Authentication
For further details, [click here](/en/pages/credentials/llama).
To use LlamaCloud tools, you need:
1. A LlamaCloud API key from [LlamaCloud](https://cloud.llamaindex.ai/)
2. Create projects and upload documents to build your knowledge base
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: Document Processing Pipeline
```yaml theme={null}
- id: parse_document
name: parse_document
tool: LLAMA_CLOUD_PARSE
config:
- name: api_key
value: "{{secrets.LLAMA_CLOUD_API_KEY}}"
- name: project_id
value: "your_project_id"
input:
- name: file_url
value: "https://example.com/technical_manual.pdf"
- name: parsing_instruction
value: |
Extract and preserve:
1. Technical specifications and parameters
2. Step-by-step procedures
3. Warning and safety information
4. Diagrams and figure descriptions
5. Reference tables and data
- id: process_parsed_content
name: process_parsed_content
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
import re
# Get parsed content
markdown_content = {{steps.parse_document.result.markdown}}
# Extract sections
sections = {}
current_section = "introduction"
current_content = []
lines = markdown_content.split('\n')
for line in lines:
if line.startswith('# ') or line.startswith('## '):
# Save previous section
if current_content:
sections[current_section] = '\n'.join(current_content)
# Start new section
current_section = line.strip('#').strip().lower().replace(' ', '_')
current_content = []
else:
current_content.append(line)
# Save last section
if current_content:
sections[current_section] = '\n'.join(current_content)
# Extract key information
specs = []
procedures = []
warnings = []
for section_name, content in sections.items():
if 'spec' in section_name or 'parameter' in section_name:
specs.append(content)
elif 'procedure' in section_name or 'step' in section_name:
procedures.append(content)
elif 'warning' in section_name or 'safety' in section_name:
warnings.append(content)
result = {
"sections": sections,
"specifications": specs,
"procedures": procedures,
"warnings": warnings,
"total_sections": len(sections)
}
print(json.dumps(result))
```
### Example: Multi-Document Analysis
```yaml theme={null}
- id: parse_multiple_documents
name: parse_multiple_documents
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
# Define documents to process
documents = [
{
"url": "https://example.com/user_manual.pdf",
"type": "user_manual",
"instruction": "Focus on user instructions and troubleshooting"
},
{
"url": "https://example.com/technical_spec.pdf",
"type": "technical_spec",
"instruction": "Extract all technical parameters and specifications"
},
{
"url": "https://example.com/installation_guide.pdf",
"type": "installation",
"instruction": "Capture installation steps and requirements"
}
]
print(json.dumps({"documents": documents}))
- id: parse_user_manual
name: parse_user_manual
tool: LLAMA_CLOUD_PARSE
config:
- name: api_key
value: "{{secrets.LLAMA_CLOUD_API_KEY}}"
- name: project_id
value: "your_project_id"
input:
- name: file_url
value: "{{steps.parse_multiple_documents.result.documents[0].url}}"
- name: parsing_instruction
value: "{{steps.parse_multiple_documents.result.documents[0].instruction}}"
- id: parse_technical_spec
name: parse_technical_spec
tool: LLAMA_CLOUD_PARSE
config:
- name: api_key
value: "{{secrets.LLAMA_CLOUD_API_KEY}}"
- name: project_id
value: "your_project_id"
input:
- name: file_url
value: "{{steps.parse_multiple_documents.result.documents[1].url}}"
- name: parsing_instruction
value: "{{steps.parse_multiple_documents.result.documents[1].instruction}}"
- id: create_unified_documentation
name: create_unified_documentation
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Create a unified documentation guide by combining information from these sources:
User Manual Content:
{{steps.parse_user_manual.result.markdown}}
Technical Specifications:
{{steps.parse_technical_spec.result.markdown}}
Create a single, well-organized document with:
1. Executive Summary
2. Installation Guide
3. Configuration Reference
4. User Operation Guide
5. Troubleshooting Section
6. Technical Specifications Appendix
Ensure consistency and eliminate redundancy.
```
### Example: RAG-Powered Q\&A System
```yaml theme={null}
- id: setup_qa_system
name: setup_qa_system
tool: INPUT_JSON_WITH_VALIDATION
input:
- name: value
value: {
"questions": [
"What are the minimum system requirements?",
"How do I configure network settings?",
"What should I do if the system fails to start?",
"How often should I perform maintenance?",
"What are the warranty terms?"
]
}
- id: answer_questions
name: answer_questions
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
questions = {{steps.setup_qa_system.result.questions}}
qa_pairs = []
for i, question in enumerate(questions):
qa_pairs.append({
"id": f"q_{i+1}",
"question": question,
"status": "pending"
})
print(json.dumps({"qa_pairs": qa_pairs}))
- id: get_answer_1
name: get_answer_1
tool: LLAMA_CLOUD_QUERY
config:
- name: api_key
value: "{{secrets.LLAMA_CLOUD_API_KEY}}"
- name: project_id
value: "your_project_id"
input:
- name: query
value: "{{steps.answer_questions.result.qa_pairs[0].question}}"
- name: include_sources
value: true
- id: get_answer_2
name: get_answer_2
tool: LLAMA_CLOUD_QUERY
config:
- name: api_key
value: "{{secrets.LLAMA_CLOUD_API_KEY}}"
- name: project_id
value: "your_project_id"
input:
- name: query
value: "{{steps.answer_questions.result.qa_pairs[1].question}}"
- name: include_sources
value: true
- id: compile_faq
name: compile_faq
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
# Compile all Q&A pairs
faq_items = [
{
"question": "{{steps.answer_questions.result.qa_pairs[0].question}}",
"answer": "{{steps.get_answer_1.result.response}}",
"sources": "{{steps.get_answer_1.result.sources}}"
},
{
"question": "{{steps.answer_questions.result.qa_pairs[1].question}}",
"answer": "{{steps.get_answer_2.result.response}}",
"sources": "{{steps.get_answer_2.result.sources}}"
}
]
# Format as FAQ document
faq_markdown = "# Frequently Asked Questions\n\n"
for i, item in enumerate(faq_items, 1):
faq_markdown += f"## {i}. {item['question']}\n\n"
faq_markdown += f"{item['answer']}\n\n"
if item['sources']:
faq_markdown += f"*Sources: {item['sources']}*\n\n"
faq_markdown += "---\n\n"
print(json.dumps({"faq_document": faq_markdown}))
```
## Tips and Best Practices
* Use specific parsing instructions for better content extraction
* Organize documents into logical projects for efficient searching
* Leverage LlamaIndex integration for advanced retrieval patterns
* Include source references for transparency and verification
* Process documents in batches for large-scale operations
* Use appropriate retrieval modes based on query types
* Monitor API usage for cost optimization
* Create structured indexes for frequently accessed information
# LlamaCloud Advanced Features
Source: https://carnot.mintlify.app/en/pages/tools/ai/llama_cloud_advanced
Advanced search and query capabilities with LlamaCloud and LlamaIndex integration
## Overview
LlamaCloud Advanced Features provide sophisticated search and query capabilities using LlamaIndex integration. These tools enable intelligent document retrieval and answer generation from your indexed knowledge base.
## Key Features
* `LLAMA_CLOUD_QUERY_WITH_LLAMA_INDEX`
* Query documents with intelligent retrieval using LlamaIndex
* `LLAMA_CLOUD_SEARCH`
* Search and generate answers using Llama Cloud index
* `LLAMA_CLOUD_SEARCH_WITH_LLAMA_INDEX`
* Enhanced search with LlamaIndex integration
## Authentication
For further details, [click here](/en/pages/credentials/llama).
To use these advanced LlamaCloud tools, you need:
1. A LlamaCloud API key from [LlamaCloud](https://cloud.llamaindex.ai/)
2. Properly configured projects and indexes
3. Organization ID and project setup
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: Advanced Document Query System
```yaml theme={null}
- id: setup_query_parameters
name: setup_query_parameters
tool: INPUT_JSON
input:
- name: value
value: {
"queries": [
"What are the key performance metrics mentioned in the quarterly report?",
"How does the company's growth compare to industry benchmarks?",
"What are the main risk factors identified?"
],
"system_prompt": "You are a financial analyst. Based on the provided context, answer the following query comprehensively: {query}",
"search_config": {
"similarity_top_k": 5,
"index_name": "quarterly-reports-index",
"project_name": "financial-analysis",
"organization_id": "your-org-id"
}
}
- id: query_financial_data
name: query_financial_data
tool: LLAMA_CLOUD_QUERY_WITH_LLAMA_INDEX
config:
- name: api_key
value: "{{secrets.LLAMA_CLOUD_API_KEY}}"
input:
- name: input
value: "{{steps.setup_query_parameters.result.queries}}"
- name: system_prompt
value: "{{steps.setup_query_parameters.result.system_prompt}}"
- name: name
value: "{{steps.setup_query_parameters.result.search_config.index_name}}"
- name: project_name
value: "{{steps.setup_query_parameters.result.search_config.project_name}}"
- name: organization_id
value: "{{steps.setup_query_parameters.result.search_config.organization_id}}"
- name: similarity_top_k
value: "{{steps.setup_query_parameters.result.search_config.similarity_top_k}}"
- id: process_query_results
name: process_query_results
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
# Process query results
query_results = {{steps.query_financial_data.result}}
processed_results = []
for i, result in enumerate(query_results):
query = result[0] if len(result) > 0 else "Unknown query"
answer = result[1] if len(result) > 1 else "No answer provided"
references = result[2:] if len(result) > 2 else []
processed_results.append({
"query_id": i + 1,
"question": query,
"answer": answer,
"references": references,
"reference_count": len(references)
})
# Generate summary report
summary = {
"total_queries": len(processed_results),
"successful_queries": len([r for r in processed_results if r["answer"] != "No answer provided"]),
"total_references": sum(r["reference_count"] for r in processed_results),
"detailed_results": processed_results
}
print(json.dumps(summary, indent=2))
```
### Example: Multi-Index Search Comparison
```yaml theme={null}
- id: setup_search_comparison
name: setup_search_comparison
tool: INPUT_JSON_WITH_VALIDATION
input:
- name: value
value: {
"search_query": "artificial intelligence trends and market outlook",
"indexes": [
{
"name": "tech-reports-2024",
"project": "technology-analysis",
"description": "Technology industry reports and analysis"
},
{
"name": "market-research-ai",
"project": "market-intelligence",
"description": "AI market research and forecasts"
}
],
"organization_id": "your-org-id"
}
- id: search_tech_reports
name: search_tech_reports
tool: LLAMA_CLOUD_SEARCH
config:
- name: api_key
value: "{{secrets.LLAMA_CLOUD_API_KEY}}"
input:
- name: input
value: ["{{steps.setup_search_comparison.result.search_query}}"]
- name: system_prompt
value: "Analyze the following query from a technology industry perspective: {query}"
- name: name
value: "{{steps.setup_search_comparison.result.indexes[0].name}}"
- name: project_name
value: "{{steps.setup_search_comparison.result.indexes[0].project}}"
- name: organization_id
value: "{{steps.setup_search_comparison.result.organization_id}}"
- name: similarity_top_k
value: 3
- id: search_market_intelligence
name: search_market_intelligence
tool: LLAMA_CLOUD_SEARCH_WITH_LLAMA_INDEX
config:
- name: api_key
value: "{{secrets.LLAMA_CLOUD_API_KEY}}"
input:
- name: input
value: ["{{steps.setup_search_comparison.result.search_query}}"]
- name: system_prompt
value: "Provide market analysis and forecasting insights for: {query}"
- name: name
value: "{{steps.setup_search_comparison.result.indexes[1].name}}"
- name: project_name
value: "{{steps.setup_search_comparison.result.indexes[1].project}}"
- name: organization_id
value: "{{steps.setup_search_comparison.result.organization_id}}"
- name: similarity_top_k
value: 3
- id: synthesize_insights
name: synthesize_insights
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Synthesize insights from multiple search results on: {{steps.setup_search_comparison.result.search_query}}
Technology Industry Perspective:
{{steps.search_tech_reports.result[0].answer}}
Market Intelligence Perspective:
{{steps.search_market_intelligence.result[0].answer}}
Create a comprehensive analysis that:
1. Identifies common themes and trends
2. Highlights unique insights from each source
3. Provides actionable recommendations
4. Notes any contradictions or differing viewpoints
5. Suggests areas for further research
Format as an executive summary with clear sections and bullet points.
```
### Example: Contextual Information Retrieval
```yaml theme={null}
- id: setup_contextual_search
name: setup_contextual_search
tool: INPUT_TEXT
input:
- name: value
value: "We are planning a new product launch in the healthcare AI sector. What regulatory considerations, market opportunities, and technical challenges should we be aware of?"
- id: extract_search_aspects
name: extract_search_aspects
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Break down this business query into specific search aspects:
"{{steps.setup_contextual_search.result}}"
Extract and categorize into:
1. Regulatory aspects (compliance, legal, regulations)
2. Market aspects (opportunities, competition, trends)
3. Technical aspects (challenges, requirements, capabilities)
For each aspect, generate 2-3 specific search queries that would help gather relevant information.
Return as JSON:
{
"regulatory_queries": ["query1", "query2", "query3"],
"market_queries": ["query1", "query2", "query3"],
"technical_queries": ["query1", "query2", "query3"]
}
- id: search_regulatory_info
name: search_regulatory_info
tool: LLAMA_CLOUD_QUERY_WITH_LLAMA_INDEX
config:
- name: api_key
value: "{{secrets.LLAMA_CLOUD_API_KEY}}"
input:
- name: input
value: "{{steps.extract_search_aspects.result.regulatory_queries}}"
- name: system_prompt
value: "Focus on regulatory and compliance aspects when answering: {query}"
- name: name
value: "regulatory-knowledge-base"
- name: project_name
value: "compliance-research"
- name: organization_id
value: "your-org-id"
- name: similarity_top_k
value: 4
- id: search_market_info
name: search_market_info
tool: LLAMA_CLOUD_QUERY_WITH_LLAMA_INDEX
config:
- name: api_key
value: "{{secrets.LLAMA_CLOUD_API_KEY}}"
input:
- name: input
value: "{{steps.extract_search_aspects.result.market_queries}}"
- name: system_prompt
value: "Provide market analysis and business intelligence for: {query}"
- name: name
value: "market-intelligence-index"
- name: project_name
value: "market-research"
- name: organization_id
value: "your-org-id"
- name: similarity_top_k
value: 4
- id: compile_comprehensive_report
name: compile_comprehensive_report
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
# Process all search results
regulatory_results = {{steps.search_regulatory_info.result}}
market_results = {{steps.search_market_info.result}}
def process_results(results, category):
processed = []
for result in results:
if len(result) >= 2:
processed.append({
"query": result[0],
"answer": result[1],
"references": result[2:] if len(result) > 2 else [],
"category": category
})
return processed
all_insights = []
all_insights.extend(process_results(regulatory_results, "Regulatory"))
all_insights.extend(process_results(market_results, "Market"))
# Generate structured report
report = {
"executive_summary": {
"total_insights": len(all_insights),
"regulatory_insights": len([i for i in all_insights if i["category"] == "Regulatory"]),
"market_insights": len([i for i in all_insights if i["category"] == "Market"])
},
"detailed_findings": {
"regulatory_considerations": [i for i in all_insights if i["category"] == "Regulatory"],
"market_opportunities": [i for i in all_insights if i["category"] == "Market"]
},
"action_items": [
"Review regulatory compliance requirements",
"Analyze market positioning strategies",
"Assess technical implementation challenges",
"Develop risk mitigation strategies"
]
}
print(json.dumps(report, indent=2))
```
## Tips and Best Practices
* **Query Optimization**: Use specific, well-structured queries for better retrieval accuracy
* **Index Management**: Organize documents into logical indexes by topic or domain
* **Similarity Tuning**: Adjust `similarity_top_k` based on the complexity of your queries
* **System Prompts**: Craft specialized system prompts for different types of analysis
* **Result Processing**: Always process and validate results for downstream use
* **Reference Tracking**: Utilize reference information for transparency and verification
* **Batch Processing**: Process multiple related queries together for efficiency
* **Context Preservation**: Maintain context across multiple search operations
* **Error Handling**: Implement proper error handling for API failures or empty results
* **Cost Management**: Monitor API usage and optimize query patterns for cost efficiency
# OpenAI
Source: https://carnot.mintlify.app/en/pages/tools/ai/openai
Invoke responses from OpenAI models
## Overview
OpenAI tools allow you to interact with OpenAI's language models, including GPT-3.5 and GPT-4. These tools support both simple text generation and structured output with JSON schemas.
## Key Features
* `OPENAI_INVOKE`
* Send prompts to OpenAI models for text generation
* Support for structured output with JSON schemas
* `OPENAI_INVOKE_WITH_FILE`
* Send files along with prompts for file-based analysis
* `OPENAI_DEEP_RESEARCH`
* Conduct autonomous, in-depth research using OpenAI's Deep Research models
* Browses public sources with web search and synthesizes a comprehensive report
* `OPENAI_SORA2`
* Generate videos with OpenAI's Sora models and receive a downloadable video URL
## Authentication
For further details, [click here](/en/pages/credentials/openai).
If you do not have an API key, you can still run OpenAI tools by using Jinba API credit. If you'd like to use your own API key, you can obtain one from the [OpenAI API website](https://platform.openai.com/api-keys).
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
**Note**: Reasoning models — o1, o3, o4, and the GPT-5 family except GPT-5.2 — do not support the `temperature` setting, and it is silently ignored for them. Their output is not deterministic even at `temperature: 0`, so when measuring output token counts, average over multiple runs instead of relying on a single invocation.
### Example: Basic Text Generation
```yaml theme={null}
- id: generate_summary
name: generate_summary
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
- name: temperature
value: 0.7
input:
- name: prompt
value: |
Please summarize the following text in 3 key points:
{{steps.previous_step.result.content}}
```
### Example: Structured Output with JSON Schema
```yaml theme={null}
- id: extract_entities
name: extract_entities
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
- name: temperature
value: 0.1
input:
- name: prompt
value: |
Extract the following information from the text:
- Names of people
- Organizations
- Locations
- Dates
Text: {{steps.input.result.content}}
- name: json_schema
value: |
{
"type": "object",
"properties": {
"entities": {
"type": "object",
"properties": {
"people": {
"type": "array",
"items": {"type": "string"}
},
"organizations": {
"type": "array",
"items": {"type": "string"}
},
"locations": {
"type": "array",
"items": {"type": "string"}
},
"dates": {
"type": "array",
"items": {"type": "string"}
}
}
}
}
}
```
### Example: File Analysis
```yaml theme={null}
- id: analyze_document
name: analyze_document
tool: OPENAI_INVOKE_WITH_FILE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Please analyze this document and provide:
1. A brief summary
2. Key topics discussed
3. Any action items or recommendations
- name: file_link
value: "{{steps.upload_file.result.url}}"
```
### Example: Deep Research
`OPENAI_DEEP_RESEARCH` runs long-form autonomous research. Available models are `o4-mini-deep-research-2025-06-26` (lightweight and faster, the default) and `o3-deep-research-2025-06-26` (optimized for in-depth synthesis and higher quality). Web search is enabled by default (`enable_web_search`), and you can optionally enable a code interpreter for data analysis (`enable_code_interpreter`). The research runs in background mode with polling; the `timeout_seconds` config controls how long to wait (default 3600 seconds). The final report is returned as `result.report`.
```yaml theme={null}
- id: market_research
name: market_research
tool: OPENAI_DEEP_RESEARCH
config:
- name: version
value: o4-mini-deep-research-2025-06-26
- name: reasoning_summary
value: auto
input:
- name: research_query
value: |
Research the current landscape of AI workflow automation tools.
Include major vendors, pricing models, and recent market trends.
- name: system_instructions
value: Focus on reputable industry sources and cite them inline.
- name: enable_web_search
value: true
- id: use_report
name: use_report
tool: OPENAI_INVOKE
input:
- name: prompt
value: |
Summarize the following research report in 5 bullet points:
{{steps.market_research.result.report}}
```
### Example: Video Generation with Sora
`OPENAI_SORA2` generates a video from a text prompt, waits for completion, and returns a downloadable video URL (`result.video_url`, valid for 24 hours). You can choose the model (`sora-2` or `sora-2-pro`), the clip duration in seconds (`4`, `8`, or `12`), and the resolution (`720x1280`, `1280x720`, `1024x1792`, or `1792x1024`). An optional `image_reference` (JPEG, PNG, or WEBP) can be provided to guide the video.
```yaml theme={null}
- id: generate_video
name: generate_video
tool: OPENAI_SORA2
input:
- name: prompt
value: A golden retriever puppy running through a field of sunflowers at sunset, cinematic lighting
- name: model
value: sora-2
- name: seconds
value: "8"
- name: size
value: "1280x720"
```
# Jev (TypeSafe AI)
Source: https://carnot.mintlify.app/en/pages/tools/ai/typesafe_jev
Make fast, structured decisions with TypeSafe AI Jev
## Overview
Jev is TypeSafe AI's System One model. Instead of generating text, it evaluates a `state` against typed questions and returns calibrated probabilities, so a following step can branch on a number rather than parse a sentence. It fits classification, routing, rubric scoring, and guardrail checks.
## Key Features
* `TYPESAFE_JEV_EVALUATE`
* Evaluate one `state` against many questions in a single request
* Three question types:
* `noul` — yes/no. Returns `noul`, the probability (0–1) that the answer is yes
* `choice` — pick one option. `criteria` maps each option to a description (or `null`). Returns `choice`, `probabilities`, `confidence`
* `score` — rate along ordered levels. `criteria` is an array of at least two level descriptions. Returns `score` (can land between levels), `legend`, `probabilities`, `confidence`
* `state` accepts plain text or a JSON object/array
* `model` defaults to `jev-latest`. Pin a version such as `jev-1.13.0` if you tune confidence thresholds
* Rate-limit (`429`) and overload (`529`) responses are retried automatically
## Authentication
This tool requires your own TypeSafe AI API key; Jinba API credit is not available for it. See the [TypeSafe AI quick start](https://docs.typesafe.ai/introduction/quickstart) to obtain one.
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
## Limits
* Text only, with a budget of 64k tokens per request (32k for `state` plus the longest question)
* English is the most accurate language. For other languages, check `confidence` before acting on an answer
### Example: Triage a Support Ticket
```yaml theme={null}
- id: triage
tool: TYPESAFE_JEV_EVALUATE
input:
- name: state
value: "Help! My payouts have been failing for 3 days."
- name: questions
value: |
{
"is_urgent": {
"type": "noul",
"instructions": "Does this convey urgency?"
},
"department": {
"type": "choice",
"instructions": "Which team should handle this?",
"criteria": {
"billing": "Payments, invoicing, refunds",
"technical": "Bugs, outages, integrations",
"sales": "Pricing, upgrades, new accounts"
}
},
"frustration": {
"type": "score",
"instructions": "How frustrated is the customer?",
"criteria": ["Calm", "Frustrated", "Very angry"]
}
}
config:
- name: api_key
value: "{{secrets.TYPESAFE_API_KEY}}"
```
Answers come back under the same ids, e.g. `{{steps.triage.result.answers.department.choice}}` or `{{steps.triage.result.answers.is_urgent.noul}}`.
# ChatWork Advanced
Source: https://carnot.mintlify.app/en/pages/tools/communication/chatwork_advanced
Advanced ChatWork messaging and task management tools
## Overview
ChatWork Advanced tools provide comprehensive functionality for managing messages, tasks, and team communication in ChatWork. These tools extend beyond basic messaging to include task management, message retrieval, and workflow automation.
## Key Features
* `CHATWORK_SEND_MESSAGE`
* Send messages to specific ChatWork rooms
* `CHATWORK_GET_MESSAGES`
* Retrieve messages from ChatWork rooms
* `CHATWORK_CREATE_TASK`
* Create tasks in ChatWork rooms
* `CHATWORK_GET_TASKS`
* Retrieve tasks from ChatWork rooms
* `CHATWORK_UPDATE_TASK_STATUS`
* Update the status of existing ChatWork tasks
## Authentication
For further details, [click here](/en/pages/credentials/chatwork).
To use ChatWork tools, you need a ChatWork API token:
1. Log in to your ChatWork account
2. Go to [API Token Settings](https://www.chatwork.com/service/packages/chatwork/subpackages/api/token.php)
3. Generate a new API token
4. Copy the token for use in your workflows
**Note**: Treat API tokens as sensitive information and never commit them to public repositories.
### Example: Basic Message Operations
```yaml theme={null}
- id: send_notification
name: send_notification
tool: CHATWORK_SEND_MESSAGE
config:
- name: api_token
value: "{{secrets.CHATWORK_API_TOKEN}}"
input:
- name: room_id
value: "123456789"
- name: body
value: |
[To:all] Weekly Report Update
The weekly report has been completed and is now available.
Please review the following sections:
- Sales Performance: {{steps.sales_data.result.summary}}
- Key Metrics: {{steps.metrics.result.kpi}}
- Action Items: See tasks below
Let me know if you have any questions!
- id: get_recent_messages
name: get_recent_messages
tool: CHATWORK_GET_MESSAGES
config:
- name: api_token
value: "{{secrets.CHATWORK_API_TOKEN}}"
input:
- name: room_id
value: "123456789"
- name: force
value: 1
- id: analyze_messages
name: analyze_messages
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Analyze the following ChatWork messages and identify:
1. Key topics discussed
2. Action items mentioned
3. Questions that need answers
4. Urgent items requiring attention
Messages: {{steps.get_recent_messages.result.messages}}
```
### Example: Task Management Workflow
```yaml theme={null}
- id: create_project_tasks
name: create_project_tasks
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
from datetime import datetime, timedelta
# Define project tasks
project_tasks = [
{
"title": "Design wireframes for new feature",
"assignee": "12345",
"limit_time": int((datetime.now() + timedelta(days=3)).timestamp()),
"priority": "high"
},
{
"title": "Implement backend API endpoints",
"assignee": "67890",
"limit_time": int((datetime.now() + timedelta(days=5)).timestamp()),
"priority": "medium"
},
{
"title": "Create unit tests for new functionality",
"assignee": "54321",
"limit_time": int((datetime.now() + timedelta(days=7)).timestamp()),
"priority": "medium"
}
]
print(json.dumps({"tasks": project_tasks}))
- id: create_task_1
name: create_task_1
tool: CHATWORK_CREATE_TASK
config:
- name: api_token
value: "{{secrets.CHATWORK_API_TOKEN}}"
input:
- name: room_id
value: "123456789"
- name: body
value: "{{steps.create_project_tasks.result.tasks[0].title}}"
- name: to_ids
value: "{{steps.create_project_tasks.result.tasks[0].assignee}}"
- name: limit_time
value: "{{steps.create_project_tasks.result.tasks[0].limit_time}}"
- id: create_task_2
name: create_task_2
tool: CHATWORK_CREATE_TASK
config:
- name: api_token
value: "{{secrets.CHATWORK_API_TOKEN}}"
input:
- name: room_id
value: "123456789"
- name: body
value: "{{steps.create_project_tasks.result.tasks[1].title}}"
- name: to_ids
value: "{{steps.create_project_tasks.result.tasks[1].assignee}}"
- name: limit_time
value: "{{steps.create_project_tasks.result.tasks[1].limit_time}}"
- id: notify_task_creation
name: notify_task_creation
tool: CHATWORK_SEND_MESSAGE
config:
- name: api_token
value: "{{secrets.CHATWORK_API_TOKEN}}"
input:
- name: room_id
value: "123456789"
- name: body
value: |
[To:all] New Project Tasks Created
I've created the following tasks for our new project:
{{#each steps.create_project_tasks.result.tasks}}
- {{title}} (Assigned to: {{assignee}})
{{/each}}
Please check your task list and let me know if you have any questions!
```
### Example: Task Status Monitoring
```yaml theme={null}
- id: get_room_tasks
name: get_room_tasks
tool: CHATWORK_GET_TASKS
config:
- name: api_token
value: "{{secrets.CHATWORK_API_TOKEN}}"
input:
- name: room_id
value: "123456789"
- name: status
value: "open"
- id: analyze_task_status
name: analyze_task_status
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
from datetime import datetime
tasks = {{steps.get_room_tasks.result.tasks}}
current_time = datetime.now().timestamp()
overdue_tasks = []
due_soon_tasks = []
normal_tasks = []
for task in tasks:
limit_time = task.get('limit_time', 0)
if limit_time > 0:
if limit_time < current_time:
overdue_tasks.append(task)
elif limit_time < current_time + (24 * 60 * 60): # Due within 24 hours
due_soon_tasks.append(task)
else:
normal_tasks.append(task)
result = {
"overdue": len(overdue_tasks),
"due_soon": len(due_soon_tasks),
"normal": len(normal_tasks),
"overdue_tasks": overdue_tasks,
"due_soon_tasks": due_soon_tasks
}
print(json.dumps(result))
- id: send_status_update
name: send_status_update
tool: CHATWORK_SEND_MESSAGE
config:
- name: api_token
value: "{{secrets.CHATWORK_API_TOKEN}}"
input:
- name: room_id
value: "123456789"
- name: body
value: |
📊 Task Status Report
⚠️ Overdue Tasks: {{steps.analyze_task_status.result.overdue}}
🔔 Due Soon (24h): {{steps.analyze_task_status.result.due_soon}}
✅ On Track: {{steps.analyze_task_status.result.normal}}
{{#if steps.analyze_task_status.result.overdue_tasks}}
🚨 Overdue Tasks Need Attention:
{{#each steps.analyze_task_status.result.overdue_tasks}}
- {{body}} (Assigned to: {{assigned_by_account.name}})
{{/each}}
{{/if}}
Please update your task status if needed!
- id: update_completed_task
name: update_completed_task
tool: CHATWORK_UPDATE_TASK_STATUS
config:
- name: api_token
value: "{{secrets.CHATWORK_API_TOKEN}}"
input:
- name: room_id
value: "123456789"
- name: task_id
value: "987654321"
- name: body
value: "done"
```
### Example: Message-Based Workflow Automation
```yaml theme={null}
- id: monitor_messages
name: monitor_messages
tool: CHATWORK_GET_MESSAGES
config:
- name: api_token
value: "{{secrets.CHATWORK_API_TOKEN}}"
input:
- name: room_id
value: "123456789"
- name: force
value: 1
- id: process_commands
name: process_commands
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
import re
messages = {{steps.monitor_messages.result.messages}}
commands = []
# Look for command patterns in messages
command_patterns = {
r'/create[_\s]+task\s+(.+)': 'create_task',
r'/report\s+(.+)': 'generate_report',
r'/remind\s+(.+)': 'set_reminder',
r'/status\s*': 'show_status'
}
for message in messages[-10:]: # Check last 10 messages
body = message.get('body', '')
for pattern, command_type in command_patterns.items():
match = re.search(pattern, body, re.IGNORECASE)
if match:
commands.append({
'type': command_type,
'message_id': message.get('message_id'),
'from_account': message.get('account', {}).get('name'),
'content': match.group(1) if match.lastindex else '',
'original_message': body
})
print(json.dumps({"commands": commands}))
- id: execute_commands
name: execute_commands
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
commands = {{steps.process_commands.result.commands}}
responses = []
for cmd in commands:
if cmd['type'] == 'create_task':
responses.append(f"✅ Task created: {cmd['content']}")
elif cmd['type'] == 'generate_report':
responses.append(f"📊 Generating report for: {cmd['content']}")
elif cmd['type'] == 'set_reminder':
responses.append(f"⏰ Reminder set for: {cmd['content']}")
elif cmd['type'] == 'show_status':
responses.append("📋 Showing current status...")
if responses:
response_text = f"🤖 Bot Response:\n" + "\n".join(responses)
else:
response_text = None
print(json.dumps({"response": response_text, "command_count": len(commands)}))
- id: send_bot_response
name: send_bot_response
tool: CHATWORK_SEND_MESSAGE
condition: "{{steps.execute_commands.result.response != null}}"
config:
- name: api_token
value: "{{secrets.CHATWORK_API_TOKEN}}"
input:
- name: room_id
value: "123456789"
- name: body
value: "{{steps.execute_commands.result.response}}"
```
## Tips and Best Practices
* Use meaningful task titles and descriptions for better project management
* Set appropriate due dates for tasks to maintain project timelines
* Monitor message patterns for workflow automation opportunities
* Use @mentions and \[To:all] notifications strategically
* Implement error handling for API rate limits
* Store room IDs and user IDs in secrets for better security
* Consider using webhooks for real-time message processing
* Use task status updates to keep projects on track
# Discord
Source: https://carnot.mintlify.app/en/pages/tools/communication/discord
Integrate with a Discord Bot
## Overview
The Discord tools allows you to integrate with a Discord bot, enabling you to send messages, retrieve messages from channels, add reactions, and fetch user information. This is useful for automating interactions with Discord servers.
## Key Features
* `DISCORD_SEND_MESSAGE`
* Send messages to Discord channels
* `DISCORD_GET_CHANNEL_MESSAGES`
* Retrieve messages from a specific channel
* Supports filtering
* `DISCORD_ADD_REACTION`
* Add reactions to messages
* `DISCORD_GET_USER_INFO`
* Fetch user information (e.g. roles, permissions)
## Authentication
For further details, [click here](/en/pages/credentials/discord).
To use the Discord tool, you need a Discord bot token. You can create a bot and obtain the token from the [Discord Developer Portal](https://discord.com/developers/applications). Follow the instructions in the developer documentation to set up your bot and get the token.
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: Fetching and Sending Messages, Adding Reactions, and Getting User Info
```yaml theme={null}
- id: send_message
tool: DISCORD_SEND_MESSAGE
config:
- name: token
value: "{{secrets.DISCORD_BOT_TOKEN}}"
input:
- name: channel_id
value: "{{secrets.CHANNEL_ID}}"
- name: content
value: Hello from Discord Bot!
- id: get_messages
tool: DISCORD_GET_CHANNEL_MESSAGES
config:
- name: token
value: "{{secrets.DISCORD_BOT_TOKEN}}"
input:
- name: channel_id
value: "123456789012345678"
- name: limit
value: 5
- id: add_reaction
tool: DISCORD_ADD_REACTION
config:
- name: token
value: "{{secrets.DISCORD_BOT_TOKEN}}"
needs:
- get_messages
input:
- name: channel_id
value: "{{secrets.CHANNEL_ID}}"
- name: message_id
value: "{{steps.get_messages.result[0].id}}"
- name: emoji
value: 👍
- id: get_user_info
tool: DISCORD_GET_USER_INFO
config:
- name: token
value: "{{secrets.DISCORD_BOT_TOKEN}}"
input:
- name: user_id
value: "{{secrets.USER_ID}}"
```
# Faximo FAX Service
Source: https://carnot.mintlify.app/en/pages/tools/communication/faximo
Send FAX messages and search FAX history using Faximo service
## Overview
Faximo provides comprehensive FAX services through both standard Faximo and FaximoSilver platforms. Send documents via FAX and track your FAX history with detailed delivery reports and status tracking.
## Key Features
### FAXIMO\_SEND\_FAX
* Send FAX messages to single or multiple recipients
* Support for document attachments
* Delivery confirmation and tracking
* Customizable FAX settings and options
### FAXIMO\_SEARCH\_HISTORY
* Search through FAX send history
* Track delivery status and timing
* Access historical FAX records
* Filtering and search capabilities
## Authentication
Faximo requires login credentials for your Faximo or FaximoSilver account.
**Required credentials:**
* Login ID
* Password
**Note**: Treat credentials as sensitive information and never commit them to public repositories.
## Example: Send FAX Document
```yaml theme={null}
- id: prepare_fax_document
name: prepare_fax_document
tool: INPUT_FILE
input:
- name: description
value: "Upload document to send via FAX"
- id: send_important_fax
name: send_important_fax
tool: FAXIMO_SEND_FAX
config:
- name: login_id
value: "{{secrets.FAXIMO_LOGIN_ID}}"
- name: password
value: "{{secrets.FAXIMO_PASSWORD}}"
input:
- name: service_type
value: "faximo" # or "faximoSilver"
- name: sendto
value: "+1-555-123-4567,+1-555-987-6543" # Multiple FAX numbers
- name: subject
value: "Important Business Document - {{date | format('YYYY-MM-DD')}}"
- name: body
value: |
Dear Recipient,
Please find attached important business documents for your review.
This FAX was sent automatically via Jinba Flow.
Best regards,
Your Company Name
- name: attachments
value: "{{steps.prepare_fax_document.result.file_url}}"
- name: priority
value: "high"
- name: receipt_required
value: true
- id: log_fax_result
name: log_fax_result
tool: OUTPUT_TEXT
input:
- name: text
value: |
FAX sent successfully!
Result Code: {{steps.send_important_fax.result.result_code}}
Process Key: {{steps.send_important_fax.result.process_key}}
Acceptance Time: {{steps.send_important_fax.result.acceptance_time}}
Detail Number: {{steps.send_important_fax.result.unique_detail_number}}
```
## Example: Bulk FAX Campaign
```yaml theme={null}
- id: prepare_recipient_list
name: prepare_recipient_list
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
# Prepare FAX recipient list
recipients = [
{"name": "Company A", "fax": "+1-555-111-2222"},
{"name": "Company B", "fax": "+1-555-333-4444"},
{"name": "Company C", "fax": "+1-555-555-6666"}
]
# Create comma-separated FAX numbers
fax_numbers = ",".join([r["fax"] for r in recipients])
print(f"FAX_NUMBERS: {fax_numbers}")
# Create recipient summary
print(f"TOTAL_RECIPIENTS: {len(recipients)}")
for i, recipient in enumerate(recipients, 1):
print(f"RECIPIENT_{i}: {recipient['name']} - {recipient['fax']}")
- id: upload_campaign_document
name: upload_campaign_document
tool: INPUT_FILE
input:
- name: description
value: "Upload marketing document for FAX campaign"
- id: send_bulk_fax
name: send_bulk_fax
tool: FAXIMO_SEND_FAX
config:
- name: login_id
value: "{{secrets.FAXIMO_LOGIN_ID}}"
- name: password
value: "{{secrets.FAXIMO_PASSWORD}}"
input:
- name: service_type
value: "faximo"
- name: sendto
value: "{{steps.prepare_recipient_list.result.stdout | regex_search('FAX_NUMBERS: (.+)') | first}}"
- name: subject
value: "Monthly Newsletter - {{date | format('MMMM YYYY')}}"
- name: body
value: |
Dear Valued Partner,
Please find our monthly newsletter attached.
This communication contains important updates about our services.
Thank you for your continued partnership.
Best regards,
Marketing Team
- name: attachments
value: "{{steps.upload_campaign_document.result.file_url}}"
- name: send_time
value: "immediate"
- name: notification_email
value: "admin@yourcompany.com"
- id: track_campaign_status
name: track_campaign_status
tool: OUTPUT_FILE
input:
- name: content
value: |
FAX Campaign Report
==================
Date: {{date | format('YYYY-MM-DD HH:mm:ss')}}
Campaign: Monthly Newsletter
Results:
- Result Code: {{steps.send_bulk_fax.result.result_code}}
- Process Key: {{steps.send_bulk_fax.result.process_key}}
- Acceptance Time: {{steps.send_bulk_fax.result.acceptance_time}}
- Detail Number: {{steps.send_bulk_fax.result.unique_detail_number}}
Recipients: {{steps.prepare_recipient_list.result.stdout | regex_search('TOTAL_RECIPIENTS: (\\d+)') | first}}
Status: Submitted for processing
Next Steps:
1. Monitor delivery status
2. Check for any failed deliveries
3. Follow up on delivery confirmations
- name: filename
value: "fax_campaign_report_{{date | format('YYYY-MM-DD')}}.txt"
- name: fileType
value: "txt"
```
## Example: FAX History Tracking
```yaml theme={null}
- id: search_recent_fax_history
name: search_recent_fax_history
tool: FAXIMO_SEARCH_HISTORY
config:
- name: login_id
value: "{{secrets.FAXIMO_LOGIN_ID}}"
- name: password
value: "{{secrets.FAXIMO_PASSWORD}}"
input:
- name: service_type
value: "faximo"
- name: date_from
value: "{{date | date_add(-30, 'days') | format('YYYY-MM-DD')}}" # Last 30 days
- name: date_to
value: "{{date | format('YYYY-MM-DD')}}"
- name: status_filter
value: "all" # or "success", "failed", "pending"
- id: analyze_fax_performance
name: analyze_fax_performance
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
from collections import Counter
# Parse FAX history results
fax_history = {{steps.search_recent_fax_history.result.history}}
if not fax_history:
print("No FAX history found for the specified period.")
else:
# Analyze delivery status
statuses = [fax.get('status', 'unknown') for fax in fax_history]
status_counts = Counter(statuses)
total_faxes = len(fax_history)
successful_faxes = status_counts.get('delivered', 0)
failed_faxes = status_counts.get('failed', 0)
pending_faxes = status_counts.get('pending', 0)
success_rate = (successful_faxes / total_faxes * 100) if total_faxes > 0 else 0
print("FAX Performance Analysis")
print("=" * 30)
print(f"Total FAXes sent: {total_faxes}")
print(f"Successfully delivered: {successful_faxes}")
print(f"Failed deliveries: {failed_faxes}")
print(f"Pending deliveries: {pending_faxes}")
print(f"Success rate: {success_rate:.1f}%")
print()
# Top recipients
recipients = [fax.get('recipient', 'unknown') for fax in fax_history]
top_recipients = Counter(recipients).most_common(5)
print("Top Recipients:")
for recipient, count in top_recipients:
print(f" {recipient}: {count} FAXes")
- id: create_performance_report
name: create_performance_report
tool: OUTPUT_FILE
input:
- name: content
value: |
FAX Performance Report
======================
Report Period: {{steps.search_recent_fax_history.input.date_from}} to {{steps.search_recent_fax_history.input.date_to}}
Generated: {{date | format('YYYY-MM-DD HH:mm:ss')}}
{{steps.analyze_fax_performance.result.stdout}}
Recommendations:
- Monitor failed deliveries and retry if necessary
- Verify recipient FAX numbers for failed sends
- Consider delivery time optimization
- Review document formatting for better compatibility
For detailed delivery logs, check the Faximo service dashboard.
- name: filename
value: "fax_performance_report_{{date | format('YYYY-MM-DD')}}.txt"
- name: fileType
value: "txt"
```
## FAX Configuration Options
### Service Types
* **faximo**: Standard Faximo service
* **faximoSilver**: Premium FaximoSilver service
### Priority Levels
* **low**: Standard delivery
* **normal**: Regular priority (default)
* **high**: High priority delivery
* **urgent**: Urgent delivery
### Send Options
* **immediate**: Send immediately
* **scheduled**: Schedule for specific time
* **business\_hours\_only**: Send during business hours only
* **retry\_failed**: Automatically retry failed sends
## Response Data
### Send FAX Response
```json theme={null}
{
"result_code": "SUCCESS",
"process_key": "FAX123456789",
"acceptance_time": "2024-01-15 14:30:00",
"unique_detail_number": "DTL001234567"
}
```
### History Search Response
```json theme={null}
{
"history": [
{
"id": "FAX123456",
"recipient": "+1-555-123-4567",
"subject": "Business Document",
"status": "delivered",
"send_time": "2024-01-15 14:30:00",
"delivery_time": "2024-01-15 14:32:15"
}
]
}
```
## Use Cases
* **Document Delivery**: Send contracts, invoices, and legal documents
* **Marketing Campaigns**: Distribute newsletters and promotional materials
* **Compliance Communication**: Send regulatory notices and compliance documents
* **Emergency Notifications**: Urgent communication when email is insufficient
* **Healthcare**: Medical records and prescription transmission
* **Legal Services**: Court documents and legal correspondence
* **Real Estate**: Property documents and contracts
* **Government Communication**: Official notices and forms
## Best Practices
### FAX Formatting
* Use clear, high-contrast documents
* Avoid small fonts (minimum 10pt recommended)
* Test document formatting before bulk sends
* Include cover page with contact information
### Delivery Optimization
* Send during business hours for better delivery rates
* Verify FAX numbers before sending
* Monitor delivery status and retry failed sends
* Use appropriate priority levels
### Security Considerations
* Encrypt sensitive documents before FAX transmission
* Use secure credential storage
* Log all FAX activity for audit trails
* Comply with industry regulations (HIPAA, etc.)
# Gmail
Source: https://carnot.mintlify.app/en/pages/tools/communication/gmail
Email operations using Gmail API
## Overview
These tools provide functionality for email management using the Gmail API.
## Key Features
* `GMAIL_LIST_MESSAGES`
* List messages in the user's mailbox
* `GMAIL_GET_MESSAGE`
* Retrieve a specific message by ID
* `GMAIL_SEND_MESSAGE`
* Send an email message
* Supports sending as a draft or directly to the recipient
* Optional CC recipients for sharing copies
## Authentication
For further details, [click here](/en/pages/credentials/google-oauth).
To use the Gmail API, you need navigate to the [Jinba secrets dashboard](https://flow.jinba.io/workspace/secrets) and authenticate with your Google account. This will create a new OAuth token for you.
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: List, Get, and Send Messages
```yaml theme={null}
- id: list_messages
tool: GMAIL_LIST_MESSAGES
config:
- name: token
value: "{{secrets.GMAIL_OAUTH_TOKEN}}"
input:
- name: user_id
value: me
- id: get_message
tool: GMAIL_GET_MESSAGE
needs:
- list_messages
config:
- name: token
value: "{{secrets.GMAIL_OAUTH_TOKEN}}"
input:
- name: id
value: "{{steps.list_messages.result.messages[0].id}}"
- name: user_id
value: me
- id: send_message
tool: GMAIL_SEND_MESSAGE
needs:
- get_message
config:
- name: token
value: "{{secrets.GMAIL_OAUTH_TOKEN}}"
input:
- name: as_draft
value: true
- name: user_id
value: me
- name: to_email
value: test@example.com
- name: cc_emails
value: cc@example.com, manager@example.com
- name: subject
value: test draft
- name: body
value: draft
```
# Intercom
Source: https://carnot.mintlify.app/en/pages/tools/communication/intercom
Create contacts, send messages, track events, and fetch conversations in Intercom
## Overview
Intercom tools let you create contacts, send messages, track customer events, and retrieve conversations from Intercom.
## Key Features
* `INTERCOM_CREATE_USER`
* Create or update a contact in Intercom
* `INTERCOM_SEND_MESSAGE`
* Create a new conversation or reply to an existing one
* `INTERCOM_TRACK_EVENT`
* Track customer events for analytics and automation
* `INTERCOM_GET_CONVERSATION`
* Retrieve a conversation by conversation ID
## Authentication
For further details, [click here](/en/pages/credentials/intercom).
These tools require an Intercom access token. Some reply flows also require an Intercom admin ID as an input value.
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: Create User, Send Message, Track Event, and Get Conversation
```yaml theme={null}
- id: create_user
tool: INTERCOM_CREATE_USER
config:
- name: access_token
value: "{{secrets.INTERCOM_ACCESS_TOKEN}}"
input:
- name: email
value: "customer@example.com"
- name: name
value: "Intercom Flow Test User"
- id: send_message
tool: INTERCOM_SEND_MESSAGE
needs:
- create_user
config:
- name: access_token
value: "{{secrets.INTERCOM_ACCESS_TOKEN}}"
input:
- name: from
value: '{"type":"admin","id":"{{secrets.INTERCOM_ADMIN_ID}}"}'
- name: to
value: '{"type":"user","id":"{{steps.create_user.result.id}}"}'
- name: body
value: "Hello from JinbaFlow!"
- id: track_event
tool: INTERCOM_TRACK_EVENT
needs:
- create_user
config:
- name: access_token
value: "{{secrets.INTERCOM_ACCESS_TOKEN}}"
input:
- name: event_name
value: "flow_test_event"
- name: email
value: "{{steps.create_user.result.email}}"
- name: metadata
value: '{"source":"jinbaflow"}'
- id: get_conversation
tool: INTERCOM_GET_CONVERSATION
needs:
- send_message
config:
- name: access_token
value: "{{secrets.INTERCOM_ACCESS_TOKEN}}"
input:
- name: conversation_id
value: "{{steps.send_message.result.conversation_id}}"
```
# LINE
Source: https://carnot.mintlify.app/en/pages/tools/communication/line
LINE messaging platform tools for sending messages, broadcasting, and retrieving user data
## Overview
LINE tools allow you to interact with the LINE Messaging API. Supports direct messaging to specific users, broadcasting to all followers, and retrieving user profile and analytics data.
## Key Features
### Messaging
* `LINE_SEND_MESSAGE`
* Send a text message to a specific LINE user
* **Inputs**: `to` (LINE user ID), `message` (text)
* `LINE_BROADCAST_MESSAGE`
* Broadcast a message to all users who follow your LINE Official Account
* **Inputs**: `message` (text)
### User Data
* `LINE_GET_PROFILE`
* Retrieve a user's profile: display name, profile picture URL, status message
* **Inputs**: `user_id` (LINE user ID)
* `LINE_GET_FRIENDS_COUNT`
* Get follower count metrics for a specific date
* **Inputs**: `date` (yyyyMMdd format, e.g. `20250329`)
* `LINE_GET_DEMOGRAPHIC`
* Get demographic breakdown of your followers (gender, age, region, app type, subscription period)
* **Inputs**: none (token only)
## Authentication
To use LINE tools, you need a **LINE Channel Access Token** from the LINE Messaging API.
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
For setup instructions, see the [LINE credentials guide](/en/pages/credentials/line).
## Setup
### 1. Create a LINE Official Account
1. Visit the [LINE Developers Console](https://developers.line.biz/console/)
2. Create a new **Provider** if you don't have one
3. Create a new **Messaging API channel**
### 2. Get Your Channel Access Token
1. Open your channel in the LINE Developers Console
2. Go to the **Messaging API** tab
3. Scroll to **Channel access token (long-lived)** and click **Issue**
4. Copy the token — this is your `LINE_API.channel_access_token`
### 3. Add LINE Credentials to JinbaFlow
Add your token as a secret in JinbaFlow with key `LINE_API`:
```json theme={null}
{
"channel_access_token": "YOUR_CHANNEL_ACCESS_TOKEN"
}
```
## Examples
### Example 1: Send a Direct Message
```yaml theme={null}
- id: send_message
tool: LINE_SEND_MESSAGE
config:
- name: token
value: "{{secrets.LINE_API.channel_access_token}}"
input:
- name: to
value: U_YOUR_LINE_USER_ID
- name: message
value: "Hello from LINE Bot!"
```
### Example 2: Broadcast to All Followers
```yaml theme={null}
- id: broadcast_message
tool: LINE_BROADCAST_MESSAGE
config:
- name: token
value: "{{secrets.LINE_API.channel_access_token}}"
input:
- name: message
value: "Hello everyone! This is a broadcast message."
```
### Example 3: Get User Profile
```yaml theme={null}
- id: get_profile
tool: LINE_GET_PROFILE
config:
- name: token
value: "{{secrets.LINE_API.channel_access_token}}"
input:
- name: user_id
value: U_YOUR_LINE_USER_ID
```
### Example 4: Get Friends Count
```yaml theme={null}
- id: get_friends_count
tool: LINE_GET_FRIENDS_COUNT
config:
- name: token
value: "{{secrets.LINE_API.channel_access_token}}"
input:
- name: date
value: "20250329"
```
### Example 5: Get Demographic Data
```yaml theme={null}
- id: get_demographic
tool: LINE_GET_DEMOGRAPHIC
config:
- name: token
value: "{{secrets.LINE_API.channel_access_token}}"
input: []
```
## LINE User ID Format
LINE user IDs start with `U` followed by 32 hexadecimal characters, e.g. `U_YOUR_LINE_USER_ID`.
You can obtain a user's ID from:
* LINE webhook events (`source.userId`)
* The LINE Developers Console (for test users)
## Date Format
The `LINE_GET_FRIENDS_COUNT` tool requires dates in `yyyyMMdd` format:
* `20250329` → March 29, 2025
* Statistics are available from the day after the reference date
## Demographic Data Notes
`LINE_GET_DEMOGRAPHIC` requires at least **20 friends** in your account before data becomes available. The `available` field in the response indicates whether data is ready.
## Resources
* [LINE Developers Documentation](https://developers.line.biz/en/docs/messaging-api/)
* [LINE Developers Console](https://developers.line.biz/console/)
* [LINE Messaging API Reference](https://developers.line.biz/en/reference/messaging-api/)
# Outlook Mail
Source: https://carnot.mintlify.app/en/pages/tools/communication/outlook_mail
Email operations using Outlook via Microsoft Graph
## Overview
The Outlook Mail tools allow you to list messages from Outlook mail folders and send emails through Outlook using the Microsoft Graph API.
## Key Features
* `OUTLOOK_LIST_MESSAGES`
* List messages from an Outlook mail folder
* Optional `folder` input (e.g., `Inbox`); if omitted, lists messages across all folders
* Optional `search` query using Microsoft Graph `$search` (matches subject, body, and sender)
* `top` controls the number of messages to fetch (1-50, default: 10)
* `include_body_preview` toggles whether each message includes a body preview (default: true)
* Returns each message's id, subject, sender, received date, body preview, and web link
* `OUTLOOK_SEND_MESSAGE`
* Send an email through Outlook
* `to_emails` accepts an array or a comma-separated string; optional `cc_emails` and `bcc_emails`
* `body` supports HTML or plain text, selected via `content_type` (`HTML` or `Text`, default: `HTML`)
* `save_to_sent_items` controls whether the message is saved to Sent Items (default: true)
## Authentication
To use the Outlook Mail tools, you need to navigate to the [Jinba secrets dashboard](https://flow.jinba.io/workspace/secrets) and authenticate with your Microsoft account. This will create a new OAuth token for you.
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
For further details, [click here](/en/pages/credentials/microsoft-oauth).
## Usage Examples
### Example: Search the Inbox and Send a Summary
```yaml theme={null}
- id: list_messages
tool: OUTLOOK_LIST_MESSAGES
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_OUTLOOK}}"
input:
- name: folder
value: Inbox
- name: search
value: invoice
- name: top
value: 20
- name: include_body_preview
value: true
- id: summarize
tool: OPENAI_INVOKE
needs:
- list_messages
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Summarize the following emails into a short report.
{{steps.list_messages.result.messages}}
- id: send_report
tool: OUTLOOK_SEND_MESSAGE
needs:
- summarize
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_OUTLOOK}}"
input:
- name: to_emails
value: manager@example.com
- name: cc_emails
value: team@example.com, accounting@example.com
- name: subject
value: Daily invoice email summary
- name: body
value: "{{steps.summarize.result.content}}"
- name: content_type
value: Text
```
### Example: Send an HTML Email
```yaml theme={null}
- id: send_message
tool: OUTLOOK_SEND_MESSAGE
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_OUTLOOK}}"
input:
- name: to_emails
value: customer@example.com
- name: subject
value: Your order has shipped
- name: body
value: "Hello,
Your order has shipped and is on its way.
"
- name: content_type
value: HTML
- name: save_to_sent_items
value: true
```
## Notes
* `OUTLOOK_LIST_MESSAGES` can fetch at most 50 messages per run (`top` accepts 1-50).
* `OUTLOOK_SEND_MESSAGE` returns the HTTP status of the Microsoft Graph `sendMail` request (202 on success); the response normally has no body.
* Recipient inputs (`to_emails`, `cc_emails`, `bcc_emails`) accept an array, a JSON array string, or a comma-separated string.
* Set `include_body_preview` to `false` when you only need message metadata and want to keep outputs compact.
# Slack
Source: https://carnot.mintlify.app/en/pages/tools/communication/slack
Slack messaging business platform tools
## Overview
Slack tools allow you to interact with the Slack messaging platform. It provides functionalities for sending messages, retrieving user profiles, broadcasting messages, and more.
## Key Features
* `SLACK_POST_MESSAGE`
* Send messages to users or channels
* `SLACK_POST_BLOCKS_MESSAGE`
* Post rich messages to channels using the Block Kit format (sections, headers, images, dividers, actions, etc.)
* `SLACK_GET_CONVERSATION_REPLIES`
* Retrieve replies to a specific thread in a channel
## Authentication
To use the Slack tools, you to create a Slack App and obtain a Bot User OAuth Access Token. You can create a Slack App and get the token from the [Slack API website](https://api.slack.com/apps). Follow the instructions in the developer documentation to set up your app and get the token.
For detailed setup instructions on configuring Slack credentials, see the [Slack Credentials page](/en/pages/credentials/slack).
Treat API keys as sensitive information and never commit them to public repositories.
### Example: Sending and Retrieving Messages
```yaml theme={null}
- id: get_conversation_replies
tool: SLACK_GET_CONVERSATION_REPLIES
config:
- name: token
value: "{{secrets.SLACK_BOT_TOKEN}}"
input:
- name: channel
value: "#jinba-dev-tmp"
- name: thread_ts
value: "1738331888.564969"
- id: send_message
tool: SLACK_POST_MESSAGE
config:
- name: token
value: "{{secrets.SLACK_BOT_TOKEN}}"
input:
- name: text
value: Hello, world!
- name: channel
value: "#900_tl_yuta"
```
### Example: Posting a Block Kit Message
`SLACK_POST_BLOCKS_MESSAGE` accepts a `blocks` array (up to 50 block objects, each with a `type` property), a fallback `text` shown in notifications and clients that do not support Block Kit, a `channel`, and an optional `thread_ts` to reply in a thread.
```yaml theme={null}
- id: post_blocks_message
tool: SLACK_POST_BLOCKS_MESSAGE
config:
- name: token
value: "{{secrets.SLACK_BOT_TOKEN}}"
input:
- name: channel
value: "#general"
- name: text
value: "Weekly report is ready"
- name: blocks
value: |
[
{
"type": "header",
"text": { "type": "plain_text", "text": "Weekly Report" }
},
{
"type": "section",
"text": { "type": "mrkdwn", "text": "*Status:* All checks passed :white_check_mark:" }
}
]
```
# Twilio
Source: https://carnot.mintlify.app/en/pages/tools/communication/twilio
Send SMS, MMS, WhatsApp messages, and make voice calls via Twilio API
## Overview
Twilio tools enable sending and receiving messages and calls through Twilio's communication platform. Supports SMS, MMS with media, WhatsApp messaging, and voice calls.
## Key Features
### Outbound Communications
* `TWILIO_SEND_SMS`
* Send SMS text messages to any phone number
* `TWILIO_SEND_WHATSAPP`
* Send WhatsApp messages via Twilio API for WhatsApp Business
## Authentication
All tools require Twilio credentials:
* **Account SID**: Found in your [Twilio Console](https://console.twilio.com/)
* **Auth Token**: Found in your Twilio Console
You can provide credentials via:
1. Environment variables: `TWILIO_ACCOUNT_SID` and `TWILIO_AUTH_TOKEN`
2. Tool config parameters
3. JinbaFlow secrets manager
## Setup
### 1. Get Twilio Account
1. Sign up at [Twilio](https://www.twilio.com/try-twilio)
2. Verify your account and phone number
3. Copy your Account SID and Auth Token from the console
### 2. Get Phone Number
For first-time users, get a trial phone number by clicking [Get a Trial Number](https://www.twilio.com/console/phone-numbers/trial-number/modal?capability%5B%5D=sms) in the console. This number can send and receive SMS messages.
For WhatsApp, join the [Twilio Sandbox](https://console.twilio.com/us1/develop/sms/try-it-out/whatsapp-learn) for testing.
**Trial Account Limitations**:
* Only 1 phone number available
* Can only send to [verified phone numbers](https://console.twilio.com/us1/develop/phone-numbers/manage/verified)
* **IMPORTANT**: Twilio virtual numbers (e.g., +18777804236) CANNOT be verified
* You must verify YOUR OWN real phone number
* Maximum 50 messages per day
* All messages include a "Sent from your Twilio trial account" signature
## Examples
**Note**: The examples below are testable with trial accounts.
## Inbound (Webhook)
Twilio inbound delivery uses webhooks. Configure your Twilio number to call the inbound URL below.
* Inbound endpoint: `POST /api/v2/external/flows/:flowId/twilio-run`
* Twilio sends `application/x-www-form-urlencoded` by default
* JinbaFlow returns an empty TwiML response (``)
### Example 5: Receive SMS (Webhook)
```yaml theme={null}
- id: receive_sms
tool: INPUT_TWILIO_SMS
config:
- name: validate_signature
value: false
input: []
```
### Example 1: Send SMS
```yaml theme={null}
- id: send_sms
tool: TWILIO_SEND_SMS
config:
- name: account_sid
value: "{{secrets.TWILIO.account_sid}}"
- name: auth_token
value: "{{secrets.TWILIO.auth_token}}"
input:
- name: to
value: "+819012345678"
- name: from
value: "+15017122661"
- name: body
value: "Hello from JinbaFlow!"
```
### Example 3: Send WhatsApp Message
```yaml theme={null}
- id: send_whatsapp
tool: TWILIO_SEND_WHATSAPP
config:
- name: account_sid
value: "{{secrets.TWILIO.account_sid}}"
- name: auth_token
value: "{{secrets.TWILIO.auth_token}}"
input:
- name: to
value: "+819012345678"
- name: from
value: "+14155238886" # Twilio WhatsApp number
- name: body
value: "Hello via WhatsApp!"
```
## Phone Number Format
All phone numbers must be in **E.164 format**:
* Include country code with `+` prefix
* No spaces, dashes, or parentheses
* Examples:
* US: `+15551234567`
* Japan: `+819012345678`
* UK: `+447911123456`
## Media Support (MMS/WhatsApp)
Supported media types:
* **Images**: JPEG, PNG, GIF
* **Videos**: MP4
* **Documents**: PDF
Maximum 10 media URLs per message.
## Resources
* [Twilio Documentation](https://www.twilio.com/docs)
* [Twilio Console](https://console.twilio.com/)
* [TwiML Voice Instructions](https://www.twilio.com/docs/voice/twiml)
* [WhatsApp Business API](https://www.twilio.com/docs/whatsapp)
# X (Twitter)
Source: https://carnot.mintlify.app/en/pages/tools/communication/x
Interact with X (Twitter) API - post tweets, get user profiles, and search tweets
## Overview
X (Twitter) tools allow you to interact with the X platform API to post tweets, retrieve user profiles, search for tweets, and get specific tweet information. These tools provide comprehensive social media integration capabilities.
## Key Features
* `X_POST`: Post tweets to your X account
* `X_GET_USER_PROFILE`: Retrieve user profile information
* `X_SEARCH_TWEETS`: Search for tweets using queries
* `X_GET_TWEETS`: Get specific tweets by ID or criteria
## Authentication
To use the X API, you need to create a developer account on the [X Developer Platform](https://developer.x.com/) and generate your API keys.
* `X_POST` uses OAuth 1.0a user-context credentials (config): `consumer_key`, `consumer_secret`, `access_token`, `access_token_secret`
* `X_GET_USER_PROFILE`, `X_SEARCH_TWEETS`, and `X_GET_TWEETS` use an app-only OAuth 2.0 Bearer token (config): `bearer_token`
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
## Tools
### X\_POST
Post tweets to your X account.
**Input**:
| Parameter | Type | Required | Description |
| - | - | - | - |
| `tweet_text` | string | Yes | The text of the tweet |
**Output**:
| Field | Type | Description |
| - | - | - |
| `tweet.id` | string | ID of the posted tweet |
| `tweet.text` | string | Text of the posted tweet |
### X\_GET\_USER\_PROFILE
Retrieve user profile information from X.
**Input**:
* `username` (string, required): Username to lookup (without @)
**Output**:
A `user` object with `id`, `username`, `name`, and (when available) `description`, `location`, `url`, `verified`, `followers_count`, `following_count`, `tweet_count`, `created_at`, and `profile_image_url`.
### X\_SEARCH\_TWEETS
Search for tweets using specific queries.
**Input**:
| Parameter | Type | Required | Description |
| - | - | - | - |
| `query` | string | Yes | Search query |
| `count` | number | No | Number of tweets to retrieve (1-100, default: 10) |
| `result_type` | string | No | Type of results: `recent`, `popular`, `mixed` (default: `recent`) |
| `include_entities` | boolean | No | Include entities such as hashtags, mentions, and URLs (default: `false`) |
**Output**:
A `tweets` array. Each tweet has `id`, `text`, `created_at`, `author`, and optional `public_metrics` (`retweet_count`, `like_count`, `reply_count`) and `entities` (`hashtags`, `mentions`, `urls`).
### X\_GET\_TWEETS
Retrieve recent tweets from a user's timeline.
**Input**:
| Parameter | Type | Required | Description |
| - | - | - | - |
| `username` | string | Yes | Twitter username (without @) |
| `count` | number | No | Number of tweets to retrieve (1-100, default: 10) |
| `include_replies` | boolean | No | Include replies in the results (default: `false`) |
| `include_retweets` | boolean | No | Include retweets in the results (default: `false`) |
**Output**:
A `tweets` array. Each tweet has `id`, `text`, `created_at`, `author` (`username`, `name`), and optional `public_metrics` (`retweet_count`, `like_count`, `reply_count`).
## Examples
### Example: Post a Tweet
```yaml theme={null}
- id: post_tweet
tool: X_POST
config:
- name: consumer_key
value: "{{secrets.TWITTER_CONSUMER_KEY}}"
- name: consumer_secret
value: "{{secrets.TWITTER_CONSUMER_SECRET}}"
- name: access_token
value: "{{secrets.TWITTER_ACCESS_TOKEN}}"
- name: access_token_secret
value: "{{secrets.TWITTER_ACCESS_TOKEN_SECRET}}"
input:
- name: tweet_text
value: "Hello from Jinba Flow! 🚀"
```
### Example: Get User Profile
```yaml theme={null}
- id: get_profile
tool: X_GET_USER_PROFILE
config:
- name: bearer_token
value: "{{secrets.TWITTER_BEARER_TOKEN}}"
input:
- name: username
value: "jinbaflow_JP"
```
### Example: Search Tweets
```yaml theme={null}
- id: search_tweets
tool: X_SEARCH_TWEETS
config:
- name: bearer_token
value: "{{secrets.TWITTER_BEARER_TOKEN}}"
input:
- name: query
value: "workflow automation"
- name: count
value: 20
```
### Example: Get a User's Tweets
```yaml theme={null}
- id: get_tweets
tool: X_GET_TWEETS
config:
- name: bearer_token
value: "{{secrets.TWITTER_BEARER_TOKEN}}"
input:
- name: username
value: "jinbaflow_JP"
- name: count
value: 10
- name: include_retweets
value: false
```
## Use Cases
* Social media automation and scheduling
* Social listening and brand monitoring
* Customer engagement and support
* Content amplification and marketing
* Real-time trend analysis
* Community management
# PostgreSQL
Source: https://carnot.mintlify.app/en/pages/tools/database/postgres
Run queries on PostgreSQL
## Overview
The PostgreSQL tool allows you to run SQL queries on a PostgreSQL database.
## Key Features
* `POSTGRES_RUN_QUERY`
* Run a SQL query on a PostgreSQL database. Supports SELECT, INSERT, UPDATE, DELETE, and other SQL statements.
* Inputs: `connection` (a PostgreSQL connection secret) and `query` (the SQL to run).
* Retrieve results in a structured format (columns and rows).
## Authentication
Create a `POSTGRES` secret with your connection details and pass it as the `connection` input:
* **Host**: Hostname of the PostgreSQL server (required).
* **Port**: Port number. Defaults to `5432` if omitted.
* **Database**: Name of the database to connect to.
* **User**: Username to connect with.
* **Password**: Password for the user.
* **SSL**: Whether to use SSL. Enabled by default; set to `false` (or `disable`) to turn it off. The legacy `sslmode` field is also accepted.
**Note**: Treat credentials as sensitive information and never commit them to public repositories.
### SSL behavior
SSL is enabled by default and server certificates are not strictly verified. If the initial SSL connection fails and SSL was not explicitly disabled, the tool automatically retries without SSL (the server may not support it).
## Usage Examples
### Example: Run PostgreSQL Query
```yaml theme={null}
- id: run_query
input:
- name: connection
value: "{{secrets.MY_POSTGRES_SECRET}}"
- name: query
value: "SELECT id, email, created_at FROM users ORDER BY created_at DESC LIMIT 10;"
tool: POSTGRES_RUN_QUERY
```
### Example: Query and Summarize with an LLM
```yaml theme={null}
- id: fetch_orders
input:
- name: connection
value: "{{secrets.MY_POSTGRES_SECRET}}"
- name: query
value: "SELECT status, COUNT(*) AS count FROM orders GROUP BY status;"
tool: POSTGRES_RUN_QUERY
- id: summarize
tool: OPENAI_INVOKE
input:
- name: prompt
value: |
Summarize the following order status breakdown for a weekly report.
Columns: {{steps.fetch_orders.result.columns}}
Rows: {{steps.fetch_orders.result.rows}}
```
## Notes
* **Timeouts**: The connection attempt times out after 10 seconds, and each statement times out after 30 seconds.
* **Not read-only**: Write statements (INSERT, UPDATE, DELETE, DDL) are executed as-is. Use a database user with appropriately scoped privileges.
* **Result serialization**: Non-primitive values are converted to strings — dates become ISO 8601 strings, binary (`bytea`) values become hex strings, and JSON/array/object values are serialized as JSON strings.
* **Non-row-returning statements**: Queries that return no result set (e.g., plain `INSERT` without `RETURNING`) return empty `columns` and `rows`.
# Snowflake
Source: https://carnot.mintlify.app/en/pages/tools/database/snowflake
Run queries on Snowflake
## Overview
The Snowflake tool allows you to run SQL queries on a Snowflake database.
## Key Features
* `SNOWFLAKE_RUN_QUERY`
* Execute SQL queries on Snowflake.
* Optionally override the warehouse, database, schema, and role for the query.
* Retrieve results in a structured format (columns and rows).
## Authentication
Create a `SNOWFLAKE` secret with your account identifier, username, and password. Only password authentication is supported (key-pair and OAuth are not supported yet).
* **Account**: Your Snowflake account identifier (e.g. `myorg-myaccount`). You can read it from your Snowsight URL: `https://app.snowflake.com///…` → use `-`.
* **User**: Snowflake username to connect with.
* **Password**: Password for the user.
**Note**: Treat credentials as sensitive information and never commit them to public repositories.
### Recommended: create a dedicated service user
Snowflake enforces MFA for human users, which blocks plain password logins from tools. Create a dedicated user with `TYPE = LEGACY_SERVICE` and grant it access explicitly. Every level of the hierarchy (warehouse → database → schema → table) needs its own grant — missing any one of them results in `Object '…' does not exist or not authorized`:
```sql theme={null}
CREATE ROLE JINBA_ROLE;
CREATE USER JINBA_FLOW_USER
PASSWORD = ''
TYPE = LEGACY_SERVICE
DEFAULT_ROLE = JINBA_ROLE
MUST_CHANGE_PASSWORD = FALSE;
GRANT ROLE JINBA_ROLE TO USER JINBA_FLOW_USER;
GRANT USAGE ON WAREHOUSE TO ROLE JINBA_ROLE;
GRANT USAGE ON DATABASE TO ROLE JINBA_ROLE;
GRANT USAGE ON SCHEMA . TO ROLE JINBA_ROLE;
GRANT SELECT ON ALL TABLES IN SCHEMA . TO ROLE JINBA_ROLE;
GRANT SELECT ON FUTURE TABLES IN SCHEMA . TO ROLE JINBA_ROLE;
```
## Warehouse, Database, Schema, and Role
These determine which compute resource and namespace a query runs against. They are **not** part of the secret — pass them per-step as inputs so the same secret can be reused across warehouses, databases, or roles:
* **Warehouse**: The virtual warehouse (compute cluster) to run the query on.
* **Database** / **Schema**: The namespace the query executes against.
* **Role**: The security role to use for the session. Defaults to the user's default role if omitted.
Each run opens a fresh session — `USE WAREHOUSE` / `USE SCHEMA` statements executed in Snowsight do not carry over. Either set these inputs or fully qualify table names (`db.schema.table`) in the query.
## Large Integers
Integers in dedicated `NUMBER`/`INTEGER` columns are returned as exact values — as a regular JSON number when safe (up to 2^53), or as a string when larger, so no precision is lost. Integers **nested inside** `VARIANT`/`OBJECT`/`ARRAY` columns do not get this protection and may lose precision beyond 2^53, since Snowflake's driver parses semi-structured content as plain JSON numbers. If you need exact large integers from semi-structured data, cast them to a string in the query (e.g. `data:big_id::string`) before selecting.
### Example: Run Snowflake Query
```yaml theme={null}
- id: run_query
input:
- name: connection
value: "{{secrets.MY_SNOWFLAKE_SECRET}}"
- name: query
value: "SELECT * FROM sales_db.public.orders LIMIT 10;"
- name: warehouse
value: "COMPUTE_WH"
- name: database
value: "SALES_DB"
- name: schema
value: "PUBLIC"
tool: SNOWFLAKE_RUN_QUERY
```
# Document Processing
Source: https://carnot.mintlify.app/en/pages/tools/files/document_processing
Extract and process text from various document formats
## Overview
Document Processing tools allow you to extract text content from various document formats including PDF, DOCX, and Word documents. These tools are essential for document analysis, content extraction, and text processing workflows.
## Key Features
* `PDF_EXTRACT_TEXT`
* Extract text content from PDF files
* `DOCX_EXTRACT_TEXT`
* Extract text content from DOCX files
* `JINBA_FLEX_PARSER`
* Parse documents to text using the Jinba Flex Parser API. Supports various file formats including PDF, DOCX, images, and more
* `WORD_TABLE_EXTRACT`
* Extract table data from Word documents as JSON
* `WORD_TABLE_UPDATE`
* Update table data in Word documents
* `TRANSLATE_PPTX_FILE`
* Translate text content in PowerPoint (PPTX) files to different languages
For converting HTML content into PDF or DOCX files, see the `CONVERTER_HTML_TO_PDF` and `CONVERTER_HTML_TO_DOCX` tools on the [Data Conversion Tools](/en/pages/tools/validation/data_conversion) page.
## Authentication
No authentication required. Document processing tools work directly with file URLs or base64 encoded files.
### Example: Basic Text Extraction
```yaml theme={null}
- id: extract_pdf_text
name: extract_pdf_text
tool: PDF_EXTRACT_TEXT
input:
- name: pdf_base64
value: "{{steps.upload_pdf.result.base64}}"
- id: extract_docx_text
name: extract_docx_text
tool: DOCX_EXTRACT_TEXT
input:
- name: docx_base64
value: "{{steps.upload_docx.result.base64}}"
- id: analyze_extracted_text
name: analyze_extracted_text
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Please analyze the following extracted text and provide:
1. A summary of the main topics
2. Key findings or important points
3. Any action items mentioned
PDF Content: {{steps.extract_pdf_text.result}}
DOCX Content: {{steps.extract_docx_text.result}}
```
### Example: Parse Documents with Jinba Flex Parser
`JINBA_FLEX_PARSER` parses a document from a URL and returns the extracted text. It works with URL-based files (no base64 encoding needed) and supports PDF, DOCX, images, and more.
**Input**:
| Parameter | Type | Required | Description |
| - | - | - | - |
| `fileUrl` | string | Yes | URL of the file to parse |
| `endpointType` | enum | No | `default` (standard parsing service, recommended), `custom` (on-premise deployments with a user-supplied URL), or `legacy` (deprecated). Defaults to `default` |
| `customEndpointUrl` | string | No | Custom endpoint URL. Required when `endpointType` is `custom` |
**Config**:
| Field | Description |
| - | - |
| `apiKey` | API key for the parsing endpoint. Leave blank to use Jinba Credit |
**Output**:
* `result`: The parsed text content from the document
```yaml theme={null}
- id: upload_source_document
name: upload_source_document
tool: INPUT_FILE
input:
- name: description
value: "Document to parse (PDF, DOCX, image, etc.)"
- id: parse_document
name: parse_document
tool: JINBA_FLEX_PARSER
input:
- name: fileUrl
value: "{{steps.upload_source_document.result}}"
- id: summarize_document
name: summarize_document
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Summarize the following document:
{{steps.parse_document.result}}
```
### Example: Word Table Processing
```yaml theme={null}
- id: extract_word_table
name: extract_word_table
tool: WORD_TABLE_EXTRACT
config:
- name: timeout
value: 300000
input:
- name: file_url
value: "https://example.com/document.docx"
- name: table_index
value: 0
- id: process_table_data
name: process_table_data
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
# Get table data from previous step
table_data = {{steps.extract_word_table.result}}
# Process the table data
processed_data = []
headers = table_data[0] if table_data else []
for row in table_data[1:]: # Skip header row
row_dict = {}
for i, cell in enumerate(row):
if i < len(headers):
row_dict[headers[i]] = cell
processed_data.append(row_dict)
print(json.dumps({"processed_table": processed_data}))
- id: save_to_spreadsheet
name: save_to_spreadsheet
tool: GOOGLE_SPREADSHEET_ADD_ROWS
config:
- name: credentials
value: "{{secrets.GOOGLE_SHEETS_CREDENTIALS}}"
input:
- name: spreadsheet_id
value: "your_spreadsheet_id"
- name: sheet_name
value: "ExtractedData"
- name: values
value: "{{steps.extract_word_table.result}}"
```
### Example: Document Analysis Pipeline
```yaml theme={null}
- id: upload_document
name: upload_document
tool: INPUT_FILE
input:
- name: value
value: "Document to analyze"
- id: determine_file_type
name: determine_file_type
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
import base64
# Get file info
file_info = {{steps.upload_document.result}}
file_name = file_info.get('filename', '').lower()
if file_name.endswith('.pdf'):
file_type = 'pdf'
elif file_name.endswith('.docx'):
file_type = 'docx'
else:
file_type = 'unknown'
print(json.dumps({"file_type": file_type, "filename": file_name}))
- id: extract_text_pdf
name: extract_text_pdf
tool: PDF_EXTRACT_TEXT
condition: "{{steps.determine_file_type.result.file_type == 'pdf'}}"
input:
- name: pdf_base64
value: "{{steps.upload_document.result.base64}}"
- id: extract_text_docx
name: extract_text_docx
tool: DOCX_EXTRACT_TEXT
condition: "{{steps.determine_file_type.result.file_type == 'docx'}}"
input:
- name: docx_base64
value: "{{steps.upload_document.result.base64}}"
- id: process_extracted_text
name: process_extracted_text
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
# Get extracted text based on file type
pdf_text = {{steps.extract_text_pdf.result if steps.extract_text_pdf else ""}}
docx_text = {{steps.extract_text_docx.result if steps.extract_text_docx else ""}}
# Combine and clean text
extracted_text = pdf_text or docx_text or ""
# Basic text analysis
word_count = len(extracted_text.split())
char_count = len(extracted_text)
# Extract potential important sections
lines = extracted_text.split('\n')
important_lines = [line.strip() for line in lines if
any(keyword in line.lower() for keyword in
['summary', 'conclusion', 'action', 'todo', 'next steps'])]
result = {
"text": extracted_text,
"word_count": word_count,
"character_count": char_count,
"important_sections": important_lines[:10] # Limit to top 10
}
print(json.dumps(result))
- id: generate_document_summary
name: generate_document_summary
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Please create a comprehensive summary of this document:
Document: {{steps.determine_file_type.result.filename}}
Word Count: {{steps.process_extracted_text.result.word_count}}
Content:
{{steps.process_extracted_text.result.text}}
Please provide:
1. Executive Summary (2-3 sentences)
2. Key Topics and Themes
3. Important Facts or Data Points
4. Action Items or Recommendations
5. Overall Assessment
```
### Example: Batch Document Processing
```yaml theme={null}
- id: get_document_list
name: get_document_list
tool: INPUT_JSON
input:
- name: value
value: {
"documents": [
{"url": "https://example.com/doc1.pdf", "name": "Report1"},
{"url": "https://example.com/doc2.docx", "name": "Report2"},
{"url": "https://example.com/doc3.pdf", "name": "Report3"}
]
}
- id: process_documents
name: process_documents
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
import requests
import base64
documents = {{steps.get_document_list.result.documents}}
processed_docs = []
for doc in documents:
try:
# Download document
response = requests.get(doc['url'])
if response.status_code == 200:
base64_content = base64.b64encode(response.content).decode('utf-8')
processed_docs.append({
"name": doc['name'],
"url": doc['url'],
"base64": base64_content,
"type": "pdf" if doc['url'].endswith('.pdf') else "docx",
"status": "ready"
})
except Exception as e:
processed_docs.append({
"name": doc['name'],
"url": doc['url'],
"status": "error",
"error": str(e)
})
print(json.dumps({"documents": processed_docs}))
```
## Example: PowerPoint Translation
```yaml theme={null}
- id: upload_presentation
name: upload_presentation
tool: INPUT_FILE
input:
- name: description
value: "Upload PowerPoint file to translate"
- id: translate_to_spanish
name: translate_to_spanish
tool: TRANSLATE_PPTX_FILE
input:
- name: value
value: "{{steps.upload_presentation.result.file_url}}"
- name: target_lang
value: "es"
- id: translate_to_french
name: translate_to_french
tool: TRANSLATE_PPTX_FILE
input:
- name: value
value: "{{steps.upload_presentation.result.file_url}}"
- name: target_lang
value: "fr"
- id: translate_to_japanese
name: translate_to_japanese
tool: TRANSLATE_PPTX_FILE
input:
- name: value
value: "{{steps.upload_presentation.result.file_url}}"
- name: target_lang
value: "ja"
- id: create_download_links
name: create_download_links
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
# Collect translation results
original_file = "{{steps.upload_presentation.result.filename}}"
spanish_url = "{{steps.translate_to_spanish.result.url}}"
french_url = "{{steps.translate_to_french.result.url}}"
japanese_url = "{{steps.translate_to_japanese.result.url}}"
translations = {
"original_file": original_file,
"translations": [
{"language": "Spanish (es)", "download_url": spanish_url},
{"language": "French (fr)", "download_url": french_url},
{"language": "Japanese (ja)", "download_url": japanese_url}
]
}
print("=== PowerPoint Translation Complete ===")
print(f"Original file: {original_file}")
print("\nTranslated versions available:")
for trans in translations["translations"]:
print(f" • {trans['language']}: {trans['download_url']}")
# Output as JSON for further processing
print(f"\nJSON Output: {json.dumps(translations)}")
```
## Example: Multilingual Presentation Workflow
```yaml theme={null}
- id: get_presentation_url
name: get_presentation_url
tool: INPUT_TEXT
input:
- name: description
value: "Enter the URL of the PowerPoint file to translate"
- id: get_target_languages
name: get_target_languages
tool: INPUT_JSON
input:
- name: description
value: "Enter target languages as JSON array"
- name: value
value: ["es", "fr", "de", "it", "pt", "ja", "ko", "zh"]
- id: process_translations
name: process_translations
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
import time
presentation_url = "{{steps.get_presentation_url.result}}"
target_languages = {{steps.get_target_languages.result}}
# Language code to name mapping
language_names = {
"es": "Spanish", "fr": "French", "de": "German", "it": "Italian",
"pt": "Portuguese", "ja": "Japanese", "ko": "Korean", "zh": "Chinese"
}
print("Starting batch translation process...")
print(f"Source file: {presentation_url}")
print(f"Target languages: {', '.join([language_names.get(lang, lang) for lang in target_languages])}")
# Store the languages for the next steps
batch_info = {
"source_url": presentation_url,
"languages": target_languages,
"language_names": language_names,
"total_count": len(target_languages)
}
print(f"\nJSON Output: {json.dumps(batch_info)}")
# Note: In a real workflow, you would need to create separate translation steps
# for each language or use a loop mechanism. This example shows the concept.
- id: translate_spanish
name: translate_spanish
tool: TRANSLATE_PPTX_FILE
condition: "{{contains(steps.process_translations.result.languages, 'es')}}"
input:
- name: value
value: "{{steps.process_translations.result.source_url}}"
- name: target_lang
value: "es"
- id: translate_french
name: translate_french
tool: TRANSLATE_PPTX_FILE
condition: "{{contains(steps.process_translations.result.languages, 'fr')}}"
input:
- name: value
value: "{{steps.process_translations.result.source_url}}"
- name: target_lang
value: "fr"
- id: compile_results
name: compile_results
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
results = []
# Check if Spanish translation was completed
if "{{steps.translate_spanish.result.url if steps.translate_spanish else ''}}":
results.append({
"language": "Spanish",
"code": "es",
"status": "completed",
"download_url": "{{steps.translate_spanish.result.url}}"
})
# Check if French translation was completed
if "{{steps.translate_french.result.url if steps.translate_french else ''}}":
results.append({
"language": "French",
"code": "fr",
"status": "completed",
"download_url": "{{steps.translate_french.result.url}}"
})
print("=== Translation Summary ===")
print(f"Completed translations: {len(results)}")
for result in results:
print(f" ✅ {result['language']} ({result['code']})")
print(f" Download: {result['download_url']}")
# Create a summary report
summary = {
"total_completed": len(results),
"translations": results,
"timestamp": "{{now}}"
}
print(f"\nFinal Summary: {json.dumps(summary, indent=2)}")
- id: notify_completion
name: notify_completion
tool: SLACK_POST_MESSAGE
input:
- name: channel
value: "#translations"
- name: text
value: |
🎉 PowerPoint translation job completed!
📄 Source file processed
✅ {{steps.compile_results.result.total_completed}} language(s) completed
Results:
{{#each steps.compile_results.result.translations}}
• {{language}} ({{code}}): {{download_url}}
{{/each}}
```
## Supported Languages
The `TRANSLATE_PPTX_FILE` tool supports translation to various languages using standard language codes:
### Popular Language Codes:
* **en**: English
* **es**: Spanish
* **fr**: French
* **de**: German
* **it**: Italian
* **pt**: Portuguese
* **ru**: Russian
* **ja**: Japanese
* **ko**: Korean
* **zh**: Chinese (Simplified)
* **ar**: Arabic
* **hi**: Hindi
* **nl**: Dutch
* **sv**: Swedish
* **da**: Danish
* **no**: Norwegian
* **fi**: Finnish
### Usage Notes:
* Translation preserves original formatting and slide structure
* Text in images cannot be translated (only text boxes and shapes)
* Complex animations and transitions are preserved
* File size may vary slightly after translation
* Processing time depends on presentation size and complexity
## Tips and Best Practices
* Support for base64 encoded files enables secure file processing
* Always validate file types before processing
* Consider file size limitations when processing large documents
* Use appropriate timeouts for large document processing
* Implement error handling for corrupt or unsupported files
* Extract tables separately from text for structured data analysis
* Consider text cleaning and preprocessing for better analysis results
# Extract from File
Source: https://carnot.mintlify.app/en/pages/tools/files/extract
Extract information from files using their base64 representation
## Overview
The File Extraction tools allow you to extract information from files using their base64 representation. This is particularly useful for analyzing images or documents where you need to extract text or other relevant data.
## Key Features
* `PDF_EXTRACT_TEXT`: Extract text from PDF files.
* `DOCX_EXTRACT_TEXT`: Extract text from DOCX files.
* `EXCEL_EXTRACT_TEXT`: Extract structured data from Excel files.
### Example: Extract Data from Base64 Files
```yaml theme={null}
- id: extract_pdf
tool: PDF_EXTRACT_TEXT
config:
[]
input:
- name: pdf_base64
value: "{{secrets.PDF_FILE_BASE64}}"
- id: extract_docx
tool: DOCX_EXTRACT_TEXT
config:
[]
input:
- name: docx_base64
value: "{{secrets.DOCX_FILE_BASE64}}"
- id: extract_pdf
tool: PDF_EXTRACT_TEXT
config:
[]
input:
- name: pdf_base64
value: "{{secrets.PDF_FILE_BASE64}}"
```
# File Input
Source: https://carnot.mintlify.app/en/pages/tools/files/input
Fetch files from URLs
## Overview
The File Input tools allow you to fetch files from specified URLs.
## Key Features
* `INPUT_PDF_FILE`: Fetch PDF files from URLs.
* `INPUT_CSV_FILE`: Fetch CSV files from URLs.
* `INPUT_DOCX_FILE`: Fetch DOCX files from URLs and return the extracted text.
* `INPUT_JSON`: Input JSON data directly.
* `INPUT_FILE`: Input generic files from URLs.
* `INPUT_TEXT`: Input plain text data directly.
## Tools
### INPUT\_PDF\_FILE
Fetch PDF files from URLs for processing.
**Input**:
* `value` (string, required): URL of the PDF file to fetch
**Output**:
* File content and metadata for further processing
### INPUT\_CSV\_FILE
Fetch CSV files from URLs for data processing.
**Input**:
* `value` (string, required): URL of the CSV file to fetch
**Output**:
* CSV content and metadata
### INPUT\_DOCX\_FILE
Fetch DOCX (Word) files from URLs and return the extracted text.
**Input**:
| Parameter | Type | Required | Description |
| - | - | - | - |
| `value` | string / string\[] | Yes | URL(s) of the DOCX file(s) to load. Can be a single URL or an array of URLs |
| `description` | string | No | Description of the DOCX file |
**Output**:
* `result`: Text extracted from the DOCX file(s)
### INPUT\_JSON
Input JSON data directly as a string.
**Input**:
* `value` (string, required): JSON string to parse
**Output**:
* Parsed JSON data ready for processing
### INPUT\_FILE
Input generic files from URLs.
**Input**:
| Parameter | Type | Required | Description |
| - | - | - | - |
| `value` | string | Yes | URL of the file to fetch |
| `description` | string | No | Description of the file |
**Output**:
File content and metadata.
### INPUT\_TEXT
Input plain text data directly.
**Input**:
* `value` (string, required): Plain text content
**Output**:
* Text content for processing
## Examples
### Example: Fetch Files from URLs
```yaml theme={null}
- id: "pdf"
tool: INPUT_PDF_FILE
input:
- name: value
value: https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf
- id: "csv"
tool: INPUT_CSV_FILE
input:
- name: value
value: https://people.sc.fsu.edu/~jburkardt/data/csv/addresses.csv
- id: "docx"
tool: INPUT_DOCX_FILE
input:
- name: value
value: https://example.com/files/report.docx
- name: description
value: "Monthly report Word document"
- id: "json_data"
tool: INPUT_JSON
input:
- name: value
value: '{"source": "example", "items": [1, 2, 3]}'
- id: "config_file"
tool: INPUT_FILE
input:
- name: value
value: https://raw.githubusercontent.com/example/repo/main/config.yaml
- name: description
value: "Application configuration file"
- id: "text_input"
tool: INPUT_TEXT
input:
- name: value
value: "This is sample text content for processing"
```
### Example: JSON Data Processing
```yaml theme={null}
- id: user_data
tool: INPUT_JSON
input:
- name: value
value: |
{
"name": "John Doe",
"age": 30,
"email": "john@example.com",
"preferences": {
"theme": "dark",
"notifications": true
}
}
- id: process_user_data
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Process this user data and create a personalized greeting:
{{steps.user_data.result}}
Create a friendly greeting message that includes their name and references their preferences.
```
## Related Input Tools
The following input tools are documented on other pages:
* `INPUT_WEBHOOK`, `INPUT_SLACK_EVENT`, `INPUT_IMAGE_FILE`, `INPUT_FILE_AS_TEXT`, `INPUT_TWILIO_SMS`: see [Advanced Input Tools](/en/pages/tools/files/input_advanced)
* `INPUT_JSON_WITH_VALIDATION`: see [Input JSON with Validation](/en/pages/tools/validation/input)
# Advanced Input Tools
Source: https://carnot.mintlify.app/en/pages/tools/files/input_advanced
Advanced input tools for webhooks, Slack events, Twilio SMS, image files, and text files
## Overview
Advanced Input Tools provide specialized input capabilities for handling different types of data sources including webhooks, Slack events, Twilio SMS/MMS, image files, and text files. These tools are essential for building comprehensive workflows that integrate with external systems.
## Key Features
### INPUT\_WEBHOOK
* Receive webhook requests from various services
* Handle HTTP POST requests to your publishable URL
* Parse JSON and form data automatically
* Essential for API integrations
### INPUT\_SLACK\_EVENT
* Receive Slack App event subscriptions
* Handle real-time Slack workspace events
* Process messages, reactions, and user interactions
* Requires Slack App configuration
### INPUT\_IMAGE\_FILE
* Input image files from direct download URLs
* Convert images to base64-encoded strings
* Support for various image formats
* Optimized for AI processing workflows
### INPUT\_FILE\_AS\_TEXT
* Input text files from URLs
* Support for multiple text formats (plain text, CSV, JSON, XML, YAML, HTML)
* Returns the file content as text
* Accepts a single URL or an array of URLs
### INPUT\_TWILIO\_SMS
* Receive incoming SMS and MMS messages via Twilio webhooks
* Supports text messages and media attachments (images, videos, PDFs)
* Requires configuring your Twilio phone number to send webhooks to your Jinba Flow URL
* See the [Twilio page](/en/pages/tools/communication/twilio) for details
## Setup Instructions
**Note**: INPUT\_ tools are crucial for MCP (Model Context Protocol) and API integrations. Their IDs must match exactly in your MCP configuration and API endpoints.
## Example: Webhook Processing Workflow
```yaml theme={null}
- id: receive_webhook
name: receive_webhook
tool: INPUT_WEBHOOK
input:
- name: description
value: "Receive order notification from e-commerce platform"
- name: use_as_input
value: true
- id: process_order
name: process_order
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Process this order data and extract key information:
{{steps.receive_webhook.result.body}}
Extract: customer info, order items, total amount, shipping details
```
## Example: Slack Event Processing
```yaml theme={null}
- id: slack_listener
name: slack_listener
tool: INPUT_SLACK_EVENT
input:
- name: description
value: "Listen for mention events in Slack"
- name: use_as_input
value: true
- id: respond_to_mention
name: respond_to_mention
tool: SLACK_POST_MESSAGE
input:
- name: channel
value: "{{steps.slack_listener.result.channel}}"
- name: text
value: "Thanks for mentioning me! I'll process your request."
```
## Example: Image Analysis Pipeline
```yaml theme={null}
- id: input_image
name: input_image
tool: INPUT_IMAGE_FILE
input:
- name: value
value: "https://example.com/image.jpg"
- name: description
value: "Product image for analysis"
- id: analyze_image
name: analyze_image
tool: GEMINI_INVOKE_WITH_IMAGE
config:
- name: version
value: gemini-1.5-flash
input:
- name: prompt
value: "Analyze this product image and describe its features"
- name: base64_image
value: "{{steps.input_image.result}}"
```
## Example: Text File Processing
```yaml theme={null}
- id: input_config_file
name: input_config_file
tool: INPUT_FILE_AS_TEXT
input:
- name: value
value: "https://example.com/config.json"
- name: description
value: "Configuration file for processing"
- name: use_as_input
value: true
- id: parse_configuration
name: parse_configuration
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
# INPUT_FILE_AS_TEXT returns the file content as text
config = json.loads('''{{steps.input_config_file.result}}''')
print("Configuration loaded:")
for key, value in config.items():
print(f" {key}: {value}")
# Extract specific settings
database_url = config.get('database_url', 'Not found')
api_key = config.get('api_key', 'Not found')
print(f"\nDatabase URL: {database_url}")
print(f"API Key: {'*' * len(api_key) if api_key != 'Not found' else 'Not found'}")
- id: validate_config
name: validate_config
tool: CHECKER_CHECK_BY_JSON
input:
- name: text
value: "{{steps.parse_configuration.result.stdout | join(' ')}}"
- name: task
value: "Configuration Validation"
- name: rules
value: |
[
{
"name": "Database URL present",
"description": "The configuration must contain a database_url entry with a valid connection URL."
},
{
"name": "API key configured",
"description": "The configuration must contain a non-empty api_key entry."
}
]
```
## Example: CSV Data Import
```yaml theme={null}
- id: import_csv_data
name: import_csv_data
tool: INPUT_FILE_AS_TEXT
input:
- name: value
value: "https://example.com/sales_data.csv"
- name: description
value: "Monthly sales data CSV file"
- id: process_csv
name: process_csv
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import csv
from io import StringIO
# INPUT_FILE_AS_TEXT returns the file content as text
csv_content = '''{{steps.import_csv_data.result}}'''
# Parse CSV
csv_reader = csv.DictReader(StringIO(csv_content))
rows = list(csv_reader)
print(f"Loaded {len(rows)} rows from CSV")
print(f"Columns: {', '.join(csv_reader.fieldnames)}")
# Calculate summary statistics
if 'amount' in csv_reader.fieldnames:
amounts = [float(row['amount']) for row in rows if row['amount']]
total = sum(amounts)
average = total / len(amounts) if amounts else 0
print(f"\nSales Summary:")
print(f" Total Sales: ${total:,.2f}")
print(f" Average Sale: ${average:,.2f}")
print(f" Number of Sales: {len(amounts)}")
- id: generate_report
name: generate_report
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Based on the following CSV processing results, generate a sales report:
{{steps.process_csv.result.stdout | join('\n')}}
Please create a markdown report with:
1. Executive summary
2. Key metrics
3. Trends and insights
4. Recommendations
```
## File Format Support
### INPUT\_FILE\_AS\_TEXT Supported Formats:
* **text/plain**: Plain text files (.txt)
* **text/csv**: Comma-separated values (.csv)
* **text/html**: HTML documents (.html)
* **text/xml**: XML documents (.xml)
* **text/json**: JSON files (.json)
* **text/yaml**: YAML configuration files (.yml, .yaml)
## Use Cases
* **API Integration**: Receive data from external services via webhooks
* **Real-time Processing**: Handle Slack events and notifications
* **Image Processing**: Analyze images with AI models
* **Document Processing**: Handle text files and documents
* **Event-driven Workflows**: Trigger workflows based on external events
# Marp Presentation
Source: https://carnot.mintlify.app/en/pages/tools/files/marp
Convert Markdown to presentation slides (PDF/PPTX)
## Overview
Marp is a presentation tool that converts Markdown to beautiful presentations. It supports multiple output formats including PDF and PowerPoint (.pptx) files. It provides a standardized, theme-based approach with support for math typesetting and emoji rendering.
**Runs in E2B sandbox environment**, so you don't need to install Marp CLI locally. The conversion process is executed securely in an isolated environment with Node.js, Chromium, and LibreOffice pre-installed.
## Key Features
### MARP\_CONVERT
* Convert Markdown to presentation PDF or PowerPoint
* **Runs securely in E2B sandbox environment** - no local installation required
* Three built-in themes: default, gaia, uncover
* Multiple output formats: PDF, PPTX, editable PPTX
* Math typesetting support (MathJax/KaTeX)
* Emoji rendering with Twemoji
* Clean, professional slide output
* Returns a signed URL for downloading the generated file
## Authentication
No authentication required for Marp tools.
## Example: Basic PDF Presentation
```yaml theme={null}
- id: create_pdf_presentation
name: create_pdf_presentation
tool: MARP_CONVERT
input:
- name: markdown
value: |
---
marp: true
---
# Welcome to Marp
Create beautiful presentations with Markdown
---
## Features
- Simple Markdown syntax
- Multiple themes
- Math support
- Emoji rendering 🎉
---
## Thank You!
- name: outputFormat
value: "pdf"
# Result: {{steps.create_pdf_presentation.result}}
# A signed URL to download the PDF file
```
## Example: PowerPoint with Editable Format
```yaml theme={null}
- id: create_editable_pptx
name: create_editable_pptx
tool: MARP_CONVERT
input:
- name: markdown
value: |
---
marp: true
theme: gaia
---
# Mathematics Presentation
Equations and formulas in slides
---
## Quadratic Formula
The quadratic formula is:
$$x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}$$
---
## Inline Math
Einstein's famous equation: $E = mc^2$
The Pythagorean theorem: $a^2 + b^2 = c^2$
- name: outputFormat
value: "pptx-editable"
# Result: {{steps.create_editable_pptx.result}}
# A signed URL to download the editable PPTX file
```
## Example: Company Presentation PDF
```yaml theme={null}
- id: generate_company_presentation
name: generate_company_presentation
tool: MARP_CONVERT
input:
- name: markdown
value: |
---
marp: true
theme: uncover
---
# Q1 2026 Results
Company Performance Review
---
## Key Metrics
- Revenue: $10M (+25% YoY)
- Customers: 5,000 (+40% YoY)
- Employee Satisfaction: 92%
---
## Market Expansion
- Entered 3 new markets
- Launched 5 new products
- Formed 10 strategic partnerships
---
## 2026 Goals
- Double revenue to $20M
- Reach 10,000 customers
- Expand to 10 new markets
---
# Thank You!
Questions?
- name: outputFormat
value: "pdf"
# Result: {{steps.generate_company_presentation.result}}
# A signed URL to download the PDF file
```
## Theme Options
| Theme | Style | Best For |
| - | - | - |
| default | Clean, minimal | General presentations |
| gaia | Modern, colorful | Creative/design presentations |
| uncover | Bold, dramatic | Executive/keynote presentations |
## Markdown Syntax
### Slide Separators
Use `---` to create a new slide:
```markdown theme={null}
# Slide 1
---
# Slide 2
```
### Headings
* `# Heading` - Main title slide
* `## Heading` - Section heading
* `### Heading` - Subsection
### Lists
```markdown theme={null}
- Bullet point 1
- Bullet point 2
- Nested point
1. Numbered item 1
2. Numbered item 2
```
### Code Blocks
````markdown theme={null}
```javascript
function greet(name) {
console.log(`Hello, ${name}!`);
}
```
````
### Math Equations
* Inline: `$E = mc^2$`
* Block: `$$x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}$$`
## Use Cases
* **Technical Presentations**: Code examples, architecture diagrams
* **Educational Content**: Math formulas, scientific presentations
* **Business Reviews**: Quarterly reports, strategy presentations
* **Portable Presentations**: PDF files that work on any device
* **Version Control**: Track presentation changes in Git
* **Collaborative Editing**: Edit presentations as Markdown files
## Best Practices
### Content Structure
* One idea per slide
* Use visual hierarchy (headings, bullets)
* Keep text concise
* Include speaker notes in comments
### Styling
* Choose theme based on audience and purpose
* Use consistent formatting
* Limit colors and fonts
* Test slides on target display
### Accessibility
* Use high contrast colors
* Provide alt text for images
* Keep font sizes readable
* Include text transcripts for screen readers
### Performance
* Optimize image sizes
* Minimize custom CSS
* Test on target browsers
* Consider offline viewing requirements
# Mermaid Diagram
Source: https://carnot.mintlify.app/en/pages/tools/files/mermaid
Convert Mermaid diagram code to images (PNG/SVG/PDF)
## Overview
Mermaid is a diagram and flowchart tool that converts text-based syntax into visual diagrams. It supports various diagram types including flowcharts, sequence diagrams, class diagrams, state diagrams, and more. The tool generates high-quality images (PNG, SVG, or PDF) from Mermaid code.
**Runs in E2B sandbox environment**, so you don't need to install mermaid-cli locally. The conversion process is executed securely in an isolated environment with Node.js and Chromium pre-installed.
## Key Features
### MERMAID\_CONVERT
* Convert Mermaid diagram code to PNG, SVG, or PDF images
* **Runs securely in E2B sandbox environment** - no local installation required
* Supports all Mermaid diagram types
* Background color options: transparent or white (PNG only)
* Clean, high-quality diagram output
* Returns a signed URL for downloading the generated image
## Authentication
No authentication required for Mermaid tools.
## Example: Business Approval Workflow
```yaml theme={null}
- id: create_approval_flowchart
name: create_approval_flowchart
tool: MERMAID_CONVERT
input:
- name: diagram
value: |
flowchart TD
Start([Application Start]) --> A[Staff creates application]
A --> B[Manager reviews]
B --> C{Review result}
C -->|Issues found| D[Return for revision]
D --> A
C -->|Approved| E[Approved]
E --> F[Share with Admin Department]
F --> G[Admin processes]
G --> End([Complete])
style Start fill:#4a90e2,stroke:#357abd,color:#fff
style End fill:#4a90e2,stroke:#357abd,color:#fff
style E fill:#66bb6a,stroke:#4caf50,color:#fff
style D fill:#ef5350,stroke:#f44336,color:#fff
- name: outputFormat
value: "png"
- name: backgroundColor
value: "white"
# Result: {{steps.create_approval_flowchart.result}}
# A signed URL to download the PNG image
```
## Example: Sequence Diagram
```yaml theme={null}
- id: create_sequence_diagram
name: create_sequence_diagram
tool: MERMAID_CONVERT
input:
- name: diagram
value: |
sequenceDiagram
participant User
participant API
participant Database
User->>API: Login request
activate API
API->>Database: Verify credentials
activate Database
Database-->>API: User found
deactivate Database
API-->>User: JWT token
deactivate API
User->>API: Get data (with token)
activate API
API->>Database: Fetch data
activate Database
Database-->>API: Return data
deactivate Database
API-->>User: JSON response
deactivate API
- name: outputFormat
value: "svg"
# Result: {{steps.create_sequence_diagram.result}}
# A signed URL to download the SVG file
```
## Example: State Diagram
```yaml theme={null}
- id: create_state_diagram
name: create_state_diagram
tool: MERMAID_CONVERT
input:
- name: diagram
value: |
stateDiagram-v2
[*] --> Draft
Draft --> Review: Submit
Review --> Approved: Accept
Review --> Rejected: Reject
Rejected --> Draft: Revise
Approved --> Published: Publish
Published --> Archived: Archive
Archived --> [*]
note right of Review
Manager reviews
the content
end note
- name: outputFormat
value: "pdf"
# Result: {{steps.create_state_diagram.result}}
# A signed URL to download the PDF file
```
## Supported Diagram Types
| Type | Description | Use Case |
| - | - | - |
| Flowchart | Process flows and decision trees | Business processes, workflows |
| Sequence Diagram | Interaction between entities | API flows, communication protocols |
| Class Diagram | UML class relationships | Software architecture, data models |
| State Diagram | State transitions | Application states, status workflows |
| ER Diagram | Database relationships | Database design, data modeling |
| Gantt Chart | Project timelines | Project planning, schedules |
| Pie Chart | Data proportions | Statistics, reports |
| Git Graph | Version control flows | Release processes, branching strategies |
| User Journey | User experience flows | UX design, customer journeys |
| Mindmap | Hierarchical ideas | Brainstorming, concept mapping |
| Timeline | Event sequences | Historical events, roadmaps |
## Basic Syntax Examples
### Flowchart
```mermaid theme={null}
flowchart LR
A[Start] --> B{Decision}
B -->|Yes| C[Action 1]
B -->|No| D[Action 2]
```
### Sequence Diagram
```mermaid theme={null}
sequenceDiagram
Alice->>Bob: Hello Bob!
Bob-->>Alice: Hi Alice!
```
### Class Diagram
```mermaid theme={null}
classDiagram
Animal <|-- Dog
Animal <|-- Cat
Animal: +String name
Animal: +makeSound()
```
### State Diagram
```mermaid theme={null}
stateDiagram-v2
[*] --> Active
Active --> Inactive
Inactive --> Active
```
## Styling and Theming
### Custom Colors
```mermaid theme={null}
%%{ init: { 'theme': 'base', 'themeVariables': { 'primaryColor': '#ff6600' } } }%%
flowchart TD
A[Styled Node]
```
### Node Styling
```mermaid theme={null}
flowchart TD
A[Normal]
B[Important]
C[Success]
style B fill:#ff6600,stroke:#ff4400,color:#fff
style C fill:#66bb6a,stroke:#4caf50,color:#fff
```
## Use Cases
* **Business Process Documentation**: Approval workflows, operational procedures
* **System Architecture**: API interactions, microservices communication
* **Database Design**: ER diagrams, schema relationships
* **Project Planning**: Gantt charts, timelines
* **Technical Documentation**: Class diagrams, state machines
* **User Experience**: User journeys, interaction flows
* **Version Control**: Git branching strategies, release processes
## Best Practices
### Diagram Design
* Keep diagrams focused and not too complex
* Use clear, descriptive labels
* Apply consistent styling
* Add notes for important context
* Use appropriate diagram type for the use case
### Formatting
* Use proper indentation for readability
* Group related elements together
* Use comments to explain complex logic
* Test diagrams before using in production
### Performance
* Large diagrams may require longer timeout
* Consider splitting very complex diagrams
* Use SVG for web display (smaller file size)
* Use PNG/PDF for documents and presentations
### Accessibility
* Use high contrast colors
* Include descriptive labels
* Provide alternative text descriptions
* Ensure font sizes are readable
## Output Format Recommendations
| Format | Best For | Advantages |
| - | - | - |
| PNG | Documents, presentations, web | Universal support, transparent backgrounds |
| SVG | Web display, scalable graphics | Small file size, infinite scaling |
| PDF | Print, documentation | Professional output, embedded fonts |
## Limitations
* Very complex diagrams may hit timeout limits
* File size limits apply for output-files API
* Background color option only works with PNG format
* Some advanced Mermaid features may require specific versions
For complete Mermaid syntax reference, visit [Mermaid Documentation](https://mermaid.js.org/).
# Output Tools
Source: https://carnot.mintlify.app/en/pages/tools/files/output_tools
Create and manage output files and text data
## Overview
Output Tools enable you to create files and manage text output in your workflows. These tools are essential for generating reports, saving processed data, and creating downloadable content for users.
## Key Features
### OUTPUT\_FILE
* Create files from text content
* Support multiple file formats (CSV, HTML, JSON, TXT, XML, YAML, XLS, XLSX, PDF, DOCX, PPTX, PNG, SVG)
* Upload to workspace with signed URLs
* Automatic file type detection
### OUTPUT\_TEXT
* Output plain text content
* Simple text display functionality
* Useful for debugging and status messages
* Compatible with all workflow steps
## Authentication
No authentication required for output tools.
## Example: Generate CSV Report
```yaml theme={null}
- id: process_data
name: process_data
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
# Process your data here
data = [
["Name", "Age", "City"],
["John", "30", "New York"],
["Jane", "25", "Los Angeles"]
]
result = "\n".join([",".join(row) for row in data])
print(result)
- id: save_report
name: save_report
tool: OUTPUT_FILE
input:
- name: content
value: "{{steps.process_data.result.stdout}}"
- name: filename
value: "user_report.csv"
- name: fileType
value: "csv"
```
## Example: JSON Data Export
```yaml theme={null}
- id: collect_data
name: collect_data
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Create a JSON structure with the following data:
{{steps.previous_step.result.content}}
Format as valid JSON with proper structure.
- id: export_json
name: export_json
tool: OUTPUT_FILE
input:
- name: content
value: "{{steps.collect_data.result.content}}"
- name: filename
value: "processed_data.json"
- name: fileType
value: "json"
- id: confirm_export
name: confirm_export
tool: OUTPUT_TEXT
input:
- name: text
value: "Data exported successfully to: {{steps.export_json.result.signed_url}}"
```
## Example: Multi-format Report Generation
```yaml theme={null}
- id: generate_report_data
name: generate_report_data
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
import yaml
# Sample report data
report_data = {
"title": "Monthly Sales Report",
"period": "January 2024",
"metrics": {
"total_sales": 45000,
"new_customers": 120,
"conversion_rate": 0.15
},
"top_products": [
{"name": "Product A", "sales": 15000},
{"name": "Product B", "sales": 12000}
]
}
# Generate different formats
json_output = json.dumps(report_data, indent=2)
yaml_output = yaml.dump(report_data, default_flow_style=False)
print("JSON_DATA:", json_output)
print("YAML_DATA:", yaml_output)
- id: save_json_report
name: save_json_report
tool: OUTPUT_FILE
input:
- name: content
value: "{{steps.generate_report_data.result.stdout | split('JSON_DATA: ')[1] | split('YAML_DATA:')[0] | trim}}"
- name: filename
value: "sales_report.json"
- name: fileType
value: "json"
- id: save_yaml_report
name: save_yaml_report
tool: OUTPUT_FILE
input:
- name: content
value: "{{steps.generate_report_data.result.stdout | split('YAML_DATA: ')[1] | trim}}"
- name: filename
value: "sales_report.yaml"
- name: fileType
value: "yaml"
```
## File Type Support
| Extension | Description | Use Cases |
| - | - | - |
| csv | Comma-separated values | Data export, spreadsheet import |
| html | HyperText Markup Language | Web report output, rich text documents |
| json | JavaScript Object Notation | API responses, configuration |
| txt | Plain text | Logs, reports, documentation |
| xml | Extensible Markup Language | Data exchange, configuration |
| yaml/yml | YAML Ain't Markup Language | Configuration, documentation |
| xls/xlsx | Microsoft Excel Workbook | Spreadsheet export, reporting |
| pdf | Portable Document Format | Downloadable reports, printable files |
| docx | Microsoft Word Document | Document generation |
| pptx | Microsoft PowerPoint Presentation | Slide export |
| png/svg | Image files | Charts, diagrams, visuals |
## Use Cases
* **Report Generation**: Create downloadable reports in various formats
* **Data Export**: Save processed data for external use
* **Configuration Files**: Generate config files for other systems
* **Documentation**: Create structured documentation files
* **Backup and Archive**: Save workflow results for future reference
* **User Downloads**: Provide files for user download
* **System Integration**: Generate files for external system import
# Reducto
Source: https://carnot.mintlify.app/en/pages/tools/files/reducto
Parse, extract, and split documents with the Reducto API
## Overview
The Reducto tools let you process documents (PDFs, images, spreadsheets, and other formats) using the [Reducto](https://reducto.ai/) API. Reducto provides OCR, layout detection, table extraction, and content chunking optimized for RAG applications, so you can turn unstructured documents into text, structured JSON, or logical sections inside your flows.
## Key Features
* `REDUCTO_UPLOAD`
* Upload a file to Reducto and get back a `reducto://` URL for use with the other Reducto tools.
* Inputs: `file_url` (publicly accessible or presigned URL), optional `extension` hint (e.g. `pdf`, `docx`).
* Outputs: `file_id` and `reducto_url`.
* `REDUCTO_PARSE`
* Parse a document to extract text, tables, and figures with layout-aware chunking.
* Inputs: `document_url` (public URL, presigned S3 URL, or `reducto://` URL), plus options such as `chunk_mode` (`variable`, `section`, `page`, `disabled`, `block`, `page_sections`; default `disabled`), `chunk_size` (250–1500 characters), `table_output_format` (`html`, `json`, `md`, `jsonbbox`, `dynamic`, `csv`; default `dynamic`), `add_page_markers`, `merge_tables`, `ocr_system` (`standard` / `legacy`), `extraction_mode` (`ocr` / `hybrid`), `page_range` (e.g. `"1-5"`, `"1,3,5"`, `"1-3,7-9"`), and `document_password` for encrypted files.
* Outputs: `job_id`, `num_pages`, and an array of `chunks` with their content blocks.
* `REDUCTO_EXTRACT`
* Extract specific fields from a document into structured JSON using a user-defined JSON Schema. Ideal for invoices, forms, and contracts.
* Inputs: `document_url`, `schema` (JSON Schema string), optional `system_prompt`, `array_extract` (repeating data such as invoice line items), `include_images`, `optimize_for_latency`, and `citations_enabled`.
* Outputs: `extracted_data`, plus `job_id`, `num_pages`, and `num_fields`.
* `REDUCTO_SPLIT`
* Split a document into sections using natural language category descriptions.
* Inputs: `document_url`, `split_description` (JSON array of `{"name": ..., "description": ...}` categories), optional `split_rules` (natural language splitting rules), and `table_cutoff` (`truncate` / `preserve` for tables at page boundaries).
* Outputs: `num_pages` and `splits` (each with `name`, `pages`, and `confidence`).
## Authentication
All Reducto tools require a Reducto API key, set in each step's config as `api_key`. Store the key as a secret (e.g. `REDUCTO_API_KEY`) and reference it with `{{secrets.REDUCTO_API_KEY}}`.
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: Parse a PDF and Summarize It
```yaml theme={null}
- id: upload_report
name: upload_report
tool: REDUCTO_UPLOAD
config:
- name: api_key
value: "{{secrets.REDUCTO_API_KEY}}"
input:
- name: file_url
value: "{{steps.input_file.result.url}}"
- name: extension
value: pdf
- id: parse_report
name: parse_report
tool: REDUCTO_PARSE
config:
- name: api_key
value: "{{secrets.REDUCTO_API_KEY}}"
input:
- name: document_url
value: "{{steps.upload_report.result.reducto_url}}"
- name: chunk_mode
value: page
- name: table_output_format
value: md
- name: add_page_markers
value: true
- id: summarize_report
name: summarize_report
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Summarize the following document. Highlight key figures and tables.
{{steps.parse_report.result.chunks}}
```
### Example: Extract Structured Data from an Invoice
```yaml theme={null}
- id: extract_invoice
name: extract_invoice
tool: REDUCTO_EXTRACT
config:
- name: api_key
value: "{{secrets.REDUCTO_API_KEY}}"
input:
- name: document_url
value: "https://example.com/invoice.pdf"
- name: schema
value: '{"type":"object","properties":{"invoice_number":{"type":"string"},"total":{"type":"number"}}}'
- name: array_extract
value: true
```
## Notes
* `document_url` accepts public URLs, presigned S3 URLs, and `reducto://` URLs. Use `REDUCTO_UPLOAD` first when the file is not directly reachable by Reducto, then pass the returned `reducto_url` to the other tools.
* `REDUCTO_PARSE` defaults: chunking is `disabled`, table format is `dynamic`, OCR system is `standard` (multilingual; `legacy` supports Germanic languages only), and extraction mode is `hybrid` (OCR combined with native text).
* `page_range` is 1-indexed and accepts ranges and comma-separated lists (e.g. `"1-3,7-9"`).
* `schema` (`REDUCTO_EXTRACT`) and `split_description` (`REDUCTO_SPLIT`) must be valid JSON strings; the step fails with an error if they cannot be parsed.
* On API errors the tools return an error object with the HTTP status and the raw response, which you can inspect in the run log.
# VTT Parse
Source: https://carnot.mintlify.app/en/pages/tools/files/vtt_parse
Parse WebVTT subtitle and transcript files into plain text or structured cues
## Overview
The VTT Parse tool parses WebVTT (`.vtt`) subtitle and transcript files — such as those exported by meeting-recording and video platforms — and returns either the plain speech text or a structured array of cues with timestamps. This makes it easy to feed transcripts into summarization, translation, or analysis steps.
## Key Features
* `VTT_PARSE`
* Parse a WebVTT file from a URL.
* Inputs: `file_url` (URL of the WebVTT file) and `output_format` (`txt` or `array`, default `txt`).
* `txt` returns plain speech text with timestamps and markup removed, one cue per line (`result.text`).
* `array` returns structured cues (`result.cues`), each with `index`, optional `id`, `start` and `end` timestamps in `HH:MM:SS.mmm` format, and the cue `text`.
## Authentication
No authentication required. The tool works directly with file URLs.
### Example: Meeting Transcript to Summary
```yaml theme={null}
- id: upload_transcript
name: upload_transcript
tool: INPUT_FILE
input:
- name: description
value: "Upload the meeting recording transcript (.vtt)"
- id: parse_transcript
name: parse_transcript
tool: VTT_PARSE
input:
- name: file_url
value: "{{steps.upload_transcript.result.url}}"
- name: output_format
value: txt
- id: summarize_meeting
name: summarize_meeting
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Please summarize the following meeting transcript:
1. Key discussion points
2. Decisions made
3. Action items with owners
==Transcript==
{{steps.parse_transcript.result.text}}
```
### Example: Structured Cues with Timestamps
```yaml theme={null}
- id: parse_subtitles
name: parse_subtitles
tool: VTT_PARSE
input:
- name: file_url
value: "https://example.com/subtitles.vtt"
- name: output_format
value: array
```
Each element of `{{steps.parse_subtitles.result.cues}}` contains `index`, `start`, `end`, and `text`, so downstream steps can reference specific moments in the recording.
## Notes
* Empty cues are skipped; `index` is assigned sequentially starting from 1 over the remaining cues.
* In `txt` mode, formatting markup inside cues is stripped and only the text content is kept.
* If the file cannot be downloaded (non-OK HTTP status), the tool returns a `DownloadError`; if the content is not valid VTT and no cues can be parsed, it returns a `ParseError`.
# Word Processing
Source: https://carnot.mintlify.app/en/pages/tools/files/word_processing
Advanced Word document processing and text highlighting
## Overview
Word Processing tools provide advanced capabilities for working with Microsoft Word documents (.docx). These tools enable content extraction, text highlighting, review comments, AI-powered document generation from templates, and document formatting with support for multiple languages including Japanese, Chinese, and other international character sets.
## Key Features
### WORD\_EXTRACT
* Extract text, tables, images, and comments (with replies) from .docx files in document order
* Returns a structured array of elements preserving the original document structure
* Table content is returned as a two-dimensional array of cell strings
* Supports Japanese and other languages
### WORD\_TEXT\_HIGHLIGHT
* Apply colored highlights to specific text in .docx files
* Support for multiple highlight colors
* International character encoding support
* Precise text matching and highlighting
* Preserve document formatting and structure
### WORD\_TEXT\_COMMENT
* Add review comments to specific text in .docx files
* Comments all occurrences of the target text by default, or only the Nth occurrence with the `index` option
* Custom author name for comments (default: `Jinbaflow`)
* Handles Japanese, Chinese, and other multilingual text natively
### WORD\_TEMPLATE\_GENERATE
* Generate a Word document based on a .dotx/.docx template
* An LLM analyzes the template's styles and structure, then creates content following the template's design rules according to your instructions
* Optionally incorporate structured data (e.g., table data, lists) into the generated document
## Authentication
No authentication is required for most Word processing tools. `WORD_TEMPLATE_GENERATE` uses an LLM and accepts an optional OpenAI API key via the `api_key` config; if omitted, it defaults to Jinba credits (`{{ secrets.JINBA_CREDIT_KEY }}`).
## Example: Extracting Document Content
`WORD_EXTRACT` takes a `file_url` pointing to a .docx file and returns a structured array of elements. Each element is one of:
* `{ "type": "text", "content": "..." }`
* `{ "type": "table", "content": [["cell", ...], ...] }`
* `{ "type": "image", "name": "..." }`
* `{ "type": "comment", "content": "...", "author": "...", "date": "...", "target": N, "replies": [...] }`
```yaml theme={null}
- id: upload_document
name: upload_document
tool: INPUT_FILE
input:
- name: description
value: "Upload Word document to extract content from"
- id: extract_content
name: extract_content
tool: WORD_EXTRACT
input:
- name: file_url
value: "{{steps.upload_document.result.file_url}}"
```
## Example: Adding Review Comments
`WORD_TEXT_COMMENT` takes a `file_url`, an `items` map of target text to comment, and an optional `author` name. Each item value is `{ "comment": "...", "index": N }` where the optional 1-based `index` targets the Nth occurrence; omit it to comment all occurrences. The output `result` is the URL of the commented .docx file.
```yaml theme={null}
- id: add_review_comments
name: add_review_comments
tool: WORD_TEXT_COMMENT
input:
- name: file_url
value: "{{steps.upload_document.result.file_url}}"
- name: items
value: |
{
"quarterly revenue": { "comment": "Please double-check this figure." },
"deadline": { "comment": "Confirm with the PM.", "index": 2 }
}
- name: author
value: "Legal Review Bot"
```
## Example: Generating a Document from a Template
`WORD_TEMPLATE_GENERATE` takes a `template_url` (.dotx or .docx), `instructions` describing what content to create, and optional structured `data` (e.g., table data, lists) to incorporate. The output is `result.url`, the URL of the generated document.
```yaml theme={null}
- id: upload_template
name: upload_template
tool: INPUT_FILE
input:
- name: description
value: "Upload a Word template (.dotx or .docx)"
- id: generate_document
name: generate_document
tool: WORD_TEMPLATE_GENERATE
input:
- name: template_url
value: "{{steps.upload_template.result.file_url}}"
- name: instructions
value: |
Create a project proposal for the new customer portal,
including an executive summary, milestones, and a budget section.
- name: data
value: |
{
"milestones": [
{ "name": "Design", "due": "2026-08-01" },
{ "name": "Implementation", "due": "2026-09-15" }
]
}
```
## Example: Document Review and Highlighting
`WORD_TEXT_HIGHLIGHT` takes a `file_url` and a `highlights` array where each item is `{ "text": "...", "color": "..." }`. Text matching is case-insensitive substring matching across paragraphs and table cells. The output `result` is the signed URL of the highlighted .docx file, which downstream steps can reference as `{{steps.highlight_key_terms.result}}`.
```yaml theme={null}
- id: upload_document
name: upload_document
tool: INPUT_FILE
input:
- name: description
value: "Upload Word document for review and highlighting"
- id: highlight_key_terms
name: highlight_key_terms
tool: WORD_TEXT_HIGHLIGHT
input:
- name: file_url
value: "{{steps.upload_document.result.file_url}}"
- name: highlights
value: |
[
{
"text": "important",
"color": "YELLOW"
},
{
"text": "urgent",
"color": "RED"
},
{
"text": "deadline",
"color": "PINK"
},
{
"text": "action required",
"color": "GREEN"
}
]
```
## Example: Contract Review Workflow
```yaml theme={null}
- id: input_contract
name: input_contract
tool: INPUT_FILE
input:
- name: description
value: "Upload contract document for legal review"
- id: extract_contract_text
name: extract_contract_text
tool: WORD_EXTRACT
input:
- name: file_url
value: "{{steps.input_contract.result.file_url}}"
- id: identify_key_clauses
name: identify_key_clauses
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Analyze this contract and identify key clauses that should be highlighted:
{{steps.extract_contract_text.result}}
Please identify and return:
1. Critical terms that need immediate attention (RED highlights)
2. Important financial terms (YELLOW highlights)
3. Deadlines and dates (PINK highlights)
4. Termination clauses (BLUE highlights)
5. Liability limitations (GREEN highlights)
Return as JSON array with text, color, and importance level.
- id: apply_legal_highlights
name: apply_legal_highlights
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
import re
# Parse AI recommendations
ai_response = """{{steps.identify_key_clauses.result.content}}"""
# Define standard legal term highlights
legal_highlights = [
{"text": "termination", "color": "BLUE"},
{"text": "liability", "color": "GREEN"},
{"text": "indemnification", "color": "GREEN"},
{"text": "breach", "color": "RED"},
{"text": "default", "color": "RED"},
{"text": "payment", "color": "YELLOW"},
{"text": "due date", "color": "PINK"},
{"text": "force majeure", "color": "VIOLET"},
{"text": "confidential", "color": "TURQUOISE"},
{"text": "intellectual property", "color": "DARK_BLUE"}
]
print(json.dumps(legal_highlights, indent=2))
- id: highlight_contract_terms
name: highlight_contract_terms
tool: WORD_TEXT_HIGHLIGHT
input:
- name: file_url
value: "{{steps.input_contract.result.file_url}}"
- name: highlights
value: "{{steps.apply_legal_highlights.result.stdout}}"
- id: create_review_summary
name: create_review_summary
tool: OUTPUT_FILE
input:
- name: content
value: |
Contract Review Summary
======================
Document: {{steps.input_contract.input.description}}
Review Date: {{date | format('YYYY-MM-DD HH:mm:ss')}}
Highlighting Legend:
- RED: Critical terms requiring immediate attention
- YELLOW: Financial terms and payment obligations
- PINK: Deadlines and important dates
- BLUE: Termination and ending clauses
- GREEN: Liability and indemnification terms
- VIOLET: Force majeure and exceptional circumstances
- TURQUOISE: Confidentiality and privacy terms
- DARK_BLUE: Intellectual property clauses
Key Findings:
{{steps.identify_key_clauses.result.content}}
Recommendations:
1. Review all RED highlighted terms with legal counsel
2. Verify all PINK highlighted dates are accurate
3. Ensure YELLOW highlighted financial terms are acceptable
4. Confirm BLUE highlighted termination conditions
Next Steps:
- Legal team review required
- Stakeholder approval needed
- Client signature pending
- name: filename
value: "contract_review_summary_{{date | format('YYYY-MM-DD')}}.txt"
- name: fileType
value: "txt"
```
## Example: Multi-language Document Processing
```yaml theme={null}
- id: upload_multilingual_doc
name: upload_multilingual_doc
tool: INPUT_FILE
input:
- name: description
value: "Upload document with Japanese/Chinese text"
- id: highlight_multilingual_terms
name: highlight_multilingual_terms
tool: WORD_TEXT_HIGHLIGHT
input:
- name: file_url
value: "{{steps.upload_multilingual_doc.result.file_url}}"
- name: highlights
value: |
[
{
"text": "重要",
"color": "RED"
},
{
"text": "緊急",
"color": "PINK"
},
{
"text": "注意",
"color": "YELLOW"
},
{
"text": "截止日期",
"color": "PINK"
}
]
- id: process_highlighted_content
name: process_highlighted_content
tool: GEMINI_INVOKE_WITH_FILE
config:
- name: version
value: gemini-1.5-flash
- name: token
value: "{{secrets.GEMINI_API_KEY}}"
input:
- name: prompt
value: |
Please analyze this highlighted multilingual document and:
1. Identify all highlighted text sections
2. Provide English translations for highlighted terms
3. Summarize the key points by highlight color
4. Note any critical information that requires attention
- name: file_url
value: "{{steps.highlight_multilingual_terms.result}}"
```
## Example: Educational Content Highlighting
```yaml theme={null}
- id: upload_study_material
name: upload_study_material
tool: INPUT_FILE
input:
- name: description
value: "Upload educational document for highlighting"
- id: extract_text
name: extract_text
tool: WORD_EXTRACT
input:
- name: file_url
value: "{{steps.upload_study_material.result.file_url}}"
- id: identify_study_points
name: identify_study_points
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Analyze this educational content and categorize text for highlighting:
{{steps.extract_text.result}}
Categories:
1. Key concepts and definitions (YELLOW)
2. Important formulas or equations (GREEN)
3. Critical facts and dates (BLUE)
4. Examples and case studies (VIOLET)
5. Warning or caution notes (RED)
Return specific text phrases to highlight in each category.
- id: create_study_highlights
name: create_study_highlights
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
# Create educational highlight scheme
study_highlights = [
# Key terms and definitions
{"text": "definition", "color": "YELLOW"},
{"text": "theorem", "color": "YELLOW"},
{"text": "principle", "color": "YELLOW"},
# Formulas and equations
{"text": "formula", "color": "GREEN"},
{"text": "equation", "color": "GREEN"},
{"text": "calculate", "color": "GREEN"},
# Important facts
{"text": "important", "color": "BLUE"},
{"text": "note that", "color": "BLUE"},
{"text": "remember", "color": "BLUE"},
# Examples
{"text": "example", "color": "VIOLET"},
{"text": "case study", "color": "VIOLET"},
{"text": "for instance", "color": "VIOLET"},
# Warnings and cautions
{"text": "warning", "color": "RED"},
{"text": "caution", "color": "RED"},
{"text": "avoid", "color": "RED"}
]
import json
print(json.dumps(study_highlights, indent=2))
- id: apply_study_highlights
name: apply_study_highlights
tool: WORD_TEXT_HIGHLIGHT
input:
- name: file_url
value: "{{steps.upload_study_material.result.file_url}}"
- name: highlights
value: "{{steps.create_study_highlights.result.stdout}}"
- id: create_study_guide
name: create_study_guide
tool: OUTPUT_FILE
input:
- name: content
value: |
Study Guide - Highlighting Legend
================================
Color Coding System:
🟡 YELLOW - Key Concepts & Definitions
- Fundamental terms and concepts
- Important definitions to memorize
- Core principles and theories
🟢 GREEN - Formulas & Equations
- Mathematical formulas
- Calculation methods
- Problem-solving approaches
🔵 BLUE - Critical Facts & Information
- Important facts to remember
- Key points for exams
- Essential knowledge items
🟣 VIOLET - Examples & Case Studies
- Practical examples
- Real-world applications
- Case study references
🔴 RED - Warnings & Cautions
- Common mistakes to avoid
- Important warnings
- Critical safety information
Study Tips:
1. Focus on YELLOW highlighted definitions first
2. Practice GREEN highlighted formulas
3. Memorize BLUE highlighted facts
4. Review VIOLET highlighted examples
5. Pay special attention to RED highlighted warnings
Document processed: {{date | format('YYYY-MM-DD HH:mm:ss')}}
- name: filename
value: "study_guide_{{date | format('YYYY-MM-DD')}}.txt"
- name: fileType
value: "txt"
```
## Highlight Color Options
The `color` value must be one of the following python-docx highlight colors (uppercase). If omitted, it defaults to `YELLOW`.
| Color | RGB Code | Use Case |
| - | - | - |
| YELLOW | #FFFF00 | Key concepts, definitions |
| BRIGHT\_GREEN | #00FF00 | Formulas, calculations |
| TURQUOISE | #00FFFF | Notes, references |
| PINK | #FF00FF | Deadlines, urgent items |
| BLUE | #0000FF | Important facts, dates |
| RED | #FF0000 | Critical items, warnings |
| DARK\_BLUE | #000080 | Intellectual property, special clauses |
| TEAL | #008080 | Secondary references |
| GREEN | #008000 | Liability, approved items |
| VIOLET | #800080 | Examples, case studies |
## Use Cases
* **Document Review**: Legal contracts, technical specifications
* **Educational Materials**: Textbooks, study guides, training materials
* **Content Categorization**: Organize information by importance
* **Quality Assurance**: Highlight issues, corrections, improvements
* **Collaboration**: Mark sections for team review
* **Compliance**: Highlight regulatory requirements
* **Translation**: Mark text for translation or localization
* **Research**: Categorize findings and key insights
## Best Practices
### Highlight Strategy
* Use consistent color coding across documents
* Create highlight legends for team collaboration
* Limit colors to avoid visual confusion
* Test highlighting on sample text first
### International Support
* Verify encoding compatibility for non-Latin characters
* Test with multilingual content before bulk processing
* Consider right-to-left text direction for Arabic/Hebrew
* Use Unicode-compatible text matching
### Performance Optimization
* Process large documents in sections
* Use specific text matching to reduce processing time
* Batch similar highlighting operations
* Monitor file size after highlighting
# Tools Overview
Source: https://carnot.mintlify.app/en/pages/tools/index
Explore the full catalog of tools available in Jinba Flow
## Overview
Tools are the building blocks of Jinba Flow workflows. Each step in a flow uses a tool to perform a specific action — from calling AI models and processing files, to integrating with external services and searching the web.
Jinba Flow offers a rich collection of tools organized into the categories below, giving you everything you need to build powerful automations. This page covers the tools that are currently documented — more tool documentation is being added continuously.
## Tool Categories
### Input/Output Tools
Tools for receiving data into your flow and producing structured output.
* [File Input](/en/pages/tools/files/input) - Fetch files from URLs
* [Advanced Input Tools](/en/pages/tools/files/input_advanced) - Webhooks, Slack events, image files, and text files
* [Input JSON with Validation](/en/pages/tools/validation/input) - Validate JSON input against a schema
* [Output Tools](/en/pages/tools/files/output_tools) - Create and manage output files and text data
* [Output JSON with Validation](/en/pages/tools/validation/output) - Validate JSON output against a schema
### AI Tools
Integrate with leading AI models to add intelligence to your workflows.
* [Gemini](/en/pages/tools/ai/gemini) - Invoke responses from Google Gemini
* [Gemini with File](/en/pages/tools/ai/gemini_with_file) - Generate text from files (PDF, image, audio, video)
* [Grok](/en/pages/tools/ai/grok) - Invoke responses from xAI Grok
* [Jev (TypeSafe AI)](/en/pages/tools/ai/typesafe_jev) - Fast structured decisions (yes/no, choice, score) with calibrated probabilities
* [Anthropic](/en/pages/tools/ai/anthropic) - Invoke responses from Claude
* [OpenAI](/en/pages/tools/ai/openai) - Invoke responses from OpenAI models
* [Azure OpenAI](/en/pages/tools/ai/azure_openai) - Invoke OpenAI models hosted on Microsoft Azure
* [LlamaCloud](/en/pages/tools/ai/llama_cloud) - Advanced document processing and search
* [LlamaCloud Advanced](/en/pages/tools/ai/llama_cloud_advanced) - Advanced search and query with LlamaIndex integration
### File Processing Tools
Extract, convert, and validate data from various file formats.
* [Extract from File](/en/pages/tools/files/extract) - Extract information from files using base64
* [Document Processing](/en/pages/tools/files/document_processing) - Extract and process text from various document formats
* [Word Processing](/en/pages/tools/files/word_processing) - Advanced Word document processing and text highlighting
* [Reducto](/en/pages/tools/files/reducto) - High-accuracy document parsing, extraction, and splitting
* [VTT Parse](/en/pages/tools/files/vtt_parse) - Parse WebVTT subtitle/transcript files into structured data
* [Marp Presentation](/en/pages/tools/files/marp) - Convert Markdown into presentation files
* [Mermaid Diagram](/en/pages/tools/files/mermaid) - Convert Mermaid syntax into images and PDFs
* [Markitdown Convert](/en/pages/tools/validation/markitdown_convert) - Convert a URL to Markdown
* [Checker Tools](/en/pages/tools/validation/checker_tools) - Data validation and checking for quality assurance
* [Jinba Modules Checker V2](/en/pages/tools/validation/jinba_modules_checker_v2) - Advanced rule-based document and data validation
* [Data Conversion Tools](/en/pages/tools/validation/data_conversion) - Convert data between different formats and structures
### External Service Integration Tools
Connect your flows to productivity platforms, communication tools, and business services.
**Productivity:**
* [GitHub](/en/pages/tools/productivity/github) - Automate GitHub tasks
* [Jira](/en/pages/tools/productivity/jira) - Manage Jira issues and project progress
* [Notion](/en/pages/tools/productivity/notion) - Automate a Notion workspace
* [Google Sheets](/en/pages/tools/productivity/google_sheets) - Spreadsheet operations using Google Sheets API
* [Advanced Google Sheets](/en/pages/tools/productivity/google_sheets_advanced) - Enhanced Google Sheets with get sheet functionality
* [Google Spreadsheet Advanced](/en/pages/tools/productivity/google_spreadsheet) - Bulk data manipulation for Google Spreadsheets
* [Google Forms](/en/pages/tools/productivity/google_forms) - Create and manage Google Forms
* [Excel Operations](/en/pages/tools/productivity/excel) - Comprehensive Excel file manipulation
* [Google Calendar](/en/pages/tools/productivity/google_calendar) - Automate Google Calendar tasks
* [Outlook Calendar](/en/pages/tools/productivity/outlook_calendar) - Automate Outlook Calendar tasks
* [Chatwork](/en/pages/tools/productivity/chatwork) - Connect with the Chatwork API
* [SharePoint](/en/pages/tools/productivity/sharepoint) - Manage SharePoint sites and OneDrive files
* [Microsoft Teams](/en/pages/tools/productivity/teams) - Manage Teams channels and messages
* [SmartHR](/en/pages/tools/productivity/smarthr) - List, create, update, delete, and invite employees (crews) in SmartHR
* [Box](/en/pages/tools/productivity/box) - Manage files and folders in Box
* [Linear](/en/pages/tools/productivity/linear) - Manage Linear issues, teams, and project progress
* [Zoom](/en/pages/tools/productivity/zoom) - Manage Zoom meetings, participants, and cloud recordings
* [Microsoft Users](/en/pages/tools/productivity/microsoft_users) - Look up users in Microsoft Entra ID (Azure AD)
* [HubSpot](/en/pages/tools/productivity/hubspot) - Create, update, and look up HubSpot CRM contacts
**Communication:**
* [Gmail](/en/pages/tools/communication/gmail) - Email operations using Gmail API
* [Outlook Mail](/en/pages/tools/communication/outlook_mail) - List and send emails via Microsoft Outlook
* [Slack](/en/pages/tools/communication/slack) - Slack messaging platform tools
* [Discord](/en/pages/tools/communication/discord) - Integrate with a Discord Bot
* [LINE](/en/pages/tools/communication/line) - LINE messaging platform tools
* [Twilio](/en/pages/tools/communication/twilio) - Send SMS and WhatsApp messages via Twilio
* [Intercom](/en/pages/tools/communication/intercom) - Create contacts, messages, and customer events in Intercom
* [X (Twitter)](/en/pages/tools/communication/x) - Post and retrieve content via the X API
* [ChatWork Advanced](/en/pages/tools/communication/chatwork_advanced) - Advanced ChatWork messaging and task management
* [Faximo FAX Service](/en/pages/tools/communication/faximo) - Send FAX messages and search FAX history
### Search & Data Retrieval Tools
Search the web, query databases, and retrieve information from various sources.
* [SerpAPI](/en/pages/tools/search/serpapi) - Search the web using SerpAPI
* [PokeAPI](/en/pages/tools/search/pokeapi) - Search for Pokemon data
* [YouTube Transcript](/en/pages/tools/search/youtube) - Get YouTube video transcripts
* [Arxiv Agent](/en/pages/tools/search/arxiv) - Search and retrieve papers from arXiv
* [Exa AI](/en/pages/tools/search/exaai) - Search the web using Exa AI
* [Perplexity](/en/pages/tools/search/perplexity) - Search the web using Perplexity
* [Pinecone](/en/pages/tools/search/pinecone) - Query and manage vector indexes in Pinecone
* [Teradata](/en/pages/tools/search/teradata) - Run queries on Teradata
* [Carnot Search](/en/pages/tools/search/carnot_search) - Search for company information
* [Azure AI Search](/en/pages/tools/search/azure_ai_search) - Query Azure AI Search indexes
* [AWS Bedrock Knowledge Base](/en/pages/tools/search/aws_bedrock_knowledge_base) - Retrieve from and sync documents to Bedrock knowledge bases
* [TinyFish](/en/pages/tools/search/tinyfish) - AI web agent for fetching, searching, and interacting with websites
### Database Tools
Run SQL queries against external databases.
* [Snowflake](/en/pages/tools/database/snowflake) - Run SQL queries on Snowflake
* [PostgreSQL](/en/pages/tools/database/postgres) - Run SQL queries on PostgreSQL
### Extended Tools
Run custom code, connect via MCP, generate media, and manage content.
* [Python Sandbox](/en/pages/tools/sandbox/python_sandbox_run) - Run Python code in a sandboxed environment
* [Browser Use Sandbox](/en/pages/tools/sandbox/browser_use_sandbox) - Run browser automation tasks in an isolated sandbox
* [MCP Tools](/en/pages/tools/sandbox/mcp_tools) - Model Context Protocol integration for local and remote tool execution
* [Shopify](/en/pages/tools/productivity/shopify) - Manage Shopify products and orders
* [Netsea](/en/pages/tools/productivity/netsea) - Connect to the Netsea API
* [AI Video Generation](/en/pages/tools/media/video_generation) - Create videos from text descriptions using AI
* [WordPress](/en/pages/tools/cms/wordpress) - Create articles on WordPress
* [Firecrawl](/en/pages/tools/cms/firecrawl) - Automate web crawling and data collection
### Jinba Tools
Leverage Jinba's own platform capabilities within your flows.
* [Jinba Flows](/en/pages/tools/jinba/jinba) - Run Jinba Flows from within a flow
* [Jinba Modules](/en/pages/tools/jinba/jinba_modules) - Advanced data extraction, parsing, and validation
* [Vector Search](/en/pages/tools/jinba/vector_search) - Semantic search for knowledge bases using vector embeddings
* [Jinba Knowledge Base](/en/pages/tools/jinba/knowledge_base) - Update and manage knowledge bases for enhanced AI workflows
## How Tools Work
1. **One tool per step** — Each step in a flow executes exactly one tool.
2. **Configuration** — Set up the tool's behavior using its `config` and `input` fields.
3. **Result referencing** — Access a step's output in later steps using `{{steps..result}}`.
For example, you could use an **Input** tool to receive a PDF, a **Document Processing** tool to extract its text, and an **Anthropic** tool to summarize the content — all connected through result references:
```mermaid theme={null}
graph LR
A["Input
(receive PDF)"] --> B["Document Processing
(extract text)"]
B --> C["Anthropic
(summarize)"]
C --> D["Slack
(notify the team)"]
```
## Choosing the Right Tool
| Use Case | Recommended Tool(s) |
| - | - |
| Receive user input | File Input, Input JSON with Validation |
| Generate text with AI | Anthropic, OpenAI, Gemini, Grok |
| Process documents | Document Processing, Extract from File, LlamaCloud |
| Send notifications | Slack, Discord, LINE, Gmail |
| Manage spreadsheets | Google Sheets, Excel Operations |
| Search the web | SerpAPI, Exa AI, Perplexity |
| Run custom logic | Python Sandbox, MCP Tools |
| Chain multiple flows | Jinba Flows |
## Credentials
Many tools require API keys or OAuth connections to access external services. See the [Credentials Overview](/en/pages/credentials/index) for setup instructions.
# Box
Source: https://carnot.mintlify.app/en/pages/tools/productivity/box
Manage files and folders in Box cloud storage
## Overview
The Box tools let you work with Box cloud storage from your flows: browse and search files, upload and download content, create and copy folders, share items via shared links or collaborators, and delete items.
## Key Features
* `BOX_LIST_FILES`
* List files and folders in a Box folder with a compact response (id, name, type, size, modified date).
* Inputs: `folder_id` (defaults to the root folder `"0"`), `limit` (1–1000, default 100).
* `BOX_LIST_FOLDER_ITEMS`
* List files and folders in a Box folder including pagination metadata (`total_count`, `offset`, `next_marker`).
* Inputs: `folder_id`, `limit`, `offset` (offset-based paging), `marker` and `use_marker_based_paging` (marker-based paging), `fields` (comma-separated Box fields to request).
* `BOX_SEARCH`
* Search files and folders in Box by keyword.
* Inputs: `query`, optional `file_extensions` (e.g. `"pdf,docx"`), optional `ancestor_folder_ids` to limit the search scope, `limit` (1–200, default 30).
* `BOX_GET_FILE_INFO`
* Get metadata for a Box file or folder, including shared link information when requested.
* Inputs: `item_id`, `item_type` (`file` or `folder`, default `file`), `fields`.
* `BOX_DOWNLOAD_FILE`
* Download a file from Box and return its content as base64, along with the file name and size.
* Inputs: `file_id`. Files up to 50MB are supported.
* `BOX_UPLOAD_FILE`
* Upload a file to Box. Accepts base64 content, a data URL (`data:;base64,...`), or an HTTPS URL.
* Inputs: `file`, optional `filename` (extracted from the file URL if omitted), `folder_id` (default root `"0"`). Returns the new `file_id` and `name`.
* `BOX_CREATE_FOLDER`
* Create a new folder in Box.
* Inputs: `name`, `parent_folder_id` (default root `"0"`).
* `BOX_COPY_FOLDER`
* Copy a folder to another location, optionally renaming it. Handles Box's asynchronous copy by polling until completion.
* Inputs: `source_folder_id`, `parent_folder_id` (default `"0"`), optional `name`, `wait_for_completion` (default `true`), `max_poll_attempts` (0–30, default 10), `poll_interval_ms` (0–30000, default 1000).
* `BOX_ADD_COLLABORATOR`
* Invite a user or group as a collaborator on a Box file or folder.
* Inputs: `item_id`, `item_type` (default `folder`), `login` (email to invite) or `accessible_by_id` (existing Box user/group ID), `accessible_by_type` (`user` or `group`), `role` (`editor` (default), `viewer`, `previewer`, `uploader`, `previewer uploader`, `viewer uploader`, `co-owner`), `notify` (default `true`).
* `BOX_CREATE_SHARED_LINK`
* Create a shared link for a Box file or folder.
* Inputs: `item_id`, `item_type` (default `file`), optional `access` (`open`, `company`, or `collaborators`), optional `password`, optional `unshared_at` (ISO date-time expiration), optional `can_download`.
* `BOX_DELETE_ITEM`
* Delete one or more Box files or folders.
* Inputs: a single `item_id` with `item_type`, or multiple `ids` with `types`, or an `items` array of `{ "id": "...", "type": "file|folder" }`; `recursive` (default `false`) to delete non-empty folders. Returns `deleted_items` and `failed_items`.
## Authentication
All Box tools require a Box OAuth access token (`token` in the tool config, secret type `BOX_OAUTH`).
Go to the [Jinba secrets dashboard](https://flow.jinba.io/workspace/secrets) and connect your Box account. This creates a `BOX_OAUTH` secret, and the platform refreshes the access token automatically when it expires. Reference the token in the tool config as shown below.
**Note**: Treat credentials as sensitive information and never commit them to public repositories.
## Usage Examples
### Example: Search for PDFs and download the first match
```yaml theme={null}
- id: search_reports
name: search_reports
tool: BOX_SEARCH
config:
- name: token
value: "{{secrets.BOX_OAUTH.access_token}}"
input:
- name: query
value: "monthly report"
- name: file_extensions
value: "pdf"
- name: limit
value: 10
- id: download_report
name: download_report
tool: BOX_DOWNLOAD_FILE
config:
- name: token
value: "{{secrets.BOX_OAUTH.access_token}}"
input:
- name: file_id
value: "{{steps.search_reports.result.entries[0].id}}"
```
### Example: Create a project folder, upload a file, and share it
```yaml theme={null}
- id: create_folder
name: create_folder
tool: BOX_CREATE_FOLDER
config:
- name: token
value: "{{secrets.BOX_OAUTH.access_token}}"
input:
- name: parent_folder_id
value: "0"
- name: name
value: "Project Alpha Deliverables"
- id: upload_file
name: upload_file
tool: BOX_UPLOAD_FILE
config:
- name: token
value: "{{secrets.BOX_OAUTH.access_token}}"
input:
- name: file
value: "{{steps.generate_report.result.url}}"
- name: filename
value: "deliverable.pdf"
- name: folder_id
value: "{{steps.create_folder.result.folder.id}}"
- id: share_file
name: share_file
tool: BOX_CREATE_SHARED_LINK
config:
- name: token
value: "{{secrets.BOX_OAUTH.access_token}}"
input:
- name: item_id
value: "{{steps.upload_file.result.file_id}}"
- name: item_type
value: "file"
- name: access
value: "company"
```
## Notes
* **File size limits**: `BOX_DOWNLOAD_FILE` and `BOX_UPLOAD_FILE` support files up to 50MB. Larger files fail with an error (Box's chunked upload API is not supported).
* **Root folder**: The Box root folder always has ID `"0"`; folder-related inputs default to it.
* **Pagination**: `BOX_LIST_FILES` returns a compact list without pagination metadata (max 1000 items). Use `BOX_LIST_FOLDER_ITEMS` when you need `total_count`, offset-based paging, or marker-based paging via `next_marker`.
* **Search limits**: `BOX_SEARCH` returns at most 200 results per call.
* **Asynchronous folder copies**: Box may process large folder copies asynchronously. `BOX_COPY_FOLDER` polls until completion (up to `max_poll_attempts`); if the copy is still in progress, the result has `pending: true`.
* **Deleting folders**: Non-empty folders are only deleted when `recursive` is set to `true` in `BOX_DELETE_ITEM`.
* **Collaborator roles**: The `owner` role cannot be assigned via `BOX_ADD_COLLABORATOR` — Box only accepts the roles listed above when creating a collaboration.
# Chatwork
Source: https://carnot.mintlify.app/en/pages/tools/productivity/chatwork
Connect with the Chatwork API
## Overview
The Chatwork tool allows you to connect with the Chatwork API, enabling you to send messages, create tasks, and manage your Chatwork account programmatically. This integration is useful for automating workflows and enhancing productivity within your team.
## Key Features
* `CHATWORK_SEND_MESSAGE`
* Send messages to a specific room in Chatwork.
* `CHATWORK_GET_MESSAGES`
* Retrieve messages from a specific room in Chatwork.
* `CHATWORK_CREATE_TASK`
* Create tasks in a specific room in Chatwork.
* `CHATWORK_GET_TASKS`
* Retrieve tasks from a specific room in Chatwork.
* `CHATWORK_UPDATE_TASK_STATUS`
* Update the status of a specific task in Chatwork.
## Authentication
For further details, [click here](/en/pages/credentials/chatwork).
To use the Chatwork API, you need to create a developer account on the [Chatwork Developer Platform](https://developer.chatwork.com/) and generate your API keys. This will provide you with the necessary credentials to authenticate your requests.
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: Manage Chatwork Tasks and Messages
```yaml theme={null}
- id: send_message
tool: CHATWORK_SEND_MESSAGE
config:
- name: token
value: "{{secrets.CHATWORK_API_TOKEN.api_token}}"
input:
- name: room_id
value: "123456"
- name: message
value: This is a test message from the Chatwork API!
- id: get_messages
tool: CHATWORK_GET_MESSAGES
config:
- name: token
value: "{{secrets.CHATWORK_API_TOKEN.api_token}}"
input:
- name: room_id
value: "123456"
- name: force
value: true
- id: create_task
tool: CHATWORK_CREATE_TASK
config:
- name: token
value: "{{secrets.CHATWORK_API_TOKEN.api_token}}"
input:
- name: room_id
value: "123456"
- name: body
value: Task with date string deadline
- name: to_ids
value: "6454321"
- name: limit
value: 2025/03/09
- name: limit_type
value: time
- id: get_tasks
tool: CHATWORK_GET_TASKS
config:
- name: token
value: "{{secrets.CHATWORK_API_TOKEN.api_token}}"
input:
- name: room_id
value: "123456"
- name: status
value: open
- id: update_task_status
tool: CHATWORK_UPDATE_TASK_STATUS
config:
- name: token
value: "{{secrets.CHATWORK_API_TOKEN.api_token}}"
input:
- name: room_id
value: "123456"
- name: task_id
value: "409281675"
- name: status
value: done
- id: get_updated_tasks
tool: CHATWORK_GET_TASKS
config:
- name: token
value: "{{secrets.CHATWORK_API_TOKEN.api_token}}"
input:
- name: room_id
value: "123456"
```
# Excel Operations
Source: https://carnot.mintlify.app/en/pages/tools/productivity/excel
Comprehensive Excel file manipulation tools
## Overview
Excel tools provide comprehensive functionality for working with Excel files (.xlsx). You can create new files from array data, read data, update cells, retrieve specific rows, extract embedded images, and manipulate Excel files from URLs.
## Key Features
* `EXCEL_CREATE`
* Create a new Excel file from a 2D array and return a download URL
* `EXCEL_GET_ROWS`
* Retrieve multiple rows from an Excel sheet as a 2D array, optionally limited to a range (e.g. "A1:C10")
* `EXCEL_GET_ROW`
* Get a single row from an Excel sheet using a range (e.g. "A5:C5")
* `EXCEL_GET_CELL_WITH_COORDINATE`
* Get cell values with their coordinates from a range defined by a start cell and an end cell
* `EXCEL_GET_IMAGES`
* Extract images embedded in an Excel file, with their sheet name and cell range
* `EXCEL_UPDATE`
* Update Excel file with new data using range selection
* `EXCEL_UPDATE_BY_COORDINATE`
* Update specific cells using coordinate-based positioning
## Authentication
No authentication required. Excel tools work directly with file URLs.
### Example: Creating an Excel File
```yaml theme={null}
- id: create_excel
name: create_excel
tool: EXCEL_CREATE
input:
- name: data
value: [
["Name", "Role", "Salary"],
["John Doe", "Manager", "50000"],
["Jane Smith", "Developer", "60000"]
]
- name: sheetName
value: "Members"
- name: outputFilename
value: "members.xlsx"
- name: startCell
value: "A1"
```
The result is a URL to download the created Excel file.
### Example: Reading Excel Data
```yaml theme={null}
- id: get_excel_rows
name: get_excel_rows
tool: EXCEL_GET_ROWS
input:
- name: url
value: "https://example.com/data.xlsx"
- name: sheetName
value: "Sheet1"
# Optional: omit range to read the entire sheet
- name: range
value: "A2:C10"
- id: get_specific_row
name: get_specific_row
tool: EXCEL_GET_ROW
input:
- name: url
value: "https://example.com/data.xlsx"
- name: sheetName
value: "Sheet1"
- name: range
value: "A5:C5"
- id: get_cell_value
name: get_cell_value
tool: EXCEL_GET_CELL_WITH_COORDINATE
input:
- name: url
value: "https://example.com/data.xlsx"
- name: sheetName
value: "Sheet1"
- name: startCell
value: "B5"
- name: endCell
value: "B5"
- id: get_images
name: get_images
tool: EXCEL_GET_IMAGES
input:
- name: url
value: "https://example.com/data.xlsx"
# Omit sheetName to extract images from all sheets
- name: sheetName
value: "Sheet1"
```
`EXCEL_GET_ROWS` returns the cell values as a 2D array in `result`, and `EXCEL_GET_ROW` returns a single row as an array. `EXCEL_GET_CELL_WITH_COORDINATE` returns an array of `{coordinate, content}` objects for each cell in the range from `startCell` to `endCell`.
`EXCEL_GET_IMAGES` returns a URL, file extension, MIME type, sheet name, and covered cell range for each extracted image, plus the total image count.
### Example: Updating Excel Data
```yaml theme={null}
- id: update_excel_range
name: update_excel_range
tool: EXCEL_UPDATE
input:
- name: url
value: "https://example.com/template.xlsx"
- name: sheetName
value: "Data"
- name: startCell
value: "A2"
- name: endCell
value: "C4"
- name: data
value: [
["John Doe", "Manager", "50000"],
["Jane Smith", "Developer", "60000"],
["Bob Johnson", "Designer", "45000"]
]
- id: update_specific_cell
name: update_specific_cell
tool: EXCEL_UPDATE_BY_COORDINATE
input:
- name: url
value: "https://example.com/report.xlsx"
- name: sheetName
value: "Summary"
- name: updateData
value: [
{"coordinate": "E10", "content": "{{steps.calculate_total.result.sum}}"}
]
```
### Example: Excel Data Processing Workflow
```yaml theme={null}
- id: read_source_data
name: read_source_data
tool: EXCEL_GET_ROWS
input:
- name: url
value: "{{secrets.EXCEL_SOURCE_URL}}"
- name: sheetName
value: "RawData"
- name: range
value: "A2:C100"
- id: process_data
name: process_data
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
# Get data from previous step (a 2D array of cell values)
raw_data = {{steps.read_source_data.result}}
# Process and transform data
processed_data = []
for row in raw_data:
if row[0] and row[1]: # Check if name and value exist
processed_data.append([
row[0].upper(), # Uppercase name
float(row[1]) * 1.1, # Increase value by 10%
"Processed"
])
print(json.dumps({"processed_data": processed_data}))
- id: update_target_excel
name: update_target_excel
tool: EXCEL_UPDATE
input:
- name: url
value: "{{secrets.EXCEL_TARGET_URL}}"
- name: sheetName
value: "ProcessedData"
- name: startCell
value: "A2"
- name: data
value: "{{steps.process_data.result.processed_data}}"
```
## Tips and Best Practices
* Always specify the sheet name to avoid working with the wrong sheet
* Use coordinate notation (A1, B2, etc.) for precise cell references
* When updating ranges, ensure your data array dimensions match the specified range
* For large datasets, consider processing data in chunks to avoid timeouts
* Validate data format before updating Excel files to prevent errors
# Github
Source: https://carnot.mintlify.app/en/pages/tools/productivity/github
Automate Github tasks
## Overview
The Github tools allow you to automate various tasks related to Github repositories, issues, releases, and Actions workflows.
## Key Features
* `GITHUB_LIST_REPOSITORY_ISSUES`
* List issues in a specified repository.
* `GITHUB_CREATE_AN_ISSUE`
* Create a new issue in a specified repository.
* `GITHUB_LIST_RELEASES`
* List releases from a repository, including tag names, release notes, author information, and asset URLs.
* `GITHUB_ACTIONS_RUN`
* Trigger a GitHub Actions workflow via `workflow_dispatch`, wait for completion, and return the run status and artifacts.
## Authentication
For further details, [click here](/en/pages/credentials/github).
In your Github account, navigate to **Settings** > **Developer settings** > **Personal access tokens**. Generate a new token with the required scopes (e.g., `repo` for full control of private repositories).
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: List Issues and Create an Issue
```yaml theme={null}
- name: List repository issues
id: list_repository_issues
tool: GITHUB_LIST_REPOSITORY_ISSUES
config:
- name: token
value: "{{secrets.GITHUB_TOKEN}}"
input:
- name: owner
value: nyuta01
- name: repository
value: cube-sl-demo
- name: Create an issue
id: create_an_issue
tool: GITHUB_CREATE_AN_ISSUE
config:
- name: token
value: "{{secrets.GITHUB_TOKEN}}"
input:
- name: owner
value: nyuta01
- name: repository
value: cube-sl-demo
- name: title
value: Test issue
- name: body
value: This is a test issue
- name: List releases
id: list_releases
tool: GITHUB_LIST_RELEASES
config:
- name: token
value: "{{secrets.GITHUB_TOKEN}}"
input:
- name: owner
value: nyuta01
- name: repository
value: cube-sl-demo
- name: per_page
value: 10
```
### Example: Run a GitHub Actions Workflow
`GITHUB_ACTIONS_RUN` authenticates with either a Personal Access Token (`pat_token`) or GitHub App credentials (`github_app`), selected via the `auth_type` config.
```yaml theme={null}
- name: Run workflow
id: run_workflow
tool: GITHUB_ACTIONS_RUN
config:
- name: auth_type
value: pat_token
- name: pat_token
value: "{{secrets.GITHUB_TOKEN}}"
input:
- name: owner
value: nyuta01
- name: repository
value: cube-sl-demo
- name: workflow
value: ci.yml
- name: ref
value: main
- name: inputs
value: '{"environment": "staging"}'
- name: wait_timeout_seconds
value: 1200
```
# Google Calendar
Source: https://carnot.mintlify.app/en/pages/tools/productivity/google_calendar
Automate Google Calendar tasks
## Overview
The Google Calendar tools allow you to automate various tasks related to Google Calendar, such as creating events, finding events, and managing calendar settings.
## Key Features
* `GOOGLE_CALENDAR_CREATE_EVENT`
* Create a new event in a specified calendar.
* `GOOGLE_CALENDAR_FIND_EVENT`
* Find events in a specified calendar within a given time range.
## Authentication
For further details, [click here](/en/pages/credentials/google-oauth).
To use the Google Calendar API, you need navigate to the [Jinba secrets dashboard](https://flow.jinba.io/workspace/secrets) and authenticate with your Google account. This will create a new OAuth token for you.
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: Create and Find Events
```yaml theme={null}
- id: find_event
tool: GOOGLE_CALENDAR_FIND_EVENT
config:
- name: token
value: ""
input:
- name: calendar_id
value: primary
- name: time_min
value: 2025-01-01T00:00:00Z
- name: time_max
value: 2025-01-03T00:00:00Z
- name: query
value: yuta.n@carnot.ai
- id: create_event
tool: GOOGLE_CALENDAR_CREATE_EVENT
config:
- name: token
value: ""
input:
- name: calendar_id
value: primary
- name: summary
value: Test Event
- name: description
value: This is a test event
- name: start
value: "{'dateTime': '2025-01-01T00:00:00Z'}"
- name: end
value: "{'dateTime': '2025-01-01T01:00:00Z'}"
```
# Google Forms
Source: https://carnot.mintlify.app/en/pages/tools/productivity/google_forms
Create and manage Google Forms - create forms, add questions, batch updates, and retrieve form data
## Overview
Google Forms tools allow you to programmatically create and manage Google Forms, add questions, perform batch updates, and retrieve form information. These tools provide comprehensive form management capabilities for surveys, feedback collection, and data gathering.
## Key Features
* `GOOGLE_FORMS_CREATE_FORM`: Create new Google Forms
* `GOOGLE_FORMS_ADD_QUESTIONS`: Add questions to existing forms
* `GOOGLE_FORMS_BATCH_UPDATE`: Perform batch updates on forms
* `GOOGLE_FORMS_GET_FORM`: Retrieve form information and structure
## Authentication
These tools require Google OAuth credentials with Google Forms API access. You need to set up OAuth credentials through the Google Cloud Console and enable the Google Forms API.
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
## Tools
### GOOGLE\_FORMS\_CREATE\_FORM
Create a new Google Form.
**Input**:
| Parameter | Type | Required | Description |
| - | - | - | - |
| `title` | string | Yes | The form title |
| `publish` | boolean | No | Publish the form so it accepts responses (default: `true`). Forms created via the API after 2026-06-30 start unpublished; set to `false` to keep the form as a draft. Note that publishing happens at creation time, so the form is live before `GOOGLE_FORMS_ADD_QUESTIONS` runs |
**Output**:
| Field | Type | Description |
| - | - | - |
| `formId` | string | Unique identifier for the created form |
| `title` | string | Title of the created form |
| `responderUri` | string | URL respondents use to fill in the form |
| `editUri` | string | URL to edit the form |
| `isPublished` | boolean | Whether the form is published (`false` when `publish` is `false`) |
| `isAcceptingResponses` | boolean | Whether the form accepts responses (`false` when `publish` is `false`) |
**Publish failures**: when `publish` is `true` and the form could not be published, or Google reports it as not accepting responses, the step fails with a `GoogleFormsPublishError`. The error is non-retryable because the form already exists (retrying would create a duplicate); the created form's `formId` and its real publish state are still returned in `result`, so you can publish it by hand from the Google Forms editor.
### GOOGLE\_FORMS\_ADD\_QUESTIONS
Add questions to an existing Google Form.
**Input**:
| Parameter | Type | Required | Description |
| - | - | - | - |
| `form_id` | string | Yes | ID of the form to modify |
| `questions` | array | Yes | Array of question objects (see below) |
Each object in `questions` contains:
| Field | Type | Required | Description |
| - | - | - | - |
| `title` | string | Yes | Question title |
| `type` | string | Yes | Question type: `multiple_choice`, `text`, `paragraph_text`, `checkboxes`, `dropdown`, `linear_scale`, `multiple_choice_grid`, `checkbox_grid`, `date`, `time`, `file_upload` |
| `required` | boolean | No | Whether the question is required |
| `options` | array | No | Options for choice-based questions |
| `description` | string | No | Question description |
**Output**:
| Field | Type | Description |
| - | - | - |
| `updated_form_id` | string | Form ID |
| `question_ids` | array | Array of IDs for the added questions |
| `form_url` | string | URL to the updated form |
### GOOGLE\_FORMS\_BATCH\_UPDATE
Perform batch updates on a Google Form.
**Input**:
| Parameter | Type | Required | Description |
| - | - | - | - |
| `form_id` | string | Yes | ID of the form to update |
| `updates` | array | Yes | Array of update requests (see below) |
Each object in `updates` contains:
| Field | Type | Required | Description |
| - | - | - | - |
| `update_type` | string | Yes | Type of update: `update_form_info`, `update_item`, `move_item`, `delete_item` |
| `update_data` | object | Yes | Update-specific data |
**Output**:
| Field | Type | Description |
| - | - | - |
| `form_id` | string | Updated form ID |
| `update_results` | array | Results of each update operation |
| `form_url` | string | URL to the updated form |
### GOOGLE\_FORMS\_GET\_FORM
Retrieve information about a Google Form.
**Input**:
* `form_id` (string, required): ID of the form to retrieve
**Output**:
Returns a `form_info` object with complete form information:
| Field | Type | Description |
| - | - | - |
| `form_id` | string | Form identifier |
| `title` | string | Form title |
| `description` | string | Form description |
| `questions` | array | Array of all questions with their settings |
| `settings` | object | Form settings (collect emails, response limits, etc.) |
| `response_count` | number | Number of responses received |
## Examples
### Example: Create a New Form
```yaml theme={null}
- id: create_feedback_form
tool: GOOGLE_FORMS_CREATE_FORM
config:
- name: oauth_credentials
value: "{{secrets.GOOGLE_OAUTH_CREDENTIALS}}"
input:
- name: title
value: "Customer Feedback Survey"
```
### Example: Add Questions to Form
```yaml theme={null}
- id: add_questions
tool: GOOGLE_FORMS_ADD_QUESTIONS
config:
- name: oauth_credentials
value: "{{secrets.GOOGLE_OAUTH_CREDENTIALS}}"
input:
- name: form_id
value: "{{steps.create_feedback_form.result.formId}}"
- name: questions
value:
- title: "How would you rate our service?"
type: "linear_scale"
required: true
description: "Rate from 1 (Poor) to 5 (Excellent)"
- title: "What could we improve?"
type: "paragraph_text"
required: false
description: "Please provide detailed feedback"
- title: "Would you recommend us to others?"
type: "multiple_choice"
required: true
options:
- "Definitely"
- "Probably"
- "Not sure"
- "Probably not"
- "Definitely not"
```
### Example: Retrieve Form Information
```yaml theme={null}
- id: get_form_details
tool: GOOGLE_FORMS_GET_FORM
config:
- name: oauth_credentials
value: "{{secrets.GOOGLE_OAUTH_CREDENTIALS}}"
input:
- name: form_id
value: "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms"
```
### Example: Batch Update Form
```yaml theme={null}
- id: batch_update_form
tool: GOOGLE_FORMS_BATCH_UPDATE
config:
- name: oauth_credentials
value: "{{secrets.GOOGLE_OAUTH_CREDENTIALS}}"
input:
- name: form_id
value: "{{steps.create_feedback_form.result.formId}}"
- name: updates
value:
- update_type: "update_form_info"
update_data:
title: "Updated Customer Feedback Survey"
description: "Updated description for our feedback survey"
- update_type: "update_item"
update_data:
item_id: "question_1"
title: "Updated question title"
```
## Question Types
### Supported Question Types:
* **multiple\_choice**: Single selection from options
* **checkboxes**: Multiple selections from options
* **dropdown**: Dropdown menu selection
* **text**: Short text input
* **paragraph\_text**: Long text input
* **linear\_scale**: Rating scale (1-5, 1-10, etc.)
* **multiple\_choice\_grid**: Grid of multiple choice questions
* **checkbox\_grid**: Grid of checkbox questions
* **date**: Date picker
* **time**: Time picker
* **file\_upload**: File upload field
## Use Cases
* Customer feedback collection
* Survey and questionnaire creation
* Event registration forms
* Employee feedback and HR surveys
* Educational assessments and quizzes
* Market research and data collection
* Application and contact forms
* Automated form generation from templates
# Google Sheets
Source: https://carnot.mintlify.app/en/pages/tools/productivity/google_sheets
Spreadsheet operations using Google Sheets API
## Overview
Enables spreadsheet data operations and automation using the Google Sheets API.
## Key Features
* `GOOGLE_SHEETS_EDIT_SHEET`
* Edit a Google Sheet by providing the spreadsheet ID, range, and values.
* `GET_SHEET`
* Retrieve data from a Google Sheet by specifying the spreadsheet ID and range.
## Authentication
For further details, [click here](/en/pages/credentials/google-oauth).
To use the Google Sheets API, you need navigate to the [Jinba secrets dashboard](https://flow.jinba.io/workspace/secrets) and authenticate with your Google account. This will create a new OAuth token for you.
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: Edit and Get Sheet Data
```yaml theme={null}
- id: edit_sheet
tool: GOOGLE_SHEETS_EDIT_SHEET
config:
- name: token
value: "{{secrets.GOOGLE_SHEETS_OAUTH_TOKEN}}"
input:
- name: spreadsheet_id
value: "0123456789"
- name: range
value: Sheet1!A1:D5
- name: values
value: '[["A1", "B1"], ["A2", "B2"]]'
- id: get_sheet
tool: GET_SHEET
config:
- name: token
value: "{{secrets.GOOGLE_SHEETS_OAUTH_TOKEN}}"
input:
- name: spreadsheet_id
value: "0123456789"
- name: range
value: Sheet1!A1:D5
```
# Advanced Google Sheets
Source: https://carnot.mintlify.app/en/pages/tools/productivity/google_sheets_advanced
Enhanced Google Sheets integration with get sheet functionality
## Overview
Advanced Google Sheets tools provide enhanced integration capabilities with Google Sheets, including the ability to retrieve complete sheet data. This complements the existing Google Sheets and Google Spreadsheet tools with additional functionality for comprehensive data access.
## Key Features
### GOOGLE\_SHEETS\_GET\_SHEET
* Retrieve complete sheet data from Google Sheets
* Access to all cells and formatting information
* Support for multiple sheets within a workbook
* Efficient data retrieval for large datasets
## Authentication
Google Sheets integration requires Google API credentials and appropriate permissions.
**Required setup:**
1. Google Cloud Console project with Sheets API enabled
2. Service account credentials or OAuth 2.0 client
3. Appropriate sharing permissions on target sheets
**Note**: Treat API credentials as sensitive information and never commit them to public repositories.
## Example: Complete Sheet Data Retrieval
```yaml theme={null}
- id: get_full_sheet_data
name: get_full_sheet_data
tool: GOOGLE_SHEETS_GET_SHEET
config:
- name: credentials
value: "{{secrets.GOOGLE_SHEETS_CREDENTIALS}}"
input:
- name: sheet_id
value: "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms"
- name: sheet_name
value: "Sheet1" # Optional: defaults to first sheet
- name: include_formatting
value: true
- name: include_metadata
value: true
- id: analyze_sheet_structure
name: analyze_sheet_structure
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
# Analyze retrieved sheet data
sheet_data = json.loads('''{{steps.get_full_sheet_data.result.sheet_data}}''')
print("Google Sheet Analysis")
print("=" * 25)
# Basic information
print(f"Sheet Name: {sheet_data.get('sheet_name', 'Unknown')}")
print(f"Sheet ID: {sheet_data.get('sheet_id', 'Unknown')}")
# Data dimensions
rows = sheet_data.get('rows', [])
if rows:
max_cols = max(len(row) for row in rows)
print(f"Dimensions: {len(rows)} rows × {max_cols} columns")
# Data preview
print("\nData Preview (first 5 rows):")
for i, row in enumerate(rows[:5], 1):
print(f"Row {i}: {row[:5]}...") # Show first 5 columns
else:
print("No data found in sheet")
# Metadata
if 'metadata' in sheet_data:
metadata = sheet_data['metadata']
print(f"\nMetadata:")
print(f" Last Modified: {metadata.get('modified_time', 'Unknown')}")
print(f" Owner: {metadata.get('owner', 'Unknown')}")
- id: convert_to_structured_format
name: convert_to_structured_format
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
sheet_data = json.loads('''{{steps.get_full_sheet_data.result.sheet_data}}''')
rows = sheet_data.get('rows', [])
if not rows:
print("No data to convert")
else:
# Assume first row contains headers
headers = rows[0] if rows else []
data_rows = rows[1:] if len(rows) > 1 else []
# Convert to array of objects
structured_data = []
for row in data_rows:
row_obj = {}
for i, header in enumerate(headers):
value = row[i] if i < len(row) else ""
row_obj[header] = value
structured_data.append(row_obj)
# Output structured data
result = {
"headers": headers,
"data": structured_data,
"record_count": len(structured_data)
}
print(json.dumps(result, indent=2))
- id: export_structured_data
name: export_structured_data
tool: OUTPUT_FILE
input:
- name: content
value: "{{steps.convert_to_structured_format.result.stdout}}"
- name: filename
value: "google_sheets_export_{{date | format('YYYY-MM-DD')}}.json"
- name: fileType
value: "json"
```
## Example: Multi-Sheet Workbook Processing
```yaml theme={null}
- id: get_workbook_info
name: get_workbook_info
tool: GOOGLE_SHEETS_GET_SHEET
config:
- name: credentials
value: "{{secrets.GOOGLE_SHEETS_CREDENTIALS}}"
input:
- name: sheet_id
value: "{{input.workbook_id}}"
- name: get_sheet_list
value: true # Get list of all sheets in workbook
- id: process_all_sheets
name: process_all_sheets
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
# Get list of sheets from workbook
workbook_info = json.loads('''{{steps.get_workbook_info.result.workbook_info}}''')
sheets = workbook_info.get('sheets', [])
print("Multi-Sheet Processing Plan")
print("=" * 30)
print(f"Workbook ID: {workbook_info.get('workbook_id', 'Unknown')}")
print(f"Total Sheets: {len(sheets)}")
print("\nSheets to process:")
processing_plan = []
for i, sheet in enumerate(sheets):
sheet_name = sheet.get('name', f'Sheet{i+1}')
sheet_info = {
"sheet_name": sheet_name,
"step_id": f"get_sheet_{i+1}",
"processing_order": i+1
}
processing_plan.append(sheet_info)
print(f" {i+1}. {sheet_name}")
print(f"\nProcessing plan created for {len(processing_plan)} sheets")
print(json.dumps(processing_plan, indent=2))
- id: get_sales_sheet
name: get_sales_sheet
tool: GOOGLE_SHEETS_GET_SHEET
config:
- name: credentials
value: "{{secrets.GOOGLE_SHEETS_CREDENTIALS}}"
input:
- name: sheet_id
value: "{{input.workbook_id}}"
- name: sheet_name
value: "Sales Data"
- name: include_formatting
value: true
- id: get_inventory_sheet
name: get_inventory_sheet
tool: GOOGLE_SHEETS_GET_SHEET
config:
- name: credentials
value: "{{secrets.GOOGLE_SHEETS_CREDENTIALS}}"
input:
- name: sheet_id
value: "{{input.workbook_id}}"
- name: sheet_name
value: "Inventory"
- name: include_formatting
value: true
- id: consolidate_workbook_data
name: consolidate_workbook_data
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
from datetime import datetime
# Consolidate data from multiple sheets
sales_data = json.loads('''{{steps.get_sales_sheet.result.sheet_data}}''')
inventory_data = json.loads('''{{steps.get_inventory_sheet.result.sheet_data}}''')
consolidated_report = {
"report_date": datetime.now().isoformat(),
"workbook_id": "{{input.workbook_id}}",
"sheets_processed": [],
"summary_statistics": {},
"data_quality_checks": []
}
# Process sales data
if sales_data.get('rows'):
sales_rows = len(sales_data['rows']) - 1 # Exclude header
consolidated_report["sheets_processed"].append({
"sheet_name": "Sales Data",
"row_count": sales_rows,
"status": "processed"
})
# Process inventory data
if inventory_data.get('rows'):
inventory_rows = len(inventory_data['rows']) - 1 # Exclude header
consolidated_report["sheets_processed"].append({
"sheet_name": "Inventory",
"row_count": inventory_rows,
"status": "processed"
})
# Calculate summary statistics
total_rows = sum(sheet["row_count"] for sheet in consolidated_report["sheets_processed"])
consolidated_report["summary_statistics"] = {
"total_data_rows": total_rows,
"sheets_processed": len(consolidated_report["sheets_processed"]),
"processing_time": "{{date | format('HH:mm:ss')}}"
}
print("Workbook Consolidation Complete")
print("=" * 35)
print(json.dumps(consolidated_report, indent=2))
- id: save_consolidated_report
name: save_consolidated_report
tool: OUTPUT_FILE
input:
- name: content
value: "{{steps.consolidate_workbook_data.result.stdout}}"
- name: filename
value: "workbook_consolidation_report.json"
- name: fileType
value: "json"
```
## Example: Data Quality Analysis
```yaml theme={null}
- id: retrieve_data_for_analysis
name: retrieve_data_for_analysis
tool: GOOGLE_SHEETS_GET_SHEET
config:
- name: credentials
value: "{{secrets.GOOGLE_SHEETS_CREDENTIALS}}"
input:
- name: sheet_id
value: "{{input.analysis_sheet_id}}"
- name: sheet_name
value: "{{input.sheet_name}}"
- name: include_formatting
value: true
- name: include_metadata
value: true
- id: perform_data_quality_analysis
name: perform_data_quality_analysis
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
import re
from collections import Counter
# Analyze data quality
sheet_data = json.loads('''{{steps.retrieve_data_for_analysis.result.sheet_data}}''')
rows = sheet_data.get('rows', [])
if not rows:
print("No data found for analysis")
else:
headers = rows[0] if rows else []
data_rows = rows[1:] if len(rows) > 1 else []
print("Data Quality Analysis Report")
print("=" * 35)
print(f"Dataset: {sheet_data.get('sheet_name', 'Unknown')}")
print(f"Total Records: {len(data_rows)}")
print(f"Total Columns: {len(headers)}")
print()
# Column-by-column analysis
quality_report = {
"overall_stats": {
"total_records": len(data_rows),
"total_columns": len(headers),
"completeness_score": 0
},
"column_analysis": [],
"data_issues": []
}
total_cells = 0
empty_cells = 0
for col_idx, header in enumerate(headers):
col_values = [row[col_idx] if col_idx < len(row) else "" for row in data_rows]
# Calculate column statistics
non_empty_values = [v for v in col_values if v.strip()]
empty_count = len(col_values) - len(non_empty_values)
completeness = (len(non_empty_values) / len(col_values)) * 100 if col_values else 0
# Data type detection
numeric_count = sum(1 for v in non_empty_values if str(v).replace('.', '').replace('-', '').isdigit())
date_count = sum(1 for v in non_empty_values if re.match(r'\d{1,2}[/-]\d{1,2}[/-]\d{2,4}', str(v)))
email_count = sum(1 for v in non_empty_values if '@' in str(v) and '.' in str(v))
likely_type = "text"
if numeric_count / len(non_empty_values) > 0.8 if non_empty_values else False:
likely_type = "numeric"
elif date_count / len(non_empty_values) > 0.5 if non_empty_values else False:
likely_type = "date"
elif email_count / len(non_empty_values) > 0.5 if non_empty_values else False:
likely_type = "email"
col_analysis = {
"column_name": header,
"completeness_percent": round(completeness, 2),
"empty_cells": empty_count,
"likely_data_type": likely_type,
"unique_values": len(set(non_empty_values)),
"sample_values": non_empty_values[:3]
}
quality_report["column_analysis"].append(col_analysis)
total_cells += len(col_values)
empty_cells += empty_count
# Identify potential issues
if completeness < 90:
quality_report["data_issues"].append(f"Column '{header}' has low completeness ({completeness:.1f}%)")
if len(set(non_empty_values)) == 1 and non_empty_values:
quality_report["data_issues"].append(f"Column '{header}' has only one unique value")
# Overall completeness score
overall_completeness = ((total_cells - empty_cells) / total_cells) * 100 if total_cells > 0 else 0
quality_report["overall_stats"]["completeness_score"] = round(overall_completeness, 2)
print(f"Overall Data Completeness: {overall_completeness:.1f}%")
print()
# Display column analysis
print("Column Analysis:")
for col in quality_report["column_analysis"]:
print(f" 📊 {col['column_name']}")
print(f" Completeness: {col['completeness_percent']}%")
print(f" Type: {col['likely_data_type']}")
print(f" Unique Values: {col['unique_values']}")
print()
# Display issues
if quality_report["data_issues"]:
print("🚨 Data Quality Issues:")
for issue in quality_report["data_issues"]:
print(f" - {issue}")
else:
print("✅ No major data quality issues detected")
print("\n" + json.dumps(quality_report, indent=2))
- id: create_quality_recommendations
name: create_quality_recommendations
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Based on this data quality analysis report, please provide specific recommendations for improving data quality:
{{steps.perform_data_quality_analysis.result.stdout}}
Please provide:
1. Priority issues to address first
2. Specific steps to improve data completeness
3. Data validation rules to implement
4. Best practices for ongoing data maintenance
5. Suggested data cleaning workflows
- id: save_quality_analysis_report
name: save_quality_analysis_report
tool: OUTPUT_FILE
input:
- name: content
value: |
Google Sheets Data Quality Analysis Report
========================================
Generated: {{date | format('YYYY-MM-DD HH:mm:ss')}}
## Analysis Results
{{steps.perform_data_quality_analysis.result.stdout}}
## Recommendations
{{steps.create_quality_recommendations.result.content}}
## Next Steps
1. Address high-priority data quality issues
2. Implement recommended data validation rules
3. Set up regular data quality monitoring
4. Train users on data entry best practices
5. Consider automated data cleaning workflows
- name: filename
value: "data_quality_analysis_{{date | format('YYYY-MM-DD')}}.txt"
- name: fileType
value: "txt"
```
## Sheet Retrieval Options
### Basic Retrieval
* **sheet\_id**: Google Sheets document ID
* **sheet\_name**: Specific sheet tab name (optional)
* **range**: Specific cell range (optional)
### Advanced Options
* **include\_formatting**: Include cell formatting information
* **include\_metadata**: Include sheet metadata (owner, modified date, etc.)
* **get\_sheet\_list**: Retrieve list of all sheets in workbook
* **preserve\_empty\_cells**: Include empty cells in output
## Data Format
### Standard Response
```json theme={null}
{
"sheet_id": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms",
"sheet_name": "Sheet1",
"rows": [
["Header 1", "Header 2", "Header 3"],
["Value 1", "Value 2", "Value 3"],
["Value 4", "Value 5", "Value 6"]
],
"metadata": {
"modified_time": "2024-01-15T10:30:00Z",
"owner": "user@example.com"
}
}
```
### With Formatting
```json theme={null}
{
"sheet_data": {
"rows": [...],
"formatting": {
"cell_formats": {
"A1": {"bold": true, "background_color": "#ffff00"},
"B1": {"italic": true, "text_color": "#ff0000"}
}
}
}
}
```
## Use Cases
* **Data Analysis**: Retrieve complete datasets for analysis
* **Reporting**: Generate reports from Google Sheets data
* **Data Migration**: Export data from Google Sheets to other systems
* **Quality Assurance**: Analyze data quality and completeness
* **Backup and Archive**: Create backups of important spreadsheets
* **Integration**: Connect Google Sheets data to other workflow tools
* **Dashboard Creation**: Pull data for dashboard and visualization tools
* **Compliance Reporting**: Extract data for regulatory reporting
## Best Practices
### Performance Optimization
* Retrieve only necessary data ranges
* Use appropriate inclusion options (formatting, metadata)
* Consider pagination for very large sheets
* Cache frequently accessed data
### Data Handling
* Always validate retrieved data structure
* Handle empty cells and missing data gracefully
* Implement error handling for access permission issues
* Consider data privacy and security requirements
### Integration Strategy
* Use structured data formats for downstream processing
* Implement data quality checks after retrieval
* Log data retrieval operations for audit trails
* Plan for rate limiting and quota management
# Google Spreadsheet Advanced
Source: https://carnot.mintlify.app/en/pages/tools/productivity/google_spreadsheet
Advanced Google Spreadsheet operations for bulk data manipulation
## Overview
Google Spreadsheet Advanced tools provide comprehensive functionality for bulk operations on Google Sheets. These tools complement the basic Google Sheets tools with advanced features for managing multiple rows, sheets, and complex data operations.
## Key Features
* `GOOGLE_SPREADSHEET_ADD_ROW`
* Add a single row to a Google Sheet
* `GOOGLE_SPREADSHEET_ADD_ROWS`
* Add multiple rows to a Google Sheet at once
* `GOOGLE_SPREADSHEET_UPDATE_ROW`
* Update a specific row in a Google Sheet
* `GOOGLE_SPREADSHEET_UPDATE_ROWS`
* Update multiple rows in a Google Sheet
* `GOOGLE_SPREADSHEET_GET_ROWS`
* Retrieve multiple rows from a Google Sheet
* `GOOGLE_SPREADSHEET_ADD_SHEET`
* Create a new sheet within a Google Spreadsheet
* `GOOGLE_SPREADSHEET_REMOVE_SHEET`
* Delete a sheet from a Google Spreadsheet
## Authentication
For further details, [click here](/en/pages/credentials/google-oauth).
You need to set up Google Sheets API credentials. Follow these steps:
1. Go to [Google Cloud Console](https://console.cloud.google.com/)
2. Create a new project or select an existing one
3. Enable the Google Sheets API
4. Create service account credentials and download the JSON key file
5. Share your Google Spreadsheet with the service account email
**Note**: Treat API credentials as sensitive information and never commit them to public repositories.
### Example: Bulk Data Operations
```yaml theme={null}
- id: add_multiple_rows
name: add_multiple_rows
tool: GOOGLE_SPREADSHEET_ADD_ROWS
config:
- name: credentials
value: "{{secrets.GOOGLE_SHEETS_CREDENTIALS}}"
input:
- name: spreadsheet_id
value: "your_spreadsheet_id_here"
- name: sheet_name
value: "Data"
- name: values
value: [
["John Doe", "john@example.com", "Manager", "2024-01-15"],
["Jane Smith", "jane@example.com", "Developer", "2024-01-16"],
["Bob Johnson", "bob@example.com", "Designer", "2024-01-17"]
]
- id: update_multiple_rows
name: update_multiple_rows
tool: GOOGLE_SPREADSHEET_UPDATE_ROWS
config:
- name: credentials
value: "{{secrets.GOOGLE_SHEETS_CREDENTIALS}}"
input:
- name: spreadsheet_id
value: "your_spreadsheet_id_here"
- name: sheet_name
value: "Data"
- name: start_row
value: 2
- name: values
value: [
["John Doe Updated", "john.doe@example.com", "Senior Manager", "2024-01-15"],
["Jane Smith Updated", "jane.smith@example.com", "Senior Developer", "2024-01-16"]
]
```
### Example: Sheet Management
```yaml theme={null}
- id: create_new_sheet
name: create_new_sheet
tool: GOOGLE_SPREADSHEET_ADD_SHEET
config:
- name: credentials
value: "{{secrets.GOOGLE_SHEETS_CREDENTIALS}}"
input:
- name: spreadsheet_id
value: "your_spreadsheet_id_here"
- name: sheet_name
value: "MonthlyReport_{{current_date}}"
- id: setup_headers
name: setup_headers
tool: GOOGLE_SPREADSHEET_ADD_ROW
config:
- name: credentials
value: "{{secrets.GOOGLE_SHEETS_CREDENTIALS}}"
input:
- name: spreadsheet_id
value: "your_spreadsheet_id_here"
- name: sheet_name
value: "MonthlyReport_{{current_date}}"
- name: values
value: ["Name", "Email", "Department", "Start Date", "Status"]
```
### Example: Data Migration Workflow
```yaml theme={null}
- id: get_source_data
name: get_source_data
tool: GOOGLE_SPREADSHEET_GET_ROWS
config:
- name: credentials
value: "{{secrets.GOOGLE_SHEETS_CREDENTIALS}}"
input:
- name: spreadsheet_id
value: "source_spreadsheet_id"
- name: sheet_name
value: "SourceData"
- name: start_row
value: 2
- name: end_row
value: 1000
- id: process_data
name: process_data
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
# Get data from previous step
source_data = {{steps.get_source_data.result.values}}
# Transform data
processed_data = []
for row in source_data:
if len(row) >= 3 and row[0]: # Validate row has minimum required data
processed_data.append([
row[0].strip().title(), # Clean and format name
row[1].strip().lower() if len(row) > 1 else "", # Email to lowercase
row[2].strip() if len(row) > 2 else "", # Department
"Active" # Default status
])
print(json.dumps({"processed_data": processed_data}))
- id: migrate_to_target
name: migrate_to_target
tool: GOOGLE_SPREADSHEET_ADD_ROWS
config:
- name: credentials
value: "{{secrets.GOOGLE_SHEETS_CREDENTIALS}}"
input:
- name: spreadsheet_id
value: "target_spreadsheet_id"
- name: sheet_name
value: "MigratedData"
- name: values
value: "{{steps.process_data.result.processed_data}}"
```
### Example: Conditional Updates
```yaml theme={null}
- id: get_current_data
name: get_current_data
tool: GOOGLE_SPREADSHEET_GET_ROWS
config:
- name: credentials
value: "{{secrets.GOOGLE_SHEETS_CREDENTIALS}}"
input:
- name: spreadsheet_id
value: "your_spreadsheet_id_here"
- name: sheet_name
value: "Employees"
- id: filter_and_update
name: filter_and_update
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
# Get current data
current_data = {{steps.get_current_data.result.values}}
# Find rows that need updating (example: inactive employees)
updates = []
for i, row in enumerate(current_data):
if len(row) >= 4 and row[3] == "Inactive":
# Update status to "Terminated" and add termination date
updated_row = row.copy()
updated_row[3] = "Terminated"
updated_row.append("2024-01-31") # Add termination date
updates.append({
"row_index": i + 2, # +2 because sheets are 1-indexed and we skip header
"data": updated_row
})
print(json.dumps({"updates": updates}))
- id: apply_updates
name: apply_updates
tool: GOOGLE_SPREADSHEET_UPDATE_ROWS
config:
- name: credentials
value: "{{secrets.GOOGLE_SHEETS_CREDENTIALS}}"
input:
- name: spreadsheet_id
value: "your_spreadsheet_id_here"
- name: sheet_name
value: "Employees"
- name: start_row
value: "{{steps.filter_and_update.result.updates[0].row_index}}"
- name: values
value: "{{steps.filter_and_update.result.updates}}"
```
## Tips and Best Practices
* Always validate data before bulk operations to prevent errors
* Use batch operations (ADD\_ROWS, UPDATE\_ROWS) for better performance
* Consider creating backups before large update operations
* Use meaningful sheet names when creating new sheets
* Implement error handling for large datasets
* Monitor API quota usage for high-volume operations
# HubSpot
Source: https://carnot.mintlify.app/en/pages/tools/productivity/hubspot
Create, update, and look up HubSpot CRM contacts; fetch and search deals; look up companies and owners; log notes and tasks on a deal
## Overview
The HubSpot tools integrate with the HubSpot CRM API to manage contacts and read deals from your workflows. The contact tools key on the email address, so you can reconcile records without going through the Search API and its rate limit. The deal tools fetch a deal by ID or search deals by name, stage, owner, close or creation date, or any other property. The company and owner tools resolve the IDs a deal carries (its associated company, its `hubspot_owner_id`) into names, domains, and email addresses, and the note and task tools attach engagements to a deal without modifying the deal itself.
## Key Features
* `HUBSPOT_UPSERT_CONTACT`
* Create a contact, or update the existing one with the same email address. Supports custom properties.
* `HUBSPOT_GET_CONTACT`
* Fetch a contact by object ID or by email address. Returns `found: false` instead of failing when no contact matches.
* `HUBSPOT_GET_DEAL`
* Fetch a deal by object ID, optionally with associated contact and company IDs. Returns `found: false` instead of failing when no deal matches.
* `HUBSPOT_SEARCH_DEALS`
* Search deals by name, stage, pipeline, owner, or close / creation date range, with free-text and custom property filters. Paged.
* `HUBSPOT_GET_COMPANY`
* Fetch a company by object ID, optionally with associated contact and deal IDs. Returns `found: false` instead of failing when no company matches.
* `HUBSPOT_GET_OWNER`
* Fetch an owner by owner ID or by email address, returning their name, email, and user ID. Returns `found: false` instead of failing when no owner matches.
* `HUBSPOT_LIST_OWNERS`
* List the owners in the account, optionally filtered by email or limited to archived owners. Paged.
* `HUBSPOT_CREATE_NOTE`
* Create a note and attach it to a deal, contact, or company, with an optional timestamp and author.
* `HUBSPOT_CREATE_TASK`
* Create a task with a due date, status, priority, and assignee, and attach it to a deal, contact, or company.
## Authentication
For setup instructions, [see the HubSpot credentials page](/en/pages/credentials/hubspot).
| Config field | Description |
| - | - |
| `access_token` | A HubSpot access token (select from workspace secrets). Needs `crm.objects.contacts.read` and `crm.objects.contacts.write` for the contact tools, `crm.objects.deals.read` for the deal tools, `crm.objects.companies.read` for `HUBSPOT_GET_COMPANY`, `crm.objects.owners.read` for the owner tools, and `crm.objects.contacts.write` for the note and task tools. |
### Example: Look Up a Contact, Then Create or Update It
```yaml theme={null}
- id: find_contact
tool: HUBSPOT_GET_CONTACT
config:
- name: access_token
value: "{{secrets.HUBSPOT_ACCESS_TOKEN}}"
input:
- name: email
value: "customer@example.com"
- name: properties
value: "email, firstname, lastname, company"
- id: upsert_contact
tool: HUBSPOT_UPSERT_CONTACT
config:
- name: access_token
value: "{{secrets.HUBSPOT_ACCESS_TOKEN}}"
input:
- name: email
value: "customer@example.com"
- name: firstname
value: "Ada"
- name: lastname
value: "Lovelace"
- name: lifecyclestage
value: "lead"
- name: properties
value: '{"hs_lead_status":"OPEN"}'
```
### Example: List Deals Closing This Month for One Owner
```yaml theme={null}
- id: search_deals
tool: HUBSPOT_SEARCH_DEALS
config:
- name: access_token
value: "{{secrets.HUBSPOT_ACCESS_TOKEN}}"
input:
- name: owner_id
value: "12345678"
- name: close_date_from
value: "2026-09-01T00:00:00+09:00"
- name: close_date_to
value: "2026-09-30T23:59:59+09:00"
- name: sort_by
value: "amount"
- name: sort_direction
value: "descending"
- name: properties
value: "dealname, amount, dealstage, closedate"
- id: get_deal
tool: HUBSPOT_GET_DEAL
config:
- name: access_token
value: "{{secrets.HUBSPOT_ACCESS_TOKEN}}"
input:
- name: deal_id
value: "{{steps.search_deals.result.deals[0].id}}"
- name: associations
value: "contacts, companies"
```
### Example: Resolve a New Deal's Owner and Company
```yaml theme={null}
- id: search_deals
tool: HUBSPOT_SEARCH_DEALS
config:
- name: access_token
value: "{{secrets.HUBSPOT_ACCESS_TOKEN}}"
input:
- name: create_date_from
value: "2026-09-30T09:00:00+09:00"
- name: sort_by
value: "createdate"
- name: sort_direction
value: "ascending"
- id: get_deal
tool: HUBSPOT_GET_DEAL
config:
- name: access_token
value: "{{secrets.HUBSPOT_ACCESS_TOKEN}}"
input:
- name: deal_id
value: "{{steps.search_deals.result.deals[0].id}}"
- name: associations
value: "contacts, companies"
- id: get_owner
tool: HUBSPOT_GET_OWNER
config:
- name: access_token
value: "{{secrets.HUBSPOT_ACCESS_TOKEN}}"
input:
- name: owner_id
value: "{{steps.get_deal.result.properties.hubspot_owner_id}}"
- id: get_company
tool: HUBSPOT_GET_COMPANY
config:
- name: access_token
value: "{{secrets.HUBSPOT_ACCESS_TOKEN}}"
input:
- name: company_id
value: "{{steps.get_deal.result.associations.companies.results[0].id}}"
- name: properties
value: "name, domain, industry, city"
```
### Example: Log a Meeting Summary and a Follow-up Task on a Deal
```yaml theme={null}
- id: create_note
tool: HUBSPOT_CREATE_NOTE
config:
- name: access_token
value: "{{secrets.HUBSPOT_ACCESS_TOKEN}}"
input:
- name: deal_id
value: "98765432"
- name: body
value: "Meeting 2026-10-01
Reviewed pricing. Customer will confirm budget by next week.
"
- id: create_task
tool: HUBSPOT_CREATE_TASK
config:
- name: access_token
value: "{{secrets.HUBSPOT_ACCESS_TOKEN}}"
input:
- name: deal_id
value: "98765432"
- name: subject
value: "Follow up on budget confirmation"
- name: due_date
value: "2026-10-08T09:00:00+09:00"
- name: priority
value: "HIGH"
- name: owner_id
value: "12345678"
```
## Inputs
### `HUBSPOT_UPSERT_CONTACT`
| Input | Required | Description |
| - | - | - |
| `email` | Yes | The lookup key. An existing contact with this email is updated, otherwise a new one is created. |
| `firstname`, `lastname`, `phone`, `company`, `jobtitle`, `website` | No | Standard contact properties. |
| `lifecyclestage` | No | e.g. `subscriber`, `lead`, `marketingqualifiedlead`, `customer`. |
| `properties` | No | Any other HubSpot properties as a JSON object of internal name → value, e.g. `{"hs_lead_status":"OPEN"}`. A `null` value clears the property. |
A named input left blank is skipped, not sent — HubSpot reads an empty string as "clear this property", so clearing has to be asked for explicitly through `properties` (`{"firstname": null}`). Named inputs win over the same key inside `properties`. Setting `properties.email` to something other than the `email` input is rejected. A difference in letter case alone is treated as the same address.
Returns `result.id`, `result.created`, `result.properties`, and the raw `result.contact`.
### `HUBSPOT_GET_CONTACT`
| Input | Required | Description |
| - | - | - |
| `contact_id` | One of the two | HubSpot contact object ID. |
| `email` | One of the two | Contact email address. |
| `properties` | No | Comma-separated property names, e.g. `email, firstname, company`. HubSpot returns only a minimal set when this is empty. Custom properties use their internal name, which you can find under **Settings → Properties**. |
| `associations` | No | Comma-separated object types to also fetch associated record IDs for, e.g. `companies, deals`. |
Returns `result.found`, `result.id`, `result.properties`, `result.associations`, and the raw `result.contact`.
### `HUBSPOT_GET_DEAL`
| Input | Required | Description |
| - | - | - |
| `deal_id` | Yes | HubSpot deal object ID (the number in the deal's URL, or an `id` from `HUBSPOT_SEARCH_DEALS`). |
| `properties` | No | Comma-separated property names, e.g. `dealname, amount, dealstage`. Defaults to `dealname, amount, dealstage, pipeline, closedate, hubspot_owner_id`. |
| `associations` | No | Comma-separated object types to also fetch associated record IDs for, e.g. `contacts, companies`. |
Returns `result.found`, `result.id`, `result.properties`, `result.associations`, and the raw `result.deal`.
### `HUBSPOT_SEARCH_DEALS`
All inputs are optional. Named filters are combined with AND.
| Input | Description |
| - | - |
| `query` | Free-text search, matched as a prefix against the deal name and other default searchable properties. |
| `deal_name` | Whole-word match on the deal name, e.g. `renewal` finds "Acme renewal 2026" but `renew` does not. Add `*` to match the start of a word (`renew*`). Use `query` for a quick keyword search instead. |
| `deal_stage` | Deal stage internal ID, e.g. `appointmentscheduled`, `closedwon`, or the numeric ID of a custom stage. |
| `pipeline` | Pipeline internal ID, e.g. `default`, or the numeric ID of a custom pipeline. |
| `owner_id` | HubSpot owner ID (`hubspot_owner_id`). Not the user ID shown under Settings → Users. |
| `close_date_from`, `close_date_to` | Close-date range, compared as `>=` / `<=` against the deal's `closedate` timestamp. ISO 8601 date or date-time; a date without a time is read as midnight UTC, so `close_date_to: "2026-09-30"` excludes deals closing later that day. To include the whole day, pass an explicit end time such as `2026-09-30T23:59:59+09:00`. |
| `create_date_from`, `create_date_to` | Creation-date range against the deal's `createdate`, with the same formats and end-of-day caveat as the close-date range. To pick up only deals created since a previous run, pass that run's timestamp as `create_date_from`. |
| `filters` | Additional filters as a JSON array of `{"propertyName","operator","value"}` objects, e.g. `[{"propertyName":"amount","operator":"GTE","value":"10000"}]`. Operators: `EQ`, `NEQ`, `LT`, `LTE`, `GT`, `GTE`, `BETWEEN` (`value` + `highValue`), `IN` / `NOT_IN` (`values` array), `HAS_PROPERTY`, `NOT_HAS_PROPERTY`, `CONTAINS_TOKEN`, `NOT_CONTAINS_TOKEN`. |
| `properties` | Comma-separated property names to return for each deal. Same default as `HUBSPOT_GET_DEAL`. |
| `sort_by` | Property to sort by, e.g. `createdate`, `closedate`, or `amount`. |
| `sort_direction` | `descending` (default) or `ascending`. Only used when `sort_by` is set. |
| `limit` | Deals per page, 1–200. Default 20. |
| `after` | Paging cursor from a previous result's `next_after`. |
Returns `result.deals` (each with `id` and `properties`), `result.count`, `result.total`, and `result.next_after` (`null` on the last page).
### `HUBSPOT_GET_COMPANY`
| Input | Required | Description |
| - | - | - |
| `company_id` | Yes | HubSpot company object ID (the number in the company's URL, or an ID from `HUBSPOT_GET_DEAL`'s `associations.companies`). |
| `properties` | No | Comma-separated property names, e.g. `name, domain, industry`. Defaults to `name, domain, industry, city, hubspot_owner_id`. |
| `associations` | No | Comma-separated object types to also fetch associated record IDs for, e.g. `contacts, deals`. |
Returns `result.found`, `result.id`, `result.properties`, `result.associations`, and the raw `result.company`.
### `HUBSPOT_GET_OWNER`
| Input | Required | Description |
| - | - | - |
| `owner_id` | One of the two | HubSpot owner ID — the `hubspot_owner_id` on a deal or contact. Not the user ID shown under Settings → Users. |
| `email` | One of the two | The owner's email address. |
Returns `result.found`, `result.id`, `result.email`, `result.first_name`, `result.last_name`, `result.user_id`, `result.archived`, and the raw `result.owner`.
### `HUBSPOT_LIST_OWNERS`
All inputs are optional.
| Input | Description |
| - | - |
| `email` | Only return the owner with this email address. |
| `archived` | `active` (default) or `archived`. HubSpot returns one set or the other, never both. |
| `limit` | Owners per page, 1–500. Default 100. |
| `after` | Paging cursor from a previous result's `next_after`. |
Returns `result.owners` (each with `id`, `email`, `first_name`, `last_name`, `user_id`, and `archived`), `result.count`, and `result.next_after` (`null` on the last page).
### `HUBSPOT_CREATE_NOTE`
| Input | Required | Description |
| - | - | - |
| `body` | Yes | The note text, as plain text or simple HTML. Up to 65,536 characters. |
| `deal_id`, `contact_id`, `company_id` | At least one | The record(s) to attach the note to. The note is associated with every record you pass. |
| `timestamp` | No | When the note was written, as ISO 8601 or epoch milliseconds. Defaults to now. |
| `owner_id` | No | HubSpot owner ID to record as the author. Left unset when empty (a service key or private app token has no user of its own). |
| `properties` | No | Any other engagement properties as a JSON object of internal name → value. Named inputs win over the same key inside `properties`. |
Returns `result.id`, `result.properties`, and the raw `result.note`.
### `HUBSPOT_CREATE_TASK`
| Input | Required | Description |
| - | - | - |
| `subject` | Yes | The task title. |
| `due_date` | Yes | When the task is due, as ISO 8601 or epoch milliseconds. HubSpot requires a due date on every task. |
| `deal_id`, `contact_id`, `company_id` | At least one | The record(s) to attach the task to. The task is associated with every record you pass. |
| `body` | No | Task description, as plain text or simple HTML. |
| `status` | No | `NOT_STARTED` (default), `IN_PROGRESS`, `WAITING`, `COMPLETED`, or `DEFERRED`. |
| `priority` | No | `LOW`, `MEDIUM`, or `HIGH`. Left unset unless you pass one. |
| `task_type` | No | `TODO` (default), `EMAIL`, or `CALL`. |
| `owner_id` | No | HubSpot owner ID to assign the task to. Left unset when empty, which leaves the task unassigned. |
| `properties` | No | Any other engagement properties as a JSON object of internal name → value. Named inputs win over the same key inside `properties`. |
Returns `result.id`, `result.properties`, and the raw `result.task`.
## Notes
* **Not found is not an error**: `HUBSPOT_GET_CONTACT`, `HUBSPOT_GET_DEAL`, `HUBSPOT_GET_COMPANY`, and `HUBSPOT_GET_OWNER` return `result.found = false` on a missing record, so "look up, and create it if missing" can be an ordinary condition step.
* **Notes and tasks do not edit the deal**: engagements are separate records associated with the deal, contact, or company you pass. None of the deal's own fields are written; HubSpot only refreshes its activity-derived properties (such as last activity date), which any workflow keyed on those will see. The Engagements API documents `crm.objects.contacts.write` for creating them, not `crm.objects.deals.write`.
* **Engagement timestamps**: `timestamp` and `due_date` accept ISO 8601 or epoch milliseconds. A date without a time is read as midnight UTC, so pass an explicit time with an offset (`2026-10-08T09:00:00+09:00`) when the hour matters.
* **Creates are not retried by the tool**: the HTTP call behind a note or task create is never repeated by the tool itself, whatever the failure, because a repeat could create the record twice. A step-level `retry` you configure still re-runs the step after a definitive rejection such as a 429, but the step opts out of it when the failure is ambiguous (the request timed out inside the tool, the connection dropped, or HubSpot answered 5xx). One gap remains: a step-level `timeout` that fires mid-request is raised by the runner, not the tool, so it is retried like any other error — keep `retry` off such steps, or set the step timeout well above the tool's own 30 seconds. Check HubSpot for the record before re-running the step.
* **Owner IDs vs user IDs**: `hubspot_owner_id` is not the user ID shown under Settings → Users. Use `HUBSPOT_GET_OWNER` to turn an owner ID into a name and email address, or `HUBSPOT_LIST_OWNERS` to find the owner ID for a given person.
* **Search limits**: HubSpot allows at most 6 filters per search (named fields and `filters` entries combined), returns at most 200 deals per page and 10,000 per query, and rate-limits the Search API separately at 5 requests per second per account. The search index can lag a few seconds behind writes, so a deal created moments earlier may not appear yet.
* **Date properties**: `closedate` and `createdate` are date-times in HubSpot. The range inputs are converted to epoch milliseconds for you; values in `filters` are sent as-is, so prefer epoch milliseconds there.
* **Incremental pickup**: `create_date_from` is inclusive (`>=`). If you pass the `createdate` of the newest deal from the previous run, that deal is returned again, so de-duplicate by `id` downstream.
* **Concurrent writes are last-write-wins**: HubSpot's CRM API has no optimistic locking, so overlapping updates resolve per property. Do not use `HUBSPOT_UPSERT_CONTACT` for read-modify-write accumulation (reading a score, adding to it, writing it back) across runs that may overlap — use a HubSpot calculated property instead.
* **Archived contacts**: a contact in HubSpot's recycle bin still reserves its email address, so an upsert against it cannot succeed. Restore it from the recycle bin, or use a different address.
* **Timeouts**: every request has a 30-second timeout, with automatic retries on rate limits and transient server errors (except note and task creates — see above).
# Jira
Source: https://carnot.mintlify.app/en/pages/tools/productivity/jira
Manage Jira issues and project progress
## Overview
The Jira tools integrate with Atlassian Jira Cloud REST API v3 to help you manage project progress from your workflows. You can create, search, update, and transition issues, add comments, and discover projects.
## Key Features
* `JIRA_CREATE_ISSUE`
* Create an issue (task, story, bug, or sub-task) in a Jira project.
* `JIRA_GET_ISSUE`
* Fetch a single issue by its key (e.g. `PROJ-123`) or numeric ID.
* `JIRA_SEARCH_ISSUES`
* Search issues with a JQL query using the enhanced `/search/jql` endpoint. Returns paginated results with a `nextPageToken`.
* `JIRA_UPDATE_ISSUE`
* Update fields on an existing issue: summary, description, assignee, priority, and labels.
* `JIRA_TRANSITION_ISSUE`
* Move an issue to a new status (e.g. To Do → In Progress → Done), with an optional comment.
* `JIRA_ADD_COMMENT`
* Add a comment to an issue. Accepts plain text and converts it to Atlassian Document Format (ADF) automatically.
* `JIRA_LIST_PROJECTS`
* List all accessible projects to discover project keys.
## Authentication
For setup instructions, [see the Jira credentials page](/en/pages/credentials/jira).
Each step requires three configuration fields:
| Config field | Description |
| - | - |
| `base_url` | Your Jira site URL, e.g. `https://your-domain.atlassian.net` |
| `email` | Your Atlassian account email |
| `api_token` | A Jira API token (select from workspace secrets) |
### Example: Create and Search Issues
```yaml theme={null}
- id: create_issue
tool: JIRA_CREATE_ISSUE
config:
- name: base_url
value: "https://your-domain.atlassian.net"
- name: email
value: "you@example.com"
- name: api_token
secret: "YOUR_JIRA_SECRET"
input:
- name: project_key
value: "PROJ"
- name: summary
value: "Fix login bug"
- name: issue_type
value: "Bug"
- id: search_issues
tool: JIRA_SEARCH_ISSUES
config:
- name: base_url
value: "https://your-domain.atlassian.net"
- name: email
value: "you@example.com"
- name: api_token
secret: "YOUR_JIRA_SECRET"
input:
- name: jql
value: "project = PROJ AND status = 'In Progress'"
```
## Notes
* **ADF conversion**: Rich-text fields (description, comment body) accept plain text. The tool automatically converts each line into an Atlassian Document Format paragraph.
* **Assignee**: Jira identifies users by `accountId`, not name or email. Pass the `accountId` visible in the user's profile URL.
* **At-least-once side effects**: `JIRA_CREATE_ISSUE` and `JIRA_ADD_COMMENT` may create duplicates if a worker restarts after the call. De-duplicate downstream if exactly-once semantics matter.
* **Timeouts**: Every request has a 30-second timeout via `AbortSignal.timeout`.
# Linear
Source: https://carnot.mintlify.app/en/pages/tools/productivity/linear
Manage Linear issues, teams, and project progress
## Overview
The Linear tools connect to the Linear GraphQL API so your workflows can create and update issues, add comments, look up teams, and track project progress.
## Key Features
* `LINEAR_CREATE_ISSUE`
* Create a new issue in a Linear team.
* Key inputs: `team_id` (required), `title` (required), `description` (Markdown), `state_id`, `assignee_id`, `project_id`, `label_ids`, `subscriber_ids`, `priority` (integer 0–4), `estimate` (integer ≥ 0).
* `LINEAR_GET_ISSUES`
* Retrieve a list of issues with optional server-side filters.
* Key inputs: `team_id`, `state_id`, `assignee_id`, `project_id`, `label_ids` (matches issues containing any of the given labels), `updated_after` / `updated_before` (ISO 8601, e.g. `2024-01-01T00:00:00Z`), `first` (1–100, default 20).
* `LINEAR_UPDATE_ISSUE`
* Update fields on an existing issue. At least one update field must be provided.
* Key inputs: `issue_id` (required), plus any of `title`, `description`, `state_id`, `assignee_id`, `project_id`, `label_ids`, `subscriber_ids`, `priority`, `estimate`.
* `LINEAR_ADD_ISSUE_COMMENT`
* Add a comment to an issue — useful for triage context or workflow notifications.
* Key inputs: `issue_id` (required), `comment_body` (required, Markdown).
* `LINEAR_LIST_TEAMS`
* Fetch teams to look up their internal IDs, names, and keys.
* Key inputs: `first` (1–100, default 20).
* `LINEAR_GET_PROJECT_PROGRESS`
* Retrieve a project's progress and status, including scope, completed scope, health, milestones, members, and recent project updates.
* Key inputs: `project_id` (required).
## Authentication
All Linear tools authenticate with a **personal API key** (OAuth is not supported). Generate one in Linear under **Settings** → **Security & access** → **Personal API keys**, then store it as a `LINEAR_API_KEY` secret in your workspace.
Each step takes a single config field:
| Config field | Description |
| - | - |
| `api_key` | Your Linear API key (select from workspace secrets) |
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
## Usage Examples
### Example: Look up a team and create an issue
Fetch your teams once to find the internal team ID, then create an issue in that team:
```yaml theme={null}
- id: list_teams
tool: LINEAR_LIST_TEAMS
config:
- name: api_key
secret: "YOUR_LINEAR_SECRET"
input:
- name: first
value: 50
- id: create_issue
tool: LINEAR_CREATE_ISSUE
config:
- name: api_key
secret: "YOUR_LINEAR_SECRET"
input:
- name: team_id
value: "TEAM_UUID_FROM_LIST_TEAMS"
- name: title
value: "Investigate checkout error spike"
- name: description
value: |
## Summary
Error rate on the checkout endpoint doubled since the last deploy.
- name: priority
value: 2
```
### Example: Weekly progress digest
Collect issues updated in the past week and the current project status, then summarize with an AI step:
```yaml theme={null}
- id: recent_issues
tool: LINEAR_GET_ISSUES
config:
- name: api_key
secret: "YOUR_LINEAR_SECRET"
input:
- name: project_id
value: "PROJECT_UUID"
- name: updated_after
value: "2026-07-07T00:00:00Z"
- name: first
value: 100
- id: project_progress
tool: LINEAR_GET_PROJECT_PROGRESS
config:
- name: api_key
secret: "YOUR_LINEAR_SECRET"
input:
- name: project_id
value: "PROJECT_UUID"
- id: write_digest
tool: OPENAI_INVOKE
input:
- name: prompt
value: |
Write a short weekly status update from this data.
==Recently updated issues==
{{steps.recent_issues.result.issues}}
==Project progress==
{{steps.project_progress.result.project}}
```
## Notes
* **IDs, not names**: All references (`team_id`, `state_id`, `assignee_id`, `project_id`, `label_ids`) are Linear's internal identifiers. Use `LINEAR_LIST_TEAMS` and `LINEAR_GET_ISSUES` to discover them.
* **List inputs**: `label_ids` and `subscriber_ids` accept a JSON array (e.g. `["id1", "id2"]`) or a comma-separated string (`id1, id2`).
* **Updates replace lists**: In `LINEAR_UPDATE_ISSUE`, `label_ids` and `subscriber_ids` replace the existing lists rather than appending to them.
* **Fields cannot be cleared**: Empty values are ignored on update, so you cannot blank out a title or description — only overwrite it. `LINEAR_UPDATE_ISSUE` fails if no update field is provided.
* **Pagination**: `LINEAR_GET_ISSUES` and `LINEAR_LIST_TEAMS` return at most 100 items per run. A `pageInfo` object (`hasNextPage`, `endCursor`) is returned, but there is no cursor input, so only the first page is retrievable in a single step. Narrow results with filters instead.
* **Error handling**: `LINEAR_GET_PROJECT_PROGRESS` returns an `error` object in its output instead of failing the step when the request fails.
# Microsoft Users
Source: https://carnot.mintlify.app/en/pages/tools/productivity/microsoft_users
Look up Microsoft 365 user profiles and manager relationships via Microsoft Graph
## Overview
Microsoft Users tools let you resolve Microsoft 365 user emails and UPNs to full directory profiles, and look up each user's direct manager, through Microsoft Graph.
## Key Features
* `MICROSOFT_GET_USERS`
* Resolve a list of email addresses or UPNs to Microsoft 365 user profiles. Returns display name, mail, job title, department, company name, and office location. Unresolved identifiers are returned in `notFound`.
* `MICROSOFT_GET_MANAGER`
* Look up the direct manager of each input user. Returns a list of `{ user, manager }` pairs where `manager` is `null` if no manager is set. Unresolved identifiers are returned in `notFound`.
## Authentication
These tools require a Microsoft Graph OAuth token with delegated `User.Read.All` permission.
Go to the [Jinba secrets dashboard](https://flow.jinba.io/workspace/secrets) and connect a Microsoft account for User Directory. Use the generated token in the tool config.
> **Tenant admin consent is required.** `User.ReadBasic.All` is NOT sufficient — company name and department are only accessible with `User.Read.All`. The Azure AD app registration must have delegated `User.Read.All` added and admin-consented before these tools work.
### Example: Resolve Users and Look Up Their Managers
```yaml theme={null}
- id: get_users
name: get_users
tool: MICROSOFT_GET_USERS
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_USERS.access_token}}"
input:
- name: identifiers
value:
- "alice@example.com"
- "bob@example.com"
- id: get_managers
name: get_managers
tool: MICROSOFT_GET_MANAGER
needs: ["get_users"]
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_USERS.access_token}}"
input:
- name: identifiers
value: "{{steps.get_users.result.users[*].userPrincipalName}}"
```
## Input
### `identifiers`
A list of email addresses or User Principal Names (UPNs) to look up. Accepts:
* An array: `["alice@example.com", "bob@example.com"]`
* A comma-separated string: `"alice@example.com, bob@example.com"`
* A JSON array string: `"[\"alice@example.com\", \"bob@example.com\"]"`
## Output
### `MICROSOFT_GET_USERS`
| Field | Description |
| - | - |
| `result.users[].id` | Azure AD object ID |
| `result.users[].displayName` | Display name |
| `result.users[].mail` | Primary email address |
| `result.users[].userPrincipalName` | User Principal Name (UPN) |
| `result.users[].jobTitle` | Job title |
| `result.users[].department` | Department |
| `result.users[].companyName` | Company name |
| `result.users[].officeLocation` | Office location |
| `result.notFound[]` | Identifiers that could not be resolved |
### `MICROSOFT_GET_MANAGER`
| Field | Description |
| - | - |
| `result.managers[].user` | The input identifier for this entry |
| `result.managers[].manager` | Manager's profile (same fields as a user), or `null` if none |
| `result.notFound[]` | Identifiers that could not be resolved |
# Notion
Source: https://carnot.mintlify.app/en/pages/tools/productivity/notion
Automate a Notion Workspace
## Overview
The Notion tools allow you to automate various tasks related to Notion workspaces, including creating and managing pages, databases, and blocks. You can also extract information from Notion pages and databases.
## Key Features
* `NOTION_SEARCH`
* Search pages and data sources shared with the connection by title, with optional result type filtering, last-edited sorting, and pagination.
* `NOTION_CREATE_PAGE`
* Create a new page in a specified Notion workspace.
* `NOTION_CREATE_DATABASE_ITEM`
* Create a new item in a specified Notion database.
* `NOTION_RETRIEVE_A_PAGE`
* Retrieve a page from a specified Notion workspace.
* `NOTION_RETRIEVE_DATABASE`
* Retrieve a database from a specified Notion workspace.
* `NOTION_QUERY_DATA_SOURCE`
* Query a data source or legacy database with filters and sorts.
* `NOTION_LIST_BLOCK_CHILDREN`
* Retrieve page or block children, with optional recursive traversal.
* `NOTION_APPEND_BLOCK_CHILDREN`
* Append Notion block JSON to a page or block.
* `NOTION_DUPLICATE_PAGE`
* Create a new page by copying writable page properties and recursively recreating supported child blocks (paragraphs, headings, lists, quotes, to-dos, toggles, callouts, synced blocks, equations, code, tables, columns, child pages, linked database views, and more). Unsupported content — such as Notion-hosted media reupload, link previews, buttons/forms, and full standalone database duplication — is skipped and reported in `skipped_blocks`. People, relation, and multi-select properties with more than 100 values are not copied (the Notion API allows at most 100 values per request) and are reported in `skipped_properties`.
* `NOTION_UPDATE_PAGE_PROPERTIES`
* Update page properties, icon, cover, trash status, or lock state.
* `NOTION_APPEND_IMAGE_BLOCK`
* Append an image block with an external URL or the File Upload API.
## Authentication
Every Notion tool has an **Authentication method** selector. Choose the method first, then select its matching secret field:
* **API token** → **Token** (`NOTION_API`): paste an internal integration token, or a personal access token (PAT) issued by each user. A PAT needs no page sharing and accesses everything its creator can see; combined with personal secrets, each runner executes with their own token
* **OAuth** → **OAuth token** (`NOTION_OAUTH`): connect by logging in to Notion in the browser. Access is limited to the pages picked on the consent screen (requires an organization-registered Notion OAuth app)
Existing flows that omit `auth_type` continue to use the API token method.
See [Notion Credentials](/en/pages/credentials/notion) for setup steps and how to choose between them.
**Note**: Treat tokens as sensitive information and never commit them to public repositories.
### Example: Create and Retrieve Pages and Databases
```yaml theme={null}
- id: retrieve_page
tool: NOTION_RETRIEVE_A_PAGE
config:
- name: token
value: "{{secrets.NOTION_TOKEN}}"
input:
- name: page_id
value: 15cf9fcee23b81e193f7cb5774043b82
- id: retrieve_database
tool: NOTION_RETRIEVE_DATABASE
config:
- name: token
value: "{{secrets.NOTION_TOKEN}}"
input:
- name: database_id
value: 16ff9fcee23b80d38b47d754dcaffe16
- id: create_page
tool: NOTION_CREATE_PAGE
config:
- name: token
value: "{{secrets.NOTION_TOKEN}}"
input:
- name: parent_page_id
value: 196bf44b5f624485a29f415bf4afac47
- name: title
value: Test Page
- name: content
value: This is a test page
- id: create_database_item
tool: NOTION_CREATE_DATABASE_ITEM
config:
- name: token
value: "{{secrets.NOTION_TOKEN}}"
input:
- name: database_id
value: 16ff9fcee23b80d38b47d754dcaffe16
- name: title
value: Test Page
- name: content
value: This is a test page
- id: search_notion
tool: NOTION_SEARCH
config:
- name: token
value: "{{secrets.NOTION_TOKEN}}"
input:
- name: query
value: Meeting Notes
- name: object_type
value: page
- name: sort_direction
value: descending
- id: query_data_source
tool: NOTION_QUERY_DATA_SOURCE
config:
- name: token
value: "{{secrets.NOTION_TOKEN}}"
input:
- name: data_source_id
value: 1a44be1209534631b4989e5817518db8
- name: filter_json
value: '{"property":"Done","checkbox":{"equals":true}}'
- name: sorts_json
value: '[{"property":"Date","direction":"descending"}]'
- id: duplicate_page
tool: NOTION_DUPLICATE_PAGE
config:
- name: token
value: "{{secrets.NOTION_TOKEN}}"
input:
- name: source_page_id
value: 15cf9fcee23b81e193f7cb5774043b82
- name: new_title
value: Next Meeting
- name: properties_json
value: '{"Date":{"date":{"start":"2026-06-06"}}}'
- id: append_image
tool: NOTION_APPEND_IMAGE_BLOCK
config:
- name: token
value: "{{secrets.NOTION_TOKEN}}"
input:
- name: block_id
value: 15cf9fcee23b81e193f7cb5774043b82
- name: image
value: https://example.com/graphic-recording.png
- name: caption
value: Graphic recording
```
# Outlook Calendar
Source: https://carnot.mintlify.app/en/pages/tools/productivity/outlook_calendar
Automate Outlook Calendar tasks
## Overview
The Outlook Calendar tools allow you to automate Outlook Calendar tasks such as finding events, checking attendee and room availability, suggesting meeting times, listing rooms, creating events, updating events, and deleting events using Microsoft Graph API.
## Key Features
* `OUTLOOK_CALENDAR_FIND_EVENT`
* Find events in Outlook Calendar within a given time range or by search query.
* `OUTLOOK_CALENDAR_GET_SCHEDULE`
* Get free/busy availability for users, distribution lists, rooms, or equipment.
* `OUTLOOK_CALENDAR_FIND_MEETING_TIMES`
* Suggest candidate meeting times and locations from attendee and room availability.
* `OUTLOOK_CALENDAR_FIND_ROOMS`
* List Outlook room resources, optionally within a room list.
* `OUTLOOK_CALENDAR_GET_ROOM_SCHEDULE`
* Get free/busy availability for room resources.
* `OUTLOOK_CALENDAR_CREATE_EVENT`
* Create a new event, including attendees, room resources, locations, and recurrence.
* `OUTLOOK_CALENDAR_UPDATE_EVENT`
* Update an existing event with new details.
* `OUTLOOK_CALENDAR_DELETE_EVENT`
* Delete an event from Outlook Calendar.
## Authentication
To use the Outlook Calendar API, you need to navigate to the [Jinba secrets dashboard](https://flow.jinba.io/workspace/secrets) and authenticate with your Microsoft account. This will create a new OAuth token for you.
Meeting scheduling and room tools require the latest Outlook Calendar OAuth scopes. If your credential was created before these tools were added, reconnect the Outlook Calendar credential from the secrets dashboard.
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
For further details, [click here](/en/pages/credentials/microsoft-oauth).
### Example: Create, Update, Find, and Delete Events
```yaml theme={null}
- id: find_before
tool: OUTLOOK_CALENDAR_FIND_EVENT
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_OUTLOOK_CALENDAR}}"
input:
- name: timezone
value: "+09:00"
- name: time_min
value: 2025-01-01T00:00:00Z
- name: time_max
value: 2025-01-31T23:59:59Z
- name: query
value: Test Event
- id: find_rooms
tool: OUTLOOK_CALENDAR_FIND_ROOMS
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_OUTLOOK_CALENDAR}}"
input:
- name: query
value: Tokyo
- name: top
value: 20
- id: get_schedule
tool: OUTLOOK_CALENDAR_GET_SCHEDULE
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_OUTLOOK_CALENDAR}}"
input:
- name: schedules
value: "user1@example.com, room1@example.com"
- name: timezone
value: "+09:00"
- name: start
value: 2025-01-15T09:00:00
- name: end
value: 2025-01-15T18:00:00
- id: find_meeting_times
tool: OUTLOOK_CALENDAR_FIND_MEETING_TIMES
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_OUTLOOK_CALENDAR}}"
input:
- name: attendees
value: "user1@example.com, user2@example.com"
- name: room_emails
value: "room1@example.com"
- name: timezone
value: "+09:00"
- name: time_min
value: 2025-01-15T09:00:00
- name: time_max
value: 2025-01-15T18:00:00
- name: meeting_duration_minutes
value: 60
- id: create_event
tool: OUTLOOK_CALENDAR_CREATE_EVENT
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_OUTLOOK_CALENDAR}}"
input:
- name: summary
value: Test Event
- name: description
value: This is a test event
- name: timezone
value: "+09:00"
- name: start
value: 2025-01-15T14:00:00
- name: end
value: 2025-01-15T15:00:00
- name: attendees
value: "user1@example.com, user2@example.com"
- name: room_emails
value: "room1@example.com"
- name: location
value: Room 1
- name: content_type
value: HTML
- id: update_event
tool: OUTLOOK_CALENDAR_UPDATE_EVENT
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_OUTLOOK_CALENDAR}}"
input:
- name: event_id
value: "{{steps.create_event.result.event.id}}"
- name: summary
value: Test Event (Updated)
- name: description
value: This event has been updated
- name: timezone
value: "+09:00"
- name: start
value: 2025-01-15T15:00:00
- name: end
value: 2025-01-15T16:00:00
- name: content_type
value: HTML
- id: find_after_update
tool: OUTLOOK_CALENDAR_FIND_EVENT
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_OUTLOOK_CALENDAR}}"
input:
- name: timezone
value: "+09:00"
- name: time_min
value: 2025-01-01T00:00:00Z
- name: time_max
value: 2025-01-31T23:59:59Z
- name: query
value: "Test Event (Updated)"
- id: delete_event
tool: OUTLOOK_CALENDAR_DELETE_EVENT
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_OUTLOOK_CALENDAR}}"
input:
- name: event_id
value: "{{steps.create_event.result.event.id}}"
```
## Tool Details
### OUTLOOK\_CALENDAR\_FIND\_EVENT
Searches for events in Outlook Calendar within a specified date range or by search query.
**Input Parameters:**
* `query` - Search query (partial match on event subject)
* `timezone` - Timezone for naive datetimes (required, e.g., "Z", "UTC", "+09:00")
* `time_min` - Start time in RFC3339 format
* `time_max` - End time in RFC3339 format
* `top` - Maximum number of events to return (1-50, default: 10)
**Output:**
* `events` - Array of matching events with id, subject, start, end, organizer, location, and webLink
### OUTLOOK\_CALENDAR\_GET\_SCHEDULE
Gets free/busy availability for users, distribution lists, rooms, or equipment.
**Input Parameters:**
* `schedules` - Email addresses to check (required; array, comma-separated, or JSON array string)
* `timezone` - Timezone for naive datetimes (required, e.g., "Z", "UTC", "+09:00")
* `start` - Availability window start time (required)
* `end` - Availability window end time (required)
* `availability_view_interval` - Slot size in minutes (5-1440, default: 30)
**Output:**
* `schedules` - Free/busy results with availability view and schedule items
### OUTLOOK\_CALENDAR\_FIND\_MEETING\_TIMES
Suggests candidate meeting times and locations from attendee and room availability.
**Input Parameters:**
* `attendees` - Required attendee email addresses (optional)
* `room_emails` - Room resource email addresses (optional)
* `location_names` - Location display names (optional)
* `timezone` - Timezone for naive datetimes (required, e.g., "Z", "UTC", "+09:00")
* `time_min` - Earliest candidate start time (required)
* `time_max` - Latest candidate end time (required)
* `meeting_duration_minutes` - Meeting duration in minutes (default: 30)
* `max_candidates` - Maximum suggestions to return (default: 10)
* `minimum_attendee_percentage` - Minimum confidence percentage (optional)
* `activity_domain` - `work`, `personal`, or `unrestricted` (default: `work`)
* `suggest_location` - Whether Graph should suggest locations (default: false)
**Output:**
* `suggestions` - Candidate meeting times with confidence, reason, locations, and attendee availability
* `emptySuggestionsReason` - Reason no suggestions were returned, if applicable
### OUTLOOK\_CALENDAR\_FIND\_ROOMS
Lists Outlook room resources using Microsoft Graph Places API.
**Input Parameters:**
* `room_list_email` - Room list email address to narrow the search (optional)
* `query` - Case-insensitive local filter for name, email, building, or floor (optional)
* `top` - Maximum rooms to return (1-500, default: 100)
**Output:**
* `rooms` - Matching room resources with display name, email, capacity, building, and device metadata
### OUTLOOK\_CALENDAR\_GET\_ROOM\_SCHEDULE
Gets free/busy availability for room resources.
**Input Parameters:**
* `room_emails` - Room resource email addresses (required; array, comma-separated, or JSON array string)
* `timezone` - Timezone for naive datetimes (required, e.g., "Z", "UTC", "+09:00")
* `start` - Availability window start time (required)
* `end` - Availability window end time (required)
* `availability_view_interval` - Slot size in minutes (5-1440, default: 30)
**Output:**
* `schedules` - Free/busy results for the requested rooms
### OUTLOOK\_CALENDAR\_CREATE\_EVENT
Creates a new event in Outlook Calendar.
**Input Parameters:**
* `summary` - Event title (required)
* `description` - Event description (optional)
* `timezone` - Timezone for naive datetimes (required, e.g., "Z", "UTC", "+09:00")
* `start` - Event start time in RFC3339 format (required)
* `end` - Event end time in RFC3339 format (required)
* `attendees` - Required attendee email addresses (optional)
* `optional_attendees` - Optional attendee email addresses (optional)
* `resource_attendees` - Resource attendee email addresses such as equipment (optional)
* `room_emails` - Room resource email addresses to reserve (optional)
* `location` - Meeting location display name (optional)
* `recurrence` - Microsoft Graph patternedRecurrence object or JSON string (optional)
* `response_requested` - Whether responses are requested from attendees (default: true)
* `allow_new_time_proposals` - Whether attendees can propose a new time (default: true)
* `content_type` - Description content type: "HTML" or "Text" (default: "HTML")
**Output:**
* `event` - Created event with id and webLink
### OUTLOOK\_CALENDAR\_UPDATE\_EVENT
Updates an existing event in Outlook Calendar.
**Input Parameters:**
* `event_id` - Event ID to update (required)
* `summary` - New event title (optional)
* `description` - New event description (optional)
* `timezone` - Timezone for naive datetimes (required, e.g., "Z", "UTC", "+09:00")
* `start` - New event start time in RFC3339 format (optional, requires end)
* `end` - New event end time in RFC3339 format (optional, requires start)
* `attendees` - New attendee list (optional, replaces existing)
* `content_type` - Description content type: "HTML" or "Text"
**Output:**
* `event` - Updated event with id and webLink
### OUTLOOK\_CALENDAR\_DELETE\_EVENT
Deletes an event from Outlook Calendar.
**Input Parameters:**
* `event_id` - Event ID to delete (required)
**Output:**
* `status` - HTTP status code of the deletion request
# SharePoint
Source: https://carnot.mintlify.app/en/pages/tools/productivity/sharepoint
Manage SharePoint sites and OneDrive files via Microsoft Graph
## Overview
SharePoint tools let you list sites, inspect site metadata, browse document libraries, search files, upload files, and download files through Microsoft Graph. They support both SharePoint site drives and the user's OneDrive.
## Key Features
* `SHAREPOINT_LIST_SITES`
* Search and list SharePoint sites.
* `SHAREPOINT_GET_SITE_INFORMATION`
* Get site metadata (id, name, URL) from a SharePoint site URL.
* `SHAREPOINT_LIST_DOCUMENTS`
* List files and folders from SharePoint document libraries or OneDrive.
* `SHAREPOINT_SEARCH_FILES`
* Search files and folders in a SharePoint document library or OneDrive by file name or keyword, with an optional files/folders filter.
* `SHAREPOINT_UPLOAD_FILE_V2`
* Upload a file to SharePoint or OneDrive (up to 30 MB). Accepts output files from previous steps, base64 strings, data URLs, or any HTTP(S) URL; files larger than 4 MB are uploaded automatically via chunked upload sessions. Supersedes `SHAREPOINT_UPLOAD_FILE` — prefer this tool for new flows.
* `SHAREPOINT_UPLOAD_FILE`
* Upload files to SharePoint or OneDrive (simple upload, up to 4MB). Kept for existing flows; use `SHAREPOINT_UPLOAD_FILE_V2` instead.
* `SHAREPOINT_DOWNLOAD_FILE`
* Download a file from SharePoint or OneDrive. Returns a pre-authenticated download URL or base64-encoded content (max 4 MB).
## Authentication
These tools require a Microsoft Graph OAuth token.
Go to the [Jinba secrets dashboard](https://flow.jinba.io/workspace/secrets) and connect a Microsoft account for SharePoint/OneDrive. Use the generated token in the tool config.
### Example: List Sites and Upload a File
```yaml theme={null}
- id: list_sites
name: list_sites
tool: SHAREPOINT_LIST_SITES
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_SHAREPOINT.access_token}}"
input:
- name: search
value: "engineering"
- id: get_site
name: get_site
tool: SHAREPOINT_GET_SITE_INFORMATION
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_SHAREPOINT.access_token}}"
input:
- name: site_url
value: "https://contoso.sharepoint.com/sites/Engineering"
- id: list_documents
name: list_documents
tool: SHAREPOINT_LIST_DOCUMENTS
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_SHAREPOINT.access_token}}"
input:
# If you omit drive_id, the tool lists the user's OneDrive (me/drive)
# For SharePoint document libraries, set drive_id to the library's drive ID.
- name: top
value: 10
- id: list_sharepoint_documents
name: list_sharepoint_documents
tool: SHAREPOINT_LIST_DOCUMENTS
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_SHAREPOINT.access_token}}"
input:
- name: drive_id
value: "YOUR_SHAREPOINT_DRIVE_ID"
- name: top
value: 10
- id: search_files
name: search_files
tool: SHAREPOINT_SEARCH_FILES
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_SHAREPOINT.access_token}}"
input:
# Omit drive_id to search the user's OneDrive (me/drive)
- name: query
value: "quarterly report"
- name: top
value: 25
# "all" (default), "files", or "folders"
- name: filter
value: "files"
- id: upload_file
name: upload_file
tool: SHAREPOINT_UPLOAD_FILE_V2
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_SHAREPOINT.access_token}}"
input:
# Omit drive_id to upload to OneDrive (me/drive)
# file accepts a previous step's output file, base64, a data URL, or an HTTP(S) URL
- name: file
value: "{{steps.generate_report.result}}"
- name: filename
value: "report.pdf"
- name: conflict_behavior
value: "rename"
- id: download_file
name: download_file
tool: SHAREPOINT_DOWNLOAD_FILE
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_SHAREPOINT.access_token}}"
input:
# item_id is retrieved from SHAREPOINT_LIST_DOCUMENTS results
- name: item_id
value: "{{steps.list_documents.result.items[0].id}}"
# "url" (default) returns a pre-authenticated download URL
# "base64" returns file content as base64 (max 4 MB)
- name: output_format
value: "url"
```
# SmartHR
Source: https://carnot.mintlify.app/en/pages/tools/productivity/smarthr
List, create, update, delete, and invite employees (crews) in SmartHR
## Overview
SmartHR tools let you manage employees (crews) in SmartHR: list with pagination, get details, create, update, delete, invite, and remove department assignments.
## Key Features
* `SMARTHR_LIST_CREWS`
* Retrieve a list of employees (crews) with optional pagination and employment status filter.
* `SMARTHR_GET_CREW`
* Get detailed information for a specific employee by ID.
* `SMARTHR_CREATE_CREW`
* Create a new employee with name, email, gender, and employment details.
* `SMARTHR_UPDATE_CREW`
* Update an existing employee; only specified fields are updated.
* `SMARTHR_DELETE_CREW`
* Delete an employee by ID (some employees may not be deletable depending on status).
* `SMARTHR_INVITE_CREW`
* Send an invitation to an employee; requires the inviter's user ID.
* `SMARTHR_DELETE_CREW_DEPARTMENTS`
* Remove all department assignments from an employee.
## Authentication
For setup details, see [SmartHR Credentials](/en/pages/credentials/smarthr).
Each tool requires a **subdomain** (your SmartHR instance URL) and an **access token**. Store the access token as a SmartHR credential in workspace secrets and reference it in the tool config together with the subdomain.
**Note**: Keep API credentials secure and do not commit them to public repositories.
### Example: List Crews and Get One Employee
```yaml theme={null}
- id: list_crews
tool: SMARTHR_LIST_CREWS
config:
- name: subdomain
value: "https://example.daruma.space"
- name: access_token
value: "{{secrets.SMARTHR_ACCESS_TOKEN.access_token}}"
input:
- name: page
value: 1
- name: per_page
value: 10
- id: get_crew
tool: SMARTHR_GET_CREW
needs: ["list_crews"]
config:
- name: subdomain
value: "https://example.daruma.space"
- name: access_token
value: "{{secrets.SMARTHR_ACCESS_TOKEN.access_token}}"
input:
- name: id
value: "{{steps.list_crews.result.result[0].id}}"
```
# Microsoft Teams
Source: https://carnot.mintlify.app/en/pages/tools/productivity/teams
Manage Microsoft Teams channels and messages via Microsoft Graph
## Overview
Microsoft Teams tools let you list teams, channels, chats, channel messages, and chat messages, search messages, look up online meetings, add members to teams, private or shared channels, and group chats, send messages to channels or chats (DMs), reply to channel threads, create channels, and create one-on-one or group chats through Microsoft Graph.
## Key Features
* `TEAMS_LIST_TEAMS`
* Get a list of teams the user has joined.
* `TEAMS_LIST_CHANNELS`
* Get a list of channels in a team.
* `TEAMS_LIST_CHANNEL_MESSAGES`
* Get messages posted in a channel, optionally including thread replies.
* `TEAMS_LIST_CHATS`
* Get a list of chats the signed-in user participates in.
* `TEAMS_LIST_CHAT_MESSAGES`
* Get messages posted in a one-on-one or group chat.
* `TEAMS_SEARCH_MESSAGES`
* Search Teams chat messages with Microsoft Graph Search, with optional date-range bounds and pagination.
* `TEAMS_LIST_ONLINE_MEETINGS`
* List Teams online meetings by join URL or video teleconference ID, or scan a calendar window for Teams meetings.
* `TEAMS_GET_ONLINE_MEETING`
* Get a Teams online meeting by Graph meeting ID, join URL, or video teleconference ID.
* `TEAMS_ADD_CHANNEL_MEMBER`
* Add a user to a private or shared channel as a member or owner.
* `TEAMS_ADD_TEAM_MEMBER`
* Add a user to a team as a member or owner. Use this for standard (public) channels, which inherit team membership.
* `TEAMS_ADD_CHAT_MEMBER`
* Add a user to an existing group chat, optionally sharing prior history.
* `TEAMS_SEND_MESSAGE`
* Send messages to Teams channels (plain text or HTML format).
* `TEAMS_REPLY_TO_MESSAGE`
* Reply to a Teams channel message thread.
* `TEAMS_CREATE_CHANNEL`
* Create new channels within a team (public or private).
* `TEAMS_CREATE_CHAT`
* Create a new 1-on-1 or group chat. The signed-in user is added automatically.
* `TEAMS_SEND_CHAT_MESSAGE`
* Send a message to a Teams chat (DM). Supports plain text and HTML.
## Authentication
These tools require a Microsoft Graph OAuth token.
Go to the [Jinba secrets dashboard](https://flow.jinba.io/workspace/secrets) and connect a Microsoft account for Teams. Use the generated token in the tool config.
The Teams OAuth connection requests Microsoft Graph scopes for channel messages, chat messages, channels, channel membership, team membership, chat membership, teams, sending messages, and token refresh. Existing Teams secrets created before these scopes were added must be reconnected. Adding team members (`TeamMember.ReadWrite.All`) or chat members (`ChatMember.ReadWrite`) may require tenant admin consent.
### Example: List Teams, Create a Private Channel, Add a Member, and Send Message
```yaml theme={null}
- id: list_teams
name: list_teams
tool: TEAMS_LIST_TEAMS
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_TEAMS.access_token}}"
input: []
- id: list_channels
name: list_channels
tool: TEAMS_LIST_CHANNELS
needs: ["list_teams"]
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_TEAMS.access_token}}"
input:
- name: team_id
value: "{{steps.list_teams.result.teams[0].id}}"
- id: list_channel_messages
name: list_channel_messages
tool: TEAMS_LIST_CHANNEL_MESSAGES
needs: ["list_teams", "list_channels"]
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_TEAMS.access_token}}"
input:
- name: team_id
value: "{{steps.list_teams.result.teams[0].id}}"
- name: channel_id
value: "{{steps.list_channels.result.channels[0].id}}"
- name: include_replies
value: true
- id: list_chats
name: list_chats
tool: TEAMS_LIST_CHATS
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_TEAMS.access_token}}"
input: []
- id: list_chat_messages
name: list_chat_messages
tool: TEAMS_LIST_CHAT_MESSAGES
needs: ["list_chats"]
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_TEAMS.access_token}}"
input:
- name: chat_id
value: "{{steps.list_chats.result.chats[0].id}}"
- id: create_channel
name: create_channel
tool: TEAMS_CREATE_CHANNEL
needs: ["list_teams"]
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_TEAMS.access_token}}"
input:
- name: team_id
value: "{{steps.list_teams.result.teams[0].id}}"
- name: channel_name
value: "project-alpha-2025"
- name: description
value: "Project Alpha for FY2025"
- name: is_private
value: true
- id: add_channel_member
name: add_channel_member
tool: TEAMS_ADD_CHANNEL_MEMBER
needs: ["create_channel"]
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_TEAMS.access_token}}"
input:
- name: team_id
value: "{{steps.list_teams.result.teams[0].id}}"
- name: channel_id
value: "{{steps.create_channel.result.channel_id}}"
- name: user_id
value: "alice@example.com"
- name: role
value: "member"
- id: send_message
name: send_message
tool: TEAMS_SEND_MESSAGE
needs: ["add_channel_member"]
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_TEAMS.access_token}}"
input:
- name: team_id
value: "{{steps.list_teams.result.teams[0].id}}"
- name: channel_id
value: "{{steps.create_channel.result.channel_id}}"
- name: message
value: "Daily Report: Completed 15 tasks, 8 in progress"
- name: message_type
value: "text"
```
### Example: Create a 1-on-1 Chat and Send a DM
```yaml theme={null}
- id: create_chat
name: create_chat
tool: TEAMS_CREATE_CHAT
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_TEAMS.access_token}}"
input:
- name: chat_type
value: "oneOnOne"
- name: member_ids
value: "bob@example.com"
- id: send_chat_message
name: send_chat_message
tool: TEAMS_SEND_CHAT_MESSAGE
needs: ["create_chat"]
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_TEAMS.access_token}}"
input:
- name: chat_id
value: "{{steps.create_chat.result.chat_id}}"
- name: message
value: "Hello! I wanted to reach out directly."
- name: message_type
value: "text"
```
### Example: Search Messages and Look Up an Online Meeting
```yaml theme={null}
- id: search_messages
name: search_messages
tool: TEAMS_SEARCH_MESSAGES
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_TEAMS.access_token}}"
input:
- name: query
value: "project alpha status"
- name: from
value: "2026-07-01T00:00:00+09:00"
- name: to
value: "2026-07-14T00:00:00+09:00"
- name: size
value: 25
- id: list_online_meetings
name: list_online_meetings
tool: TEAMS_LIST_ONLINE_MEETINGS
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_TEAMS.access_token}}"
input:
# With start_datetime/end_datetime, scans the calendar window for Teams meetings
- name: start_datetime
value: "2026-07-14T00:00:00+09:00"
- name: end_datetime
value: "2026-07-21T00:00:00+09:00"
- name: top
value: 25
- id: get_online_meeting
name: get_online_meeting
tool: TEAMS_GET_ONLINE_MEETING
config:
- name: token
value: "{{secrets.MICROSOFT_GRAPH_TEAMS.access_token}}"
input:
# Specify one of meeting_id, join_web_url, or video_teleconference_id
- name: join_web_url
value: "https://teams.microsoft.com/l/meetup-join/..."
```
# Zoom
Source: https://carnot.mintlify.app/en/pages/tools/productivity/zoom
Manage Zoom meetings, reports, and cloud recordings
## Overview
The Zoom tools let you automate Zoom from your flows: create and update meetings (including recurring series), list a user's meetings, retrieve meeting reports and participant lists after a meeting ends, and work with cloud recordings. Tools authenticate either with account-level Server-to-Server OAuth credentials or with a connected Zoom user account (user-level OAuth).
## Key Features
* `ZOOM_CREATE_MEETING`
* Create instant, scheduled, or recurring meetings for a host (`user_id`: Zoom user ID or email).
* Key inputs: `topic` (required), `type` (1: instant, 2: scheduled — default, 3: recurring without fixed time, 8: recurring with fixed time), `start_time` (ISO 8601), `duration` (minutes), `timezone`, `agenda`, `password` (max 10 characters), `recurrence` (required when `type` is 8; JSON string or object), `settings` (JSON string or object).
* `ZOOM_LIST_MEETINGS`
* List meetings for a user (`user_id`; use `me` for the admin account).
* Key inputs: `type` (`scheduled` — default, `upcoming`, `live`, `upcoming_meetings`, `previous_meetings`), `page_size` (1-300), `next_page_token`, `from` / `to` (YYYY-MM-DD, for past meetings).
* `ZOOM_UPDATE_MEETING`
* Update an existing meeting by `meeting_id` (ID or UUID). At least one field must be provided.
* Key inputs: `topic`, `type`, `start_time`, `duration`, `timezone`, `agenda`, `password`, `recurrence`, `settings` (e.g. alternative hosts), and `occurrence_id` for a single occurrence of a recurring meeting.
* `ZOOM_LIST_MEETING_PARTICIPANTS`
* List participants of a past meeting by `meeting_id`.
* Key inputs: `page_size` (1-300, default 100), `next_page_token`, `dedupe` (default `true` — collapses duplicate entries by user ID, email, or name).
* `ZOOM_GET_MEETING_REPORT`
* Two modes: pass `meeting_id` for a detailed report of one meeting, or omit it to list report summaries for a user and date range.
* Key inputs (list mode): `user_id` (default `me`), `from` / `to` (YYYY-MM-DD), `type` (`past` — default, `pastJoined`, `pastOne`, `live`), `page_size` (1-30), `next_page_token`.
* `ZOOM_LIST_CLOUD_RECORDINGS`
* List cloud recordings for a user, with optional date range and trash filters.
* Key inputs: `user_id` (default `me`), `from` / `to` (YYYY-MM-DD), `page_size` (1-300, default 30), `next_page_token`, `trash`, `trash_type` (`meeting_recordings` or `recording_file`).
* `ZOOM_GET_CLOUD_RECORDING`
* Get cloud recording details for a meeting by `meeting_id`, including `recording_files`, `share_url`, and `password`.
* Key inputs: `include_fields` (optional comma-separated value).
* `ZOOM_UPDATE_RECORDING_SETTINGS`
* Update sharing and viewing settings of a cloud recording by `meeting_id`. At least one setting must be provided.
* Key inputs: `share_recording` (`none`, `internally`, `publicly`), `viewer_download`, `password`, `on_demand`, `approval_type`, and a `settings` JSON object for advanced Zoom fields.
## Authentication
Every Zoom tool supports two authentication methods, selected with the `auth_type` config field:
### Server-to-Server OAuth (`auth_type: server_to_server`, default)
Create a Server-to-Server OAuth app in the [Zoom App Marketplace](https://marketplace.zoom.us/) and register the following values as a `ZOOM_SERVER_TO_SERVER_OAUTH` secret:
* **Account ID**: Your Zoom account ID.
* **Client ID**: The OAuth client ID of the app.
* **Client Secret**: The OAuth client secret of the app.
Access tokens are issued automatically with the `account_credentials` grant, so no user login or token refresh handling is required on your side. These are account-level admin credentials: they can act on **any** user in the Zoom account.
### Connected Zoom account (`auth_type: oauth`)
Connect a Zoom account from the secrets screen and reference its `ZOOM_OAUTH` secret in the `token` config field. The tools then act **as that user** with Zoom's granular user-level scopes — they can only reach meetings and recordings the connected user owns, which is the recommended method when flows should not have account-wide admin access.
Connecting Zoom requires an organization-registered Zoom OAuth app (Organization settings → OAuth apps, organization OWNER only): register your own Zoom OAuth app's client ID/secret and set the per-organization callback URL shown there in the Zoom app's redirect allow list. Tokens are refreshed automatically before flow runs.
With a connected account, use `me` as the `user_id` (the tools operate on the connected user), and note that `ZOOM_GET_MEETING_REPORT` only supports single-meeting details (`meeting_id` mode, served from the past-meetings API); the date-range report listing is admin-only in Zoom's API and needs Server-to-Server credentials.
**Note**: Treat credentials as sensitive information and never commit them to public repositories.
### Example: Create a Scheduled Meeting
```yaml theme={null}
- id: create_meeting
tool: ZOOM_CREATE_MEETING
config:
- name: client_id
value: "{{secrets.ZOOM_SERVER_TO_SERVER_OAUTH.client_id}}"
- name: client_secret
value: "{{secrets.ZOOM_SERVER_TO_SERVER_OAUTH.client_secret}}"
- name: account_id
value: "{{secrets.ZOOM_SERVER_TO_SERVER_OAUTH.account_id}}"
input:
- name: user_id
value: host@example.com
- name: topic
value: Weekly Sync
- name: type
value: "2"
- name: start_time
value: 2026-07-20T09:00:00Z
- name: duration
value: "30"
- name: timezone
value: Asia/Tokyo
- name: agenda
value: Review progress and blockers for the week.
```
### Example: Create a Meeting as the Connected User (User OAuth)
```yaml theme={null}
- id: create_meeting
tool: ZOOM_CREATE_MEETING
config:
- name: auth_type
value: oauth
- name: token
value: "{{secrets.ZOOM_OAUTH.access_token}}"
input:
- name: user_id
value: me
- name: topic
value: Weekly Sync
- name: type
value: "2"
- name: start_time
value: 2026-07-20T09:00:00Z
```
### Example: Summarize a Past Meeting (Report + Participants)
```yaml theme={null}
- id: get_report
tool: ZOOM_GET_MEETING_REPORT
config:
- name: client_id
value: "{{secrets.ZOOM_SERVER_TO_SERVER_OAUTH.client_id}}"
- name: client_secret
value: "{{secrets.ZOOM_SERVER_TO_SERVER_OAUTH.client_secret}}"
- name: account_id
value: "{{secrets.ZOOM_SERVER_TO_SERVER_OAUTH.account_id}}"
input:
- name: meeting_id
value: "123456789"
- id: list_participants
tool: ZOOM_LIST_MEETING_PARTICIPANTS
config:
- name: client_id
value: "{{secrets.ZOOM_SERVER_TO_SERVER_OAUTH.client_id}}"
- name: client_secret
value: "{{secrets.ZOOM_SERVER_TO_SERVER_OAUTH.client_secret}}"
- name: account_id
value: "{{secrets.ZOOM_SERVER_TO_SERVER_OAUTH.account_id}}"
input:
- name: meeting_id
value: "123456789"
- name: dedupe
value: true
- id: summarize
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Summarize the following Zoom meeting for the team.
==Meeting Report==
{{steps.get_report.result.report}}
==Participants==
{{steps.list_participants.result.participants}}
==Instructions==
1. Summarize the meeting (topic, duration, attendance)
2. List the participants and their time in the meeting
3. Keep it concise and suitable for a Slack post
```
## Notes
* With Server-to-Server OAuth, the host specified in `user_id` must belong to the same Zoom account as the app, and `me` refers to the admin account. With a connected account (user OAuth), use `me` — the tools act as the connected user and Zoom rejects operations on other users' resources.
* To create a recurring meeting series, set `type` to `8` and supply a `recurrence` object (e.g. `{ "type": 2, "repeat_interval": 1, "weekly_days": "2,4", "end_times": 10 }`); `recurrence` is ignored for other meeting types.
* `recurrence` and `settings` inputs accept either a JSON string or a structured object matching Zoom's API objects.
* `ZOOM_LIST_MEETING_PARTICIPANTS` and `ZOOM_GET_MEETING_REPORT` work on **past** meetings; run them after the meeting has ended.
* List-style tools are paginated: pass the returned `next_page_token` back in to fetch the next page. `page_size` is capped at 300 (30 for the meeting report list mode).
* `ZOOM_UPDATE_MEETING` and `ZOOM_UPDATE_RECORDING_SETTINGS` fail if no field to update is provided.
* Access tokens issued via the `account_credentials` grant expire after 1 hour; the tools cache and refresh them automatically.
# Browser Use (Sandbox)
Source: https://carnot.mintlify.app/en/pages/tools/sandbox/browser_use_sandbox
AI-powered browser automation running in an E2B sandbox
## Overview
The Browser Use Sandbox tool runs the open-source [browser-use](https://browser-use.com) framework inside a secure E2B sandbox. Describe what you want the agent to do in plain language, and it will navigate the web, fill forms, extract data, and more — all powered by OpenAI models.
For Human-in-the-Loop workflows, set `keep_session: true` to pause after the task and receive a `sandbox_id`. Pass that `sandbox_id` back to a subsequent `BROWSER_USE_SANDBOX_RUN_TASK` step to reconnect to the same browser session and continue.
## Configuration
| Field | Description |
| - | - |
| `openai_api_key` | Your OpenAI API key. Leave blank to use Jinba Credit. |
| `timeout` | Execution timeout in milliseconds (default: 600000 = 10 min) |
## Inputs
| Field | Type | Description |
| - | - | - |
| `task` | string | Natural-language description of what to do in the browser |
| `sandbox_id` | string | E2B sandbox ID from a previous run with `keep_session: true`. When provided, reconnects to that session and continues. Use `{{steps..result.sandbox_id}}`. Leave empty to start a new session. |
| `llm_model` | enum | OpenAI model to use (`gpt-4.1` / `gpt-4.1-mini` / `gpt-5.1`) |
| `max_steps` | number | Maximum agent steps (default: 20, maximum: 100). A larger value runs as 100. |
| `capture_screenshot` | boolean | Return a signed URL to the final browser screenshot |
| `keep_session` | boolean | Keep the browser session alive after the task completes. Only used when starting a new session (no `sandbox_id`). Returns `sandbox_id` and `current_url` for use in a subsequent step. |
## Credit cost
When `openai_api_key` is blank, the step is billed in Jinba Credit per token, at the rate of the `llm_model` you pick — not a flat fee per step. Supplying your own key bills OpenAI directly and costs no credits.
* **Before the run**, credits are reserved: `max_steps` × the tokens one browser step typically sends (each step re-sends the page DOM and the run history), at that model's rate. The reservation is also the admission check — a balance below it refuses the step before the sandbox starts.
* **After the run**, the reservation is replaced by the token usage the agent actually reported, whether the task succeeded or failed. Only the reservation is capped at `max_steps: 100`; the final charge follows real usage.
* A run that ends without reporting any usage costs a flat 160 credits.
* **A step that runs over a list (`forEach`) is settled per iteration.** Each iteration is billed by the two rules above as if it had run alone: its own reported tokens, or the flat 160 when it reported none. The step's charge is the sum over all iterations. Only the **reservation** is still a single iteration's figure from the table below — so the admission check does not bound the final charge, and a 20-iteration loop can settle at up to 20× what one iteration costs. Budget a `forEach` browser-use step at one iteration's cost × the number of items, not at its reservation.
Reservation, by model and `max_steps`:
| `llm_model` | 9 | 20 (default) | 100 (maximum) |
| - | - | - | - |
| `gpt-4.1-mini` | 160 | 160 | 615 |
| `gpt-4.1` | 277 | 615 | 3,072 |
| `gpt-5.1` | 202 | 448 | 2,240 |
160 credits is the minimum reservation for any run. Raising `max_steps` therefore raises what your balance must cover up front, even for a task that finishes in a few steps.
## Outputs
| Field | Type | Description |
| - | - | - |
| `output` | string | The agent's final answer |
| `is_done` | boolean | Whether the agent completed the task |
| `steps` | array | Per-step `action` / `extracted_content` / `error` |
| `screenshot` | string | Signed URL to the final screenshot |
| `files` | array | Files the agent downloaded. Absent when nothing was downloaded |
| `sandbox_id`, `current_url` | string | Set when `keep_session: true` |
### `files[]`
| Field | Description |
| - | - |
| `filename` | Name the site gave the download |
| `url` | Signed Jinba URL. Pass it to a later step |
| `size` | Size in bytes |
| `content_type` | Guessed MIME type |
| `error` | Why this file has no `url` |
A file is never dropped silently — if it cannot be carried out, the entry comes back with `error` instead of `url`. Reasons: over 10 MB, the run total over 20 MB, more than 20 files, the download was still in progress when the agent stopped, or the extension is outside the accepted set.
Accepted extensions: `csv`, `html`, `json`, `txt`, `xml`, `yaml`, `yml`, `md`, `tsv`, `log`, `sql`, `xls`, `xlsx`, `pdf`, `docx`, `pptx`, `png`, `svg`, `jpg`, `jpeg`, `gif`, `webp`.
## Typing a secret the agent must not see
Write `MY_SECRET` in `task`, where `MY_SECRET` is the name of a **workspace** secret. The agent and the LLM only ever see the placeholder; the real value is restored in the browser action that types it, and the step output records `Typed sensitive data` rather than the value.
```yaml theme={null}
- id: login
tool: BROWSER_USE_SANDBOX_RUN_TASK
input:
- name: task
value: |
Go to https://portal.example.com and sign in with
PORTAL_ID and PORTAL_PASS,
then download the latest CSV.
```
**Do not write `{{secrets.MY_SECRET}}` in `task`.** It is expanded before the step runs, so the value is recorded in the step's input and sent to the LLM. The step fails with a `ConfigurationError` when it detects one — including in flows that worked this way before this behaviour existed.
Only **workspace** and **organization** secrets can be used. Personal (user-scoped) secrets are not visible to this tool.
The secret is scoped to the agent, not to a site: browser-use will type it on whatever page the agent reaches. Keep the task specific about which sites to visit, and prefer a credential whose blast radius you accept.
## Example — Simple task
```yaml theme={null}
- id: browse
tool: BROWSER_USE_SANDBOX_RUN_TASK
input:
- name: task
value: "Go to https://example.com and return the page title and main heading text."
- name: llm_model
value: gpt-4.1-mini
- name: max_steps
value: 10
```
## Example — Human-in-the-Loop form submission
```yaml theme={null}
- id: fill_form
tool: BROWSER_USE_SANDBOX_RUN_TASK
input:
- name: task
value: "Go to https://example.com/contact, fill in the name and email fields, then stop before clicking submit."
- name: llm_model
value: gpt-4.1
- name: keep_session
value: "true"
- id: wait_for_approval
tool: WAIT_FOR_APPROVAL
input:
- name: message
value: "Please review the filled form and approve to submit."
- id: submit_form
tool: BROWSER_USE_SANDBOX_RUN_TASK
input:
- name: sandbox_id
value: "{{steps.fill_form.result.sandbox_id}}"
- name: task
value: "Click the submit button. Reviewer comment: {{steps.wait_for_approval.result.comment}}"
- name: llm_model
value: gpt-4.1
- name: capture_screenshot
value: "true"
```
# MCP Tools
Source: https://carnot.mintlify.app/en/pages/tools/sandbox/mcp_tools
Model Context Protocol integration for local and remote tool execution
## Overview
MCP (Model Context Protocol) Tools enable integration with MCP servers for extended functionality. These tools allow you to connect to both local and remote MCP servers, discover available tools, and execute them with custom inputs using the Python SDK.
## Key Features
### MCP\_LOCAL\_RUN
* Connect to local MCP servers
* Execute tools on your local environment
* Direct Python SDK integration
* Real-time tool discovery and execution
### MCP\_REMOTE\_RUN
* Connect to remote MCP servers via HTTP
* Streamable HTTP connections
* Cloud-based tool execution
* Scalable remote processing
## Authentication
MCP tools may require authentication depending on the server configuration. Check with your MCP server administrator for specific requirements.
## Example: Local MCP Server Integration
```yaml theme={null}
- id: connect_local_mcp
name: connect_local_mcp
tool: MCP_LOCAL_RUN
input:
- name: server_config
value: |
{
"server_path": "/path/to/mcp-server",
"server_args": ["--config", "/path/to/config.json"],
"timeout": 30
}
- name: tool_name
value: "file_reader"
- name: tool_inputs
value: |
{
"file_path": "/home/user/documents/report.txt",
"encoding": "utf-8"
}
- id: process_mcp_result
name: process_mcp_result
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
# Process MCP tool result
mcp_result = json.loads('''{{steps.connect_local_mcp.result.output}}''')
print("MCP Tool Execution Results:")
print("=" * 40)
print(f"Tool: {mcp_result.get('tool_name', 'Unknown')}")
print(f"Status: {mcp_result.get('status', 'Unknown')}")
print(f"Execution Time: {mcp_result.get('execution_time', 'N/A')}ms")
print()
if 'data' in mcp_result:
print("Output Data:")
print(mcp_result['data'])
```
## Example: Remote MCP Service Integration
```yaml theme={null}
- id: discover_remote_tools
name: discover_remote_tools
tool: MCP_REMOTE_RUN
input:
- name: server_url
value: "https://mcp-server.example.com/api"
- name: auth_token
value: "{{secrets.MCP_AUTH_TOKEN}}"
- name: action
value: "list_tools"
- name: tool_inputs
value: "{}"
- id: execute_remote_analysis
name: execute_remote_analysis
tool: MCP_REMOTE_RUN
input:
- name: server_url
value: "https://mcp-server.example.com/api"
- name: auth_token
value: "{{secrets.MCP_AUTH_TOKEN}}"
- name: tool_name
value: "data_analyzer"
- name: tool_inputs
value: |
{
"data_source": "{{steps.input_data.result.file_url}}",
"analysis_type": "statistical_summary",
"output_format": "json",
"include_charts": true
}
- id: save_analysis_results
name: save_analysis_results
tool: OUTPUT_FILE
input:
- name: content
value: "{{steps.execute_remote_analysis.result.output}}"
- name: filename
value: "mcp_analysis_results_{{date | format('YYYY-MM-DD')}}.json"
- name: fileType
value: "json"
```
## Example: Multi-Tool MCP Workflow
```yaml theme={null}
- id: setup_mcp_environment
name: setup_mcp_environment
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
# Define MCP workflow configuration
mcp_workflow = {
"server_config": {
"local_server": "/opt/mcp-tools/server",
"remote_server": "https://api.mcp-cloud.example.com",
"timeout": 60,
"retry_attempts": 3
},
"tools_to_execute": [
{
"name": "document_parser",
"type": "local",
"inputs": {
"document_url": "{{input.document_url}}",
"extract_images": True,
"extract_tables": True
}
},
{
"name": "content_analyzer",
"type": "remote",
"inputs": {
"content_type": "document",
"analysis_depth": "comprehensive"
}
},
{
"name": "report_generator",
"type": "remote",
"inputs": {
"template": "standard_report",
"include_summary": True
}
}
]
}
import json
print(json.dumps(mcp_workflow, indent=2))
- id: parse_document_local
name: parse_document_local
tool: MCP_LOCAL_RUN
input:
- name: server_config
value: |
{
"server_path": "/opt/mcp-tools/server",
"timeout": 60
}
- name: tool_name
value: "document_parser"
- name: tool_inputs
value: |
{
"document_url": "{{input.document_url}}",
"extract_images": true,
"extract_tables": true,
"output_format": "structured_json"
}
- id: analyze_content_remote
name: analyze_content_remote
tool: MCP_REMOTE_RUN
input:
- name: server_url
value: "https://api.mcp-cloud.example.com"
- name: auth_token
value: "{{secrets.MCP_CLOUD_TOKEN}}"
- name: tool_name
value: "content_analyzer"
- name: tool_inputs
value: |
{
"parsed_content": {{steps.parse_document_local.result.output}},
"analysis_type": "comprehensive",
"include_sentiment": true,
"include_entities": true,
"include_summary": true
}
- id: generate_final_report
name: generate_final_report
tool: MCP_REMOTE_RUN
input:
- name: server_url
value: "https://api.mcp-cloud.example.com"
- name: auth_token
value: "{{secrets.MCP_CLOUD_TOKEN}}"
- name: tool_name
value: "report_generator"
- name: tool_inputs
value: |
{
"analysis_results": {{steps.analyze_content_remote.result.output}},
"template": "executive_summary",
"format": "markdown",
"include_charts": true,
"include_recommendations": true
}
- id: save_comprehensive_report
name: save_comprehensive_report
tool: OUTPUT_FILE
input:
- name: content
value: "{{steps.generate_final_report.result.output}}"
- name: filename
value: "comprehensive_analysis_report.md"
- name: fileType
value: "txt"
```
## Example: Custom MCP Tool Development
```yaml theme={null}
- id: deploy_custom_mcp_tool
name: deploy_custom_mcp_tool
tool: MCP_LOCAL_RUN
input:
- name: server_config
value: |
{
"server_path": "/usr/local/bin/custom-mcp-server",
"server_args": ["--plugin-dir", "/home/user/mcp-plugins"],
"environment": {
"MCP_DEBUG": "true",
"MCP_LOG_LEVEL": "info"
}
}
- name: tool_name
value: "custom_data_processor"
- name: tool_inputs
value: |
{
"input_data": {{steps.prepare_data.result.processed_data}},
"processing_rules": {
"remove_duplicates": true,
"normalize_dates": true,
"validate_emails": true,
"standardize_phone_numbers": true
},
"output_options": {
"format": "json",
"include_metadata": true,
"include_statistics": true
}
}
- id: validate_mcp_output
name: validate_mcp_output
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
# Validate MCP tool output
try:
mcp_output = json.loads('''{{steps.deploy_custom_mcp_tool.result.output}}''')
print("MCP Tool Validation Results:")
print("=" * 35)
# Check for required fields
required_fields = ['processed_data', 'metadata', 'statistics']
missing_fields = [field for field in required_fields if field not in mcp_output]
if missing_fields:
print(f"❌ Missing required fields: {', '.join(missing_fields)}")
else:
print("✅ All required fields present")
# Validate data structure
if 'processed_data' in mcp_output:
data_count = len(mcp_output['processed_data'])
print(f"📊 Processed {data_count} records")
if 'statistics' in mcp_output:
stats = mcp_output['statistics']
print(f"📈 Processing Statistics:")
for key, value in stats.items():
print(f" {key}: {value}")
print("✅ MCP tool executed successfully")
except json.JSONDecodeError as e:
print(f"❌ Invalid JSON output from MCP tool: {e}")
except Exception as e:
print(f"❌ Error validating MCP output: {e}")
```
## MCP Server Configuration
### Local Server Setup
```json theme={null}
{
"server_path": "/path/to/mcp-server",
"server_args": ["--config", "/path/to/config.json"],
"environment": {
"MCP_LOG_LEVEL": "info",
"MCP_TIMEOUT": "30"
},
"timeout": 60,
"retry_attempts": 3
}
```
### Remote Server Setup
```json theme={null}
{
"server_url": "https://mcp-server.example.com/api",
"auth_method": "bearer_token",
"auth_token": "your-auth-token",
"timeout": 30,
"stream_response": true
}
```
## Tool Discovery
### List Available Tools
```yaml theme={null}
- id: discover_tools
name: discover_tools
tool: MCP_LOCAL_RUN
input:
- name: action
value: "list_tools"
- name: server_config
value: '{"server_path": "/path/to/mcp-server"}'
```
### Get Tool Schema
```yaml theme={null}
- id: get_tool_info
name: get_tool_info
tool: MCP_REMOTE_RUN
input:
- name: action
value: "describe_tool"
- name: tool_name
value: "data_processor"
- name: server_url
value: "https://mcp-server.example.com/api"
```
## Error Handling
### Common Error Types
* **Connection errors**: Server unreachable or authentication failed
* **Tool not found**: Specified tool doesn't exist on server
* **Input validation**: Invalid inputs for tool execution
* **Timeout errors**: Tool execution exceeded time limit
* **Server errors**: Internal server errors during execution
### Error Response Format
```json theme={null}
{
"error": {
"type": "tool_execution_error",
"message": "Tool execution failed",
"details": {
"tool_name": "data_processor",
"error_code": "INPUT_VALIDATION_FAILED",
"timestamp": "2024-01-15T14:30:00Z"
}
}
}
```
## Use Cases
* **Data Processing**: Advanced data transformation and analysis
* **Document Processing**: Complex document parsing and extraction
* **AI/ML Integration**: Machine learning model execution
* **Custom Workflows**: Domain-specific business logic execution
* **External API Integration**: Wrapper for external services
* **Batch Processing**: Large-scale data processing operations
* **Specialized Tools**: Industry-specific processing tools
* **Research Tools**: Academic and scientific computing tools
## Best Practices
### Performance Optimization
* Use local servers for frequent operations
* Use remote servers for compute-intensive tasks
* Implement proper timeout handling
* Cache tool discovery results
### Security Considerations
* Secure authentication tokens
* Validate all inputs and outputs
* Use HTTPS for remote connections
* Implement proper error handling
### Development Guidelines
* Document custom MCP tools thoroughly
* Implement proper logging and monitoring
* Use consistent input/output schemas
* Test tools thoroughly before deployment
# Python Sandbox
Source: https://carnot.mintlify.app/en/pages/tools/sandbox/python_sandbox_run
Run Python code in a sandboxed environment
## Overview
You can run Python code in a sandboxed environment using the Python Sandbox tool. This tool allows you to execute Python code securely and perform advanced and flexible operations.
## Key Features
* `PYTHON_SANDBOX_RUN`
* This tool allows you to run Python code in a sandboxed environment.
* You can add additional packages or libraries in the configuration.
### Example: Merge Step Results in Python
```yaml theme={null}
- id: input1
name: Input 1
tool: INPUT_TEXT
input:
- name: value
value: "1"
- id: input2
tool: INPUT_TEXT
input:
- name: value
value: "2"
- id: merge
tool: PYTHON_SANDBOX_RUN
needs:
- input1
- input2
input:
- name: code
value: int("{{steps.input1.result}}") + int("{{steps.input2.result}}")
- name: data_type
value: NUMBER
```
## Large tables: `tables`
A step output travels between steps as JSON. A DataFrame with hundreds of
thousands of rows does not survive that: serializing it exhausts the sandbox's
memory before the step can return.
Every Python step is given a `tables` helper for this. `tables.write(df)`
publishes the frame to storage and returns a small marker — a few hundred
bytes naming the stored table — which becomes the step's result. The next step
calls `tables.read(...)` on that marker and gets the DataFrame back. The rows
never become JSON.
```yaml theme={null}
- id: load
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
import pandas as pd
df = pd.read_csv(steps.input.result.url)
json.dumps(tables.write(df))
- name: data_type
value: OBJECT
- id: pivot
tool: PYTHON_SANDBOX_RUN
needs: [load]
input:
- name: code
value: |
import json
df = tables.read(steps.load.result.data)
pv = df.pivot_table(index=["rep_month", "branch_cd"],
columns="product_cd", values="amt_00",
aggfunc="sum")
json.dumps(tables.write(pv, name="pivot"))
- name: data_type
value: OBJECT
```
The marker is a dict, so the step has to return it the way it returns any
other structured result: `json.dumps(...)` as the last expression, with
`data_type: OBJECT`. Without that the step's `data_type` defaults to `STRING`
and the next step receives the dict's Python text, which `tables.read` cannot
open.
**`tables.write(df, name="result", fmt="csv", index=None)`** publishes a frame
and returns its marker.
* `name` — the stored object's name, so one step can publish several tables.
Letters, digits, `.`, `_` and `-` only, with no `..` and no leading or
trailing dot.
* `fmt` — `"csv"` (the default) or `"parquet"`. Parquet needs `pyarrow`, which
is not installed in every sandbox image; `tables.write` says so if it is
missing.
* `index` — whether to write the frame's index as columns. The default, `None`,
writes it when it carries data: the grouping keys of `groupby(...).agg(...)`
or `pivot_table`, a `DatetimeIndex` from `resample`. A plain positional index
is dropped, so a filtered frame does not gain a stray column. Pass `True` or
`False` to decide it yourself.
Columns must be single-level. Flatten a pivot with several `values` first:
`df.columns = ["_".join(str(part) for part in column) for column in
df.columns.to_flat_index()]`.
`df` must be a DataFrame, not a Series. `df.groupby([...])["amt"].sum()` returns
a Series — call `.to_frame()` on it first; its grouping keys are a named index
and are written as columns.
**`tables.read(marker)`** returns the DataFrame. The frame comes back flat:
everything `tables.write` serialized is a column, including levels that were
an index on the way out. `marker["__jinbatable"]["columns"]` lists them, along
with `rows` and `sizeBytes`, so a later step can see the shape without
fetching the table. `rows` is also checked against the frame that actually
parsed: an object cut short mid-upload is refused here rather than handed on
as a quietly shorter table.
**`tables.is_table(value)`** reports whether a value is a marker, for a step
that accepts either a table or inline rows.
**Size limit.** One `tables.write` call is bounded by what the deployment
accepts in a single upload, and that bound belongs to the deployment rather
than to the tool: on the managed service the platform ingress rejects a request
body over **32 MiB**, while a self-hosted deployment may have a different
ceiling, or none, and may instead cut a slow upload on a request timeout.
`tables.write` reports whichever happened — a frame refused for its size, or a
connection closed before any status came back — and names the limit when the
deployment has declared one. Either way: aggregate or filter before writing, or
publish several smaller tables with different `name`s. Reading is not bounded
this way: a table already in storage can be read back whole, subject only to
the sandbox's memory — which for a very large frame is the binding constraint,
because `tables.read` materializes the whole table at once.
Notes:
* A table is readable by later steps of the same flow, including `reused`
steps replaying an earlier run's output. It is not readable from another
flow.
* Inside a `forEach`, each iteration gets its own storage slot, so every
iteration can call `tables.write(df)` with the default name without
overwriting its siblings.
* `tables.read` also accepts a marker arriving as the `item` of a `forEach`.
* Small results need none of this: a step that returns rows still returns rows.
# Arxiv Agent
Source: https://carnot.mintlify.app/en/pages/tools/search/arxiv
Search and retrieve papers from arXiv
## Overview
The Arxiv Agent tool allows you to search and retrieve papers from the arXiv repository. It provides a simple interface to query the database and fetch relevant research papers based on your input.
## Key Features
* `ARXIV_INVOKE_AGENT`
* Search for papers on arXiv using a query string.
* Retrieve metadata and content of the papers.
### Example: Search for Papers
```yaml theme={null}
- id: invoke_arxiv_agent
tool: ARXIV_INVOKE_AGENT
input:
- name: query
value: What's the paper 1605.08386 about?
```
# AWS Bedrock Knowledge Base
Source: https://carnot.mintlify.app/en/pages/tools/search/aws_bedrock_knowledge_base
RAG and document sync with AWS Bedrock Knowledge Bases
## Overview
The AWS Bedrock Knowledge Base tools let you query an existing AWS Bedrock Knowledge Base — either retrieving raw documents or generating a RAG answer — and sync new PDF documents into its S3 data source.
## Key Features
* `AWS_BEDROCK_KNOWLEDGE_BASE`
* Query an AWS Bedrock Knowledge Base with a natural language `query`.
* Two modes (set via the `mode` config): `retrieve` returns raw retrieval results (content, source location, score, metadata), while `retrieveAndGenerate` (default) returns an LLM-generated response with source citations.
* `numberOfResults` controls how many documents are retrieved (1–100, default 5).
* In `retrieve` mode, the output also reports `guardrailAction` (`INTERVENED` or `NONE`) when guardrails are configured.
* `AWS_BEDROCK_KNOWLEDGE_BASE_PDF_SYNC`
* Upload a PDF to the S3 data source of an existing Bedrock Knowledge Base and start an ingestion job.
* `pdf` input accepts a base64 string, a data URL (`data:application/pdf;base64,...`), or a public HTTPS URL.
* Deduplicates by content: the object key is derived from the SHA-256 hash of the PDF, and if the same content already exists in S3, the upload and ingestion are skipped (`skipped: true`).
* Optionally waits for the ingestion job to finish (`waitForIngestion`, default `true`) with a configurable timeout (`ingestionTimeoutSeconds`, 30–1800, default 300) and polling interval (`ingestionPollIntervalSeconds`, 1–60, default 5).
* Output includes the S3 `bucket` and `objectKey`, the `contentHash`, and the `ingestionJobId` / `ingestionStatus`.
## Authentication
Both tools authenticate with AWS access keys, configured per step:
* **accessKeyId**: An `AWS_ACCESS_KEY_ID` value, or the name of the Flow secret that contains it.
* **secretAccessKey**: An `AWS_SECRET_ACCESS_KEY` value, or the name of the Flow secret that contains it.
Each builder should register their own AWS credential secrets. In addition to credentials, the config requires:
* **region**: AWS region of the Bedrock Knowledge Base.
* **knowledgeBaseId**: The Bedrock Knowledge Base ID.
* **dataSourceId** (PDF sync only): The target S3 data source ID of the knowledge base.
* **s3KeyPrefix** (PDF sync only, optional): Additional folder appended after the data source prefix. The uploaded object path becomes `{S3_bucket_name}{dataSourcePrefix}{s3KeyPrefix}/...` — omit any leading `/` and never include the bucket name itself.
**Note**: Treat AWS credentials as sensitive information and never commit them to public repositories.
## Usage Examples
### Example: RAG Answer from a Knowledge Base
```yaml theme={null}
- id: ask_kb
tool: AWS_BEDROCK_KNOWLEDGE_BASE
config:
- name: region
value: us-east-1
- name: knowledgeBaseId
value: "YOUR_KB_ID"
- name: mode
value: retrieveAndGenerate
- name: accessKeyId
value: "{{secrets.AWS_ACCESS_KEY_ID}}"
- name: secretAccessKey
value: "{{secrets.AWS_SECRET_ACCESS_KEY}}"
input:
- name: query
value: "What is our refund policy for annual contracts?"
- name: numberOfResults
value: 5
```
### Example: Sync a PDF and Query It
```yaml theme={null}
- id: sync_pdf
tool: AWS_BEDROCK_KNOWLEDGE_BASE_PDF_SYNC
config:
- name: region
value: us-east-1
- name: knowledgeBaseId
value: "YOUR_KB_ID"
- name: dataSourceId
value: "YOUR_DATA_SOURCE_ID"
- name: accessKeyId
value: "{{secrets.AWS_ACCESS_KEY_ID}}"
- name: secretAccessKey
value: "{{secrets.AWS_SECRET_ACCESS_KEY}}"
input:
- name: pdf
value: "https://example.com/reports/q3-report.pdf"
- name: filename
value: "q3-report.pdf"
- name: waitForIngestion
value: true
- id: query_kb
tool: AWS_BEDROCK_KNOWLEDGE_BASE
config:
- name: region
value: us-east-1
- name: knowledgeBaseId
value: "YOUR_KB_ID"
- name: mode
value: retrieve
- name: accessKeyId
value: "{{secrets.AWS_ACCESS_KEY_ID}}"
- name: secretAccessKey
value: "{{secrets.AWS_SECRET_ACCESS_KEY}}"
input:
- name: query
value: "Key revenue drivers in the Q3 report"
- name: numberOfResults
value: 10
```
## Notes
* **PDF size limit**: PDFs larger than 100 MB are rejected.
* **PDF validation**: The file must start with a `%PDF` header; other file types are rejected.
* **HTTPS only**: Insecure `http://` URLs are rejected for the `pdf` input — use HTTPS.
* **Deduplication**: The uploaded object is named `{sha256}.pdf`. If an object with the same content hash already exists, the tool skips both upload and ingestion and returns `skipped: true`.
* **Filename**: `filename` is used for logging only; it is sanitized (special characters replaced) and truncated to 100 characters. Defaults to `document.pdf`.
* **Ingestion wait**: When `waitForIngestion` is `true`, the step fails if the ingestion job ends with `FAILED`, `STOPPING`, or `STOPPED`, or if it does not complete within `ingestionTimeoutSeconds`.
* **numberOfResults** for querying is capped at 100.
# Azure AI Search
Source: https://carnot.mintlify.app/en/pages/tools/search/azure_ai_search
Search Azure AI Search knowledge bases with text, vector, or hybrid search
## Overview
The Azure AI Search tool lets you search external knowledge bases backed by Azure AI Search that are registered in your Jinba Flow workspace. It supports text (keyword), vector (semantic), and hybrid search.
## Key Features
* `AZURE_AI_SEARCH`
* Search an Azure AI Search external knowledge base registered in your workspace.
* Key inputs: `query` (search query string), `externalKbId` (the external knowledge base to search, selectable from your workspace), and `indexName` (the index within that knowledge base).
* Choose the search method with `searchType`: `text` (keyword search), `vector` (semantic search), or `hybrid` (text + vector, the default).
* Control result volume with `answerTotal` (number of documents to reference for answers, default 5, max 1000), `vectorRetrievalCount` (number of vector search results for hybrid search, default 5, max 1000), and `skip` (pagination offset).
* Narrow results with `filter` (an OData filter expression) and `select` (fields to return).
* Results include `id`, `score`, `content`, `filename`, a direct `downloadUrl` for the source file, and `metadata`, plus `count` and `totalResults`.
## Authentication
The tool calls the Jinba Flow API on your behalf, so it is configured with a **Jinba Flow Workspace API Token** (`token` config) rather than an Azure credential. The Azure AI Search connection itself is managed on the external knowledge base registered in your workspace.
**Note**: Treat API tokens as sensitive information and never commit them to public repositories.
## Usage Examples
### Example: Hybrid Search over a Knowledge Base
```yaml theme={null}
- id: search_kb
tool: AZURE_AI_SEARCH
config:
- name: token
value: "{{secrets.JINBA_WORKSPACE_TOKEN}}"
input:
- name: externalKbId
value: "YOUR_EXTERNAL_KB_ID"
- name: indexName
value: "product-manuals"
- name: query
value: "How do I reset the device to factory settings?"
- name: searchType
value: hybrid
- name: answerTotal
value: 5
```
### Example: Filtered Search Feeding an LLM Answer
```yaml theme={null}
- id: search_docs
tool: AZURE_AI_SEARCH
config:
- name: token
value: "{{secrets.JINBA_WORKSPACE_TOKEN}}"
input:
- name: externalKbId
value: "YOUR_EXTERNAL_KB_ID"
- name: indexName
value: "support-articles"
- name: query
value: "warranty policy for enterprise plans"
- name: searchType
value: text
- name: filter
value: "category eq 'policy'"
- id: generate_answer
tool: OPENAI_INVOKE
input:
- name: prompt
value: |
Answer the question using only the context below.
Context:
{{steps.search_docs.result.results[0].content}}
Question: What is the warranty policy for enterprise plans?
```
## Notes
* The external knowledge base and its indexes must be registered in your workspace beforehand; `externalKbId` and `indexName` are selected from those registrations.
* `answerTotal` and `vectorRetrievalCount` are capped at 1000.
* When passing `select` as a string, it must be a JSON array (e.g., `'["title", "content"]'`).
* The tool runs in the context of a workspace; execution fails with an error if no workspace context is available.
# Carnot Search
Source: https://carnot.mintlify.app/en/pages/tools/search/carnot_search
Search for company information using Carnot Search Corp and Pro
## Overview
Carnot Search provides powerful company search capabilities to find detailed business information. With both standard and Pro versions, you can access comprehensive company databases for market research, lead generation, and business intelligence.
## Key Features
### CARNOT\_SEARCH\_CORP
* Basic company search functionality
* Find company information by name or criteria
* Retrieve company URLs and addresses
* Configurable result count
### CARNOT\_SEARCH\_CORP\_PRO
* Enhanced search capabilities
* More detailed company information
* Advanced filtering options
* Higher accuracy and coverage
## Authentication
Carnot Search requires API keys from both Perplexity and OpenAI for enhanced search capabilities.
**Required credentials:**
* Perplexity API Key
* OpenAI API Key
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
## Example: Basic Company Search
```yaml theme={null}
- id: search_companies
name: search_companies
tool: CARNOT_SEARCH_CORP
config:
- name: perplexity_api_key
value: "{{secrets.PERPLEXITY_API_KEY}}"
- name: openai_api_key
value: "{{secrets.OPENAI_API_KEY}}"
input:
- name: query
value: "software companies in San Francisco"
- name: num_results
value: 10
- id: process_search_results
name: process_search_results
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
# Process search results
results = {{steps.search_companies.result.companies}}
print("Company Search Results:")
print("=" * 50)
for i, company in enumerate(results, 1):
print(f"{i}. {company.get('name', 'Unknown')}")
print(f" URL: {company.get('url', 'N/A')}")
print(f" Address: {company.get('address', 'N/A')}")
print()
print(f"Total companies found: {len(results)}")
```
## Example: Enhanced Pro Search
```yaml theme={null}
- id: advanced_company_search
name: advanced_company_search
tool: CARNOT_SEARCH_CORP_PRO
config:
- name: perplexity_api_key
value: "{{secrets.PERPLEXITY_API_KEY}}"
- name: openai_api_key
value: "{{secrets.OPENAI_API_KEY}}"
input:
- name: query
value: "fintech startups with Series A funding in New York"
- name: num_results
value: 20
- id: analyze_competitive_landscape
name: analyze_competitive_landscape
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Analyze the following company search results and provide insights:
{{steps.advanced_company_search.result.companies | json}}
Please provide:
1. Market trends analysis
2. Geographic distribution
3. Company size patterns
4. Key players identification
5. Competitive landscape overview
- id: export_company_data
name: export_company_data
tool: CONVERTER_ARRAY_TO_CSV
input:
- name: array
value: |
[
["Company Name", "Website", "Address", "Search Score"],
{% for company in steps.advanced_company_search.result.companies %}
["{{company.name}}", "{{company.url}}", "{{company.address}}", "High"]{% if not loop.last %},{% endif %}
{% endfor %}
]
```
## Example: Market Research Workflow
```yaml theme={null}
- id: search_competitors
name: search_competitors
tool: CARNOT_SEARCH_CORP_PRO
config:
- name: perplexity_api_key
value: "{{secrets.PERPLEXITY_API_KEY}}"
- name: openai_api_key
value: "{{secrets.OPENAI_API_KEY}}"
input:
- name: query
value: "{{input.industry}} companies in {{input.target_region}}"
- name: num_results
value: 50
- id: enrich_company_data
name: enrich_company_data
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
import re
from urllib.parse import urlparse
companies = {{steps.search_competitors.result.companies}}
enriched_data = []
for company in companies:
# Extract domain from URL
domain = ""
if company.get('url'):
try:
domain = urlparse(company['url']).netloc
except:
domain = company['url']
# Analyze company size based on address/description
size_indicator = "Unknown"
address = company.get('address', '').lower()
if any(term in address for term in ['suite', 'floor', 'building']):
size_indicator = "Medium-Large"
elif any(term in address for term in ['street', 'ave', 'road']):
size_indicator = "Small-Medium"
enriched = {
"name": company.get('name', ''),
"url": company.get('url', ''),
"domain": domain,
"address": company.get('address', ''),
"estimated_size": size_indicator
}
enriched_data.append(enriched)
print(json.dumps(enriched_data, indent=2))
- id: create_market_report
name: create_market_report
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Create a comprehensive market research report based on this company data:
{{steps.enrich_company_data.result.stdout}}
Include:
1. Executive Summary
2. Market Size Assessment
3. Key Players Analysis
4. Geographic Distribution
5. Competitive Landscape
6. Market Opportunities
7. Recommendations
Format as a professional business report.
- id: save_market_report
name: save_market_report
tool: OUTPUT_FILE
input:
- name: content
value: "{{steps.create_market_report.result.content}}"
- name: filename
value: "market_research_report_{{date | format('YYYY-MM-DD')}}.txt"
- name: fileType
value: "txt"
```
## Example: Lead Generation Pipeline
```yaml theme={null}
- id: find_potential_leads
name: find_potential_leads
tool: CARNOT_SEARCH_CORP
config:
- name: perplexity_api_key
value: "{{secrets.PERPLEXITY_API_KEY}}"
- name: openai_api_key
value: "{{secrets.OPENAI_API_KEY}}"
input:
- name: query
value: "{{input.target_industry}} companies with 10-100 employees"
- name: num_results
value: 25
- id: qualify_leads
name: qualify_leads
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Analyze these potential leads and score them for sales qualification:
{{steps.find_potential_leads.result.companies | json}}
Scoring criteria:
- Company size and growth potential (1-10)
- Industry fit (1-10)
- Geographic accessibility (1-10)
- Technology alignment (1-10)
Return a scored list with recommendations for follow-up.
- id: export_qualified_leads
name: export_qualified_leads
tool: CONVERTER_ARRAY_TO_CSV
input:
- name: array
value: |
[
["Company", "Website", "Address", "Qualification Score", "Priority", "Notes"],
{% for company in steps.find_potential_leads.result.companies %}
["{{company.name}}", "{{company.url}}", "{{company.address}}", "TBD", "Medium", "Follow up required"]{% if not loop.last %},{% endif %}
{% endfor %}
]
```
## Search Parameters
### Query Optimization
* Use specific industry terms
* Include geographic qualifiers
* Specify company size when relevant
* Use boolean operators for complex searches
### Result Management
* Start with smaller result sets (10-20)
* Increase for comprehensive research (50+)
* Consider API rate limits
* Balance accuracy vs coverage
## Use Cases
* **Market Research**: Identify competitors and market players
* **Lead Generation**: Find potential customers and partners
* **Investment Research**: Analyze market sectors and opportunities
* **Competitive Intelligence**: Monitor competitor landscape
* **Partnership Development**: Discover potential business partners
* **Sales Prospecting**: Build targeted prospect lists
* **Due Diligence**: Research companies for business decisions
## Data Structure
Search results include:
```json theme={null}
{
"name": "Company Name",
"url": "https://company-website.com",
"address": "123 Business St, City, State, ZIP"
}
```
## Best Practices
* **Query Design**: Use specific, targeted search terms
* **Result Processing**: Always validate and enrich search results
* **Rate Limiting**: Respect API limits and implement delays
* **Data Quality**: Clean and verify company information
* **Privacy**: Handle company data responsibly and legally
# Exa AI
Source: https://carnot.mintlify.app/en/pages/tools/search/exaai
Search the web using Exa AI
## Overview
The Exa AI tool allows you to search the web using Exa AI's capabilities. It provides a simple interface to query the web and retrieve relevant information based on your input.
## Key Features
* `EXAAI_SEARCH`
* Search for information on the web using a query string.
* Retrieve relevant results based on your input.
## Authentication
If you do not have an Exa AI API key, you can still run Exa AI tools by using Jinba API credit. If you'd like to use your own API key, you can obtain one from the [official Exa AI website](https://exa.ai/).
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: Run Exa AI Search
```yaml theme={null}
- id: search
tool: EXAAI_SEARCH
config:
- name: exaApiKey
value: "{{secrets.EXAAI_API_KEY}}"
input:
- name: query
value: find blog posts about AGI
```
# Perplexity
Source: https://carnot.mintlify.app/en/pages/tools/search/perplexity
Use Perplexity to search the web
## Overview
The Perplexity tool allows you to search the web for information. It is designed to provide quick and accurate answers to your queries by leveraging the power of AI and web search capabilities.
## Key Features
* `PERPLEXITY_SEARCH`
* Search for information on the web using a query string.
* Retrieve relevant results based on your input.
* Get answers to questions, summaries, and more.
## Authentication
If you do not have a Perplexity API key, you can still run Perplexity tools by using Jinba API credit. If you'd like to use your own API key, you can obtain one from the [official Perplexity website](https://www.perplexity.ai/).
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: Run Perplexity Search
```yaml theme={null}
- id: perplexity_search
tool: PERPLEXITY_SEARCH
config:
- name: api_key
value: "{{secrets.PERPLEXITY_API_KEY}}"
input:
- name: query
value: What is the capital of France?
```
# Pinecone
Source: https://carnot.mintlify.app/en/pages/tools/search/pinecone
Vector database for semantic search and RAG applications
## Overview
Pinecone is a fully managed vector database that enables semantic search and RAG (Retrieval-Augmented Generation) applications. The Pinecone tool allows you to query vector indexes for similar vectors using semantic similarity.
## Key Features
* `PINECONE_CREATE_INDEX`
* Create new serverless vector indexes
* Configure vector dimension and distance metric
* Select cloud provider and deployment region
* Optional deletion protection
* Wait-until-ready option for immediate use
* `PINECONE_QUERY`
* Search for similar vectors using semantic similarity
* **Dual-mode operation**: Vector query OR text query with integrated inference
* Support for top-K results retrieval
* Metadata filtering with Pinecone filter syntax
* Namespace isolation for data partitioning
* Similarity threshold filtering (minScore)
* Optional inclusion of metadata and vector values
* `PINECONE_UPSERT`
* Insert or update vectors in Pinecone index
* **Dual-mode operation**: Vector upsert OR document upsert with integrated inference
* Batch operations (up to 100 vectors/documents per request)
* Metadata support for rich vector annotations
* Namespace isolation for data organization
## Authentication
You need a Pinecone API key to use this tool. You can obtain one from the [Pinecone Console](https://app.pinecone.io/).
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
## Examples
### Example: Create Index and Upsert Documents (Integrated Inference)
This example shows the complete workflow using Pinecone's integrated inference feature - no external embedding tool needed!
```yaml theme={null}
# Step 1: Create a serverless index
- id: create_index
name: create_index
tool: PINECONE_CREATE_INDEX
config:
- name: apiKey
value: "{{secrets.PINECONE_API_KEY}}"
input:
- name: indexName
value: knowledge-base
- name: dimension
value: 1024
- name: metric
value: cosine
- name: cloud
value: aws
- name: region
value: us-east-1
- name: waitUntilReady
value: true
# Step 2: Upload documents with automatic embedding
- id: upload_docs
name: upload_docs
tool: PINECONE_UPSERT
config:
- name: apiKey
value: "{{secrets.PINECONE_API_KEY}}"
input:
- name: indexName
value: knowledge-base
- name: documents
value: |
[
{
"id": "doc1",
"text": "Pinecone is a vector database optimized for AI applications.",
"metadata": {"category": "intro", "source": "docs"}
},
{
"id": "doc2",
"text": "Integrated inference automatically generates embeddings from your text.",
"metadata": {"category": "features", "source": "docs"}
}
]
# Step 3: Query with text (automatic embedding)
- id: search
name: search
tool: PINECONE_QUERY
config:
- name: apiKey
value: "{{secrets.PINECONE_API_KEY}}"
input:
- name: indexName
value: knowledge-base
- name: query
value: "How does Pinecone handle embeddings?"
- name: topK
value: 3
- name: includeMetadata
value: true
```
### Example: Query with Reranking for Improved Relevance
Reranking re-scores initial results to improve relevance. This is especially useful for complex queries.
```yaml theme={null}
- id: search_with_rerank
name: search_with_rerank
tool: PINECONE_QUERY
config:
- name: apiKey
value: "{{secrets.PINECONE_API_KEY}}"
input:
- name: indexName
value: knowledge-base
- name: query
value: "How does Pinecone handle embeddings?"
- name: topK
value: 10
- name: includeMetadata
value: true
- name: rerankModel
value: bge-reranker-v2-m3 # Options: cohere-rerank-3.5, bge-reranker-v2-m3, pinecone-rerank-v0
- name: rerankTopN
value: 3
- name: rerankRankFields
value: '["text"]'
- name: fields
value: '["category", "text"]'
```
### Example: Traditional Semantic Search with OpenAI Embeddings
```yaml theme={null}
- id: generate_embeddings
name: generate_embeddings
tool: OPENAI_CREATE_EMBEDDING
config:
- name: api_key
value: "{{secrets.OPENAI_API_KEY}}"
input:
- name: input
value: What is semantic search?
- name: model
value: text-embedding-3-large
- id: search_pinecone
name: search_pinecone
tool: PINECONE_QUERY
config:
- name: apiKey
value: "{{secrets.PINECONE_API_KEY}}"
input:
- name: indexName
value: my-docs-index
- name: vector
value: "{{steps.generate_embeddings.result.data[0].embedding}}"
- name: topK
value: 5
- name: minScore
value: 0.7
- name: includeMetadata
value: true
- id: generate_answer
name: generate_answer
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Answer the following question based on the context provided.
Context:
{{steps.search_pinecone.result.matches[0].metadata.text}}
{{steps.search_pinecone.result.matches[1].metadata.text}}
Question: What is semantic search?
```
### Example: Search with Metadata Filtering
```yaml theme={null}
- id: filtered_search
name: filtered_search
tool: PINECONE_QUERY
config:
- name: apiKey
value: "{{secrets.PINECONE_API_KEY}}"
input:
- name: indexName
value: my-docs-index
- name: vector
value: "[0.1, 0.2, 0.3, ...]"
- name: topK
value: 10
- name: filter
value: '{"category": {"$eq": "technology"}, "year": {"$gte": 2020}}'
- name: namespace
value: production
```
## Parameters
### PINECONE\_CREATE\_INDEX
| Parameter | Type | Required | Default | Description |
| - | - | - | - | - |
| `indexName` | string | Yes | - | Name of the index (lowercase alphanumeric and hyphens, max 45 chars) |
| `dimension` | number | Yes | - | Vector dimension (e.g., 1536 for OpenAI ada-002) |
| `metric` | string | No | cosine | Distance metric: cosine, euclidean, or dotproduct |
| `cloud` | string | No | aws | Cloud provider: aws, gcp, or azure |
| `region` | string | Yes | - | Deployment region (e.g., us-east-1) |
| `deletionProtection` | string | No | disabled | Enable deletion protection: enabled or disabled |
| `waitUntilReady` | boolean | No | true | Wait until index is ready before returning |
### PINECONE\_QUERY
| Parameter | Type | Required | Default | Description |
| - | - | - | - | - |
| `indexName` | string | Yes | - | The name of the Pinecone index to query |
| `vector` | number\[] | No\* | - | Query vector as array of numbers |
| `query` | string | No\* | - | Text query for integrated inference (automatic embedding) |
| `topK` | number | No | 10 | Number of results to return (1-100) |
| `namespace` | string | No | - | Namespace to query within the index |
| `filter` | object | No | - | Metadata filter using Pinecone filter syntax |
| `minScore` | number | No | - | Minimum similarity score threshold (0-1) |
| `includeMetadata` | boolean | No | true | Include metadata in results |
| `includeValues` | boolean | No | false | Include vector values in results |
\*Either `vector` or `query` must be provided, but not both.
### PINECONE\_UPSERT
| Parameter | Type | Required | Default | Description |
| - | - | - | - | - |
| `indexName` | string | Yes | - | The name of the Pinecone index |
| `vectors` | array | No\* | - | Array of vector objects (id, values, metadata) |
| `documents` | array | No\* | - | Array of document objects for integrated inference (id, text, metadata) |
| `namespace` | string | No | - | Namespace for data organization |
\*Either `vectors` or `documents` must be provided, but not both.
### Output
The tool returns an object with the following structure:
```json theme={null}
{
"matches": [
{
"id": "vec1",
"score": 0.95,
"metadata": {
"title": "Document Title",
"text": "Document content...",
"category": "technology"
}
}
],
"namespace": "production",
"usage": {
"readUnits": 5
}
}
```
## Use Cases
### RAG (Retrieval-Augmented Generation)
Combine Pinecone with OpenAI to build RAG applications:
1. Generate embeddings from user query
2. Search Pinecone for relevant documents
3. Use retrieved context in LLM prompts
### Semantic Search
Search documents by meaning rather than keywords:
* Find similar articles
* Recommend related content
* Discover relevant information
### Question Answering
Build Q\&A systems with context retrieval:
* Technical documentation search
* Customer support knowledge base
* Research paper discovery
## Resources
* [Pinecone Documentation](https://docs.pinecone.io/)
* [Pinecone Console](https://app.pinecone.io/)
* [Vector Embeddings Guide](https://www.pinecone.io/learn/vector-embeddings/)
* [RAG Best Practices](https://www.pinecone.io/learn/retrieval-augmented-generation/)
# PokeAPI
Source: https://carnot.mintlify.app/en/pages/tools/search/pokeapi
Search for Pokemon data using PokeAPI
## Overview
The PokeAPI tools allow you to search for Pokemon data, including information about specific Pokemon, their abilities, types, and more. These tools are designed to provide quick access to a wide range of Pokemon-related data.
## Key Features
* `POKEAPI_GET_POKEMON`
* Retrieve detailed information about a specific Pokemon by its ID or name.
* Access various attributes such as height, weight, abilities, and more.
* `POKEAPI_GET_TYPE`
* Get information about a specific Pokemon type.
* Access details such as damage relations and effectiveness against other types.
* `POKEAPI_GET_ABILITY`
* Retrieve information about a specific Pokemon ability.
* Access details such as effects and which Pokemon can have the ability.
### Example: Run PokeAPI
```yaml theme={null}
- id: get_pokemon
tool: POKEAPI_GET_POKEMON
input:
- name: id
value: "1"
- id: get_type
tool: POKEAPI_GET_TYPE
input:
- name: id
value: "1"
- id: get_ability
tool: POKEAPI_GET_ABILITY
input:
- name: id
value: "65"
```
# SerpAPI
Source: https://carnot.mintlify.app/en/pages/tools/search/serpapi
Search the web using SerpAPI
## Overview
The SerpAPI tool allows you to search the web using SerpAPI's capabilities. It provides a simple interface to query the web and retrieve relevant information based on your input.
## Key Features
* `SERPAPI_SEARCH`
* Search for information on the web using a query string.
* Retrieve relevant results based on your input.
* Get answers to questions, summaries, and more.
## Authentication
If you do not have a SerpAPI API key, you can still run SerpAPI tools by using Jinba API credit. If you'd like to use your own API key, you can obtain one from the [official SerpAPI website](https://serpapi.com/).
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: Run SerpAPI Search
```yaml theme={null}
- id: serpapi_search
tool: SERPAPI_SEARCH
config:
- name: token
value: "{{secrets.SERPAPI_API_KEY}}"
input:
- name: query
value: What is the capital of France?
- name: engine
value: google
```
# Teradata
Source: https://carnot.mintlify.app/en/pages/tools/search/teradata
Run queries on Teradata
## Overview
The Teradata tools allow you to run SQL queries on a Teradata database and to build and search vector stores on Teradata Vantage Cloud for RAG-style workflows.
## Key Features
* `TERADATA_RUN_QUERY`
* Execute SQL queries on a Teradata database.
* Retrieve results in a structured format.
* `VANTAGE_CLOUD_VECTOR_STORE_CREATE`
* Create a VectorStore on Vantage Cloud from files in Jinba storage, with document ingestion and chunking.
* `VANTAGE_CLOUD_VECTOR_STORE_ADD_DOCUMENT`
* Add documents from files in Jinba storage to an existing VectorStore on Vantage Cloud.
* `VANTAGE_CLOUD_VECTOR_SEARCH`
* Perform semantic similarity search on a Vantage Cloud VectorStore.
## Authentication
For `TERADATA_RUN_QUERY`, you will need your Teradata database credentials: `host`, `user`, and `password`.
The three `VANTAGE_CLOUD_*` tools share the same config parameters:
| Parameter | Required | Description |
| - | - | - |
| `host` | No | Vantage Cloud host address (default: `host.docker.internal`, keep the default when using an SSH tunnel on the host machine) |
| `dbs_port` | No | Database port number (default: `1025`) |
| `username` | Yes | Database username |
| `password` | Yes | Database password |
| `base_url` | Yes | UES URI (the URL without the trailing `/open-analytics`) |
| `pat_token` | Yes | Personal Access Token (for CCP authentication) |
| `pem_content` | Yes | Contents of the PEM private key (paste the text starting with `-----BEGIN PRIVATE KEY-----` as-is) |
| `pem_kid` | No | Key ID of the PEM key (defaults to `username`; must match the key name registered on the Teradata side) |
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
## Vantage Cloud Vector Tools
### VANTAGE\_CLOUD\_VECTOR\_STORE\_CREATE
Create a VectorStore on Vantage Cloud from files in Jinba storage.
**Input**:
| Parameter | Type | Required | Description |
| - | - | - | - |
| `vector_store_name` | string | Yes | Name of the VectorStore to create |
| `file_urls` | string | Yes | Comma-separated (or newline-separated) HTTPS URLs of files to ingest as documents (maximum 10 files) |
| `embeddings_model` | string | No | Embeddings model to use for vectorization (default: `amazon.titan-embed-text-v1`) |
| `search_algorithm` | string | No | Search algorithm: `VECTORDISTANCE` or `HNSW` (default: `VECTORDISTANCE`) |
| `top_k` | number | No | Number of top results for search (default: 5) |
| `object_names` | string | No | Object name for data storage (defaults to `vector_store_name` + `_data`) |
| `data_columns` | string | No | Data column name for text content (default: `chunks`) |
| `vector_column` | string | No | Column name for vector embeddings (default: `Embedding`) |
| `chunk_size` | number | No | Chunk size for document splitting (default: 500) |
**Output**: `result` with `name` (created VectorStore), `status`, and `message`.
### VANTAGE\_CLOUD\_VECTOR\_STORE\_ADD\_DOCUMENT
Add documents to an existing VectorStore on Vantage Cloud.
**Input**:
| Parameter | Type | Required | Description |
| - | - | - | - |
| `vector_store_name` | string | Yes | Name of the existing VectorStore to add documents to |
| `file_urls` | string | Yes | Comma-separated (or newline-separated) HTTPS URLs of files to add as documents (maximum 10 files) |
**Output**: `result` with `name`, `status`, and `message`.
### VANTAGE\_CLOUD\_VECTOR\_SEARCH
Perform semantic similarity search on a Vantage Cloud VectorStore.
**Input**:
| Parameter | Type | Required | Description |
| - | - | - | - |
| `vector_store_name` | string | Yes | Name of the VectorStore to search |
| `query` | string | Yes | Natural language query for similarity search |
| `top_k` | number | No | Number of similar results to return (default: 5) |
**Output**: `result` with `similar_objects` (each containing `score` and, when available, `DataBaseName`, `TableName`, `TD_ID`, `TD_FILENAME`, `chunks`, `index_label`) and `total_count`.
### Example: Create a VectorStore and Search It
```yaml theme={null}
- id: create_vector_store
tool: VANTAGE_CLOUD_VECTOR_STORE_CREATE
config:
- name: username
value: "{{secrets.VANTAGE_USERNAME}}"
- name: password
value: "{{secrets.VANTAGE_PASSWORD}}"
- name: base_url
value: "{{secrets.VANTAGE_BASE_URL}}"
- name: pat_token
value: "{{secrets.VANTAGE_PAT_TOKEN}}"
- name: pem_content
value: "{{secrets.VANTAGE_PEM_CONTENT}}"
input:
- name: vector_store_name
value: "product_docs"
- name: file_urls
value: "{{steps.upload_manual.result.file_url}}"
- id: vector_search
tool: VANTAGE_CLOUD_VECTOR_SEARCH
config:
- name: username
value: "{{secrets.VANTAGE_USERNAME}}"
- name: password
value: "{{secrets.VANTAGE_PASSWORD}}"
- name: base_url
value: "{{secrets.VANTAGE_BASE_URL}}"
- name: pat_token
value: "{{secrets.VANTAGE_PAT_TOKEN}}"
- name: pem_content
value: "{{secrets.VANTAGE_PEM_CONTENT}}"
input:
- name: vector_store_name
value: "product_docs"
- name: query
value: "How do I reset my password?"
- name: top_k
value: 5
```
### Example: Run Teradata Query
```yaml theme={null}
- id: run_query
tool: TERADATA_RUN_QUERY
config:
- name: host
value: 100.21.165.28
- name: user
value: carnot
- name: password
value: carnot#123
input:
- name: query
value: "
\ with examples as (
\ select 1 as id, 'jon' as name
\ union all
\ select 2 as id, 'jane' as name
\ )
\ select * from examples;
\ "
```
# TinyFish
Source: https://carnot.mintlify.app/en/pages/tools/search/tinyfish
Search, fetch, and automate the web with TinyFish web agents
## Overview
TinyFish tools provide web infrastructure for AI agents: structured web search, full-browser page fetching, and a natural-language browser agent that navigates real websites and extracts structured data.
## Key Features
* `TINYFISH_SEARCH`
* Search the web with a query string and get structured JSON results (title, URL, description, snippet)
* Control the number of results (`num_results`, 1–50, default 10) and geo-target results with a two-letter country code (`country`, e.g. `us`, `jp`)
* `TINYFISH_FETCH`
* Render and extract clean content from one or more URLs using a full browser — works on JavaScript-heavy pages
* Pass a single URL string or a JSON array of URLs (`urls`), and choose the output format (`format`: `markdown` (default), `html`, `json`, or `text`)
* `TINYFISH_AGENT`
* Run a browser automation agent: give it a starting URL (`url`) and a natural-language goal (`goal`), and it navigates the site and extracts structured data
* Configure the maximum run time with `timeout_seconds` (default 300)
* Returns the stream of agent events plus the final result
## Authentication
All TinyFish tools authenticate with a TinyFish API key, set via the `api_key` config (stored as a secret). If the config is not provided, the tools fall back to the `TINYFISH_API_KEY` environment variable.
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
## Usage Examples
### Example: Search the web and fetch the top pages
```yaml theme={null}
- id: search_news
name: search_news
tool: TINYFISH_SEARCH
config:
- name: api_key
value: "{{secrets.TINYFISH_API_KEY}}"
input:
- name: query
value: latest AI workflow automation trends
- name: num_results
value: 5
- name: country
value: us
- id: fetch_pages
name: fetch_pages
tool: TINYFISH_FETCH
config:
- name: api_key
value: "{{secrets.TINYFISH_API_KEY}}"
input:
- name: urls
value: '["https://example.com/article-1","https://example.com/article-2"]'
- name: format
value: markdown
```
### Example: Extract structured data with the browser agent
```yaml theme={null}
- id: check_pricing
name: check_pricing
tool: TINYFISH_AGENT
config:
- name: api_key
value: "{{secrets.TINYFISH_API_KEY}}"
input:
- name: url
value: https://example.com/pricing
- name: goal
value: Find all subscription plans and prices. Return JSON.
- name: timeout_seconds
value: 300
```
## Notes
* `TINYFISH_AGENT` is an at-least-once operation: if a worker dies mid-run, the runner may resubmit the job. Avoid using it for irreversible side effects (form submissions, purchases, etc.) without an external idempotency guard.
* `TINYFISH_FETCH` accepts `urls` as a single URL string, a comma-separated list, or a JSON array.
* `TINYFISH_SEARCH` returns at most 50 results per call.
# YouTube Transcript
Source: https://carnot.mintlify.app/en/pages/tools/search/youtube
Get YouTube video transcripts
## Overview
The YouTube Transcript tool allows you to retrieve transcripts for YouTube videos. This can be useful for extracting spoken content from videos, making it easier to analyze or reference later.
## Key Features
* `YOUTUBE_GET_TRANSCRIPT`
* Retrieve transcripts for YouTube videos.
* Supports multiple languages and options for timestamps.
### Example: Get YouTube Transcript
```yaml theme={null}
- id: get_transcript
name: get_transcript
tool: YOUTUBE_GET_TRANSCRIPT
config: []
input:
- name: video_id
value: Rzlr2tNSl0U
- name: lang
value: en
- name: timestamps
value: false
```
# Checker Tools
Source: https://carnot.mintlify.app/en/pages/tools/validation/checker_tools
Data validation and checking tools for quality assurance
## Overview
Checker Tools provide comprehensive data validation and quality assurance capabilities. These tools help ensure data integrity, compliance with business rules, and automated quality control in your workflows.
## Key Features
### CHECKER\_CHECK\_BY\_JSON
* Uses an LLM to check text against rules defined as a JSON array
* Each rule can include a `name`, `description`, optional `references`, and optional few-shot `examples`
* Detailed validation results with reasons
* Inputs: `text` (text to check), `task` (task name), `description` (optional task description), `rules` (JSON array of rules)
### CHECKLIST
* Uses an LLM to evaluate whether the input text complies with each rule defined in a CSV file
* CSV columns: `name`, `description`, optional `references` (semicolon-separated), optional `examples` (JSON)
* Structured validation reporting
* Inputs: `text` (text to check), `task` (task name), `description` (optional task description), `rules` (URL of the CSV rules file)
### JINBA\_MODULES\_CHECKER\_V2
* Advanced validation using JSON rule files
* Enhanced rule processing
* Improved performance and accuracy
* Version 2 with additional features
## Authentication
No authentication required for checker tools.
## Example: Document Validation
```yaml theme={null}
- id: validate_document
name: validate_document
tool: CHECKER_CHECK_BY_JSON
input:
- name: text
value: "{{steps.extract_document.result.content}}"
- name: task
value: "Contract Compliance Check"
- name: description
value: "Validate contract document against legal requirements"
- name: rules
value: |
[
{
"name": "Must contain signature section",
"description": "The document must contain a signature section (e.g. 'signature', 'sign here', 'executed by')."
},
{
"name": "Must include termination clause",
"description": "The document must include a termination clause describing how the agreement ends or expires."
},
{
"name": "Should specify payment terms",
"description": "The document should specify payment terms such as invoicing, billing, or due dates."
}
]
```
## Example: Data Quality Validation
```yaml theme={null}
- id: extract_data
name: extract_data
tool: EXCEL_GET_ROWS
input:
- name: file_url
value: "{{steps.input_file.result.file_url}}"
- name: range
value: "A1:E100"
- id: validate_data_quality
name: validate_data_quality
tool: CHECKER_CHECK_BY_JSON
input:
- name: text
value: "{{steps.extract_data.result.content | join('\n')}}"
- name: task
value: "Customer Data Validation"
- name: rules
value: |
[
{
"name": "Email format validation",
"description": "Every email address must follow a valid email format (e.g. user@example.com)."
},
{
"name": "Phone number format",
"description": "Every phone number must be a valid international phone number."
},
{
"name": "Complete address information",
"description": "Each record should contain complete address information (street, city, etc.)."
}
]
- id: process_validation_results
name: process_validation_results
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
validation_results = {{steps.validate_data_quality.result}}
# Count validation status
accepted = sum(1 for r in validation_results if r['status'] == 'accepted')
rejected = sum(1 for r in validation_results if r['status'] == 'rejected')
pending = sum(1 for r in validation_results if r['status'] == 'pending')
print(f"Validation Summary:")
print(f"✅ Accepted: {accepted}")
print(f"❌ Rejected: {rejected}")
print(f"⏳ Pending: {pending}")
# List rejected items with reasons
if rejected > 0:
print("\nRejected Items:")
for result in validation_results:
if result['status'] == 'rejected':
print(f"- {result['rule']}: {result['reason']}")
```
## Example: Advanced File Validation
```yaml theme={null}
- id: upload_rules_file
name: upload_rules_file
tool: INPUT_FILE
input:
- name: description
value: "Upload validation rules CSV file"
- id: validate_with_checklist
name: validate_with_checklist
tool: CHECKLIST
input:
- name: text
value: "{{steps.input_data.result}}"
- name: task
value: "Batch Data Validation"
- name: rules
value: "{{steps.upload_rules_file.result}}"
- id: advanced_validation
name: advanced_validation
tool: JINBA_MODULES_CHECKER_V2
input:
- name: target_file
value: "{{steps.input_data.result.file_url}}"
- name: task
value: "Advanced Data Validation"
- name: description
value: "Comprehensive validation using enhanced checker v2"
- name: rules
value: |
[
{
"uniqueId": "email_check",
"name": "Email format validation",
"description": "Every email address must follow a valid email format (e.g. user@example.com)."
},
{
"uniqueId": "age_check",
"name": "Age range validation",
"description": "Every age value must be a number between 18 and 120."
},
{
"uniqueId": "country_check",
"name": "Country code validation",
"description": "Every country code must be one of US, UK, CA, AU, or JP."
}
]
- name: additionalDataSchema
value: |
{
"extractedData": {
"type": "object",
"properties": {
"email": {"type": "string"},
"age": {"type": "number"},
"country": {"type": "string"}
}
}
}
```
## Validation Rule Types
### Pattern-based Rules
* **Regex patterns**: Use regular expressions for complex validation
* **Text matching**: Simple text presence or absence checks
* **Format validation**: Email, phone, URL, date formats
### Structural Rules
* **Required fields**: Ensure mandatory data is present
* **Data types**: Validate numeric, date, boolean data
* **Range validation**: Min/max values, length constraints
### Business Rules
* **Custom logic**: Complex business rule validation
* **Cross-field validation**: Rules that depend on multiple fields
* **Conditional rules**: Rules that apply under certain conditions
## Validation Results
Each validation returns an array of structured results:
```json theme={null}
{
"rule": "Email format validation",
"status": "accepted|rejected|pending",
"range": [0, 120],
"reason": "Detailed explanation of validation result"
}
```
`range` is an array of numbers indicating the character range the result applies to.
## Use Cases
* **Data Quality Assurance**: Validate imported data quality
* **Compliance Checking**: Ensure documents meet regulatory requirements
* **Form Validation**: Validate user-submitted forms and applications
* **Content Moderation**: Check content against community guidelines
* **Business Rule Enforcement**: Ensure data meets business criteria
* **Import Validation**: Validate data before importing into systems
* **Document Review**: Automated document compliance checking
# Data Conversion Tools
Source: https://carnot.mintlify.app/en/pages/tools/validation/data_conversion
Convert data between different formats and structures
## Overview
Data Conversion Tools provide essential functionality for transforming data between different formats. These tools handle array-to-CSV conversion, image-to-PDF conversion, HTML-to-PDF/DOCX conversion, and other data transformation needs in your workflows.
## Key Features
### CONVERTER\_ARRAY\_TO\_CSV
* Convert 2D arrays to CSV format with automatic escaping
* Handles special characters (quotes, commas, newlines)
* Input: `input` (2D array) — Output: `result` (CSV string)
* Compatible with spreadsheet applications
### CONVERTER\_IMAGE\_TO\_PDF
* Convert images to PDF format
* Support for TIFF, PNG, JPEG, GIF, and more
* Input: `file_link` (array of image URLs, max 10 files)
* Output: `result` (URL of the generated PDF)
### CONVERTER\_HTML\_TO\_PDF
* Convert HTML content to a PDF file
* Input: `html_content` (HTML string), `filename` (optional, without extension)
* Output: `result` (signed URL to the created PDF file)
### CONVERTER\_HTML\_TO\_DOCX
* Convert HTML content to a DOCX (Word) file
* Input: `html_content` (HTML string), `filename` (optional, without extension)
* Output: `result` (signed URL to the created DOCX file)
## Authentication
No authentication required for conversion tools.
## Example: Data Export to CSV
```yaml theme={null}
- id: fetch_data
name: fetch_data
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
# Sample data processing
import json
# Simulate fetching data from API or database
raw_data = [
{"name": "John Doe", "email": "john@example.com", "age": 30, "city": "New York"},
{"name": "Jane Smith", "email": "jane@example.com", "age": 25, "city": "Los Angeles"},
{"name": "Bob Johnson", "email": "bob@example.com", "age": 35, "city": "Chicago"}
]
# Convert to 2D array format
headers = ["Name", "Email", "Age", "City"]
data_rows = []
data_rows.append(headers)
for item in raw_data:
row = [item["name"], item["email"], str(item["age"]), item["city"]]
data_rows.append(row)
print(json.dumps(data_rows))
- id: convert_to_csv
name: convert_to_csv
tool: CONVERTER_ARRAY_TO_CSV
input:
- name: input
value: "{{steps.fetch_data.result.stdout | fromJson}}"
- id: save_csv_file
name: save_csv_file
tool: OUTPUT_FILE
input:
- name: content
value: "{{steps.convert_to_csv.result}}"
- name: filename
value: "user_data_export.csv"
- name: fileType
value: "csv"
```
## Example: Sales Report Generation
```yaml theme={null}
- id: calculate_sales_metrics
name: calculate_sales_metrics
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
from datetime import datetime, timedelta
# Sample sales data
sales_data = [
{"product": "Widget A", "sales": 1500, "region": "North", "month": "Jan"},
{"product": "Widget B", "sales": 2300, "region": "South", "month": "Jan"},
{"product": "Widget A", "sales": 1800, "region": "North", "month": "Feb"},
{"product": "Widget B", "sales": 2100, "region": "South", "month": "Feb"}
]
# Create summary table
summary = [["Product", "Region", "Month", "Sales", "Growth"]]
for i, item in enumerate(sales_data):
growth = "N/A"
if i >= 2: # Calculate growth for Feb data
prev_sales = sales_data[i-2]["sales"]
growth = f"{((item['sales'] - prev_sales) / prev_sales * 100):.1f}%"
summary.append([
item["product"],
item["region"],
item["month"],
f"${item['sales']:,}",
growth
])
print(json.dumps(summary))
- id: export_sales_csv
name: export_sales_csv
tool: CONVERTER_ARRAY_TO_CSV
input:
- name: input
value: "{{steps.calculate_sales_metrics.result.stdout | fromJson}}"
- id: create_downloadable_report
name: create_downloadable_report
tool: OUTPUT_FILE
input:
- name: content
value: "{{steps.export_sales_csv.result}}"
- name: filename
value: "sales_report_{{date | format('YYYY-MM-DD')}}.csv"
- name: fileType
value: "csv"
```
## Example: Image to PDF Conversion
```yaml theme={null}
- id: input_images
name: input_images
tool: INPUT_IMAGE_FILE
input:
- name: file_url
value: "https://example.com/chart1.png"
- name: description
value: "Sales chart image"
- id: convert_chart_to_pdf
name: convert_chart_to_pdf
tool: CONVERTER_IMAGE_TO_PDF
input:
- name: file_link
value:
- "https://example.com/chart1.png"
- id: convert_multiple_charts
name: convert_multiple_charts
tool: CONVERTER_IMAGE_TO_PDF
input:
- name: file_link
value:
- "https://example.com/chart1.png"
- "https://example.com/chart2.png"
- "https://example.com/chart3.png"
```
## Example: HTML to PDF / DOCX Conversion
```yaml theme={null}
- id: generate_html_report
name: generate_html_report
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Generate an HTML report summarizing this month's sales results.
Return only the HTML content.
- id: convert_report_to_pdf
name: convert_report_to_pdf
tool: CONVERTER_HTML_TO_PDF
input:
- name: html_content
value: "{{steps.generate_html_report.result}}"
- name: filename
value: "monthly_sales_report"
- id: convert_report_to_docx
name: convert_report_to_docx
tool: CONVERTER_HTML_TO_DOCX
input:
- name: html_content
value: "{{steps.generate_html_report.result}}"
- name: filename
value: "monthly_sales_report"
# steps.convert_report_to_pdf.result is a signed URL to the PDF file
# steps.convert_report_to_docx.result is a signed URL to the DOCX file
```
## Example: Complex Data Transformation
```yaml theme={null}
- id: extract_complex_data
name: extract_complex_data
tool: EXCEL_GET_ROWS
input:
- name: file_url
value: "{{steps.input_excel.result.file_url}}"
- name: range
value: "A1:F1000"
- id: transform_and_clean_data
name: transform_and_clean_data
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
import re
# Parse the Excel data
excel_data = {{steps.extract_complex_data.result.content}}
# Clean and transform data
cleaned_data = []
headers = ["ID", "Name", "Email", "Phone", "Status", "Notes"]
cleaned_data.append(headers)
for row in excel_data[1:]: # Skip header row
if len(row) >= 6:
# Clean email
email = row[2].strip().lower() if row[2] else ""
# Format phone number
phone = re.sub(r'[^\d+]', '', row[3]) if row[3] else ""
# Clean and escape notes (may contain commas, quotes)
notes = str(row[5]).replace('"', '""') if row[5] else ""
cleaned_row = [
str(row[0]) if row[0] else "",
str(row[1]).title() if row[1] else "",
email,
phone,
str(row[4]).upper() if row[4] else "PENDING",
notes
]
cleaned_data.append(cleaned_row)
print(json.dumps(cleaned_data))
- id: convert_cleaned_data
name: convert_cleaned_data
tool: CONVERTER_ARRAY_TO_CSV
input:
- name: input
value: "{{steps.transform_and_clean_data.result.stdout | fromJson}}"
- id: save_cleaned_export
name: save_cleaned_export
tool: OUTPUT_FILE
input:
- name: content
value: "{{steps.convert_cleaned_data.result}}"
- name: filename
value: "cleaned_data_export.csv"
- name: fileType
value: "csv"
```
## Data Format Support
### CSV Conversion
* **Input**: 2D arrays, JSON arrays, structured data
* **Output**: RFC 4180 compliant CSV
* **Features**: Automatic escaping, encoding handling
### Image to PDF
* **Supported formats**: TIFF, PNG, JPEG, GIF, and more
* **Input**: Up to 10 image URLs per conversion
* **Output**: PDF document URL
### HTML to PDF / DOCX
* **Input**: HTML content string and optional filename (without extension)
* **Output**: Signed URL to the generated PDF or DOCX file
* **Features**: Useful for turning LLM-generated HTML into downloadable documents
## Best Practices
### CSV Handling
* Always include headers in your data arrays
* Handle special characters (commas, quotes, newlines)
* Use consistent data types within columns
* Validate data before conversion
### Image Conversion
* Ensure images are accessible via public URLs
* Consider file size limitations
* Optimize images before conversion for better performance
* Use appropriate filenames for organization
## Use Cases
* **Data Export**: Export database queries to CSV for Excel
* **Report Generation**: Convert processed data to spreadsheet format
* **Document Creation**: Convert charts and images to PDF
* **Data Migration**: Transform data between different systems
* **Analytics Export**: Export analysis results for stakeholders
* **Backup and Archive**: Convert data to portable formats
* **Integration**: Prepare data for external system import
# Input JSON with Validation
Source: https://carnot.mintlify.app/en/pages/tools/validation/input
Validate your JSON input against a schema
## Overview
The JSON Input Validation tool allows you to validate the input of your JSON data against a specified schema. This ensures that the input meets the expected structure and data types, helping to catch errors early in the process.
## Key Features
* `INPUT_JSON_WITH_VALIDATION`
* Validate your JSON input against a schema.
* Ensure that the input meets the specified structure and data types.
### Example: Validate JSON Input
```yaml theme={null}
- id: success
tool: INPUT_JSON_WITH_VALIDATION
config:
- name: schema
value: |-
{
"type": "object",
"properties": {
"name": { "type": "string" },
"age": { "type": "number" }
},
"required": ["name", "age"]
}
input:
- name: value
value: '{"name": "John", "age": 30}'
- id: failure
tool: INPUT_JSON_WITH_VALIDATION
config:
- name: schema
value: |-
{
"type": "object",
"properties": {
"name": { "type": "string" },
"age": { "type": "number" }
},
"required": ["name", "age"]
}
input:
- name: value
value: '{"name": "John"}'
- id: no_schema
tool: INPUT_JSON_WITH_VALIDATION
input:
- name: value
value: '{"name": "John"}'
```
# Jinba Modules Checker V2
Source: https://carnot.mintlify.app/en/pages/tools/validation/jinba_modules_checker_v2
Advanced rule-based document and data validation with enhanced checking capabilities
## Overview
Jinba Modules Checker V2 is an advanced validation tool that checks files and data against custom rules defined in JSON format. This tool is designed for comprehensive document validation, compliance checking, and data quality assurance with enhanced capabilities over the original checker.
## Key Features
* **Rule-Based Validation**: Define custom validation rules in JSON format
* **Multi-Format Support**: Check PDF, text, JSON, XML, CSV, and DOCX files
* **Reference Integration**: Include company regulations, legal documents, and other reference materials
* **Detailed Results**: Get structured results with status, ranges, and detailed explanations
* **Custom Data Schema**: Define additional data schemas for specialized validation
## Configuration
This tool requires no configuration parameters.
### Example: Document Compliance Checking
```yaml theme={null}
- id: prepare_compliance_rules
name: prepare_compliance_rules
tool: INPUT_JSON
input:
- name: value
value: [
{
"uniqueId": "financial_disclosure_001",
"name": "Currency labeling for financial figures",
"description": "All financial figures must be clearly labeled with a currency denomination. Check that monetary values include proper currency symbols or abbreviations."
},
{
"uniqueId": "date_format_002",
"name": "Consistent date formatting",
"description": "All dates must follow ISO 8601 format (YYYY-MM-DD) or a clearly stated format, applied consistently throughout the document."
},
{
"uniqueId": "signature_requirement_003",
"name": "Authorized signature present",
"description": "The document must contain an authorized signature or digital signature verification."
},
{
"uniqueId": "contact_information_004",
"name": "Valid contact information",
"description": "Contact information must include a valid email format and phone number format."
}
]
- id: check_financial_report
name: check_financial_report
tool: JINBA_MODULES_CHECKER_V2
input:
- name: target_file
value: "path/to/financial_report.pdf"
- name: task
value: "Financial Report Compliance Review"
- name: description
value: "Comprehensive compliance check for quarterly financial report including regulatory requirements, data formatting standards, and authorization requirements."
- name: rules
value: "{{steps.prepare_compliance_rules.result}}"
- name: references
value: [
"path/to/company_financial_policies.pdf",
"path/to/regulatory_guidelines.pdf",
"path/to/previous_approved_reports.pdf"
]
- name: additionalDataSchema
value: {
"financial_metrics": {
"revenue": "number",
"expenses": "number",
"net_income": "number",
"currency": "string"
},
"reporting_period": {
"start_date": "date",
"end_date": "date",
"quarter": "string",
"fiscal_year": "number"
}
}
- id: process_check_results
name: process_check_results
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
from collections import defaultdict
# Get check results
check_results = {{steps.check_financial_report.result}}
# Analyze results by status and category
status_summary = defaultdict(int)
category_summary = defaultdict(list)
critical_issues = []
for result in check_results:
status = result.get("status", "unknown")
status_summary[status] += 1
# Extract category from rule if possible
rule_text = result.get("rule", "")
category = "general"
if "financial" in rule_text.lower():
category = "financial"
elif "date" in rule_text.lower():
category = "formatting"
elif "signature" in rule_text.lower():
category = "authorization"
elif "contact" in rule_text.lower():
category = "contact"
category_summary[category].append({
"rule_id": result.get("uniqueId"),
"status": status,
"reason": result.get("reason"),
"range": result.get("range", [])
})
# Track critical issues (rejected items)
if status == "rejected":
critical_issues.append({
"rule_id": result.get("uniqueId"),
"rule": result.get("rule"),
"reason": result.get("reason"),
"location": result.get("range", []),
"additional_data": result.get("additionalData", {})
})
# Generate comprehensive report
report = {
"validation_summary": {
"total_rules_checked": len(check_results),
"accepted": status_summary.get("accepted", 0),
"rejected": status_summary.get("rejected", 0),
"pending": status_summary.get("pending", 0),
"compliance_score": round((status_summary.get("accepted", 0) / len(check_results)) * 100, 2) if check_results else 0
},
"category_breakdown": dict(category_summary),
"critical_issues": critical_issues,
"recommendations": [],
"detailed_results": check_results
}
# Generate recommendations based on critical issues
if critical_issues:
report["recommendations"].extend([
"Review and address all rejected validation rules",
"Implement document review process for critical compliance items",
"Consider template updates to prevent recurring issues"
])
else:
report["recommendations"].append("Document passes all validation checks")
print(json.dumps(report, indent=2))
```
### Example: Multi-Document Quality Assurance
```yaml theme={null}
- id: setup_qa_workflow
name: setup_qa_workflow
tool: INPUT_JSON_WITH_VALIDATION
input:
- name: value
value: {
"documents": [
{
"file": "path/to/contract_draft.docx",
"type": "legal_contract",
"priority": "high"
},
{
"file": "path/to/technical_spec.pdf",
"type": "technical_documentation",
"priority": "medium"
},
{
"file": "path/to/user_manual.pdf",
"type": "user_documentation",
"priority": "low"
}
],
"universal_rules": [
{
"uniqueId": "spelling_grammar_001",
"name": "Spelling and grammar",
"description": "The document must be free of spelling and grammatical errors."
},
{
"uniqueId": "formatting_consistency_002",
"name": "Formatting consistency",
"description": "Headers, fonts, and formatting must be consistent throughout the document."
}
],
"legal_specific_rules": [
{
"uniqueId": "legal_terminology_001",
"name": "Precise legal terminology",
"description": "Legal terminology must be precise and properly defined."
},
{
"uniqueId": "clause_numbering_002",
"name": "Clause numbering and references",
"description": "Contract clauses must be properly numbered and referenced."
}
]
}
- id: check_legal_contract
name: check_legal_contract
tool: JINBA_MODULES_CHECKER_V2
input:
- name: target_file
value: "{{steps.setup_qa_workflow.result.documents[0].file}}"
- name: task
value: "Legal Contract Quality Assurance"
- name: description
value: "Comprehensive quality check for legal contract including terminology, structure, and compliance requirements."
- name: rules
value: "{{steps.setup_qa_workflow.result.universal_rules}} + {{steps.setup_qa_workflow.result.legal_specific_rules}}"
- name: references
value: [
"path/to/legal_style_guide.pdf",
"path/to/contract_templates.pdf",
"path/to/legal_terminology_reference.pdf"
]
- name: additionalDataSchema
value: {
"contract_parties": {
"party_a": "string",
"party_b": "string",
"party_roles": "array"
},
"key_terms": {
"effective_date": "date",
"termination_date": "date",
"renewal_terms": "string",
"payment_terms": "object"
}
}
- id: check_technical_spec
name: check_technical_spec
tool: JINBA_MODULES_CHECKER_V2
input:
- name: target_file
value: "{{steps.setup_qa_workflow.result.documents[1].file}}"
- name: task
value: "Technical Documentation Review"
- name: description
value: "Quality assurance check for technical specifications focusing on clarity, completeness, and technical accuracy."
- name: rules
value: "{{steps.setup_qa_workflow.result.universal_rules}}"
- name: references
value: [
"path/to/technical_writing_standards.pdf",
"path/to/industry_specifications.pdf"
]
- id: generate_qa_dashboard
name: generate_qa_dashboard
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
from datetime import datetime
# Get results from both checks
legal_results = {{steps.check_legal_contract.result}}
technical_results = {{steps.check_technical_spec.result}}
def analyze_document_results(results, doc_type, priority):
total_checks = len(results)
passed = len([r for r in results if r.get("status") == "accepted"])
failed = len([r for r in results if r.get("status") == "rejected"])
pending = len([r for r in results if r.get("status") == "pending"])
return {
"document_type": doc_type,
"priority": priority,
"total_checks": total_checks,
"passed": passed,
"failed": failed,
"pending": pending,
"success_rate": round((passed / total_checks * 100), 2) if total_checks > 0 else 0,
"critical_issues": [r for r in results if r.get("status") == "rejected"]
}
# Analyze each document
legal_analysis = analyze_document_results(legal_results, "Legal Contract", "high")
technical_analysis = analyze_document_results(technical_results, "Technical Specification", "medium")
# Create QA dashboard
dashboard = {
"qa_report_generated": datetime.now().isoformat(),
"overall_summary": {
"documents_reviewed": 2,
"high_priority_issues": len(legal_analysis["critical_issues"]),
"medium_priority_issues": len(technical_analysis["critical_issues"]),
"average_success_rate": round((legal_analysis["success_rate"] + technical_analysis["success_rate"]) / 2, 2)
},
"document_analysis": [legal_analysis, technical_analysis],
"next_actions": [],
"quality_recommendations": [
"Prioritize resolution of high-priority document issues",
"Implement automated pre-checks for common formatting issues",
"Create document templates incorporating identified best practices",
"Schedule regular QA reviews for critical documents"
]
}
# Generate next actions based on results
if legal_analysis["failed"] > 0:
dashboard["next_actions"].append("Review and revise legal contract based on failed checks")
if technical_analysis["failed"] > 0:
dashboard["next_actions"].append("Update technical specification to address quality issues")
if not dashboard["next_actions"]:
dashboard["next_actions"].append("All documents passed quality checks - proceed with approval process")
print(json.dumps(dashboard, indent=2))
```
### Example: Data Quality Validation Pipeline
```yaml theme={null}
- id: prepare_data_validation_rules
name: prepare_data_validation_rules
tool: INPUT_JSON
input:
- name: value
value: [
{
"uniqueId": "data_completeness_001",
"name": "Data completeness",
"description": "All required fields must contain non-empty values. Check for missing or empty required data fields."
},
{
"uniqueId": "data_format_002",
"name": "Email format",
"description": "Email addresses must follow a valid email format (e.g. user@example.com)."
},
{
"uniqueId": "date_range_003",
"name": "Date range",
"description": "Dates must be within a reasonable range (no future dates where inappropriate) and logically consistent."
},
{
"uniqueId": "numeric_bounds_004",
"name": "Numeric bounds",
"description": "Numeric values must be within expected ranges and contain no invalid characters."
}
]
- id: validate_customer_data
name: validate_customer_data
tool: JINBA_MODULES_CHECKER_V2
input:
- name: target_file
value: "path/to/customer_data.csv"
- name: task
value: "Customer Data Quality Validation"
- name: description
value: "Validate customer data export for completeness, format compliance, and logical consistency before processing."
- name: rules
value: "{{steps.prepare_data_validation_rules.result}}"
- name: references
value: [
"path/to/data_quality_standards.pdf",
"path/to/customer_data_schema.json"
]
- name: additionalDataSchema
value: {
"customer_record": {
"customer_id": "string",
"first_name": "string",
"last_name": "string",
"email": "email",
"phone": "phone",
"registration_date": "date",
"last_activity": "date",
"account_status": "enum"
},
"validation_metrics": {
"total_records": "number",
"valid_records": "number",
"invalid_records": "number",
"completion_percentage": "number"
}
}
- id: generate_data_quality_report
name: generate_data_quality_report
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
from collections import Counter, defaultdict
# Get validation results
validation_results = {{steps.validate_customer_data.result}}
# Analyze data quality metrics
total_rules = len(validation_results)
status_counts = Counter(result.get("status", "unknown") for result in validation_results)
# Group issues by category and severity
issues_by_category = defaultdict(list)
critical_issues = []
for result in validation_results:
rule_text = result.get("rule", "")
status = result.get("status")
# Categorize based on rule content
category = "general"
if "completeness" in rule_text.lower():
category = "data_completeness"
elif "format" in rule_text.lower():
category = "format_validation"
elif "range" in rule_text.lower() or "date" in rule_text.lower():
category = "logical_validation"
elif "numeric" in rule_text.lower():
category = "numeric_validation"
issue_info = {
"rule_id": result.get("uniqueId"),
"status": status,
"reason": result.get("reason"),
"location": result.get("range", []),
"additional_data": result.get("additionalData", {})
}
issues_by_category[category].append(issue_info)
if status == "rejected":
critical_issues.append({
"category": category,
"rule": result.get("rule"),
"reason": result.get("reason"),
"impact": "high" if "high" in rule_text.lower() else "medium"
})
# Calculate data quality score
quality_score = round((status_counts.get("accepted", 0) / total_rules * 100), 2) if total_rules > 0 else 0
# Generate comprehensive data quality report
report = {
"data_quality_summary": {
"overall_quality_score": quality_score,
"total_validation_rules": total_rules,
"passed_validations": status_counts.get("accepted", 0),
"failed_validations": status_counts.get("rejected", 0),
"pending_validations": status_counts.get("pending", 0),
"quality_grade": "A" if quality_score >= 90 else "B" if quality_score >= 80 else "C" if quality_score >= 70 else "F"
},
"category_breakdown": dict(issues_by_category),
"critical_issues": critical_issues,
"data_readiness": "READY" if quality_score >= 85 else "NEEDS_REVIEW" if quality_score >= 70 else "NOT_READY",
"recommendations": [
f"Data quality score: {quality_score}% - {'Excellent' if quality_score >= 90 else 'Good' if quality_score >= 80 else 'Needs Improvement'}",
f"Address {len(critical_issues)} critical data quality issues before proceeding",
"Implement data validation at source to prevent future quality issues",
"Consider automated data cleaning for common format issues"
],
"detailed_validation_results": validation_results
}
print(json.dumps(report, indent=2))
```
## Tips and Best Practices
* **Rule Definition**: Create clear, specific rules with well-defined success criteria
* **Reference Materials**: Include relevant reference documents to improve validation accuracy
* **Structured Results**: Always process results for actionable insights and reporting
* **Incremental Validation**: Start with basic rules and gradually add complexity
* **Rule Organization**: Use consistent `uniqueId` prefixes to group related rules for better result analysis
* **Custom Schemas**: Define additional data schemas for specialized validation needs
* **Error Handling**: Implement proper handling for validation failures and edge cases
* **Performance Optimization**: Consider file size and complexity when setting up validation workflows
* **Documentation**: Maintain clear documentation of validation rules and their purposes
* **Continuous Improvement**: Regularly review and update validation rules based on results
# Markitdown Convert
Source: https://carnot.mintlify.app/en/pages/tools/validation/markitdown_convert
Convert a URL to Markdown
## Overview
The Markitdown Convert tool allows you to convert a URL's HTML content to Markdown format. This is useful for generating Markdown documentation or notes from web pages, making it easier to share and edit content in Markdown format.
## Key Features
* `MARKITDOWN_CONVERT`
* Convert a URL's HTML content to Markdown format.
* Supports various options for customization, such as including or excluding certain elements.
### Example: Convert URL to Markdown
```yaml theme={null}
name: Convert Markdown
steps:
- id: convert
tool: MARKITDOWN_CONVERT
input:
- name: url
value: https://go.microsoft.com/fwlink/?LinkID=521962
```
# Output JSON with Validation
Source: https://carnot.mintlify.app/en/pages/tools/validation/output
Validate your JSON output against a schema
## Overview
The JSON Output Validation tool allows you to validate the output of your JSON data against a specified schema. This ensures that the output meets the expected structure and data types, helping to catch errors early in the process.
## Key Features
* `OUTPUT_JSON_WITH_VALIDATION`
* Validate your JSON output against a schema.
* Ensure that the output meets the specified structure and data types.
### Example: Validate JSON Output
```yaml theme={null}
- id: success
tool: OUTPUT_JSON_WITH_VALIDATION
config:
- name: schema
value: |-
{
"type": "object",
"properties": {
"name": { "type": "string" },
"age": { "type": "number" }
},
"required": ["name", "age"]
}
input:
- name: value
value: '{"name": "John", "age": 30}'
- id: failure
tool: OUTPUT_JSON_WITH_VALIDATION
config:
- name: schema
value: |-
{
"type": "object",
"properties": {
"name": { "type": "string" },
"age": { "type": "number" }
},
"required": ["name", "age"]
}
input:
- name: value
value: '{"name": "John"}'
- id: no_schema
tool: OUTPUT_JSON_WITH_VALIDATION
input:
- name: value
value: '{"name": "John"}'
```
# Privacy Policy
Source: https://carnot.mintlify.app/en/privacy-policy
Jinba Privacy Policy
For the full Privacy Policy, please refer to the document below:
View the full Privacy Policy
# Terms of Use
Source: https://carnot.mintlify.app/en/terms-of-use
Jinba Terms of Use
For the full Terms of Use, please refer to the document below:
View the full Terms of Use
# Anthropic Credentials
Source: https://carnot.mintlify.app/en/pages/credentials/anthropic
Configure your Anthropic API key to use Claude models in your Jinba Flow workflows.
## Prerequisites
* An Anthropic account
* Access to the Anthropic API
## Getting Your API Key
1. Visit the [Anthropic Console](https://console.anthropic.com/)
2. Sign in to your account or create a new one
3. Navigate to the "API Keys" section
4. Click "Create Key" to generate a new API key
5. Copy the generated key (it starts with `sk-ant-`)
## Setting Up in Jinba Flow
1. Go to your workspace settings in Jinba Flow
2. Navigate to the "Secret" section
3. Find "Anthropic" in the list of available credentials
4. Click "Configure" or "Add New"
5. Enter your API key in the designated field
6. Click "Save" to store your credentials
## Usage
Once configured, you can use Anthropic's Claude models in your flows:
* **Claude 3.5 Sonnet** - Latest model with improved reasoning
* **Claude 3 Haiku** - Fast and cost-effective for simple tasks
* **Claude 3 Opus** - Most capable model for complex reasoning
# Chatwork Credentials
Source: https://carnot.mintlify.app/en/pages/credentials/chatwork
Configure your Chatwork API credentials to send messages, manage rooms, and interact with Chatwork from your Jinba Flow workflows.
## Prerequisites
* A Chatwork account
* API access enabled for your account
## Getting Your API Key
1. Sign in to your [Chatwork account](https://www.chatwork.com/)
2. Go to your account settings
3. Navigate to the "API" section
4. Click "Generate API Key" or "Create new API key"
5. Give your API key a descriptive name
6. Copy the generated API key (you'll only see it once)
## API Key Permissions
When creating your API key, you can specify permissions:
### Read Permissions
* **Read room information** - Access room details and member lists
* **Read messages** - Access message history
* **Read tasks** - Access task information
### Write Permissions
* **Send messages** - Send messages to rooms
* **Create tasks** - Create and manage tasks
* **Manage room members** - Add/remove room members
* **Manage room settings** - Update room information
## Setting Up in Jinba Flow
1. Go to your workspace settings in Jinba Flow
2. Navigate to the "Secret" section
3. Find "Chatwork" in the list of available credentials
4. Click "Configure" or "Add New"
5. Enter your Chatwork API key in the designated field
6. Click "Save" to store your credentials
## Usage
Once configured, you can use Chatwork in your flows to:
* Send messages to rooms
* Read message history
* Create and manage tasks
* Get room information and member lists
* Upload files to rooms
* Manage room members and settings
## API Endpoints
### Messages
* Send text messages to rooms
* Send messages with file attachments
* Read message history
* Get message details
### Rooms
* Get room information
* Get room member lists
* Create new rooms
* Update room settings
### Tasks
* Create tasks in rooms
* Update task status
* Get task information
* Assign tasks to members
### Files
* Upload files to rooms
* Get file information
* Download files
# Communication Platforms
Source: https://carnot.mintlify.app/en/pages/credentials/communication-platforms
Configure credentials for various communication platforms to enable messaging and collaboration in your Jinba Flow workflows.
## Available Communication Platforms
### [Slack](/en/pages/credentials/slack)
Set up Slack workspace integration to send messages and manage channels.
### [Discord](/en/pages/credentials/discord)
Configure Discord bot integration for server communication and management.
### [LINE](/en/pages/credentials/line)
Set up LINE messaging platform integration for user communication.
### [Chatwork](/en/pages/credentials/chatwork)
Configure Chatwork API integration for team collaboration and messaging.
## Getting Started
1. Choose the communication platform you want to integrate
2. Follow the platform-specific setup instructions
3. Configure the necessary permissions and webhooks
4. Test your integration to ensure proper functionality
# Discord Credentials
Source: https://carnot.mintlify.app/en/pages/credentials/discord
Configure your Discord bot to send messages, manage channels, and interact with Discord servers from your Jinba Flow workflows.
## Prerequisites
* A Discord account
* Administrator permissions on a Discord server (for bot setup)
## Creating a Discord Bot
1. Visit the [Discord Developer Portal](https://discord.com/developers/applications)
2. Click "New Application"
3. Enter a name for your bot application
4. Click "Create"
## Configuring Your Discord Bot
### Bot Configuration
1. In your application, go to the "Bot" section in the sidebar
2. Click "Add Bot" if you haven't already
3. Give your bot a username
4. Upload an avatar image (optional)
5. Note your **Bot Token** (you'll need this later)
### Bot Permissions
1. In the Bot section, scroll down to "Privileged Gateway Intents"
2. Enable the following intents:
* **Message Content Intent** - Required to read message content
* **Server Members Intent** - Required to access member information
* **Presence Intent** - Optional, for presence updates
### OAuth2 Configuration
1. Go to the "OAuth2" section in the sidebar
2. Click on "URL Generator"
3. Select the following scopes:
* `bot` - Bot permissions
* `applications.commands` - Slash commands (if needed)
4. Select the following bot permissions:
* **Send Messages** - Send messages in channels
* **Send Messages in Threads** - Send messages in threads
* **Read Message History** - Read previous messages
* **Use Slash Commands** - Use slash commands (if needed)
* **Manage Messages** - Delete and manage messages
* **Embed Links** - Send embedded messages
* **Attach Files** - Send file attachments
* **Read Message History** - Access message history
* **Add Reactions** - Add reactions to messages
* **Use External Emojis** - Use emojis from other servers
## Setting Up in Jinba Flow
1. Go to your workspace settings in Jinba Flow
2. Navigate to the "Secret" section
3. Find "Discord" in the list of available credentials
4. Click "Configure" or "Add New"
5. Enter your Discord bot credentials:
* **Bot Token**: From your Discord application's Bot section
* **Client ID**: From your Discord application's General Information
* **Client Secret**: From your Discord application's General Information
6. Click "Save" to store your credentials
## Inviting Your Bot to a Server
1. Go to the "OAuth2" > "URL Generator" in your Discord application
2. Select the scopes and permissions mentioned above
3. Copy the generated URL
4. Open the URL in a browser
5. Select the server where you want to add the bot
6. Review the permissions and click "Authorize"
## Usage
Once configured, you can use Discord in your flows to:
* Send messages to channels, direct messages, or threads
* Read messages and user information
* Manage channels and roles
* Upload files and attachments
* Respond to events and interactions
* Use slash commands (if configured)
# E-commerce Platforms
Source: https://carnot.mintlify.app/en/pages/credentials/ecommerce-platforms
Configure credentials for e-commerce platforms to automate your online business operations and manage products, orders, and customers.
## Available E-commerce Platforms
### [Netsea](/en/pages/credentials/netsea)
Set up Netsea marketplace integration for product and order management.
### [Shopify](/en/pages/credentials/shopify)
Configure Shopify store integration for comprehensive e-commerce automation.
## Getting Started
1. Choose the e-commerce platform you want to integrate
2. Follow the platform-specific setup instructions
3. Configure the necessary API permissions
4. Test your integration to ensure proper functionality
# Gemini Credentials
Source: https://carnot.mintlify.app/en/pages/credentials/gemini
Configure your Google Gemini integration to access advanced AI capabilities from your Jinba Flow workflows.
## Prerequisites
* A Google Cloud account
* Access to Google AI Studio or Google Cloud Console
## Getting Started with Gemini
### Option 1: Google AI Studio (Recommended for beginners)
1. Visit [Google AI Studio](https://aistudio.google.com/)
2. Sign in with your Google account
3. Navigate to the "Get API key" section
4. Click "Create API key"
5. Copy your API key (starts with `AIza`)
### Option 2: Google Cloud Console (For advanced users)
1. Go to [Google Cloud Console](https://console.cloud.google.com/)
2. Create a new project or select an existing one
3. Enable the Gemini API:
* Go to "APIs & Services" > "Library"
* Search for "Gemini API"
* Click "Enable"
4. Create credentials:
* Go to "APIs & Services" > "Credentials"
* Click "Create Credentials" > "API Key"
* Copy your API key
## API Key Security
* **Never share your API key publicly**
* **Store it securely in environment variables**
* **Use the key only in trusted applications**
* **Monitor your usage in Google Cloud Console**
## Setting Up in Jinba Flow
1. Go to your workspace settings in Jinba Flow
2. Navigate to the "Secret" section
3. Find "Gemini" in the list of available credentials
4. Click "Configure" or "Add New"
5. Enter your Gemini credentials:
* **API Key**: Your Google AI Studio or Cloud Console API key
6. Click "Save" to store your credentials
## Available Models
### Gemini Pro
* **Best for**: General text generation, analysis, and reasoning
* **Use cases**: Content creation, summarization, Q\&A
### Gemini Pro Vision
* **Best for**: Image analysis and multimodal tasks
* **Use cases**: Image description, visual analysis, document processing
### Gemini Flash
* **Best for**: Fast, efficient text generation
* **Use cases**: Quick responses, real-time applications
## Usage Examples
Once configured, you can use Gemini in your flows to:
* Generate creative content and text
* Analyze and summarize documents
* Answer questions based on context
* Process and understand images
* Create structured data from unstructured text
* Translate content between languages
# GitHub Credentials
Source: https://carnot.mintlify.app/en/pages/credentials/github
Configure your GitHub integration to manage repositories, issues, pull requests, and other GitHub resources from your Jinba Flow workflows.
## Prerequisites
* A GitHub account
* Access to the repositories you want to manage
## Creating a Personal Access Token
1. Visit [GitHub.com](https://github.com) and sign in to your account
2. Click on your profile picture in the top right corner
3. Select "Settings" from the dropdown menu
4. In the left sidebar, click "Developer settings"
5. Click "Personal access tokens"
6. Select "Tokens (classic)" or "Fine-grained tokens"
## Choosing the Right Token Type
### Personal Access Token (Classic)
* **Use for**: Full repository access and legacy integrations
* **Scopes needed**:
* `repo` - Full control of private repositories
* `public_repo` - Access public repositories only
* `workflow` - Update GitHub Action workflows
* `admin:org` - Full control of organizations (if needed)
### Fine-grained Personal Access Token
* **Use for**: More secure, granular permissions
* **Repository access**: Select specific repositories or all repositories
* **Permissions needed**:
* Repository permissions:
* `Issues`: Read and write
* `Pull requests`: Read and write
* `Contents`: Read and write
* `Metadata`: Read-only
## Generating Your Token
### For Classic Tokens:
1. Click "Generate new token (classic)"
2. Give your token a descriptive name (e.g., "Jinba Flow Integration")
3. Set an expiration date (recommended: 90 days or less)
4. Select the required scopes:
* ✅ `repo` (Full control of private repositories)
* ✅ `workflow` (Update GitHub Action workflows)
5. Click "Generate token"
6. **Important**: Copy the token immediately - you won't be able to see it again!
### For Fine-grained Tokens:
1. Click "Generate new token"
2. Give your token a descriptive name
3. Set an expiration date
4. Select "All repositories" or specific repositories
5. Under "Repository permissions", set:
* Issues: Read and write
* Pull requests: Read and write
* Contents: Read and write
* Metadata: Read-only
6. Click "Generate token"
7. **Important**: Copy the token immediately - you won't be able to see it again!
## Setting Up in Jinba Flow
1. Go to your workspace settings in Jinba Flow
2. Navigate to the "Secret" section
3. Find "GitHub" in the list of available credentials
4. Click "Configure" or "Add New"
5. Enter your GitHub credentials:
* **Token**: Your personal access token (starts with `ghp_` for classic tokens or `github_pat_` for fine-grained tokens)
* **Username**: Your GitHub username
6. Click "Save" to store your credentials
## Usage
Once configured, you can use GitHub in your flows to:
* List and create issues
* Manage pull requests
* Read repository contents
* Update files and create commits
* Manage workflows and actions
* Interact with GitHub's API
# Google OAuth Credentials
Source: https://carnot.mintlify.app/en/pages/credentials/google-oauth
Configure Google OAuth to access Google services like Gmail, Google Drive, Google Calendar, and other Google APIs from your Jinba Flow workflows.
## Prerequisites
* A Google account
## Setting Up in Jinba Flow
1. Go to your workspace settings in Jinba Flow
2. Navigate to the "Secret" section
3. Find "Google OAuth" in the list of available credentials
4. Click "Configure" or "Add New"
5. Follow the authentication flow:
* Click "Connect with Google"
* Sign in with your Google account
* Review and accept the requested permissions
* You'll be redirected back to Jinba Flow
* Your OAuth tokens will be securely stored
## OAuth Flow
When you first use Google services in your flows:
1. Jinba Flow will redirect you to Google's OAuth consent screen
2. Sign in with your Google account
3. Review and accept the requested permissions
4. You'll be redirected back to Jinba Flow
5. Your OAuth tokens will be securely stored
## Available Google Services
### Gmail
* Send emails
* Read email messages
* Search emails
* Manage labels and folders
* Handle email attachments
### Google Drive
* Upload and download files
* Create and manage folders
* Share files and folders
* Get file metadata
* Search for files
### Google Calendar
* Create and update events
* Read calendar events
* Manage calendar settings
* Handle recurring events
* Send calendar invitations
### Google Sheets
* Read and write spreadsheet data
* Create new spreadsheets
* Update cell values
* Format cells and ranges
* Manage sheets and tabs
### Google Docs
* Create and update documents
* Read document content
* Format text and paragraphs
* Add comments and suggestions
* Export documents
# Grok Credentials
Source: https://carnot.mintlify.app/en/pages/credentials/grok
Configure your xAI Grok integration to access advanced AI capabilities from your Jinba Flow workflows.
## Prerequisites
* An xAI account
* Access to the Grok API (currently in limited access)
## Getting Started with Grok
### Access Requirements
Grok API is currently in limited access. To get access:
1. Visit the [xAI website](https://x.ai/)
2. Sign up for an account if you don't have one
3. Apply for API access through the developer portal
4. Wait for approval from xAI team
5. Once approved, you'll receive your API credentials
### API Key Setup
1. After receiving approval, log into your xAI developer account
2. Navigate to the API section
3. Generate a new API key
4. Copy your API key for use in Jinba Flow
## API Key Security
* **Never share your API key publicly**
* **Store it securely in environment variables**
* **Use the key only in trusted applications**
* **Monitor your usage in the xAI dashboard**
## Setting Up in Jinba Flow
1. Go to your workspace settings in Jinba Flow
2. Navigate to the "Secret" section
3. Find "Grok" in the list of available credentials
4. Click "Configure" or "Add New"
5. Enter your Grok credentials:
* **API Key**: Your xAI Grok API key
6. Click "Save" to store your credentials
## Available Models
### Grok-1
* **Best for**: General text generation and reasoning
* **Use cases**: Content creation, analysis, Q\&A
### Grok-1.5
* **Best for**: Enhanced reasoning and complex tasks
* **Use cases**: Advanced analysis, problem solving
## Usage Examples
Once configured, you can use Grok in your flows to:
* Generate creative content and text
* Analyze complex documents and data
* Answer questions with real-time information
* Perform advanced reasoning tasks
* Create structured data from unstructured text
* Generate code and technical solutions
# HubSpot Credentials
Source: https://carnot.mintlify.app/en/pages/credentials/hubspot
Set up a HubSpot access token for CRM contact, company, deal, and owner access, and for logging notes and tasks
Configure a HubSpot access token to manage CRM contacts, read deals, companies, and owners, and log notes and tasks from your Jinba Flow workflows.
## Prerequisites
* A HubSpot account with access to the CRM
* Permission to create a service key or a private app in that account
## Creating a HubSpot Access Token
HubSpot issues two kinds of static token that both work here. They produce the same `Bearer` token, so pick whichever your account offers.
**Private apps have moved.** HubSpot reorganised its developer platform and
private apps now live under **Legacy apps**. Existing private app tokens keep
working — no sunset has been announced — but new integrations are steered
towards **service keys**, which are purpose-built for REST API access.
### Option A: Service key (recommended)
1. Sign in to HubSpot
2. Navigate to **Development** → **Keys** → **Service keys** (or **Settings** → **Integrations** → **Service Keys**)
3. Click **Create service key** and give it a name (e.g. `Jinba Flow`)
4. Click **Add new scope** and select `crm.objects.contacts.read`, `crm.objects.contacts.write`, `crm.objects.deals.read`, `crm.objects.companies.read`, and `crm.objects.owners.read`
5. Click **Create**, then copy the generated token
Service keys are currently in public beta. They cannot be used for webhooks or
UI extensions — REST API requests only, which is all these tools need.
### Option B: Legacy private app
1. Sign in to HubSpot
2. Navigate to **Development** → **Legacy apps** (this is where **Integrations → Private Apps** used to be)
3. Create a legacy app of type **Private**, or open an existing one
4. On the **Scopes** tab, select `crm.objects.contacts.read`, `crm.objects.contacts.write`, `crm.objects.deals.read`, `crm.objects.companies.read`, and `crm.objects.owners.read`
5. Open the **Auth** tab, click **Show token**, and copy it
## Setting Up in Jinba Flow
1. Go to your workspace settings in Jinba Flow
2. Navigate to the **Secrets** section
3. Click **Add secret** and choose **HUBSPOT\_ACCESS\_TOKEN** as the type
4. Enter a name and paste the token into **access\_token**
5. Click **Save**
The saved secret then appears in the **Access Token** dropdown on any HubSpot step.
## Required Scopes
| Scope | Needed for |
| - | - |
| `crm.objects.contacts.read` | `HUBSPOT_GET_CONTACT`, and the lookup half of `HUBSPOT_UPSERT_CONTACT` |
| `crm.objects.contacts.write` | `HUBSPOT_UPSERT_CONTACT`, `HUBSPOT_CREATE_NOTE`, `HUBSPOT_CREATE_TASK` |
| `crm.objects.deals.read` | `HUBSPOT_GET_DEAL`, `HUBSPOT_SEARCH_DEALS` |
| `crm.objects.companies.read` | `HUBSPOT_GET_COMPANY` |
| `crm.objects.owners.read` | `HUBSPOT_GET_OWNER`, `HUBSPOT_LIST_OWNERS` |
HubSpot's Engagements API documents `crm.objects.contacts.write` as the scope
for creating notes and tasks. If the scope picker in your account offers
object-specific engagement scopes instead, grant those. We do not grant
`crm.objects.deals.write`: the note and task tools only associate records with
a deal and never edit the deal itself, so leaving it off keeps the token unable
to modify deals. If a note or task create fails with `HTTP 403` even so, check
which scope the error message names before adding anything.
A step that fails with `HTTP 401` or `HTTP 403` almost always means one of these scopes is missing rather than the token being wrong.
## Related Docs
* [HubSpot Tools](/en/pages/tools/productivity/hubspot)
* [HubSpot: legacy private apps](https://developers.hubspot.com/docs/apps/legacy-apps/private-apps/overview)
* [HubSpot: service keys](https://developers.hubspot.com/docs/apps/developer-platform/build-apps/authentication/account-service-keys)
# Overview
Source: https://carnot.mintlify.app/en/pages/credentials/index
Configure API keys and OAuth connections for external services
## Overview
Jinba Flow supports integration with various external services through API keys and OAuth connections. This section provides detailed instructions for setting up credentials for each supported service.
## Available Credentials
### AI Services
Configure credentials for AI and language model services:
* [Anthropic](/en/pages/credentials/anthropic) - Claude API integration for advanced AI capabilities
* [OpenAI](/en/pages/credentials/openai) - GPT models and OpenAI services integration
* [Llama](/en/pages/credentials/llama) - Local and cloud Llama models integration
* [Gemini](/en/pages/credentials/gemini) - Google Gemini AI integration
* [Grok](/en/pages/credentials/grok) - xAI Grok integration
### Communication Platforms
Set up integrations with messaging and collaboration platforms:
* [Slack](/en/pages/credentials/slack) - Slack workspace integration for team communication
* [Discord](/en/pages/credentials/discord) - Discord bot integration for community engagement
* [LINE](/en/pages/credentials/line) - LINE messaging platform integration
* [Intercom](/en/pages/credentials/intercom) - Intercom access token for messaging and customer events
* [Chatwork](/en/pages/credentials/chatwork) - Chatwork collaboration tool integration
* [Twilio](/en/pages/credentials/twilio) - Twilio credentials for SMS/WhatsApp messaging
### Productivity Tools
Connect with productivity and workflow management tools:
* [Jira](/en/pages/credentials/jira) - Jira Cloud API token for issue and project management
* [Notion](/en/pages/credentials/notion) - Notion workspace integration for knowledge management
* [Google OAuth](/en/pages/credentials/google-oauth) - Google services integration (Gmail, Sheets, Calendar, etc.)
* [GitHub](/en/pages/credentials/github) - GitHub integration for repository management and automation
* [SmartHR](/en/pages/credentials/smarthr) - SmartHR API credentials for employee (crew) management
* [HubSpot](/en/pages/credentials/hubspot) - HubSpot access token for CRM contact management
### E-commerce Platforms
Integrate with e-commerce and marketplace platforms:
* [Netsea](/en/pages/credentials/netsea) - Netsea marketplace integration
* [Shopify](/en/pages/credentials/shopify) - Shopify store integration
### AI/ML Services
Configure credentials for specialized AI and ML services:
* [Luma](/en/pages/credentials/luma) - Luma AI services integration
* [Kling](/en/pages/credentials/kling) - Kling AI platform integration
## Setting Up Credentials
Follow these general steps to configure credentials for any service:
1. Navigate to your workspace settings in Jinba Flow
2. Go to the "Credentials" or "Secrets" section
3. Select the service you want to configure from the list
4. Follow the specific instructions provided in each service's documentation page
5. Enter your API key, OAuth credentials, or other required information
6. Test the connection to ensure it's working properly
7. Save your credentials securely
## Security Best Practices
* **Never share your API keys** - Keep your credentials private and secure
* **Use environment variables** - For production deployments, consider using secure environment variable storage
* **Rotate keys regularly** - Periodically update your API keys for enhanced security
* **Review access permissions** - Regularly audit which services have access to your credentials
* **Use OAuth when available** - OAuth provides more secure authentication than API keys for supported services
## Need Help?
If you encounter issues setting up credentials:
* Check the specific service's documentation page for detailed instructions
* Verify that your API keys are valid and have the correct permissions
* Ensure your workspace has the necessary permissions to access external services
* Contact support if you need additional assistance
# Intercom Credentials
Source: https://carnot.mintlify.app/en/pages/credentials/intercom
Set up Intercom credentials for messaging and customer events
Configure Intercom credentials to send messages, create contacts, and track events from Jinba Flow.
## Required Credentials
* **Access Token**
You can create and manage access tokens in the [Intercom Developer Hub](https://developers.intercom.com/).
## Setup
1. Sign in to your Intercom workspace
2. Open the [Intercom Developer Hub](https://developers.intercom.com/)
3. Create or select an app for your workspace
4. Generate an access token with the scopes required by your workflow
5. In Jinba Flow, open your workspace secrets settings
6. Add an Intercom credential and save the access token
## Notes
* Some example flows also use an Intercom admin ID for reply operations
* Keep access tokens private and rotate them when needed
## Related Docs
* [Intercom Tool](/en/pages/tools/communication/intercom)
* [Communication Platforms](/en/pages/credentials/communication-platforms)
# Kling Credentials
Source: https://carnot.mintlify.app/en/pages/credentials/kling
Configure your Kling AI API credentials to use Kling's AI services and models from your Jinba Flow workflows.
## Prerequisites
* A Kling AI account
* Access to Kling AI API
## Getting Your API Key
1. Visit the [Kling AI website](https://kling.ai/)
2. Sign in to your account or create a new one
3. Navigate to your account settings or API section
4. Click "Generate API Key" or "Create new API key"
5. Give your API key a descriptive name
6. Copy the generated API key (you'll only see it once)
## API Features
Kling AI provides various AI-powered services:
### Text Generation
* **Text completion** - Generate text continuations
* **Text summarization** - Summarize long documents
* **Text classification** - Categorize text content
* **Text translation** - Translate between languages
### Conversational AI
* **Chat completion** - Interactive conversations
* **Context-aware responses** - Maintain conversation context
* **Multi-turn dialogues** - Handle complex conversations
* **Personality customization** - Customize AI personality
### Content Generation
* **Creative writing** - Generate stories, articles, and content
* **Code generation** - Generate code snippets and functions
* **Documentation** - Create technical documentation
* **Email composition** - Draft professional emails
## Setting Up in Jinba Flow
1. Go to your workspace settings in Jinba Flow
2. Navigate to the "Secret" section
3. Find "Kling" in the list of available credentials
4. Click "Configure" or "Add New"
5. Enter your Kling AI API key in the designated field
6. Click "Save" to store your credentials
## Usage
Once configured, you can use Kling AI in your flows to:
* Generate text completions and responses
* Create conversational AI experiences
* Summarize documents and content
* Translate text between languages
* Generate creative content and stories
* Create technical documentation
* Draft professional communications
## API Endpoints
### Text Generation
* **Complete text** - Generate text continuations
* **Summarize text** - Create document summaries
* **Classify text** - Categorize content
* **Translate text** - Convert between languages
### Chat and Conversation
* **Chat completion** - Interactive conversations
* **Context management** - Handle conversation context
* **Personality settings** - Customize AI behavior
* **Multi-turn dialogue** - Complex conversation handling
### Content Creation
* **Creative writing** - Generate stories and articles
* **Code generation** - Create code snippets
* **Documentation** - Generate technical docs
* **Email drafting** - Compose professional emails
## Model Parameters
### Text Generation
* **Temperature** - Controls randomness (0.0 to 1.0)
* **Max tokens** - Maximum response length
* **Top p** - Nucleus sampling parameter
* **Frequency penalty** - Reduce repetitive content
* **Presence penalty** - Encourage diverse topics
### Chat Parameters
* **System prompt** - Define AI behavior and role
* **User message** - Input from the user
* **Conversation history** - Previous messages
* **Response format** - Structured or free-form
### Content Parameters
* **Style** - Writing style and tone
* **Length** - Desired output length
* **Format** - Output format (markdown, plain text, etc.)
* **Language** - Target language for generation
# LINE Credentials
Source: https://carnot.mintlify.app/en/pages/credentials/line
Configure your LINE channel to send messages, manage webhooks, and interact with LINE users from your Jinba Flow workflows.
## Prerequisites
* A LINE account
* Access to LINE Developers Console
## Creating a LINE Channel
1. Visit the [LINE Developers Console](https://developers.line.biz/)
2. Sign in with your LINE account
3. Click "Create a new channel"
4. Choose "Messaging API" as the channel type
5. Fill in the required information:
* **Channel name**: A name for your channel
* **Channel description**: Brief description of your bot
* **Category**: Select an appropriate category
* **Subcategory**: Choose a relevant subcategory
6. Click "Create"
## Configuring Your LINE Channel
### Basic Settings
1. In your channel settings, go to the "Basic" tab
2. Note your **Channel ID** and **Channel Secret** (you'll need these later)
3. Upload a channel icon (optional)
4. Add a channel description
### Messaging API Settings
1. Go to the "Messaging API" tab
2. Note your **Channel Access Token** (you'll need this later)
3. Set up your webhook URL (if needed for receiving messages)
4. Enable "Use webhook" if you want to receive messages
### QR Code and Add Friends
1. In the "Messaging API" tab, find the QR code
2. Users can scan this QR code to add your bot as a friend
3. Alternatively, you can create a "Add friends" URL
## Setting Up in Jinba Flow
1. Go to your workspace settings in Jinba Flow
2. Navigate to the "Secret" section
3. Find "LINE" in the list of available credentials
4. Click "Configure" or "Add New"
5. Enter your LINE channel credentials:
* **Channel ID**: From your LINE channel's Basic settings
* **Channel Secret**: From your LINE channel's Basic settings
* **Channel Access Token**: From your LINE channel's Messaging API settings
6. Click "Save" to store your credentials
## Webhook Configuration (Optional)
If you want to receive messages from LINE users:
1. In your LINE channel's "Messaging API" settings
2. Enable "Use webhook"
3. Set the webhook URL to your Jinba Flow webhook endpoint
4. Verify the webhook URL is accessible from LINE's servers
## Usage
Once configured, you can use LINE in your flows to:
* Send text messages to users
* Send rich messages (images, videos, audio, files)
* Send location messages
* Send sticker messages
* Send template messages (buttons, carousel, etc.)
* Get user profile information
* Respond to user messages via webhook
## Message Types
### Text Messages
* Simple text messages
* Support for emoji and Unicode characters
### Rich Messages
* **Image messages**: Send images with preview text
* **Video messages**: Send videos with preview text
* **Audio messages**: Send audio files
* **File messages**: Send any file type
### Template Messages
* **Button template**: Text with action buttons
* **Confirm template**: Yes/No confirmation
* **Carousel template**: Multiple items with images and buttons
* **Image carousel template**: Multiple images with buttons
# Llama Credentials
Source: https://carnot.mintlify.app/en/pages/credentials/llama
Configure your Llama model credentials to use local or cloud-based Llama models in your Jinba Flow workflows.
## Prerequisites
* Access to Llama models (local or cloud-based)
* API key for cloud Llama services (if using cloud)
## Getting Your API Key (Cloud Services)
### For Cloud Llama Services (e.g., Replicate, Ollama Cloud)
1. Visit your chosen Llama cloud service provider
2. Sign in to your account or create a new one
3. Navigate to the API keys or credentials section
4. Generate a new API key
5. Copy the generated key
### For Local Llama Models
If you're running Llama models locally (e.g., with Ollama), you typically don't need an API key, but you'll need to configure the connection details.
## Setting Up in Jinba Flow
### Cloud-based Llama
1. Go to your workspace settings in Jinba Flow
2. Navigate to the "Secret" section
3. Find "Llama" in the list of available credentials
4. Click "Configure" or "Add New"
5. Enter your API key in the designated field
6. Select your preferred Llama model version
7. Click "Save" to store your credentials
### Local Llama Models
1. Go to your workspace settings in Jinba Flow
2. Navigate to the "Secret" section
3. Find "Llama" in the list of available credentials
4. Click "Configure" or "Add New"
5. Select "Local" as the connection type
6. Enter your local server URL (e.g., `http://localhost:11434`)
7. Specify the model name you have installed
8. Click "Save" to store your credentials
## Available Models
### Llama 3 Models
* **Llama 3.1 8B** - Fast and efficient for most tasks
* **Llama 3.1 70B** - More capable for complex reasoning
* **Llama 3.1 405B** - Most capable model (cloud only)
### Llama 2 Models
* **Llama 2 7B** - Lightweight model
* **Llama 2 13B** - Balanced performance
* **Llama 2 70B** - High performance
## Local Setup (Optional)
If you want to run Llama models locally:
1. Install [Ollama](https://ollama.ai/)
2. Pull your preferred model: `ollama pull llama3.1:8b`
3. Start the Ollama service: `ollama serve`
4. Configure the local connection in Jinba Flow
# Luma Credentials
Source: https://carnot.mintlify.app/en/pages/credentials/luma
Configure your Luma AI API credentials to generate videos, images, and use other Luma AI services from your Jinba Flow workflows.
## Prerequisites
* A Luma AI account
* Access to Luma AI API
## Getting Your API Key
1. Visit the [Luma AI website](https://lumalabs.ai/)
2. Sign in to your account or create a new one
3. Navigate to your account settings or API section
4. Click "Generate API Key" or "Create new API key"
5. Give your API key a descriptive name
6. Copy the generated API key (you'll only see it once)
## API Features
Luma AI provides various AI-powered services:
### Video Generation
* **Text-to-video** - Generate videos from text descriptions
* **Image-to-video** - Create videos from images
* **Video editing** - Modify existing videos
* **Video enhancement** - Improve video quality
### Image Generation
* **Text-to-image** - Generate images from text descriptions
* **Image editing** - Modify existing images
* **Image enhancement** - Improve image quality
* **Style transfer** - Apply artistic styles to images
### 3D Generation
* **Text-to-3D** - Generate 3D models from text
* **Image-to-3D** - Create 3D models from images
* **3D editing** - Modify 3D models
## Setting Up in Jinba Flow
1. Go to your workspace settings in Jinba Flow
2. Navigate to the "Secret" section
3. Find "Luma" in the list of available credentials
4. Click "Configure" or "Add New"
5. Enter your Luma AI API key in the designated field
6. Click "Save" to store your credentials
## Usage
Once configured, you can use Luma AI in your flows to:
* Generate videos from text descriptions
* Create images from text prompts
* Generate 3D models and assets
* Edit and enhance existing media
* Apply AI-powered effects and styles
* Convert between different media formats
## API Endpoints
### Video Generation
* **Create video** - Generate videos from text or images
* **Edit video** - Modify existing videos
* **Enhance video** - Improve video quality
* **Get video status** - Check generation progress
### Image Generation
* **Create image** - Generate images from text
* **Edit image** - Modify existing images
* **Enhance image** - Improve image quality
* **Style transfer** - Apply artistic styles
### 3D Generation
* **Create 3D model** - Generate 3D models from text or images
* **Edit 3D model** - Modify existing 3D models
* **Export 3D model** - Export in various formats
## Generation Parameters
### Video Generation
* **Prompt** - Text description of the desired video
* **Duration** - Length of the generated video
* **Resolution** - Video resolution (e.g., 1920x1080)
* **Style** - Visual style and aesthetic
* **Seed** - Random seed for reproducible results
### Image Generation
* **Prompt** - Text description of the desired image
* **Resolution** - Image resolution
* **Style** - Artistic style to apply
* **Aspect ratio** - Image aspect ratio
* **Quality** - Generation quality level
### 3D Generation
* **Prompt** - Text description of the desired 3D model
* **Complexity** - Model complexity level
* **Format** - Output format (OBJ, GLB, etc.)
* **Texture quality** - Texture resolution
# Netsea Credentials
Source: https://carnot.mintlify.app/en/pages/credentials/netsea
Configure your Netsea API credentials to manage products, orders, and interact with the Netsea marketplace from your Jinba Flow workflows.
## Prerequisites
* A Netsea seller account
* API access enabled for your account
## Getting Your API Credentials
1. Sign in to your [Netsea seller account](https://www.netsea.jp/)
2. Navigate to your seller dashboard
3. Go to the "API Settings" or "Developer" section
4. Click "Generate API Key" or "Create new API key"
5. Give your API key a descriptive name
6. Copy the generated **API Key** and **API Secret** (you'll only see them once)
## API Permissions
When creating your API key, you can specify permissions:
### Read Permissions
* **Read product information** - Access product details and inventory
* **Read order information** - Access order history and details
* **Read customer information** - Access customer data
* **Read sales reports** - Access sales and analytics data
### Write Permissions
* **Create and update products** - Manage product listings
* **Update inventory** - Modify stock levels
* **Process orders** - Update order status
* **Manage shipping** - Update shipping information
## Setting Up in Jinba Flow
1. Go to your workspace settings in Jinba Flow
2. Navigate to the "Secret" section
3. Find "Netsea" in the list of available credentials
4. Click "Configure" or "Add New"
5. Enter your Netsea API credentials:
* **API Key**: From your Netsea API settings
* **API Secret**: From your Netsea API settings
* **Seller ID**: Your Netsea seller identifier
6. Click "Save" to store your credentials
## Usage
Once configured, you can use Netsea in your flows to:
* Create and update product listings
* Manage inventory levels
* Process and update orders
* Generate sales reports
* Handle customer inquiries
* Manage shipping and fulfillment
## API Endpoints
### Products
* Create new product listings
* Update existing product information
* Manage product categories and attributes
* Handle product images and descriptions
* Update inventory levels
### Orders
* Retrieve order information
* Update order status
* Process order fulfillment
* Handle order cancellations
* Manage shipping information
### Customers
* Access customer information
* Handle customer inquiries
* Manage customer accounts
* Process customer feedback
### Analytics
* Generate sales reports
* Access performance metrics
* Track inventory movements
* Analyze customer behavior
# Notion Credentials
Source: https://carnot.mintlify.app/en/pages/credentials/notion
The Notion tools in Jinba Flow support three connection methods. Pick the one that fits your use case.
| Method | Secret type | Acts as | Access scope |
| - | - | - | - |
| Internal integration | `NOTION_API` | The connection (bot) | Only pages the connection was added to |
| Personal access token (PAT) | `NOTION_API` | The token's creator | Everything the creator can see (no page sharing needed) |
| OAuth (public integration) | `NOTION_OAUTH` | A bot under the authorizing user | Only pages picked on the consent screen |
## Internal integration
The classic method: one workspace-wide token.
1. Visit the [Notion Developers page](https://www.notion.so/my-integrations) (workspace owner permission required)
2. Click "New integration", set a name and the associated workspace, and create it
3. Copy the **Internal Integration Token** from the integration settings
4. In Jinba Flow, go to workspace settings → "Secret" and create a secret of type `NOTION_API` with the token
5. In Notion, share the pages/databases your flows need with the integration ("…" menu on the page → "Connections" → add the integration; child pages inherit it)
Only shared pages are accessible. Access survives even if the person who shared them leaves.
## Personal access token (PAT)
A token each user issues under their own permissions (added by Notion in May 2026). No page sharing is needed — it can access everything its creator can see.
1. Create a "Personal access token" on the [Notion Developers page](https://www.notion.so/my-integrations)
2. Choose an expiration (7 days to 1 year; default 1 year)
3. Register the token as a secret of type `NOTION_API`, the same type as an internal integration token
The header format is identical to internal integration tokens, so no extra Jinba Flow configuration is needed.
**To run flows per-user**, combine PATs with personal secrets: each member registers their own PAT as a personal secret (type `NOTION_API`) and the tool's Token field is set to "Use personal secret" — each runner's own PAT is then injected.
Notes:
* Tokens **always expire**. Re-issue and replace them before the expiration date
* A token is revoked when its creator leaves the Notion workspace
* Notion admins can list and revoke PATs, and some plans can restrict who may create them
## OAuth (public integration)
Users connect by logging in to Notion in the browser. Access is limited to the pages picked on the consent screen's page picker.
Connecting Notion **requires an organization-registered Notion OAuth app** (organization settings → OAuth apps; only organization OWNERs can configure it). There is no shared app, so Notion does not appear in the connection list until one is registered, and personal connections are not available.
### Registering the organization OAuth app (organization OWNER)
1. Create an integration on the [Notion Developers page](https://www.notion.so/my-integrations) and configure it as a **Public integration**
* We recommend "**Selected workspaces only**" for distribution (fixed at creation time and cannot be changed later)
* Enable the Read/Update/Insert content capabilities your tools need
2. In the integration's **OAuth Domain & URIs** settings, register the **per-organization callback URL** shown on Jinba Flow's organization settings → OAuth apps page as a Redirect URI
3. Register the integration's `client_id` / `client_secret` in Jinba Flow under organization settings → OAuth apps, provider **Notion**
### Connecting as a user
1. Open the "OAuth" tab from workspace settings → Secret (or the "+" on a tool's Token field) and pick **Notion**
2. Log in on Notion's consent screen and use the page picker to select **the pages your flows may access**
3. On completion a secret of type `NOTION_OAUTH` is created. In a Notion tool, select **OAuth** as the authentication method and choose the secret in the **OAuth token** field
Notes:
* Only the pages selected on the consent screen are accessible. To widen access, reconnect, or add the integration from the page's "Connections" menu in Notion
* The token is static. If access stops working (e.g. the authorization was revoked), reconnect
## Using the tools
Notion tools expose separate fields for the two methods: **API token** uses `NOTION_API` (internal token / PAT), while **OAuth** uses `NOTION_OAUTH` (OAuth connection). See the [Notion tools](/en/pages/tools/productivity/notion) page for details.
**Note**: Treat tokens as sensitive information and never commit them to public repositories.
# OpenAI Credentials
Source: https://carnot.mintlify.app/en/pages/credentials/openai
Configure your OpenAI API key to use GPT models and other OpenAI services in your Jinba Flow workflows.
## Prerequisites
* An OpenAI account
* Access to the OpenAI API
## Getting Your API Key
1. Visit the [OpenAI Platform](https://platform.openai.com/)
2. Sign in to your account or create a new one
3. Navigate to the "API Keys" section in your account settings
4. Click "Create new secret key"
5. Give your key a descriptive name
6. Copy the generated key (it starts with `sk-`)
## Setting Up in Jinba Flow
1. Go to your workspace settings in Jinba Flow
2. Navigate to the "Secret" section
3. Find "OpenAI" in the list of available credentials
4. Click "Configure" or "Add New"
5. Enter your API key in the designated field
6. Click "Save" to store your credentials
## Available Models
Once configured, you can use various OpenAI models in your flows:
### GPT Models
* **GPT-4 Turbo** - Latest model with improved performance
* **GPT-4** - Powerful model for complex tasks
* **GPT-3.5 Turbo** - Cost-effective for most use cases
### Other Services
* **DALL-E** - Image generation
* **Whisper** - Speech-to-text transcription
* **Embeddings** - Text embedding models
# Productivity Tools
Source: https://carnot.mintlify.app/en/pages/credentials/productivity-tools
Configure credentials for productivity tools to enhance your workflows with document management and collaboration features.
## Available Productivity Tools
### [Notion](/en/pages/credentials/notion)
Set up Notion workspace integration for document and database management.
### [Google OAuth](/en/pages/credentials/google-oauth)
Configure Google OAuth to access Gmail, Drive, Calendar, and other Google services.
### [Microsoft OAuth](/en/pages/credentials/microsoft-oauth)
Configure Microsoft OAuth to access Outlook Calendar, Outlook Mail, and other Microsoft services.
## Getting Started
1. Choose the productivity tool you want to integrate
2. Follow the platform-specific setup instructions
3. Configure the necessary permissions and scopes
4. Test your integration to ensure proper functionality
# Shopify Credentials
Source: https://carnot.mintlify.app/en/pages/credentials/shopify
Configure your Shopify API credentials to manage products, orders, customers, and interact with your Shopify store from your Jinba Flow workflows.
## Prerequisites
* A Shopify store (or partner account)
* Admin access to your Shopify store
## Getting Your API Credentials
### For Shopify Partners
1. Visit the [Shopify Partners Dashboard](https://partners.shopify.com/)
2. Sign in to your partner account
3. Go to "Apps" > "Create app"
4. Choose "Custom app" or "Public app"
5. Fill in the app details and create the app
### For Store Owners
1. Sign in to your [Shopify Admin](https://admin.shopify.com/)
2. Go to "Settings" > "Apps and sales channels"
3. Click "Develop apps" or "Manage private apps"
4. Click "Create an app"
5. Give your app a name and description
## Configuring Your Shopify App
### API Credentials
1. In your app settings, go to "API credentials"
2. Note your **API key** and **API secret key** (you'll need these later)
3. Configure the required scopes for your app
### Required Scopes
Add the following scopes based on your needs:
#### Read Access
* `read_products` - Access product information
* `read_orders` - Access order information
* `read_customers` - Access customer information
* `read_inventory` - Access inventory levels
* `read_analytics` - Access analytics data
#### Write Access
* `write_products` - Create and update products
* `write_orders` - Update order status
* `write_customers` - Create and update customers
* `write_inventory` - Update inventory levels
* `write_fulfillments` - Manage order fulfillments
#### Additional Scopes
* `read_themes` - Access theme information
* `write_themes` - Modify themes
* `read_script_tags` - Access script tags
* `write_script_tags` - Manage script tags
## Setting Up in Jinba Flow
1. Go to your workspace settings in Jinba Flow
2. Navigate to the "Secret" section
3. Find "Shopify" in the list of available credentials
4. Click "Configure" or "Add New"
5. Enter your Shopify API credentials:
* **API Key**: From your Shopify app's API credentials
* **API Secret Key**: From your Shopify app's API credentials
* **Store URL**: Your Shopify store URL (e.g., `your-store.myshopify.com`)
* **Access Token**: Your app's access token (if using OAuth)
6. Click "Save" to store your credentials
## Installing Your App
### For Custom Apps
1. In your app settings, go to "App setup"
2. Copy the installation URL
3. Open the URL in a browser
4. Select your store and install the app
5. Note the access token provided
### For Public Apps
1. Submit your app for review (if required)
2. Users can install your app from the Shopify App Store
3. Handle the OAuth flow for each installation
## Usage
Once configured, you can use Shopify in your flows to:
* Create and update product listings
* Manage inventory levels
* Process and update orders
* Handle customer information
* Generate sales reports
* Manage shipping and fulfillment
* Update store settings
## API Endpoints
### Products
* Create and update products
* Manage product variants
* Handle product images
* Update inventory levels
* Manage product collections
### Orders
* Retrieve order information
* Update order status
* Process order fulfillment
* Handle order cancellations
* Manage shipping information
### Customers
* Create and update customer accounts
* Access customer information
* Handle customer orders
* Manage customer addresses
### Analytics
* Generate sales reports
* Access performance metrics
* Track inventory movements
* Analyze customer behavior
# Slack Credentials
Source: https://carnot.mintlify.app/en/pages/credentials/slack
Configure your Slack workspace integration to send messages, create channels, and interact with Slack from your Jinba Flow workflows.
## Prerequisites
* A Slack workspace where you have admin permissions
* Ability to install apps in your workspace
## Creating a Slack App
1. Visit the [Slack API website](https://api.slack.com/)
2. Click "Create an app" or "Your apps"
3. Choose "From scratch"
4. Enter your app name and select your workspace
5. Click "Create app"
## Configuring Your Slack App
### Basic Information
1. In your app settings, go to "Basic Information"
2. Note your **Client ID** and **Client Secret** (you'll need these later)
3. Add a short description of your app
### OAuth & Permissions
1. Navigate to "OAuth & Permissions" in the sidebar
2. Add the following scopes to your app:
#### Bot Token Scopes
* `channels:read` - View basic information about public channels
* `channels:write` - Manage public channels
* `chat:write` - Send messages as your app
* `chat:write.public` - Send messages to channels your app isn't in
* `groups:read` - View basic information about private channels
* `groups:write` - Manage private channels
* `im:read` - View basic information about direct messages
* `im:write` - Send direct messages
* `mpim:read` - View basic information about group direct messages
* `mpim:write` - Send messages to group direct messages
* `users:read` - View people in your workspace
* `users:read.email` - View email addresses of people in your workspace
#### User Token Scopes (if needed)
* `channels:read` - View basic information about public channels
* `chat:write` - Send messages as the user
### Event Subscriptions (Optional)
1. Go to "Event Subscriptions"
2. Enable events if you want to receive real-time updates
3. Add relevant events like `message.channels`, `message.im`, etc.
## Setting Up in Jinba Flow
1. Go to your workspace settings in Jinba Flow
2. Navigate to the "Secret" section
3. Find "Slack" in the list of available credentials
4. Click "Configure" or "Add New"
5. Enter your Slack app credentials:
* **Client ID**: From your Slack app's Basic Information
* **Client Secret**: From your Slack app's Basic Information
* **Bot Token**: From OAuth & Permissions (starts with `xoxb-`)
* **User Token**: From OAuth & Permissions (starts with `xoxp-`) if needed
6. Click "Save" to store your credentials
## Installing Your App
1. Go to "OAuth & Permissions" in your Slack app
2. Click "Install to Workspace"
3. Review the permissions and click "Allow"
4. Copy the **Bot User OAuth Token** (starts with `xoxb-`)
5. Copy the **User OAuth Token** (starts with `xoxp-`) if you requested user scopes
## Usage
Once configured, you can use Slack in your flows to:
* Send messages to channels, direct messages, or group messages
* Create and manage channels
* Read messages and user information
* Upload files and attachments
* Respond to events in real-time
## Accessing your Slack App
Once set up correctly, your app should be able within the selected Workspace(s)
"Apps" section in the "Home" tab (probably at the bottommost part of the list).
You should also be able to access it by "@-mentioning" it from the search bar.
In case you have modified your app's "Display Information" using
the "Basic Information" app settings page, it is possible that the changes
are not reflected within the installed workspace(s). To ensure consistency,
please make sure to visit the "App Home" page within the "Feautures" category
of your app's settings page.
# Twilio Credentials
Source: https://carnot.mintlify.app/en/pages/credentials/twilio
Set up Twilio credentials for SMS and WhatsApp integrations
Configure Twilio credentials to send SMS and WhatsApp messages from Jinba Flow.
## Required Credentials
* **Account SID**
* **Auth Token**
You can find both values in the [Twilio Console](https://console.twilio.com/).
## Setup
1. Sign up or log in to [Twilio](https://www.twilio.com/try-twilio)
2. Open the [Twilio Console](https://console.twilio.com/)
3. Copy your **Account SID**
4. Reveal and copy your **Auth Token**
5. In Jinba Flow, open your workspace secrets settings
6. Add a Twilio credential and save these values
## Trial Account Notes
* Trial accounts can only send to verified phone numbers
* Trial messages include a Twilio trial signature
* WhatsApp testing requires joining the [Twilio Sandbox](https://console.twilio.com/us1/develop/sms/try-it-out/whatsapp-learn)
## Related Docs
* [Twilio Tool](/en/pages/tools/communication/twilio)
* [Communication Platforms](/en/pages/credentials/communication-platforms)
# Logout
Source: https://carnot.mintlify.app/en/pages/jinba_app/account/logout
How to log out of Jinba App
## Logout
Log out when you finish using Jinba App.
## Logout Steps
Click the user icon in the upper right corner of the screen.
Select "Logout" from the dropdown menu.
You will be returned to the login screen.
## Notes When Logging Out
### Unsaved Data
When you log out, unsaved chat content or draft task edits may be lost. Please confirm saving before logging out.
### Running Tasks
Scheduled tasks will continue to run even after you log out. You can check task execution results when you log in next time.
### Session Termination
Logging out ends your current session. You need to log in again to use Jinba App.
## Automatic Logout
You may be automatically logged out in the following situations:
| Situation | Description |
| - | - |
| **Session Timeout** | Automatic logout for security after prolonged inactivity |
| **Authentication Expiration** | When SSO authentication token expires |
Please log in again after automatic logout.
## Logging In Again
To log in again after logging out, refer to the [Login](/en/pages/jinba_app/basics/login) page.
## FAQ
Yes, scheduled tasks will automatically run even after you log out. You can check execution results when you log in next time.
This may be due to session timeout or authentication expiration. Please log in again. If the problem continues, contact support.
Click the user icon (or profile picture) in the upper right corner of the screen to display a dropdown menu. You can select "Logout" from there.
# Theme Settings
Source: https://carnot.mintlify.app/en/pages/jinba_app/account/theme
Change the display theme (light/dark)
## Theme Settings
In Jinba App, you can change the display theme. Adjust the display to reduce eye strain or match your preferences.
## Theme Types
You can choose from the following three themes:
| Theme | Description |
| - | - |
| **Follow System** | Syncs with OS (Windows / macOS) system settings |
| **Light** | Dark text on light background |
| **Dark** | Light text on dark background |
### Follow System
Automatically syncs with the OS dark mode setting.
* When OS is in dark mode → Dark theme
* When OS is in light mode → Light theme
### Light Theme
Displays dark text on a light background. Suitable for working in bright environments.
### Dark Theme
Displays light text on a dark background. Suitable for working in dark environments or when you want to reduce eye strain.
## How to Change Theme
Click the user icon in the upper right corner of the screen.
Select "Settings" from the dropdown menu.
Find the "Theme" section on the settings screen.
Select "Follow System", "Light", or "Dark".
The selected theme is applied immediately.
## Theme Persistence
The selected theme setting is automatically saved and maintained on your next login.
Theme settings are saved per browser. If you use different browsers, you need to configure each separately.
## FAQ
When "Follow System" is selected, if the OS dark mode setting changes, the Jinba App theme will also automatically switch. If you want to lock in a specific theme, explicitly select "Light" or "Dark".
Browser extensions or OS settings may be affecting the display. Try switching the theme and then switching back, or reload the page.
# Agent Builder
Source: https://carnot.mintlify.app/en/pages/jinba_app/agents/agent-builder
How to create and edit agents
## What is Agent Builder
Agent Builder is the screen for creating and editing AI agents. You configure agent settings by giving instructions to the AI in a chat format.
Creating and editing agents requires workspace owner permissions.
## Opening Agent Builder
### For New Creation
Select "Agents" from the side menu.
Click the "New" button at the top of the screen.
### Editing Existing Agents
Select "Edit" from the settings menu (⋮) of the agent you want to edit.
## Screen Layout
Agent Builder consists of the following areas:
| Area | Description |
| - | - |
| **Chat Area** | Enter instructions through conversation with AI |
| **Settings Panel** | Display and edit various agent settings |
| **Preview Area** | Preview of the configured results |
## Chat-based Instructions
In Agent Builder, you can give agent configuration instructions to the AI in a chat format.
### Example Instructions
```
This agent retrieves deal data from Salesforce and
creates a weekly sales report.
Please include the following information in the report:
- Number of new deals this week
- Total amount of closed deals
- List of deals requiring follow-up next week
```
The AI analyzes the instructions and suggests appropriate settings.
## Connector Reference Settings
Configure the connectors to be used by the agent.
Click the "Connectors" section in the settings panel.
Check the connectors you want to use with this agent from the available connectors list.
The selected connectors are associated with the agent.
When connectors are configured, the selected connectors become automatically available in chats using this agent.
## File Reference Settings
Configure files for the agent to reference.
Click the "Files" section in the settings panel.
Click the "Add Files" button and upload the files you want the agent to reference.
Uploaded files are displayed in the list.
### Reference File Examples
* **FAQ Documents**: Information that forms the basis for customer support agent responses
* **Report Templates**: Sample output formats
* **Business Manuals**: Procedure and policy references
## Saving Agents
After completing the settings, save the agent.
Enter a name for the agent (if not already entered).
Enter a description for the agent. A clear description is recommended as it will be displayed in the list.
Click the "Save" button at the top of the screen to save.
## Running Agents (Testing)
You can test run the agent before or after saving.
Click the "Run" button in Agent Builder.
A chat screen with the agent's settings applied opens. You can send actual questions to verify the behavior.
If there are no issues with the test run, save the agent and proceed with publishing preparations.
## Troubleshooting
* Try describing the instructions more specifically
* Enter in a format that's easier for the AI to understand
* Verify the connector is installed
* Check the connector's connection status
* Verify the file format is supported
* Check if the file size exceeds the limit
# Agent Details
Source: https://carnot.mintlify.app/en/pages/jinba_app/agents/agent-detail
Viewing detailed agent information
## Agent Details Screen
The Agent Details screen allows you to view detailed information about a selected agent.
## Accessing the Details Screen
Select "Agents" from the side menu.
Click the "Details" button or info icon for the agent you want to view.
## Displayed Information
The Agent Details screen displays the following information:
### Basic Information
| Field | Description |
| - | - |
| **Agent Name** | Identifier name of the agent |
| **Description** | Overview of the agent's features |
| **Creator** | User who created the agent |
| **Created** | Date and time the agent was created |
| **Updated** | Date and time of last update |
| **Published Status** | Published / Unpublished |
### Instructions
The AI instructions configured for the agent are displayed.
### Connected Connectors
A list of connectors configured for use with the agent is displayed.
For each connector, you can check:
* Connector name
* Connection status
* Number of available tools
### Reference Files
A list of files the agent references is displayed.
For each file, you can check:
* File name
* File size
* Upload date/time
## Switching Detail Views
On the details screen, you can switch between information sections.
### Tab Structure
| Tab | Content |
| - | - |
| **Overview** | Basic information and description |
| **Settings** | Instructions, connectors, files |
| **Usage** | Usage count and history (admin only) |
Click the tab for the information you want to view.
The content of the selected tab is displayed.
## Actions from Details Screen
You can perform the following actions from the details screen:
### Using the Agent
Click the "Start Using" button on the details screen.
A chat screen with this agent's settings applied opens.
### Editing the Agent
Editing requires workspace owner permissions.
Click the "Edit" button on the details screen.
You can edit settings in Agent Builder.
### Publishing Settings
Changing publishing settings requires workspace owner permissions.
For more details, see [Publishing Agents](/en/pages/jinba_app/agents/publish).
# Agent List
Source: https://carnot.mintlify.app/en/pages/jinba_app/agents/agent-list
Searching, duplicating, editing, and deleting agents
## Agent List
When you open the Agent Management screen, your created agents are displayed in a list.
## List Contents
Each agent card displays the following information:
| Field | Description |
| - | - |
| **Agent Name** | Identifier name of the agent |
| **Description** | Overview of the agent's features |
| **Creator** | User who created the agent |
| **Updated** | Date and time of last update |
| **Published Status** | Published / Unpublished |
## Text Search (Filtering)
When you have many agents, you can quickly find the one you need using text search.
Click the search box at the top of the agent list.
Enter keywords contained in the agent name or description.
Only agents matching the entered keywords will be displayed.
## Duplicating Agents
You can create a new agent by copying an existing one. This is convenient when you want to inherit the settings of the original agent while only changing certain parts.
Click the settings menu (⋮) on the agent card you want to duplicate.
Select "Duplicate" from the menu.
The editing screen (Agent Builder) for the duplicated agent opens. All settings from the original agent are copied.
Change the agent name and settings, then save.
Duplicated agents will have "(Copy)" added to their name. Change the name as needed.
## Editing Agents
You can modify the settings of created agents.
Editing agents requires workspace owner permissions.
Click the settings menu (⋮) on the agent card you want to edit.
Select "Edit" from the menu.
The Agent Builder opens. Modify the settings and save.
For detailed editing methods, see [Agent Builder](/en/pages/jinba_app/agents/agent-builder).
## Deleting Agents
You can delete agents that are no longer needed.
Deleted agents cannot be recovered. Please confirm before deleting.
Click the settings menu (⋮) on the agent card you want to delete.
Select "Delete" from the menu.
A confirmation dialog appears. Click "Delete" to confirm.
## Using Agents
Click on an agent from the list to start a chat using that agent.
Click the agent card you want to use.
A chat screen with the agent's settings applied opens.
# Agent Management Overview
Source: https://carnot.mintlify.app/en/pages/jinba_app/agents/overview
Screen layout and basic features of Agent Management
## What is Agent Management
The Agent Management screen allows you to create and manage AI agents. Agents are reusable AI configurations specialized for specific tasks or purposes.
## What are Agents
Agents are defined by combining the following elements:
| Element | Description |
| - | - |
| **Instructions** | Specific instructions for the AI |
| **Connectors** | Connections to external services |
| **Reference Files** | Documents and data for the AI to reference |
By setting these up in advance, you don't need to repeat the same settings each time you chat.
## Screen Layout
The Agent Management screen consists of the following sections:
### Agent List
Displays a list of created agents.
For more details, see [Agent List](/en/pages/jinba_app/agents/agent-list).
### Agent Builder
The screen for creating and editing new agents.
For more details, see [Agent Builder](/en/pages/jinba_app/agents/agent-builder).
## Access Control
Agent editing is only permitted for workspace owners.
| Operation | Member | Owner |
| - | - | - |
| View agent list | ✓ | ✓ |
| Use agents | ✓ | ✓ |
| Create/edit agents | - | ✓ |
| Delete agents | - | ✓ |
Members can still chat using published agents.
## Accessing Agent Management
Select "Agents" from the side menu.
The agent list is displayed.
## Key Features
Search, duplicate, edit, and delete agents
Create and configure agents
View detailed agent information
Publish agents and run as apps
## Agent Use Cases
### For Individuals
* **Instructions**: "Summarize the latest news articles and list the important points as bullet points"
* **Connectors**: RSS feeds, News APIs
* **Reference Files**: None
* **Instructions**: "Extract important points from uploaded learning materials and create review notes"
* **Connectors**: None
* **Reference Files**: Educational PDFs, Lecture materials
* **Instructions**: "Suggest recommended tourist spots and travel routes considering budget and schedule"
* **Connectors**: None
* **Reference Files**: Travel guides
### For Teams & Business
* **Instructions**: "Retrieve this month's deal data from Salesforce and create a weekly sales report"
* **Connectors**: Salesforce
* **Reference Files**: Report template
* **Instructions**: "Reference the FAQ document to answer user questions"
* **Connectors**: None
* **Reference Files**: FAQ document, Product manual
* **Instructions**: "Analyze sales data and report trends and anomalies"
* **Connectors**: Google Sheets, BigQuery
* **Reference Files**: Analysis criteria document
# Publishing Agents
Source: https://carnot.mintlify.app/en/pages/jinba_app/agents/publish
Agent publishing settings and app execution
## What is Agent Publishing
When you publish an agent, other users can use that agent. Published agents can be run as "Agent Apps."
Changing agent publishing settings requires workspace owner permissions.
## Publishing Settings
### Accessing Publishing Settings
Open the details screen for the agent you want to publish.
Click the settings menu (⋮) at the top of the screen.
Select "Publishing Settings" from the menu.
### Changing Published Status
| Status | Description |
| - | - |
| **Unpublished** | Only accessible by creator and administrators |
| **Published** | Accessible by all users |
Select "Published" or "Unpublished" in the publishing settings dialog.
Save the settings.
## Notes Before Publishing
Before publishing an agent, please verify the following:
Verify that the connectors being used are properly connected. If connections are broken, the agent will not function correctly.
Verify that reference files do not contain confidential information. In published agents, reference file contents influence AI responses.
Verify through test execution that the instructions reflect the intended behavior.
## Agent App Execution Screen
Published agents can be used from the Agent App execution screen.
### Agent App Features
* **Simple Interface**: A screen specialized for agent usage
* **Instant Start**: Start chatting immediately after selecting an agent
* **No Setup Required**: Connector and file settings are pre-configured
### Using Agent Apps
Select "Agents" from the side menu.
Click the published agent you want to use from the list.
A chat screen with the agent's settings applied opens. Enter a question to start chatting.
## Searching Published Agents
Published agents can be searched in the agent list.
Enter keywords contained in the agent name or description.
Use the "Published" filter to display only published agents.
## Unpublishing Agents
You can revert a published agent back to unpublished status.
Once unpublished, other users will no longer be able to use that agent.
Open publishing settings from the agent details screen.
Change the published status to "Unpublished".
Saving the settings will unpublish the agent.
# Login
Source: https://carnot.mintlify.app/en/pages/jinba_app/basics/login
How to log in to Jinba App
## Login Methods
You can log in to Jinba App using the following methods:
* Google account
* Email address and password
* SSO (Enterprise plan only)
## Login with Google Account
Open your browser and navigate to [Jinba App](https://app.jinba.io/).
Click the "Continue with Google" button on the login screen.
The Google login screen will appear. Select the account you want to use and log in.
Once authentication is successful, you'll be redirected to the Jinba App main screen.
## Login with Email Address
Open your browser and navigate to [Jinba App](https://app.jinba.io/).
Enter your registered email address and password on the login screen.
Click the "Sign in" button to log in.
Once authentication is successful, you'll be redirected to the Jinba App main screen.
## SSO Login (Enterprise)
SSO login is available for organizations on the Enterprise plan.
Log in using your organization's Identity Provider (IdP).
Open your browser and navigate to [Jinba App](https://app.jinba.io/).
Click the "Login with SSO" button on the login screen.
Your organization's Identity Provider login screen will appear. Enter your credentials to log in.
Once authentication is successful, you'll be redirected to the Jinba App main screen.
## Creating an Account
You can create a Jinba App account using the following methods:
### Register with Google Account
When you log in with "Continue with Google", your account is automatically created.
### Register with Email Address
Click the "Sign up" link on the login screen.
Enter the required information such as email address and password.
Once registration is complete, you can start using Jinba App.
### First-time SSO Login (Enterprise)
If you're using SSO on an Enterprise plan, your account is automatically created on first login.
## Forgot Password
### For Email Login
Click the "Forgot password?" link on the login screen.
Enter your registered email address to send a password reset email.
Click the link in the email you receive to set a new password.
### For SSO
If you're using SSO, reset your password through your organization's Identity Provider. Contact your organization's IT administrator for details.
## Troubleshooting
Please check the following:
* Is your email address and password correct?
* If logging in with a Google account, have you selected the correct account?
* If using SSO, are your organization's Identity Provider credentials correct?
* Try clearing your browser's cache and cookies and try again
This may be a temporary error. Please wait a while and try again. If the problem persists, contact support.
# Navigation
Source: https://carnot.mintlify.app/en/pages/jinba_app/basics/navigation
Screen layout and navigation in Jinba App
## Two Main Areas
The Jinba App screen consists of two main areas.
| Area | Description |
| - | - |
| **Side Panel** | Provides access to menus and various features |
| **Main Area** | The workspace for actual chat, agent settings, and other tasks |
## Side Panel
The side panel consists of three areas. Click on each element to access the main features.
### Workspace
Displays the workspace you're currently using. Click the arrow to create a new workspace or switch between workspaces.
### Menu
| Menu | Description |
| - | - |
| **New Chat** | Start a new chat with AI |
| **Apps & MCP** | View installed MCPs or create new MCPs |
| **Agents** | Create new agents, run created agents, or publish your agents |
| **Templates** | Duplicate preset agent templates to create new templates |
| **Tasks** | Manage tasks that run at specified times or intervals based on agents |
| **Jinba Flow** | Manage integration with Jinba Flow. Establish new integrations using API keys or check existing integrations |
| **Workspace Settings** | Rename workspace, manage user access, or delete workspace |
| **Recent Chats** | View a list of past chat history |
### Account Information
Click the user icon at the bottom left of the screen to display the account information menu. You can view and change your profile, subscription plan, theme, and language settings.
## Navigating to Each Screen
### Chat Screen
A new chat screen opens. This is the main screen for interacting with AI.
For more details, see [Chat Screen Overview](/en/pages/jinba_app/chat/overview).
### Apps & MCP Management Screen
Navigate to the MCP management screen. View installed MCPs and create new ones.
For more details, see [Apps & MCP Overview](/en/pages/jinba_app/connectors/overview).
### Agent Management Screen
Navigate to the agent management screen. View agent list, create new agents, and publish.
For more details, see [Agent Management Overview](/en/pages/jinba_app/agents/overview).
### Templates Screen
Navigate to the templates screen. Duplicate and use preset agent templates.
### Task Management Screen
Navigate to the task management screen. View task list and add new tasks.
For more details, see [Task Management Overview](/en/pages/jinba_app/tasks/overview).
### Jinba Flow Integration Screen
Navigate to the Jinba Flow integration screen. Manage API keys and check integration status.
### Workspace Settings Screen
Navigate to the workspace settings screen. Rename, manage users, or delete the workspace.
# File Attachments
Source: https://carnot.mintlify.app/en/pages/jinba_app/chat/file-attachment
How to attach files in chat for AI to process
## File Attachment Feature
When you attach files to the chat, AI can analyze and process the file contents.
## How to Attach Files
### Attach via Button
Click the clip icon (attachment button) in the input area.
Select the file you want to attach from the file selection dialog.
The attached file will be displayed in the input area.
Enter a message if needed and send.
### Attach via Drag & Drop
You can also attach files by dragging and dropping them onto the chat screen.
## Supported File Formats
The following file formats are supported:
| Category | File Formats |
| - | - |
| Documents | PDF, Word (.docx), Excel (.xlsx), PowerPoint (.pptx), Text (.txt) |
| Images | PNG, JPEG, GIF, WebP |
| Data | CSV, JSON |
An error message will be displayed if you try to attach an unsupported file format.
## File Size Limits
There is a maximum file size limit for attachments. Files exceeding the limit cannot be attached.
For large files, consider splitting them or extracting only the necessary parts before attaching.
## Examples of File-based Questions
### Excel File Analysis
```
Please aggregate the sales data in the attached Excel file by month and create a graph.
```
### PDF Summary
```
Please summarize the contents of the attached PDF in three key points.
```
### Image Description
```
Please describe what is shown in this image.
```
### CSV Data Processing
```
Please extract rows with sales over 1 million yen from the attached CSV.
```
## Removing Attached Files
If you want to remove an attachment before sending, click the "×" button on the attachment preview.
## Troubleshooting
Please check the following:
* Is the file format supported?
* Does the file size exceed the limit?
* Is the file corrupted?
* Password-protected files cannot be read
* Scanned PDFs may be recognized as images
# Chat Overview
Source: https://carnot.mintlify.app/en/pages/jinba_app/chat/overview
Overview and screen layout of Jinba App chat feature
## What is the Chat Feature
The chat feature is the main functionality of Jinba App. You can ask questions and give instructions to AI in a conversational format to get answers.
## Screen Layout
The chat screen consists of the following elements:
### Chat List
The list of past chats is displayed on the left side of the screen.
* **New Chat**: Start a new chat
* **Chat History**: Click on a past chat to resume from where you left off
* **Search**: Search through your chat history
### Message Area
The conversation with AI is displayed in the center of the screen.
* Messages sent by the user
* Responses from AI
* Attached file contents
* Connector execution results
### Input Area
The message input area is at the bottom of the screen.
* Text input field
* File attachment button
* Send button
## Key Features
Send text messages to AI
Attach files for AI to process
Retrieve information by integrating with external services
Review responses from AI
## Starting a New Chat
Click the "New Chat" button at the top of the chat list.
Type your message in the input area.
Click the send button or press Enter to send your message.
## Resuming Past Chats
Click on a past chat in the chat list to resume the conversation from where you left off.
# Receiving AI Responses
Source: https://carnot.mintlify.app/en/pages/jinba_app/chat/receive-response
Display formats and how to review AI responses
## AI Responses
When you send a message, AI generates a response and displays it on the chat screen.
## Response Display Formats
AI responses are displayed in various formats depending on the content.
### Text
Regular text is formatted for easy reading.
### Markdown
AI responses are formatted in Markdown. The following elements are properly styled:
* **Headings**: Used for section divisions
* **Lists**: Bulleted or numbered lists
* **Bold/Italic**: Emphasis
* **Links**: Click to navigate to external sites
* **Tables**: Organized data display
### Code Blocks
Program code is displayed with syntax highlighting (color coding).
Code block features:
* **Automatic language detection**: Appropriate syntax highlighting is applied
* **Copy button**: Copy code with one click
### Mermaid Diagrams
If AI generates a diagram in Mermaid format, it is automatically visualized.
Supported diagram types:
* Flowcharts
* Sequence diagrams
* Class diagrams
* Gantt charts
* Other Mermaid-supported formats
### Tabular Data
When data is returned in table format, it is displayed as a readable table.
## Connector Execution Results
When connectors are used, their execution results are included in the response.
* Name of the connector used
* Retrieved or processed data
* Success/failure status of execution
## Working with Responses
### Copy
You can copy part or all of the response.
* **Text selection**: Drag to select and copy
* **Code blocks**: Click the copy button
### Follow-up Questions
You can continue asking questions about the response. AI considers the context of the previous conversation when responding.
```
Please explain in more detail.
```
```
Can you give me a specific example of the third point?
```
## During Response Generation
While AI is generating a response, a loading indicator is displayed.
* Responses are displayed with **streaming**, appearing on screen as they are generated
* For long responses, you can start reading the content without waiting for completion
## Error Display
If an error occurs during response generation, an error message is displayed.
This may be a temporary error. Please wait a moment and try again.
Check the connector connection status in the [Connector Management screen](/en/pages/jinba_app/connectors/overview).
# Sending Messages to AI
Source: https://carnot.mintlify.app/en/pages/jinba_app/chat/send-message
How to send messages to AI in chat
## How to Send Messages
You can send messages to AI from the input area at the bottom of the chat screen.
### Basic Steps
Type what you want to tell AI in the text input field.
Send using one of the following methods:
* Click the **Send button**
* Press **Enter**
A loading indicator will appear while AI generates its response.
## Tips for Effective Questions
To get better responses from AI, keep the following points in mind when composing your messages.
### Be Specific
```text Good Example theme={null}
Please aggregate the sales data by month and calculate the year-over-year comparison.
```
```text Needs Improvement theme={null}
Analyze the data.
```
### Provide Context
```text Good Example theme={null}
I'm preparing a presentation for next week. Please summarize the three key features of Product A for our customers.
```
```text Needs Improvement theme={null}
Summarize Product A.
```
### Specify Output Format
```text Good Example theme={null}
Please organize the following items in a table format: Product name, Price, Stock quantity
```
```text Needs Improvement theme={null}
Tell me about the products.
```
## Multi-line Messages
When sending long messages or messages with multiple paragraphs:
* **Shift + Enter**: Insert a line break (without sending)
* **Enter**: Send the message
## Canceling During Generation
If AI is generating a response, you can cancel the process by clicking the stop button.
Even if you cancel, part of the response that was already generated may still be displayed.
## Related Pages
Send messages with file attachments
Reference external data using connectors
# Using Connectors
Source: https://carnot.mintlify.app/en/pages/jinba_app/chat/use-connectors
How to use connectors in chat to integrate with external services
## What are Connectors
Connectors are features that connect Jinba App with external services. By using connectors in chat, AI can retrieve data from external services or perform operations.
## How to Call Connectors
There are two ways to call connectors: **explicit specification** and **implicit specification**.
### Explicit Specification (@connectorname)
When you want to use a specific connector, type `@connectorname` in your message.
```
@Salesforce Please get this month's deals list
```
When you type `@` in the message input field, a list of available connectors appears.
Click the connector you want to use from the suggestion list, or type the connector name.
After the connector name, enter what you want to do.
When you send the message, the specified connector will be used.
### Implicit Specification (AI Auto-selection)
Even without explicitly specifying a connector, AI may automatically select an appropriate connector based on your question.
```
Show me this month's deals list
```
In this case, AI automatically selects the Salesforce connector based on the keyword "deals" and retrieves the data.
With implicit specification, AI determines the best connector. If the intended connector is not selected, please specify it explicitly.
## Using Multiple Connectors
You can specify multiple connectors in a single message.
```
Please cross-reference the deal data from @Salesforce with the list in @Google Sheets
```
## Connector Execution Results
When a connector is executed, its results are displayed in the chat.
* Contents of retrieved data
* Results of executed operations
* Error messages if an error occurred
## Checking Available Connectors
You can check currently available connectors in [My Connectors](/en/pages/jinba_app/connectors/my-connectors). To add new connectors, use the [Connector Management screen](/en/pages/jinba_app/connectors/overview).
## Troubleshooting
* Check if the connector is installed in [My Connectors](/en/pages/jinba_app/connectors/my-connectors)
* Verify the connector name spelling is correct
* Check if the connector connection is valid
* Verify you have the necessary permissions
* Try [re-authenticating](/en/pages/jinba_app/connectors/manage-connectors) the connection
## Related Pages
Installing and managing connectors
Checking installed connectors
# Form Execution
Source: https://carnot.mintlify.app/en/pages/jinba_app/connectors/form-execution
Execute connector tools individually using forms
## What is Form Execution
The Form Execution screen allows you to execute each tool provided by a connector individually using a form interface. This is convenient when you want to directly operate specific tools without using chat.
## Accessing Form Execution
Select "Connectors" from the side menu.
Click the connector you want to use from the My Connectors list.
Click the "Form Execution" tab or button on the connector details screen.
## Tool List
A list of tools provided by the connector is displayed.
Each tool displays the following information:
* **Tool Name**: Identifier name of the tool
* **Description**: Explanation of the tool's function
* **Parameters**: Input fields required for tool execution
## Searching Tools
When there are many tools, you can use the search function to quickly find the one you need.
Enter keywords in the search box at the top of the tool list.
Only tools matching the tool name or description will be displayed.
## Executing Tools
Execute the selected tool using a form interface.
Click the tool you want to execute from the tool list.
Enter the required parameters in the form. Required fields are marked with "\*".
Click the "Execute" button to run the tool.
The execution results will be displayed on screen.
## Execution Result Summary
After tool execution, a summary of the results is displayed.
The summary includes:
* **Execution Status**: Success/Failure
* **Execution Time**: Date and time the tool was executed
* **Retrieved/Processed Data**: Result data from execution
* **Error Information**: Error details if execution failed
## Execution History
You can view the history of previously executed tools.
Click the "History" tab on the Form Execution screen.
Past execution history is displayed in a list. You can check date/time, tool name, and status.
Click a history item to view the execution details (input parameters, execution results).
### Re-executing from History
You can re-execute a tool with the same parameters from past execution history.
Click the history item you want to re-execute.
Click the "Re-execute" button on the details screen.
## Troubleshooting
Please check the following:
* Are all required parameters filled in?
* Are the parameter values in the correct format?
* Is the connector connection valid?
* There may be no data matching the search criteria
* Try changing the parameter values and re-executing
# Jinba Flow Connectors
Source: https://carnot.mintlify.app/en/pages/jinba_app/connectors/jinbaflow
Connecting, installing, and managing Jinba Flow connectors
## What are Jinba Flow Connectors
Jinba Flow is an external workflow service that can integrate with Jinba App. You can install connectors created in Jinba Flow to Jinba App and use them from chat.
## Jinba Flow Connector List
Available connectors are displayed in the "Jinba Flow Connectors" section of the Connector Management screen.
The list displays the following information:
| Field | Description |
| - | - |
| **Connector Name** | Name of the connector as configured in Jinba Flow |
| **Description** | Overview of the connector's features |
| **Connection Status** | Connected / Not Connected |
| **Tool Count** | Number of tools provided by the connector |
## One-click Connect and Install
Jinba Flow connectors can be connected and installed simultaneously with one click.
Find the connector you want to install from the Jinba Flow connector list.
Click the "Connect" button on the connector card.
Once connected, the connector is automatically installed and added to My Connectors.
One-click connection automatically uses the authentication credentials configured in Jinba Flow.
## Refreshing Connection
When connector settings have been updated in Jinba Flow, you can refresh the connection information in Jinba App.
### When Refresh is Needed
* When tools have been added or changed in Jinba Flow
* When authentication settings have been changed in Jinba Flow
* When connection errors occur
### Refresh Steps
Click the Jinba Flow connector you want to refresh from the My Connectors list.
Click the settings menu (⋮) on the connector details screen.
Select "Refresh Connection" from the menu.
A confirmation message will appear when the refresh is complete.
## Disconnecting
Disconnecting a Jinba Flow connector will uninstall that connector from Jinba App.
Once disconnected, the connector will no longer be available in chat. You will need to reconnect to use it again.
### Disconnect Steps
Click the Jinba Flow connector you want to disconnect from the My Connectors list.
Click the settings menu (⋮) on the connector details screen.
Select "Disconnect" from the menu.
A confirmation dialog will appear. Click "Disconnect" to confirm.
## Troubleshooting
Please check the following:
* Is the connector properly configured in Jinba Flow?
* Does your Jinba Flow account have the appropriate permissions?
* Are your Jinba App and Jinba Flow accounts linked?
* Check the authentication settings in Jinba Flow
* Wait a moment and try again
* If the problem persists, contact support
* Verify the changes have been saved in Jinba Flow
* This may be due to cache. Try reloading the browser
# Managing Connectors
Source: https://carnot.mintlify.app/en/pages/jinba_app/connectors/manage-connectors
Re-fetching, uninstalling, and renaming connectors
## Connector Management Features
You can perform management operations such as re-fetching, uninstalling, and renaming on installed connectors.
## Re-fetching Connectors
Refresh the connector's connection information to the latest state.
### When Re-fetching is Needed
* When settings have been changed on the external service side
* When connection errors occur
* When the tool list has been updated
### Re-fetch Steps
Click the connector you want to re-fetch from the My Connectors list.
Click the settings menu (⋮) on the connector details screen.
Select "Re-fetch" from the menu.
A confirmation message will appear when re-fetch is complete.
## Uninstalling Connectors
Remove connectors that are no longer needed.
Once uninstalled, the connector will no longer be available in chat. You will need to reinstall it to use it again.
### Uninstall Steps
Click the connector you want to uninstall from the My Connectors list.
Click the settings menu (⋮) on the connector details screen.
Select "Uninstall" from the menu.
A confirmation dialog will appear. Click "Uninstall" to confirm.
## Renaming Connectors
You can change the display name of a connector. This changes the name used when typing `@connectorname` in chat.
### When Renaming is Useful
* When you want to distinguish between multiple accounts of the same service
* When you want a shorter name for easier access
* When you want to name it according to its purpose
### Rename Steps
Click the connector you want to rename from the My Connectors list.
Click the settings menu (⋮) on the connector details screen.
Select "Rename" from the menu.
Enter the new name in the rename dialog and click "Save".
After renaming, you can call the connector using `@newname` in chat.
## Troubleshooting
Please check the following:
* Is the external service account still valid?
* Has the API key or token expired?
* Have access permissions been changed on the external service side?
* Connectors in use by agents may not be uninstallable
* Remove the connector reference from the agent first
# Marketplace
Source: https://carnot.mintlify.app/en/pages/jinba_app/connectors/marketplace
List and installation of standard MCPs
## What is the Marketplace
The Marketplace (MCP App Store) allows you to install standard MCPs that are ready to use. You can start integrating with various external services without the hassle of setting up your own MCP.
## Standard MCP List
The following standard MCPs are available for installation in Jinba App.
| MCP Name | Description |
| - | - |
| **Custom MCP** | Bring your own custom MCP server configuration |
| **Slack** | MCP server for Slack API. AI can interact with Slack workspaces |
| **ExaAI** | Perform web searches using MCP |
| **Notion** | Official Notion MCP server |
| **Google Maps** | Access location-based services and mapping features |
| **Firecrawl** | Provides powerful web scraping capabilities |
| **SiteMCP** | Fetch entire websites and use them as a knowledge base |
| **LINE Bot** | Connect AI agents to LINE official accounts |
| **Expedia** | Manage Expedia properties, bookings, and services |
| **e-Stat** | Access government statistical data |
## MCPs via Klavis
Additional MCPs are available through the Klavis platform.
| MCP Name | Description |
| - | - |
| **WordPress** | Easily connect to WordPress sites |
| **Firecrawl** | Provides powerful web scraping capabilities |
| **YouTube** | Access YouTube video transcripts |
| **KlavisAI ReportGen** | Generate web reports based on search queries |
| **Supabase** | Manage Supabase projects, databases, and services |
| **Notion** | Official Notion MCP server |
| **Slack** | AI can interact with Slack workspaces |
| **Doc2Markdown** | Convert documents in various formats to Markdown |
| **Markdown2Doc** | Convert Markdown to PDF, DOCX, and other formats |
## How to Install MCPs
Select "Apps & MCP" from the side menu.
Click the "MCP App Store" tab to view available MCPs.
Click on the MCP card you want to install.
Enter the required settings (such as API keys). For standard MCPs, many fields are pre-configured.
Click the "Register" button to install the MCP.
MCPs via Klavis may require OAuth authentication with external services.
## Related Pages
Managing installed connectors
Connecting Jinba Flow connectors
# My Connectors
Source: https://carnot.mintlify.app/en/pages/jinba_app/connectors/my-connectors
List and management of installed connectors
## What is My Connectors
My Connectors is a section that displays a list of connectors you have installed. All connectors available for use in chat are shown here.
## Connector List
Installed connectors are displayed as cards. Each connector card includes the following information:
* **Connector Name**: Display name of the connector
* **Description**: Overview of the connector's features
* **Connection Status**: Whether the connection is working properly
* **Tool Count**: Number of tools provided by the connector
## Searching Connectors
When you have many connectors installed, you can use the search function to quickly find the one you need.
Click the search box at the top of the connector list.
Enter keywords contained in the connector name or description.
Only connectors matching the entered keywords will be displayed.
## Sorting Connectors
You can change the display order of the connector list.
### Sort Options
| Sort Order | Description |
| - | - |
| **By Name** | Alphabetical order by connector name |
| **Recently Used** | Display recently used connectors at the top |
| **Installation Date** | Order by installation date |
Click the sort button at the top of the connector list.
Select your preferred sort order from the dropdown.
## Viewing Connector Details
Click on a connector card to view detailed information about that connector.
The details screen shows:
* Detailed description of the connector
* List of available tools
* Connection status and settings
* Management options (re-fetch, uninstall, rename)
## Connector Management Operations
The following operations are available for each connector:
Refresh connection information
Remove the connector
Change the display name
For more details, see [Managing Connectors](/en/pages/jinba_app/connectors/manage-connectors).
## Navigate to Form Execution
From the connector details screen, you can navigate to the [Form Execution screen](/en/pages/jinba_app/connectors/form-execution) to execute tools individually.
# Connector Management Overview
Source: https://carnot.mintlify.app/en/pages/jinba_app/connectors/overview
Screen layout and basic features of Connector Management
## What is Connector Management
The Connector Management screen allows you to manage connectors that connect Jinba App with external services.
## Screen Layout
The Connector Management screen consists of the following sections:
### My Connectors
Displays a list of installed connectors.
* Search and sort connectors
* Re-fetch, uninstall, and rename connectors
* Access to Form Execution screen
For more details, see [My Connectors](/en/pages/jinba_app/connectors/my-connectors).
### Jinba Flow Connectors
Displays a list of connectors available from Jinba Flow.
* Search Jinba Flow connectors
* One-click connect and install
* Refresh or disconnect connections
For more details, see [Jinba Flow Connectors](/en/pages/jinba_app/connectors/jinbaflow).
## Types of Connectors
Various types of connectors are available in Jinba App.
| Type | Description |
| - | - |
| **Data Integration** | Connect with data sources like databases and spreadsheets |
| **Service Integration** | Connect with SaaS applications and APIs |
| **Marketplace** | Install standard MCPs from the [MCP App Store](/en/pages/jinba_app/connectors/marketplace) |
| **Jinba Flow** | Custom connectors created in Jinba Flow |
## What Connectors Can Do
With connectors, AI can perform the following operations on external services:
Get information from external services and use in chat
Create new records or files in external services
Update existing data in external services
Delete data in external services
## Accessing Connector Management
Select "Connectors" from the side menu.
The My Connectors and Jinba Flow Connectors sections are displayed.
## Key Features
List and search installed connectors
List and install standard MCPs
Re-fetch, uninstall, and rename connectors
Execute tools individually using forms
Connect and install Jinba Flow connectors
# Core Concepts
Source: https://carnot.mintlify.app/en/pages/jinba_app/core-concepts
Basic terminology for understanding Jinba App
Understanding these core concepts will help you effectively use Jinba App.
## Core Terminology
| Term | Description |
| - | - |
| **Account** | The user account used for login |
| **MCP / MCP Tools** | MCP stands for Model Context Protocol, a standardized common mechanism for AI to integrate with external data and tools. Jinba App provides various "MCP Tools" that can connect to external services. Through these, you can use various services from chats and agents. You can also call workflows built in Jinba Flow as MCP. **It's important to understand that in Jinba App, AI can access Jinba Flow and various other services through MCP.** |
| **Chat** | An interface for dialogue between AI and users through words. Conversations here become triggers for AI instructions and workflow execution |
| **Agent** | AI autonomously interacts with users to achieve pre-instructed goals, using MCP to fulfill specific roles |
| **Task** | A mechanism to schedule and run agents in the background without user interaction |
| **App** | By publishing a built agent as an app, anyone can easily use it |
## Next Steps
Learn about Jinba App screens and navigation
# FAQ
Source: https://carnot.mintlify.app/en/pages/jinba_app/faq
Frequently asked questions and answers about Jinba App
## Login & Account
Please check the following:
* Is your email address and password correct?
* If logging in with a Google account, have you selected the correct account?
* If using SSO, are your organization's Identity Provider credentials correct?
* Try clearing your browser's cache and cookies and try again
If you became unable to log in after several failed password attempts, your account may be temporarily locked. See the next item.
If the problem persists, please contact support.
To protect against unauthorized access, email and password login temporarily locks an account after repeated failed attempts.
* The lock is released automatically over time. No action from an administrator is required
* Retrying while the lock is active makes the wait longer. Please wait a while before trying again
* If you no longer remember your password, reset it from "Forgot password?" on the login screen instead of waiting for the lock to clear
* This applies only to email and password login. Logging in with Google or SSO is unaffected
While the lock is active, clearing your cache and cookies or switching browsers will not resolve it.
You can create a new account from "Sign up" on the login screen.
Alternatively, logging in with "Continue with Google" automatically creates an account.
If you're using SSO on an Enterprise plan, your account is automatically created on first login.
Click "Forgot password?" on the login screen and enter your registered email address.
If using SSO, reset your password through your organization's Identity Provider.
## Chat
This may be a temporary error. Please try the following:
* Reload the page and send your question again
* Wait a moment and try again
If the problem persists, please contact support.
Please check the following:
* Is the file format supported? (PDF, Word, Excel, images, etc.)
* Does the file size exceed the limit?
* Is the file corrupted?
You can view past chat history from the chat list on the left side of the chat screen. Click on a chat to resume the conversation from where you left off.
Click the settings menu (⋮) of the chat you want to delete in the chat list and select "Delete". Deleted chats cannot be recovered.
## Connectors
Please check the following:
* Is the external service account valid?
* Has the API key or token expired?
* Are access permissions set on the external service side?
Try "Re-fetch" on the Connector Management screen.
Possible causes of the error:
* Connection is broken
* Insufficient permissions
* Invalid parameters
Try re-fetching the connector or test individually on the Form Execution screen.
Please check the following:
* Is the connector properly configured in Jinba Flow?
* Does your Jinba Flow account have appropriate permissions?
* Are your Jinba App and Jinba Flow accounts linked?
## Agents
Creating agents requires workspace owner permissions. If you don't have permissions, please contact the workspace owner.
Please check the following:
* Are the instructions specific and clear?
* Are the required connectors configured?
* Are the reference files properly uploaded?
Run a test in Agent Builder to verify the behavior.
Verify the publishing setting is set to "Published". Also, other users may need to reload the agent list.
## Tasks
Please check the following:
* Is the schedule correctly set?
* Is the task in "Scheduled" state?
* Is the agent being used valid?
* Is the connector connection valid?
You can check from the "Completed" tab on the Task Management screen. Click on a task to view execution result details.
Select "Cancel Schedule" from the settings menu (⋮) of the scheduled task. The task will return to draft state and automatic execution will stop.
## Other
We recommend the latest versions of the following browsers:
* Google Chrome
* Mozilla Firefox
* Apple Safari
* Microsoft Edge
Jinba App is recommended for use on PC browsers. While you can access it from mobile browsers, some features may be limited.
For data security and privacy information, please refer to the [Jinba App Privacy Policy](https://jinba.io/privacy). If you're on an Enterprise plan, please also refer to your organization's security policy.
If your issue is not resolved, please contact [Support](https://app.jinba.io/support).
# Introduction
Source: https://carnot.mintlify.app/en/pages/jinba_app/introduction
Welcome to the official Jinba App documentation
## What is Jinba App
Jinba App is an AI-powered business efficiency platform. You can automate tasks by interacting with AI through chat while integrating with various external services.
## Key Features
Ask questions and give instructions to AI in a conversational format to get answers
Integrate with external services to enable AI to retrieve and manipulate data
Create and manage AI agents specialized for specific tasks
Schedule agent executions to automate your workflows
## How to Use This Documentation
* **New users**: Start with the [Quick Start Guide](/en/pages/jinba_app/quickstart)
* **Want to learn more about features**: Browse each feature page from the navigation on the left
* **Need help with terminology**: Refer to the [Core Concepts](/en/pages/jinba_app/core-concepts)
* **Having trouble**: Check the [FAQ](/en/pages/jinba_app/faq)
## Target Audience
This documentation is intended for all end users of Jinba App. No technical knowledge is required.
# Quick Start
Source: https://carnot.mintlify.app/en/pages/jinba_app/quickstart
Basic steps to get started with Jinba App
## Before You Begin
To use Jinba App, you need:
* A Jinba App account (Google account, email address, or your organization's SSO account)
* A modern browser (Chrome, Firefox, Safari, or Edge latest versions recommended)
## Step 1: Log In
Open your browser and navigate to [Jinba App](https://app.jinba.io/).
Log in with your Google account, or with your email address and password.
If you're on an Enterprise plan, you can also log in with your organization's SSO.
For more details, see [Login](/en/pages/jinba_app/basics/login).
## Step 2: Chat with AI
Select "Chat" from the side menu.
Enter your message in the input field at the bottom of the screen and click the send button.
The AI's response will appear in the chat screen.
For more details, see [Chat Feature](/en/pages/jinba_app/chat/overview).
## Step 3: Use Connectors
Connectors allow AI to access data from external services.
Install the connector you want to use from the Connector Management screen.
Type `@connectorname` in the chat, or let AI automatically select the appropriate connector.
For more details, see [Connectors Feature](/en/pages/jinba_app/connectors/overview).
## Next Steps
Create an AI agent specialized for specific tasks
Automate agent execution with scheduling
# Creating Tasks
Source: https://carnot.mintlify.app/en/pages/jinba_app/tasks/create-task
How to create new tasks
## Creating New Tasks
You can create new tasks from the Task Management screen.
## Task Creation Steps
Select "Tasks" from the side menu.
Click the "New" button at the top of the screen.
Enter the required information on the task creation screen.
Click "Save as Draft" or "Set Schedule".
## Task Settings
### Specifying the Agent
Select the agent to execute for the task.
Click the "Select Agent" dropdown.
Select the agent to use from the list. Published agents are displayed.
When you select an agent, its description and the connectors it uses are displayed.
### Task Name
Enter a name to identify the task.
```
Example: Weekly Sales Report Creation
Example: Daily Sales Aggregation
Example: Month-end Inventory Check
```
Using descriptive names makes it easier to manage tasks in the list.
### Initial Input
Enter the message to send to the agent first. When the task executes, this message is sent to the agent.
```
Example: Please aggregate this week's deal data and create a weekly report.
Example: Please analyze yesterday's sales data and report any anomalies.
Example: Please create a list of products with inventory below 10 units.
```
Include specific instructions needed for the agent to process in the initial input.
### Execution Time
Set the date and time to execute the task.
Execution time settings are explained in detail in [Scheduled Execution](/en/pages/jinba_app/tasks/schedule-execution).
## Save Options
There are two ways to save tasks:
### Save as Draft
If you want to set the schedule later, click "Save as Draft".
* The task is saved in "Draft" state
* You can set the schedule later
* For more details, see [Draft Management](/en/pages/jinba_app/tasks/draft-management)
### Save with Schedule
If you want to specify the execution time and save, set the execution time first then click "Set Schedule".
* The task is saved in "Scheduled" state
* It will be automatically executed at the specified time
* For more details, see [Scheduled Execution](/en/pages/jinba_app/tasks/schedule-execution)
## Input Validation
When creating a task, the following validations are performed:
| Field | Validation |
| - | - |
| Agent | Is one selected? |
| Task Name | Is it entered? |
| Initial Input | Is it entered? |
| Execution Time | When saving with schedule, is it a valid date/time? |
If there are validation errors, error messages are displayed.
## Troubleshooting
* Only published agents can be selected
* Check the publication status in the agent list
* Verify all required fields are filled in
* Check your network connection
# Draft Management
Source: https://carnot.mintlify.app/en/pages/jinba_app/tasks/draft-management
Saving and editing task drafts
## What are Drafts
Drafts are tasks saved before schedule settings. You can set a schedule later to execute the task.
## When to Use Drafts
* When you want to prepare task content but decide execution time later
* When you want to verify task settings before execution
* When you want to create multiple tasks in advance
## Viewing the Draft List
Select "Tasks" from the side menu.
Click the "Drafts" tab at the top of the task list.
Tasks in draft state are displayed in a list.
## Editing Drafts
You can edit the content of draft tasks.
Click the draft task you want to edit.
The task edit screen opens.
Edit the necessary fields:
* Change agent
* Change task name
* Change initial input
Click "Save as Draft" to save changes.
## Setting Schedule from Draft
Set execution time for a draft task to transition it to scheduled execution.
Click the draft task you want to schedule.
The task edit screen opens.
Set the date and time in the execution time section.
Click the "Set Schedule" button when settings are complete.
The task changes to "Scheduled" state and will execute at the specified time.
For more details, see [Scheduled Execution](/en/pages/jinba_app/tasks/schedule-execution).
## Deleting Drafts
You can delete draft tasks that are no longer needed.
Deleted drafts cannot be recovered.
Click the settings menu (⋮) of the draft task you want to delete.
Select "Delete" from the menu.
A confirmation dialog appears. Click "Delete" to confirm.
## Duplicating Drafts
You can copy an existing draft to create a new task.
Click the settings menu (⋮) of the draft task you want to duplicate.
Select "Duplicate" from the menu.
A copy of the original draft is created. "(Copy)" is added to the name.
## Searching Drafts
When you have many drafts, you can quickly find the one you need using the search function.
Enter keywords in the search box at the top of the draft list.
Only drafts matching the task name or initial input are displayed.
# Task Management Overview
Source: https://carnot.mintlify.app/en/pages/jinba_app/tasks/overview
Screen layout and basic features of Task Management
## What is Task Management
The Task Management screen allows you to schedule and automate agent execution. You can manage automatic execution of regular tasks and processing at specified times.
## What are Tasks
Tasks are units that manage agent execution. They consist of the following elements:
| Element | Description |
| - | - |
| **Agent** | The agent to execute |
| **Task Name** | Identifier name for the task |
| **Initial Input** | The message to send to the agent first |
| **Execution Time** | The date and time to execute the task |
## Screen Layout
The Task Management screen consists of the following sections:
### Task List
Displays a list of created tasks.
For each task, the following information is displayed:
* Task name
* Agent used
* Execution status (Draft/Scheduled/Completed)
* Next execution time
* Last execution time
### Drafts
Displays tasks before schedule settings.
For more details, see [Draft Management](/en/pages/jinba_app/tasks/draft-management).
### Scheduled
Displays tasks with execution times set.
For more details, see [Scheduled Execution](/en/pages/jinba_app/tasks/schedule-execution).
## Accessing Task Management
Select "Tasks" from the side menu.
The task list is displayed.
## Key Features
Create new tasks
Edit and manage draft tasks
Set task execution times
## Task Use Cases
* **Agent**: Sales Report Creation Agent
* **Initial Input**: "Please create this week's sales report"
* **Execution Time**: Every Friday at 17:00
* **Agent**: Data Analysis Agent
* **Initial Input**: "Please aggregate yesterday's sales data"
* **Execution Time**: Every day at 9:00
* **Agent**: Report Creation Agent
* **Initial Input**: "Please create last month's activity report"
* **Execution Time**: 1st of every month at 10:00
## Task States
Tasks have the following states:
| State | Description |
| - | - |
| **Draft** | Created but schedule not yet set |
| **Scheduled** | Execution time set, waiting for execution |
| **Running** | Currently executing |
| **Completed** | Execution finished |
| **Error** | Error occurred during execution |
# Scheduled Execution
Source: https://carnot.mintlify.app/en/pages/jinba_app/tasks/schedule-execution
Setting task execution times and automatic execution
## What is Scheduled Execution
Scheduled execution is a feature that automatically runs tasks at specified times. You can choose between one-time execution and recurring execution.
## Execution Types
### One-time Execution
Executes the task once at the specified date and time.
```
Example: Execute on March 15, 2024 at 10:00
```
### Recurring Execution
Executes the task periodically at specified intervals.
| Recurrence Pattern | Description |
| - | - |
| **Daily** | Execute at specified time every day |
| **Weekly** | Execute at specified day and time every week |
| **Monthly** | Execute at specified date and time every month |
## How to Set Schedule
### Setting Schedule for New Task
Click "New" on the Task Management screen.
Enter agent, task name, and initial input.
Select "One-time" or "Recurring".
Specify date and time. For recurring, also set the interval.
Save settings and enable the schedule.
### Setting Schedule from Draft
Select the task from the draft list.
Set the execution type and time.
The task transitions to scheduled state.
## Recurring Settings Details
### Daily Execution
Select "Daily" for the recurrence pattern.
Set what time to execute each day.
### Weekly Execution
Select "Weekly" for the recurrence pattern.
Check the days to execute. Multiple selections are possible.
Set the execution time.
### Monthly Execution
Select "Monthly" for the recurrence pattern.
Set which day of the month to execute.
Set the execution time.
If you want to set month-end, specify 31. For months without 31 days, it will execute on the last day of the month.
## Automatic Execution
Scheduled tasks are automatically executed at the specified time.
### Execution Flow
1. When the specified time arrives, the system starts the task
2. Initial input is sent to the agent
3. The agent processes the request
4. Execution results are saved
### Checking Execution Results
Select "Tasks" from the side menu.
View completed tasks in the "Completed" tab.
Click a task to view execution result details.
## Changing Schedule
You can change the execution time of scheduled tasks.
Click the settings menu (⋮) of the task you want to change.
Select "Edit" from the menu.
Set the new execution time.
Click "Set Schedule" to save.
## Canceling Schedule
You can return a scheduled task to draft status.
Click the settings menu (⋮) of the task you want to cancel.
Select "Cancel Schedule" from the menu.
The task returns to draft state.
## Troubleshooting
Please check the following:
* Is the schedule correctly set?
* Is the agent being used valid?
* Is the connector connection valid?
* Check the agent settings
* Verify the initial input content is appropriate
* Check connector permissions
# Attach resources
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/agents/attach
How to attach skills, connectors, and knowledge to an agent
An agent's capability is defined by the resources attached to it: skills, connectors, and knowledge. Resources live in one of two places.
| Location | Description |
| - | - |
| **Workspace shared** | Shared resources managed under "Configure" in the sidebar (Skills / Knowledge / Connectors). Multiple agents can attach them |
| **Agent-specific** | Resources used by one agent only. Registered from the agent detail page; they do not appear on the shared pages |
## Attaching skills
Open the **Skills** section of the agent's configuration panel (the gear icon in the detail page's header) and click "Add skill."
* Search for a workspace-shared skill and attach it, or use "Create new" to build an agent-specific skill from scratch
* There is a limit on how many skills can be attached to one agent (the remaining count is shown on the add screen)
* To use a shared skill with small tweaks, use "**Copy to this agent and edit**" (fork)
Editing a workspace-shared skill **affects every other agent** it is attached to. Be mindful of the blast radius.
## Attaching connectors
Manage these in the **Flow connectors** and **External connectors** sections of the configuration panel.
* **jinba-flow** — Jinba connections are grouped into "**In use**," "**Available · Connected in workspace**," and "**Available · Not connected (connect to use)**." Press "**Connect**" to attach one in one click. Your own workspaces also appear in the not-connected group and connect as connections dedicated to this agent (marked with an "**Agent-only**" badge)
* **Add connector** (Custom MCP) — pick a shared MCP connection, or register an agent-specific MCP server
Agent-specific connections do not appear to other agents or in the workspace catalog. Use them for connections you want to keep scoped, such as department-specific systems.
## Attaching knowledge
Open the **Knowledge** section of the configuration panel and click "Add knowledge."
* **Attach files individually; sync folders wholesale** — setting a folder to "auto-sync" means files added to the folder later are automatically reflected in the agent
* Search and select workspace files and folders, or drag and drop files right there to add them (pasting URLs is supported too) — files and URLs added this way become agent-specific material
* "**Import from Notion**" at the bottom of the picker registers Notion pages as agent-specific knowledge. It opens the "**Add Knowledge (this agent only)**" dialog, where you paste the page URL and choose a destination folder
The Knowledge section shows each item's sync status, size, and how many agents use it — the same information as the workspace Knowledge page. Agent-specific folders offer the full folder menu (add source, create subfolder, rename, move, delete) and drag-and-drop moves within the agent's scope; folders mirrored from the workspace stay read-only, and auto-synced folders offer "**Stop syncing**" only.
There is a limit on how many knowledge sources are loaded automatically when a chat starts. Sources beyond the limit are not auto-loaded, but the AI can still search for and retrieve them as needed. See [Organize knowledge](/en/pages/jinba_app_neo/knowledge/organize) for details.
## Detaching
Remove attachments from the list in each section. In the Knowledge section, the action depends on where the item lives: a workspace-shared item shows "**Remove from agent**" — the source itself stays in the workspace and can be re-added later — while an agent-specific item shows a red "**Delete**" with a confirmation, and deleted agent-specific resources cannot be restored. Bulk selection adapts the same way ("Remove from agent" / "Delete selected"; a mixed selection shows "**Delete / remove**" with a single confirmation covering both).
# Create an agent
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/agents/create
How to create a new agent and what each setting does
## Steps
Select "Agents" in the sidebar and click "**New agent**."
* **Name** (required) — e.g., Sales Analyst. A name an existing agent already uses is rejected (case-insensitive); the same check applies when renaming later
* **Description** — a one-liner describing this agent's role
* **Model** — the Claude model used for new chats with this agent
* **System prompt** (optional) — behavior, tone, and constraints. If left blank, the default system prompt is used
Enter a name and press "**Auto-generate**" to have the AI draft a description and system prompt from what you have entered so far.
Press "Create" to create the agent and go to its detail page. Next, attach skills, connectors, and knowledge ([Attach resources](/en/pages/jinba_app_neo/agents/attach)).
## Creating from chat
You can also create an agent without leaving chat. In a chat with no agent selected, just ask — "Create an agent for sales analysis" — and the AI drafts the setup and shows an "**Agent creation proposed**" card.
* Review the name, description, model, and system prompt on the card
* Press "**Create**" to create the agent, or "Dismiss" to pass — nothing is created until you approve
* Use the "**Open**" link on the card to jump to the new agent's detail page and continue setup
* The created agent appears in the sidebar's agent list right away
## Notes on choosing a model
Model changes apply to **new chats only**. Existing chats keep running on the model they were created with. To keep the response style consistent, we recommend sticking with the model chosen at creation time.
| Model | Best for |
| - | - |
| Claude Opus 4.8 | Complex reasoning and multi-step agentic tasks |
| Claude Sonnet 4.6 | Most business tasks (default) |
| Claude Haiku 4.5 | Quick lookups and summaries |
## Writing a system prompt
Put in the system prompt anything you always want the agent to follow.
* **Role**: "You are an analyst responsible for sales data analysis"
* **Tone and language**: "Always respond in polite, formal Japanese"
* **Constraints**: "Always cite a source for every number"
* **Procedures**: routine workflows
Your prompt is layered on top of the platform's base prompt, not a replacement for it. It wins on role, style, tone, and format, while platform behavior (tool usage, memory, file handling, confirmation before destructive actions) still applies — no need to restate any of that. The response language changes only if you say so explicitly (e.g., "always answer in English"); writing the prompt itself in a given language doesn't change it.
For concrete procedures you want to reuse, register them as a [skill](/en/pages/jinba_app_neo/skills/overview) rather than writing them into the system prompt. Skills can be shared across agents and can receive update suggestions from chat.
## Setting an avatar
From the Settings section of the agent's configuration panel, you can upload an avatar image (PNG / JPEG / GIF / WebP, up to 2 MB). It helps you identify the agent in lists and chat screens.
## Built-in document creation skills
Every agent supports creating PowerPoint (.pptx), Word (.docx), Excel (.xlsx), and PDF documents out of the box. No extra setup is required.
# Operate and manage agents
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/agents/manage
Version history, archiving, and deletion
The **Settings** section of the agent's configuration panel (the gear icon on the detail page) covers the administrative operations you need for day-to-day use.
## Changing settings
* You can change the name, description, model, and system prompt
* Renaming to a name an existing agent already uses is rejected (case-insensitive)
* "Auto-generate" regenerates the description and system prompt from the current inputs
* The creator and last-updated timestamp are shown in the "Info" section
Model changes apply to new chats only. Existing chats keep running on the model they were created with, so chats within the same agent can end up on different models, with noticeable differences in response style.
## Changing settings from chat
While chatting with an agent, you can also ask it to change its own settings — "make your tone more formal," "switch your model to Haiku." The AI shows a "**Settings change proposed**" card with the changes (including a system prompt diff) and applies them only when you press "**Apply changes**." Changes apply from the next chat.
Sharing changes can be proposed from chat too — see [Share an agent](/en/pages/jinba_app_neo/agents/sharing). Lifecycle operations — deleting or archiving the agent — and erasing its memory are deliberately **not available from chat**: if you ask, the AI directs you to the agent's settings screen or Memory section instead. See [In-Chat Forms and Suggestions](/en/pages/jinba_app_neo/chat/interactive-cards) for the full list of cards.
## Version history
Changes to settings such as the system prompt are recorded as **version history**.
* Open "Version history" in the Settings section to list past versions
* You can view the diff of the system prompt for each version
* Use "**Restore**" to roll back to a previous version
## Duplicating
"**Duplicate**" builds a new agent from an existing one. It sits in the "…" menu on each card or row in the agent catalog, and in the "**Duplicate agent**" card of the Settings section.
* Anyone who can **see** the agent can duplicate it — including an agent shared with you and an agent opened from another workspace because it is shared org-wide. Archived agents cannot be duplicated
* The copy is created in **your** workspace as **your private agent**; the original's sharing settings are not carried over
* The name defaults to "\ (copy)" and can be edited in the dialog before you confirm. Duplicating your own private agent skips the dialog and copies straight away
* Workspace-shared skills, knowledge, and connectors stay linked to the shared originals, so the copy keeps receiving their updates. Resources that belong to the agent alone are copied as they are at that moment and stop tracking the original
* Duplicating an org-shared agent from another workspace copies the attached skills and knowledge — **the workspace-shared ones included** — into your workspace as material of your own, so nothing stays in sync. Custom MCP connections are not carried over in this case; set them up again on the copy
* **Memory and chat history are not carried over.** Jinba Flow connections are copied, but using them still requires your own Jinba Flow access, and the agent's own MCP server settings, which hold credentials, are not carried over (the dialog says so when it applies)
Once the copy is created you land on its detail page.
## Archiving
Archive agents you are not using for the time being.
* Archived agents **cannot be selected for new chats**, but past chats remain viewable
* Settings and sharing cannot be changed while archived (the sharing scope stays visible as read-only). Unarchive first if you need to make changes
## Deletion
Delete an agent from "Danger zone" in the Settings section. Deletion happens only on this screen — it cannot be performed from chat.
Deletion also removes the version history and audit log, and cannot be undone. Associated chats are not deleted — they remain in your history as standalone chats.
# Agent memory
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/agents/memory
How agents learn from conversations, and how to manage what they learn
Each agent has an **agent memory** where the AI notes procedures and caveats learned from conversations with that agent. Manage it in the **Memory** section of the agent's configuration panel.
**Personal memory**, which stores your individual preferences, is managed separately. See [Memory (personal settings)](/en/pages/jinba_app_neo/settings/memory).
## How it works
* During conversations with this agent, the AI writes down anything it judges worth remembering, as it happens
* What it writes down is **shared with everyone who uses this agent**
* It does not backfill from past logs. Learning starts with conversations after you turn it on
* In chats started without an agent, the AI can also consult the memories of the agents you can use (read-only). Up to **8 memories** are consulted in one chat, including your personal memory; beyond that, recently updated agents take priority
## Turning learning on and off
Use the "**Learn from conversations (shared with everyone)**" switch in the Memory section.
* Turning it off stops new entries from being written (existing memories remain)
* You can also ask from chat — "turn off this agent's memory" — and the switch flips only when you approve the confirmation card
## Viewing and managing memories
The Memory section lists everything this agent has learned.
* Members with edit permission can **edit or delete each entry individually**, or delete every entry at once with "**Delete all**" (a confirmation is shown; this cannot be undone)
* View-only members ("Use only" permission) can read the entries but not change them
Erasing memory — a single entry or all of it — happens only on this screen. Asking from chat will direct you here instead.
Agent memory works like a team-shared handover note. If the AI learns something incorrect, fix it by editing or deleting the entry.
# Agents overview
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/agents/overview
What agents are and how to use them by purpose
An **agent** is a conversation partner that bundles skills, connectors, and knowledge. Create several in a workspace and switch between them by purpose.
## What an agent has
| Component | Description |
| - | - |
| **Model** | The Claude model that generates responses (Opus 4.8 / Sonnet 4.6 / Haiku 4.5) |
| **System prompt** | Instructions for behavior, tone, and constraints |
| **Skills** | Attached playbooks and instructions |
| **Connectors** | Attached external service integrations (jinba-flow, MCP) |
| **Knowledge** | Attached reference material |
| **Memory** | What the AI has learned from conversations with this agent (shared by everyone who uses it) |
## Agent list
Open the workspace's agent catalog from "Agents" in the sidebar.
* **View toggle** — grid / list
* **Sort** — recently used / creation date / name
* **Search** — filter by name
* **Pinning** — pin frequently used agents for quick access from the sidebar, and put pinned agents first with "**Pinned first**"
The view, sort, and "Pinned first" choices are remembered on the device you are using, so the catalog comes back the way you left it. A link that carries an explicit view or sort in its URL wins over the remembered choice.
## Agent detail page
Selecting an agent opens its detail page — a chat surface for that agent where you start new chats and revisit past ones. Press the **gear icon** in the header to open the **configuration panel** on the right (it can be resized by dragging its edge), organized into sections:
| Section | Contents |
| - | - |
| **Skills** | Attach or create skills |
| **Flow connectors** | jinba-flow workspace connections |
| **External connectors** | Custom MCP servers and other connectors |
| **Knowledge** | Attach knowledge or register agent-specific material |
| **Memory** | View and manage agent memory |
| **Settings** | Name, description, model, system prompt, avatar, version history, duplicate, archive, and delete |
The `‹` chevron beside the agent's name always goes **up to the agent catalog**, whichever screen you arrived from — use your browser's back button to retrace your steps instead.
Each section card shows a count and a short preview of what is attached. Click the card header ("Manage" / "Edit") to open the section, or click a preview row to jump straight to that item. The panel state — which section and item you have open — is reflected in the page URL, so it survives reloads and can be shared with teammates as a link.
## Permissions
* An agent's settings can be changed by its **creator**, a **workspace owner**, or members granted "Can edit" permission when the agent was shared
* Members with "Use only" permission can chat with the agent but cannot change its settings
## Next steps
Setting the name, model, and system prompt — with auto-generation
How to attach skills, connectors, and knowledge
Configuring sharing scope and permissions
Version history, archiving, and deletion
# Share an agent
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/agents/sharing
Configuring sharing scope and permissions
Agents you create can be shared with other members of the workspace. Configure sharing from the Sharing chip on the agent detail page.
## Sharing scope
| Scope | Description |
| - | - |
| **Only me** | Only the creator can use it (default) |
| **Specific people** | Only the members you choose can use it |
| **Everyone in the workspace** | All workspace members can use it |
| **Everyone in the organization** | All members of the organization can use it, from any workspace in the organization. Attached knowledge also becomes visible to the whole organization. Editing remains limited to the originating workspace |
The sharing dialog itself offers the first three scopes only. Org-wide sharing has its own action — see "Share with the whole organization" below — and while it is in effect the dialog's scope options can no longer be saved.
## Permissions for people you share with
Along with the scope, choose what the people you share with can do.
| Permission | What it allows |
| - | - |
| **Use only** | Chat only. No changes to settings |
| **Can edit** | Chat, plus changes to settings and attached resources |
## Share with the whole organization
Sharing an agent beyond its own workspace is a separate action, on the agent detail header next to the sharing chip.
* Press "**Share with organization**" and confirm. The dialog explains: "Everyone in your organization will be able to view and use this asset. You can stop sharing at any time."
* The header then carries a "**Shared**" chip, and the agent appears in the agent list of every workspace in the organization
* "**Stop sharing with organization**" reverses it — members outside this workspace lose access and the agent returns to the visibility it had before
* The action appears only in the workspace where the agent was created, only for members with "Can edit" rights, and not while the agent is archived
* While the agent is shared org-wide, the sharing dialog cannot be saved. It shows a note pointing you back to "Share with organization" or to Organization settings
Organization owners and admins see everything shared this way under "**Shared assets**" in [Organization settings](/en/pages/jinba_app_neo/settings/workspace), where they can stop a share (the reason is recorded) or share it again.
Once you edit an agent that is shared org-wide, the header adds "**Shared version differs from your latest edits**." Everyone keeps chatting with the current agent — the note is a record-keeping marker, which an administrator clears with "**Update shared version**" under Shared assets.
## Proposing sharing changes from chat
While chatting with an agent, you can also ask it to change its own sharing — "share this agent with everyone in the workspace." The AI shows the change (current scope → new scope) on the "**Settings change proposed**" card, and nothing changes until you press "**Apply changes**." Unlike other settings, an approved sharing change takes effect **immediately**.
* Sharing changes — from chat or on-screen — can be applied only by the agent's **creator** or a **workspace owner**
* The "Specific people" scope cannot be set from chat; choose the members on the sharing screen
## What "Use only" members see
* The agent carries a "**View only**" badge in the agents list
* The configuration panel stays fully browsable, but read-only: a bar reads "**Shared with you for use — this configuration is view-only.**" and section actions show "View" instead of "Manage / Edit"
* Jinba Flow connections show which workspaces are connected, but the individual flow list is visible only to members of the workspace that owns the connection
## Things to keep in mind
* Members you share with can use the skills, connectors, and knowledge attached to the agent — **through that agent**. They never see the connector credentials themselves
* Agent memory (what the AI learns from conversations) is **shared by everyone** who uses the agent. See [Agent memory](/en/pages/jinba_app_neo/agents/memory) for details
* An agent shared with the whole organization always reads its knowledge in **the workspace it lives in**. Whichever workspace you chat from, both the knowledge you mention in the composer and the material the AI looks up itself come from the agent's own attached knowledge — never from your workspace's catalog
* If you stop sharing, those members can no longer open their chats with that agent
* Workspace members who are not members of the organization (guests invited from outside it) do not see agents shared with "Everyone in the organization"
* Sharing settings cannot be changed while the agent is archived — unarchive it first. The current scope stays visible as read-only
# AI Activity and the Workspace Panel
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/chat/agent-activity
How to read the AI run status, review outputs, code, terminal output, and plans, and save deliverables to Knowledge or Notion
In Jinba App Neo, the AI works inside an isolated session environment for each message, performing file operations, code execution, web search, and more. This page explains how to follow what it is doing.
## Run status
The AI's status is shown in the message area in real time.
| Indicator | Meaning |
| - | - |
| Connecting... | Starting the session |
| Thinking... / Reasoning... | The AI is working out its answer or plan of action |
| Running tool | Executing a Connector tool, code, or similar |
| AI running | Work is in progress (changes to "Done" when finished) |
## Interrupting a run
While the AI is running, an "**Interrupt**" button is shown. Click it to stop processing at any time. An interrupted chat records "AI run was interrupted", and you can send follow-up instructions from there.
## The workspace panel
Use the "Workspace" toggle in the chat screen to open a side panel showing what the AI has been working on. You can also switch it to full screen.
### Tabs
| Tab | Contents |
| - | - |
| **Results** | A summary of the run's results |
| **Files** | Files the AI created ("Deliverables"). Select one to view its contents in place — text-based formats show their source, images / PDF / Office files show their rendered form. The "Open preview" (eye) action on a row opens it in the Preview tab, and "Download all (ZIP)" grabs everything at once |
| **Code** | Code files the AI created or edited |
| **Terminal** | Commands the AI ran and their output. Output can be shown or hidden |
| **Plan** | The work steps the AI laid out. The current step is highlighted |
| **Preview** | Rendered previews of HTML, Office documents (.docx / .xlsx / .pptx), PDFs, images, and similar formats |
| **Console log** | A record of what was executed |
Browser view (a live view of the AI's browser operations) is coming soon.
When the AI produces a file and the panel opens automatically, formats that cannot be rendered in Preview (data files such as JSON) open on the **Files** tab, where the contents are still readable.
### The new preview layout (rolling out)
The panel is moving to a new layout that shows **one item at a time**: the preview gets its own pane next to the chat, and a separate "**Files**" pane — with search, filters (All / Deliverables / Sources / Code), and bulk download — opens from the tab on the right edge. Panes are resizable, and the preview can be expanded to the full chat width. The rollout is gradual, so your workspace may still show the tabbed panel described above.
## Receiving generated files
When the AI creates files, they appear in the message as cards under a "**Deliverables**" heading — each card shows a format icon, the file name, and its format and size. Click a card to preview it, or use the download button on the card to save it. Word (.docx), Excel (.xlsx), PowerPoint (.pptx), and PDF files render as previews (legacy binary `.doc` is download-only); other non-previewable formats open in the Files tab, where you can still read their contents or download them.
## Saving generated files to Knowledge or Notion
Deliverables can be saved to a permanent home without downloading and re-uploading. Click the **bookmark icon** on a deliverable card (or "**Save…**" in the Preview tab's toolbar — use this for images, which have no card bookmark) and choose a destination:
* **Knowledge** — save the file as a knowledge source. In an agent chat you can choose between workspace knowledge and that agent's knowledge; for workspace knowledge, pick the destination with the built-in folder browser (the folder you are currently viewing is where the file is saved)
* **Notion** — export the file to a Notion page you search for and select (requires the [Notion personal connector](/en/pages/jinba_app_neo/connectors/personal-connectors); if it is not connected, the menu shows a Connect link)
The name field is pre-filled with the file name. If a knowledge item with the same name already exists, nothing is overwritten silently — rename the file, or explicitly choose "**Overwrite and save**." After a save completes, the bookmark stays lit as "Saved" for the rest of the session.
The AI may also offer to save a deliverable for you via a "**Save to knowledge proposed**" card — see [In-Chat Forms and Suggestions](/en/pages/jinba_app_neo/chat/interactive-cards).
## When a run takes a long time
If a tool run through a Connector is slow to respond, a hint message is shown. If a jinba-flow integration leaves no run history on the jinba-flow side, check that the MCP URL is reachable from outside (Anthropic's cloud) — `localhost` and internal-only hostnames cannot be reached.
# Composing Messages and Attachments
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/chat/composer
Using the composer — sending, reference pickers, and file attachments
## Sending messages
* **`Enter`** sends the message; **`Shift + Enter`** or **`⌘ + Enter`** (`Ctrl + Enter` on Windows) inserts a line break
* The Enter that confirms a text conversion in IME-based input (such as Japanese) never sends
* You can switch the send key to `⌘ / Ctrl + Enter` under "**Sending messages**" in [Theme & Language settings](/en/pages/jinba_app_neo/settings/appearance); in either mode, the Enter combination that is not the send key inserts a line break. The keycap chip next to the send button shows the active key. On phones and tablets, Return inserts a line break — use the send button to send
* Messages sent while the AI is still working are **queued** and processed once the current run ends. The AI opens each reply by noting which request it is answering, so stacked messages don't get mixed up
## Reply suggestions
After the AI finishes responding, a predicted next reply may appear as gray ghost text in the empty composer.
* Press **Tab** to accept it; it is inserted into the composer for you to edit or send
* Start typing your own text and it disappears
* The suggestion is kept with the reply, so it is still waiting for you after a reload — and it is prepared even when the AI finished the reply while you were on another screen
## Reference pickers
Typing certain trigger characters in the composer opens a picker that lets you search agents, connectors, knowledge, and skills by name and embed them in your message as references.
| Trigger | What you can reference |
| - | - |
| `@` | **Agents** — pick the agent to bind this chat to |
| `#` | **Connectors** — a jinba-flow workspace connection, an individual flow, or a custom MCP server |
| `[[` | **Knowledge** — attach a registered file, or a whole folder as one reference |
| `/` | **Skills** — specify a skill you want the AI to use |
Referencing a flow with `#` makes your intent — "run this flow" — unambiguous, so the AI picks the right tool without hesitation. We recommend using it liberally for routine work.
Flows in the `#` picker are organized by their jinba-flow folder structure — drill into folders, or just type to search across everything (results show the folder path). The `[[` picker is a navigable folder tree too: "Add entire folder" attaches the folder's whole contents, subfolders included.
Searches can include spaces, so multi-word names like "Weekly Report" match as you type. The picker closes on a line break, on two consecutive spaces, or when a spaced query no longer matches anything — and Esc closes it too. Selected references appear as chips and can be removed with the ✕.
## The "+" menu
The "+" button to the left of the composer offers the same actions.
* **Select an agent** — bind the chat to an agent
* **Add files or photos** — attach files
* **Attach folder** — attach a folder's contents in one go
* **Connectors** — pick a connector
## File attachments
Attach documents or images you want analyzed.
* **Drag and drop** files or folders onto the composer, or choose from the "+" menu
* Attaching a folder (via "**Attach folder**" or drag and drop) attaches the files inside it individually — subfolders are included, but the folder structure itself is not preserved, and OS bookkeeping files such as `.DS_Store` are skipped automatically
* There are limits on the number of attachments per message and on file size (an error message will let you know if you exceed them)
* You cannot send until the upload finishes. Please wait for it to complete
* A failed attachment states the reason on its chip — an unsupported file type, over the size limit, an empty file, a server error, a network error, a timeout, or the organization's storage limit — and the **retry** button next to the ✕ re-runs that upload in place, so you never have to pick the file again
* An upload that takes longer than five minutes is given up and lands in that same failed state, so the send button is never left disabled with nothing you can do about it
Uploads fail if your organization has reached its storage limit. In that case, contact your workspace administrator.
Files registered in Knowledge are not attachments to your message. They stay available to the AI as standing reference material, but it does not act on them unless your request refers to them — when "this file" could mean either, it asks which file you mean.
## Pasting large text
Pasting a long text (roughly 2,000 characters or 40 lines and up) condenses it into a compact "**Pasted text**" card above the input instead of flooding the editor.
* Nothing is uploaded — the card's content is merged back into the message when you send
* Remove a card with the ✕; cards are kept with your draft if you navigate away
* Extremely large pastes (1,000,000 characters and up) are attached as a `pasted-text.txt` file instead
## Model and options
The bottom of the composer shows the **AI model** used for this conversation. Hover over the badge to see whether it is the workspace default or a model configured on the agent. The "Options" menu lets you select an agent.
## Selecting an agent
* Choosing an agent with the agent selector in the composer (or `@`) applies that agent's skills, connectors, knowledge, and memory to the conversation
* Choosing "No agent" gives you an ad-hoc chat
* In a chat with no agent, you can also simply ask to talk to a specific agent — the AI shows an **agent hand-off card** that starts a new chat with that agent ([In-Chat Forms and Suggestions](/en/pages/jinba_app_neo/chat/interactive-cards))
* You cannot switch agents after a chat is created. To use a different agent, start a new chat
# In-Chat Forms and Suggestions
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/chat/interactive-cards
Flow input forms, flow approval cards, multiple-choice questions, AI operation cards, connect cards, agent hand-off cards, agent setting proposals, skill suggestions, and save-to-knowledge proposals
As the AI works, it may show input forms or suggestion cards in the chat. This page explains what each one means and how to respond.
Cards that propose keeping something for later — a skill, knowledge, a connector, or a new agent — open with a plain-language line describing what approving will do; the corresponding product term appears alongside as a label (for example "It will be saved as a Skill").
## Flow input forms
When running a jinba-flow flow, the required inputs are shown as a form.
* Fill in the required fields (marked with `*`) and press "**Run**" to execute the flow
* Fields with an **AI guess** badge contain initial values the AI inferred from the conversation. You can use them as-is or edit them
* For file fields, enter the path or reference of the file the flow needs
* Press "Cancel" to abandon the input
## Flow approval card
If a running flow reaches a step that waits for a person — an approval step (WAIT\_FOR\_APPROVAL) or a step that asks you a question — the flow-run card (the card that tracks a flow's run status in the chat) switches to "**Awaiting approval…**" and shows a form. Requests you can settle with a choice plus a comment (optional or required) are answered right on the card; if the step needs a form that chat cannot display, the card asks you to respond on the Jinba Flow side instead. See [jinba-flow integration](/en/pages/jinba_app_neo/connectors/jinba-flow) for how approvals work (comments, actions, and expiry).
## Multiple-choice questions
When the AI is unsure how to proceed, it may show a question card with options.
* Choose one option per question (or several, when "Multi-select" is shown)
* If no option fits, pick "**Other**" and type a free-form answer (typing selects it automatically)
* "**None of these fit**" dismisses the question entirely — the AI won't re-present the same options and follows up a different way instead
* Once you answer, the AI resumes work
## Jinba AI operation card
When the conversation calls for jinba-flow operations and AI operation is off, a card may appear asking "**Let the AI operate your Jinba?**"
* Choose "**Enable**" and an "**Allow the AI to operate your Jinba?**" dialog explains the scope; press "**Allow**" to let the AI list, create, and run Jinba flows on your behalf. This is a one-time, account-wide setting — you won't be asked again in any chat, and the AI resumes the original request right away
* Choose "Not now" to skip. You can turn it on (or off) later from the "**Let the AI create and edit workflows**" band at the top of the Flow page's list column
* If your organization's settings disable AI code execution, the card shows "**Unavailable — your organization's settings disable AI code execution.**" and cannot be enabled
Credentials (such as API keys) are never passed to the AI. For details on how it works, see [jinba-flow integration](/en/pages/jinba_app_neo/connectors/jinba-flow).
## Connect cards
When the conversation needs a service that is not connected yet, the AI can offer to connect it right in the chat instead of sending you to the Connectors screen.
* **Connector connect card** — "**Connect Gmail?**" and the like for catalog connectors (Gmail, Google Calendar, Notion, Slack, and so on). "**Connect**" opens the service's sign-in flow in a popup, and the AI resumes your request once it completes ([Personal connectors](/en/pages/jinba_app_neo/connectors/personal-connectors))
* **Reconnect card** — if a connected service stops working because its sign-in has expired or been revoked, the same card appears as "**Reconnect …?**" so you can restore the connection without leaving the chat
* **Jinba Flow workspace connect card** — "**Connect Jinba Flow workspaces?**" shows the organization-shared Jinba Flow workspaces you haven't connected as a checklist; tick the ones you need and press "**Connect**." In chats bound to an agent, you can also pick the **Connection scope** ("This agent only" / "Workspace-shared") — that choice is offered only if you may edit the agent; otherwise the workspaces are connected workspace-shared ([jinba-flow integration](/en/pages/jinba_app_neo/connectors/jinba-flow))
## Agent hand-off card
In a chat with no agent selected, asking to talk to a specific agent — or describing work an existing agent is a better match for — can bring up an **agent hand-off card** (labeled "**Call agent**") proposing that agent.
* The card shows the matched agent and an editable "**First message to send**"
* "**Start chat**" opens a new chat bound to that agent; the first message is sent for you and the agent replies there. The original card keeps an "Open" link to the new chat
* "Dismiss" keeps you in the current chat
This is a hand-off, not an in-place switch — the chat you are in keeps its own agent setting ([Selecting an agent](/en/pages/jinba_app_neo/chat/composer)).
## Agent setting proposals
When you ask for it in chat — or when the AI spots something that would help — the AI can create a new agent or change the current agent's setup. Each change is shown as a proposal card first, and **nothing is applied until you approve it**.
* **Agent creation proposed** (in chats with no agent selected) — review the name, description, model, and system prompt, then press "Create." An "Open" link takes you to the new agent
* **Settings change proposed** — shows what changes, including a system prompt diff. Press "**Apply changes**"; changes apply from the next chat
* **Sharing change proposed** — change who can use the agent (only you / everyone in this workspace / everyone in the organization) and whether they can also edit it. The card shows the change as before and after; unlike other settings, sharing takes effect **immediately** when you apply it
* **Connector addition proposed** — attach a connector already connected in the workspace to the agent. When several could fit, the card shows a picker grouped into "**Jinba Flow workspaces**" and "**Custom MCP servers**" — it opens even when nothing matches the name the AI mentioned, so just pick the right one. "Add" saves it right away — in most cases the card then reads "**Ready to use in this chat**"; otherwise it takes effect in new chats with this agent
* **Skill attach proposed** — attach a workspace-shared skill the workspace already has to the agent ([Create Skills from Chat](/en/pages/jinba_app_neo/skills/from-chat))
* **Knowledge addition proposed** — attach a knowledge source to the agent. Choose "Add" to attach it, or "Dismiss" to pass; additions take effect from your next chat
* **Confirm memory action** — turning the agent's memory learning on or off; the switch flips only when you press "**Run**." Erasing memory — single entries or all of it — is not possible from chat; the AI directs you to the agent's Memory section instead ([Agent memory](/en/pages/jinba_app_neo/agents/memory))
* **Confirm detach** — removing an attached skill, connector, or knowledge item from the agent. Detaching saves right away; a shared item stays in the workspace catalog. Deleting the agent itself is not possible from chat ([Managing agents](/en/pages/jinba_app_neo/agents/manage))
For knowledge addition proposals, the caret on the "Add" button offers "**Auto-approve the rest**": for the next 24 hours in that chat, further knowledge additions are applied without confirmation. While it is active, an "Auto-approving knowledge additions" banner above the composer reminds you (end it anytime with "Turn off"), and auto-approved cards carry an "auto" tag with an Undo link.
## Save-to-knowledge proposals
After producing a deliverable, the AI may offer to keep it for you with a "**Save to knowledge proposed**" card.
* The card spells out the name, the destination (a Knowledge folder, or the agent's private knowledge), and who will be able to use the file. Press "**Save**" to register it, or "Dismiss" to pass
* "**Change…**" opens a picker where you can adjust the name and destination before saving
* Saving is **create-only**: if the name is already taken at the destination, the card warns you before you approve, and the file is saved under a new name like "name (2)" — nothing is ever overwritten
* These proposals always require an explicit click; the auto-approve mode above does not apply to them
* You can also save any deliverable yourself at any time — see [Saving generated files](/en/pages/jinba_app_neo/chat/agent-activity)
## Email draft card
If Gmail is connected and you ask the AI to send an email, an **email draft card** appears in the chat. Review and edit the recipients, subject, and body before sending. You can also cancel with "Discard." The AI never sends email without your confirmation.
## Skill suggestions
When a reusable procedure takes shape during a chat, the AI may show a "**Skill suggestion**" card.
* Check what will be saved in the **body preview**
* Choose where to save it:
* **This agent only** — usable only by the current agent (you can promote it to shared later)
* **Workspace shared** — available to every agent
* Choose "Save" to register it, "Not now" to pass, or "**Request changes**" to have the AI revise the draft before saving ([Create Skills from Chat](/en/pages/jinba_app_neo/skills/from-chat))
If the AI detects that a conversation has drifted from an existing skill, it shows a "**Skill update suggestion**" — review the diff of the body and choose "Apply update."
You cannot save a new skill once you reach the skill limit. Consider updating an existing skill or deleting ones you no longer need. See [Skills](/en/pages/jinba_app_neo/skills/overview) for managing skills.
# Managing and Searching Chats
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/chat/manage-chats
The resizable sidebar chat list, pinning, renaming, deleting, cross-chat search, and in-chat search
## The chat list in the sidebar
The sidebar shows chats per agent as well as recent (ad-hoc) chats. Recent chats are grouped into "Today / Yesterday / Last 7 days / Last 30 days."
An expanded agent group shows at most 10 of that agent's chats. "**Show N more**" reveals the ones already loaded beyond that, and "**Show more**" then loads older chats for that agent, 25 at a time, until there are none left. Collapsing the group puts it back to 10. The chat you are currently in — and any chat with a run in progress — always stays visible, however far down the list it sits.
On desktop, the sidebar is **resizable** — drag its right edge to the width you like (double-click the handle to reset). Dragging it all the way in collapses it to a narrow icon rail; drag it back out to expand. The width is remembered per device.
The sidebar never collapses on its own — navigating or resizing the window keeps it open, and collapsing is always your decision (the toggle button or the drag). If you would rather have it fold down to icons on portrait devices and narrow windows, choose "**Fold to icons**" under "**Sidebar on small screens**" in [Theme & Language settings](/en/pages/jinba_app_neo/settings/appearance) (off by default).
## Pinning
Pin frequently used chats to keep them at the top of the sidebar.
* Choose "**Pin**" from the chat's menu
* To remove it, choose "Unpin"
## Renaming
Chat titles are generated automatically from the first message, but you can change them at any time via "**Rename**" in the menu.
## Deleting
Choose "**Delete**" from the chat's menu. The messages in the chat are deleted as well.
Deleted chats cannot be restored.
## Cross-chat search
"**Search**" in the sidebar (shortcut: `⌘K`, `Ctrl + K` on Windows) opens the command palette, where you can search your past chats.
* Both **titles and message bodies** are searched
* Select a result to jump to that chat
## In-chat search
To search within the open chat, use "Search in this chat." Move between hits with "Previous / Next."
## When a chat cannot be found
If you see "Chat not found," the chat has been deleted or you no longer have access (for example, a chat belonging to an agent that is no longer shared with you).
# Chat Overview
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/chat/overview
An overview of chat in Jinba App Neo
Chat is the central screen of Jinba App Neo. Talk to an agent to ask questions or request work, watch the AI's progress in real time, and receive the results.
## Types of chats
| Type | Description |
| - | - |
| **Agent chat** | A chat bound to a specific agent. That agent's skills, connectors, knowledge, and memory are applied automatically |
| **Ad-hoc chat** | A chat with no agent specified. It runs with the workspace default model and the default Skill (if one is configured) |
Selecting an agent via `@` in the composer or the "+" menu when creating a chat turns it into an agent chat.
## Screen layout
* **Sidebar** — New chat, Search (command palette), Agents, Flow, Configure (Skills, Knowledge, Connectors), and pinned / recent chats (grouped into Today / Yesterday / Last 7 days / Last 30 days)
* **Message area** — The conversation history. The AI's activity (thinking, running tools, and so on) also appears here
* **Composer** — Message input, file attachments, and the reference pickers
* **Workspace panel** — A side panel where you can inspect files the AI created, code it ran, terminal output, and its work plan
## Basics
How to send messages, the reference pickers (@ / # / \[\[ and more), and file attachments
Reading the AI's progress, interrupting it, and inspecting outputs, code, terminal, and plans
Flow input forms, multiple-choice questions, AI operation cards, agent setting proposals, and skill suggestions
Pinning, renaming, deleting, cross-chat search, and in-chat search
## Models and chats
The model used in a chat is decided when the chat is created and **stays fixed within that chat**. To use a different model, start a new chat. You can check the current model on the model badge in the chat screen.
## Response language
The AI generally responds in **the language you write in**. An explicit request such as "answer in English" always takes top priority. The app's display language (Settings > Appearance > Language) is used as a fallback when the language cannot be determined from your input.
## When you hit your usage limit
Once you reach the monthly usage included in your workspace plan, sending messages is temporarily blocked and the reset date is shown. To raise the limit, talk to your workspace owner or contact support.
The limit is also checked while a reply is being generated: if a long run crosses it partway through, the run is stopped there and the chat shows "This response was stopped because you've reached this month's usage limit." Whatever the AI produced up to that point stays in the chat.
# Connect a Custom MCP
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/connectors/custom-mcp
How to register any MCP server, and what to watch out for
Register an MCP server for an internal system or external service, and the AI can call its tools. Register it via "**Add MCP**" on the Connectors page (Sidebar > Configure).
Jinba App Neo supports **http-stream type** MCP servers. stdio type (locally executed) servers cannot be registered. Configurations that go through `mcp-remote` can be converted via JSON paste.
Your organization's policy may block custom connectors. If you see "**Your organization has blocked custom connectors (MCP).**", registration is unavailable — contact your organization's administrator.
## Registering with manual entry
* **Name** — e.g., Internal Wiki MCP
* **Server URL** — the MCP server's endpoint
* **Description** (optional) — what the server provides
For servers that require authentication, set request headers (e.g., `Authorization: Bearer ...`). Headers are sent to the server with every request.
Press "Register." Once registered, the tools can be called from chat.
The server URL must be a **public URL reachable from Anthropic's cloud**. `localhost` and internal-network-only addresses (RFC1918) will not work.
## Registering by pasting JSON
You can paste Claude Desktop-style `mcpServers` JSON as-is.
1. Select the "Paste JSON" tab
2. Paste JSON with a `url` entry, or with `args` that go through `mcp-remote` (one server at a time)
3. Press "Apply to form" to load the parsed result into the form, then review and register
## After registering
Right after registration, the connection may not have been verified yet (you will see "MCP created (connection unverified)"). Check that the tool list loads and that you can run a tool manually from the tool detail screen.
## Editing and deleting
* **Edit** — you can change the name, URL, and description. Saved header values are not displayed; to change them, check "Overwrite saved headers" and re-enter them
* **Delete** — deleting an MCP also deletes its registered tools
Editing a workspace-shared MCP affects every other agent it is attached to.
## Agent-specific MCP
Register an MCP for a single agent from the External connectors section of the agent's configuration panel.
* It does not appear in the Connectors page list
* Authentication tokens can be specified as **key references** to Vault or Secret Manager instead of literal values (so the token itself is never stored)
## Organization connectors
MCP servers your organization's administrator registered for the whole organization show up on the Connectors page in a read-only "**Organization connectors**" group, above the connected / not-connected groups (in both card and list view). Each carries an "**Org-managed**" badge, and the group ends with the note "Applied automatically by your organization. Managed in Organization settings."
* They are already available to every agent — there is nothing to connect
* They cannot be edited or deleted from the workspace side; ask your organization's administrator
* Only the name and description are shown. The server URL and its credential stay on the server
# jinba-flow Integration
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/connectors/jinba-flow
Using workflows as tools, flow runs and approval steps in chat, the Flow run console, and AI operation
Jinba App Neo integrates with jinba-flow in two ways: workspace connections and AI operation. Choose based on what you need (using both is fine).
| Approach | Best for |
| - | - |
| **Workspace connection (call-only)** | Calling published workflows as tools for an agent |
| **AI operation** | Letting the AI handle Jinba end to end from chat — "list my flows," "run this one" — with your own permissions |
## Connecting a workspace
Connect a jinba-flow workspace so its published flows can be called as tools for the AI. Connecting takes one click — there are no API keys to issue or paste. Connecting, listing and running all happen on the same page.
"**Flow**" in the sidebar opens the page (its heading reads "**Jinba Flow**"). Its list column has two sections: "**Connected**" and "**Not connected**." The latter lists the jinba-flow workspaces you belong to whose published flows can be reached from outside. Some may not be connectable depending on their visibility settings (see below).
Press "**Connect**" on a workspace row. It moves to the "**Connected**" section, and its published flows become callable as tools. There is no connection-type choice to make: workspace connections are **call-only** — the AI cannot create or edit flows through them.
Add this connection from the Flow connectors section of the agent's configuration panel. The AI can then run the flows as tools.
* You can also connect straight from the **agent detail page**: its Flow connectors section lists your connectable workspaces too, and one click sets up a connection dedicated to that agent ([Attach resources](/en/pages/jinba_app_neo/agents/attach))
* Connecting **from chat** works too: ask the AI ("connect my Jinba Flow workspace") — or let it propose the connection — and a "**Connect Jinba Flow workspaces?**" card appears listing your unconnected workspaces as a checklist. Tick the ones you want and press "**Connect**." In an agent-bound chat, a "**Connection scope**" toggle lets you choose "**Workspace-shared**" or "**This agent only**." Flows connected this way are usable **in the same conversation** — no need to start a new chat. The card lists organization-shared workspaces; workspaces from your personal Jinba account are connected from the Flow page's "**Not connected**" section
* Workspaces set to **Private** on the jinba-flow side cannot be connected: their rows carry a lock mark noting "**Set to Private on the Jinba Flow side**," and trying to connect opens a "**Can't connect**" dialog explaining why. Switching the workspace's visibility to **Unlisted** makes it connectable (this requires an owner — the dialog's "**Open settings in Jinba Flow**" button takes you to the relevant settings screen)
* Connected workspaces and their published flows stay in that same list column. Selecting a workspace name opens its index beside the list: the flow count, "**Last synced**", the connection's status, and the actions "**Refresh**", "**Change display name**" and "**Disconnect**" (plus "**Go to workspace**" for a workspace you belong to with your own jinba-flow account). On a narrow window the index opens as a sheet from the "…" button on the workspace row instead
* Connections stay in sync automatically: opening the Flow page or the composer's connector picker checks the jinba-flow side for changes, and new or updated flows are marked with "**NEW**" / "**Updated**" chips. Manual "**Refresh**" in the workspace index is still there when you want to force a refresh
* When a flow runs, a [flow input form](/en/pages/jinba_app_neo/chat/interactive-cards) may appear in the chat
## Display names
A connected workspace and an individual flow can each be given a display name that applies **only inside Jinba App** — as the dialog puts it, "Only changes how this connector is displayed in Jinba App. The name in Jinba Flow and syncing are unaffected."
* **A workspace** — "**Change display name**" in its index on the Flow page
* **A flow** — the pencil next to the flow's name in the run console header
While a display name is in use, the jinba-flow name stays visible as "**Original name:** …", and "**Reset to original name**" puts it back.
## Flow runs in chat
When the AI runs a flow, a "**Flow run**" card appears in the chat with the flow's name and live status — "Running…" with the latest progress message and elapsed time, then "**Completed**" or "**Failed**" with the reason (if you have lost access to the Flow workspace, the card says so). Files the flow produces appear as download chips just below the card, with their real filenames, and are collected with the chat's other deliverables.
Files generated earlier in the chat — by a flow or by the AI itself — can be passed as file inputs to follow-up flow runs, so multi-step pipelines work without downloading and re-uploading anything.
## Approval steps (human-in-the-loop)
When a running flow reaches a WAIT\_FOR\_APPROVAL step, the run pauses until someone decides.
* In chat, the flow-run card switches to "**Awaiting approval…**" and shows an approval form: the message the flow author configured, any data to review, a comment box, and one button per configured action (typically **Approve** / **Reject**). An "**Open approval page**" link and the request's expiry are shown as well
* Whether a comment is required is up to the flow author — always, only when rejecting, or not at all. If a required comment is missing, the card says so and you can try again
* The same approval form appears in the Flow run console for runs started from a form there
* A request that has expired, or was already decided by someone else, is reported on the card
## Flow run console
"**Flow**" in the sidebar is a run console for executing published flows directly from a form, without going through chat.
* Flows are listed under the workspace that publishes them. Open a workspace to see its flows — one workspace at a time — or search across every workspace and flow with the box above the list. jinba-flow folders are not shown as levels here; when two flows in one workspace share a name, the row adds its jinba-flow folder path (or "**Top level**") so you can tell them apart
* Newly published flows carry a "**NEW**" chip and updated ones an "**Updated**" chip. A collapsed workspace that has changes behind it shows an "**Updates**" chip
* Selecting a flow opens its input form; run it and check the results on the spot. If the flow has an approval step, the approval form appears right in the console
* "**Deliverables**" collects the files this flow's past runs produced, newest first, above "**Output**" and "**Run History**". Selecting one opens it in the shared [file preview](/en/pages/jinba_app_neo/chat/agent-activity) — as does a file listed under "**Output Files**" in the output itself, so an Excel or Word deliverable can be read without downloading it
* In "**Run History**", an expanded row shows "**Output**" before "**Input**", and a long input value scrolls inside its own box instead of stretching the row
* Drag the divider between the list and the console to resize the list; double-click it to go back to the default, or move it with the arrow keys once it has focus. The width is remembered per device. Output and history scroll with the console as one column
## AI operation
Turn on "**AI operation**" and the AI can operate Jinba on your behalf — listing, creating, and running flows: anything you can do.
* Turn it on with the toggle on the "**Let the AI create and edit workflows**" card, at the top of the Flow page's list column above the search box. The card is collapsed by default — the chevron opens the description of what the setting covers. A confirmation dialog explains the scope; press "**Allow**"
* It is a **one-time, account-wide setting**: it covers every Jinba Flow workspace you belong to (including ones you join later). There are no per-workspace grants
* If the AI needs it mid-conversation, a "**Let the AI operate your Jinba?**" card appears in the chat — press "**Enable**", confirm the same "**Allow the AI to operate your Jinba?**" dialog with "**Allow**", and the AI picks up right where it left off
* You can turn it off anytime from the same card
- The AI acts with **your own permissions**, and every action is logged
- Credentials are never passed to the AI
- If your organization's settings disable AI code execution, this setting is unavailable — the in-chat card shows "**Unavailable — your organization's settings disable AI code execution.**" instead of the Enable button
## Troubleshooting
* **"No access" is shown** — you have lost access to that Flow workspace on the jinba-flow side. Ask the owner to invite you as a member or add an external access rule
* **A "Can't connect" dialog appears when connecting** — the workspace is set to Private on the jinba-flow side, which does not allow external connections. Switch its visibility to Unlisted (requires an owner; ask one if that isn't you)
* **Flow runs never respond** — if no run appears in the jinba-flow run history, the MCP URL may not be reachable from Anthropic's cloud. jinba-flow instances on `localhost` or internal-only hosts cannot be integrated
* **Connected but tools are missing** — check that the flow is **published**. Connections re-sync automatically when you open the Flow page or the composer's connector picker; "Refresh" in the workspace index forces a refresh
# Connectors Overview
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/connectors/overview
The external service connections that extend what the AI can do
A **connector** is a connection to an external service that extends what the AI can do. Through MCP (Model Context Protocol), an open standard, the AI can call external tools. Manage connectors on the "**Connectors**" page in the "Configure" section of the sidebar.
The page opens as a card grid — switch between "**Card view**" and "**List view**" with the toggle in the header. Click a card to open its details.
## Types of connections
Connect your own accounts — Gmail, Slack, Google Calendar, Notion, and more — and let the AI act on your behalf
Call jinba-flow workflows as tools for the AI, or turn on AI operation to let it operate Jinba on your behalf. Connecting, listing and running all happen on the "Flow" page
Register any MCP server, such as an internal system, for the AI to use
## Related pages at a glance
| Page | Location | Purpose |
| - | - | - |
| **Connectors** | Sidebar > Configure | Managing external tool integrations: personal connectors, custom MCP, and more |
| **Flow** | Sidebar | Everything jinba-flow: one-click workspace connect, the AI operation toggle, the list of connected workspaces and their published flows, and a console for running one from a form on the spot |
## Where connections live
| Location | Description |
| - | - |
| **Workspace shared** | Managed on the Connectors page. Multiple agents can attach and use them |
| **Agent-specific** | Registered from the agent's configuration panel. Used by that agent only; not shown in the catalog |
| **Personal** | Personal connectors (Gmail, etc.) are used only in chats by you, the person who connected them |
| **Organization-managed** | MCP servers your organization's administrator registered. They appear on the Connectors page in a read-only "**Organization connectors**" group, marked "**Org-managed**" — see [Custom MCP](/en/pages/jinba_app_neo/connectors/custom-mcp) |
## Using connectors from chat
* The AI automatically selects and runs the tools of connectors attached to the agent, based on the conversation
* You can also name a specific tool or flow with `#` in the composer
* When the AI spots a connection that would be useful given the conversation, it may show a "**Connector addition proposed**" card. Approving saves the addition right away, and in most cases the card then reads "**Ready to use in this chat**" — otherwise it takes effect from your next chat
* When a service you need is not connected yet — or an existing connection has stopped working — the AI can show a connect (or reconnect) card right in the chat. Complete the authorization there and the conversation picks up where it left off. Both [personal connectors](/en/pages/jinba_app_neo/connectors/personal-connectors) and [jinba-flow workspaces](/en/pages/jinba_app_neo/connectors/jinba-flow) support this
## Managing connections
* **Refresh** — refetch the tool list from a jinba-flow connection: in the workspace's index on the Flow page, or beside the connection in an agent's Flow connectors section. jinba-flow connections also re-sync automatically when you open the Flow page or the composer's connector picker, so the manual action is mostly a fallback
* **Disconnect** — remove the connection. The associated MCP server and its tools are deleted too
* **No access** — connections that have lost access on the jinba-flow side show "No access." Ask the Flow workspace owner to invite you as a member or add an external access rule
* **Blocked by your organization** — depending on your organization's policy, some connectors show "**Your organization has blocked this connector.**" A blocked connector cannot be connected, and even one that was connected earlier is not used by the AI while it stays blocked. Contact your organization's administrator
# Personal Connectors (Gmail, Slack, and more)
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/connectors/personal-connectors
Connect your own accounts and let the AI act on your behalf
**Personal connectors** connect your own accounts — Gmail, Slack, Google Calendar, Notion, and more — via OAuth so the AI can operate them on your behalf. Connect them from the Connectors page.
## Available services
| Service | What the AI can do |
| - | - |
| **Gmail** | Search and read email, send email |
| **Slack** | Search and read messages, post to channels (multiple workspaces supported) |
| **Google Calendar** | Check your schedule; create, change, and delete events |
| **Notion** | Import shared pages into knowledge and reference them (works with [Knowledge](/en/pages/jinba_app_neo/knowledge/add-sources)) |
Beyond these, Google and Microsoft apps — Google Drive, Google Docs, Google Sheets, Google Meet, Google Tasks, Excel, OneDrive, SharePoint, Outlook, and Microsoft Teams — can be connected the same way, so the AI can call each connected app's tools. Every connection opens its own authorization screen and is per-user, just like the services above (the lineup can vary by environment).
## Connecting
Open "Configure" > "Connectors" in the sidebar.
Press the "Connect" button for the service you want, then sign in and approve on the authorization screen that appears.
Once connected, just ask in chat — "Summarize yesterday's email from Tanaka-san" or "What's on my calendar tomorrow?" — and the AI will use the tools.
## Connecting and reconnecting from chat
You don't have to visit the Connectors page first. When a conversation needs a service you haven't connected, the AI can show a connect card — "**Connect Gmail?**", for example — right in the chat. Press "**Connect**" and approve on the authorization screen that opens in a separate window, or pass with "**Not now**." Once connected, the AI continues the conversation and can use the service right away. Connections made from chat are the same per-user connections as those made from the Connectors page.
If an existing connection stops working — the authorization has expired or been revoked, for example — the AI shows a reconnect card ("**Reconnect Gmail?**") the same way. Reconnecting re-authenticates the same connection in place; nothing needs to be set up again.
## Sending email with Gmail
When you ask the AI to send an email, an **email draft card** appears in the chat. Review and edit the recipients, subject, and body before sending, or cancel with "Discard." The AI never sends email on its own.
If Gmail is not connected — or its authorization has expired — the card says so and offers a "**Connect Gmail**" button that takes you straight to the right connector; come back and press "Send via Gmail" again.
## Security and privacy
* Personal connectors are used only in chats by **you, the person who connected them**. Other workspace members cannot access your Gmail or Slack
* Credentials (tokens) are stored encrypted and are never passed to the AI
* You can "Disconnect" at any time. After disconnecting, the AI can no longer access that service (you can reconnect whenever you like)
If you disconnect Notion, knowledge already imported remains, but you can no longer import new pages or refetch existing ones.
# Core Concepts
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/core-concepts
The basic concepts that make up Jinba App Neo
Jinba App Neo revolves around "agents," with several concepts working together around them. This page explains what each one does and how they relate.
## The big picture
```
Workspace
├── Agents (units of conversation)
│ ├── Skills (playbooks and instructions)
│ ├── Connectors (external service integrations)
│ ├── Knowledge (reference material)
│ └── Memory (what the AI learns from conversations)
├── Chats (agent-bound / ad-hoc)
└── Configure (shared pages for Skills, Knowledge, and Connectors)
```
## Agents
An **agent** is a conversation partner that bundles skills, connectors, and knowledge. Each agent has a model and a system prompt, and you can create multiple agents in a workspace and switch between them by purpose.
* Examples: "Sales Analyst," "Meeting Notes Writer," "Code Reviewer"
* Agents can be shared with members other than their creator ([Share an agent](/en/pages/jinba_app_neo/agents/sharing))
* You can also chat without specifying an agent (an **ad-hoc chat**)
Throughout this documentation, we use "agent" for the product entity you create and manage, and "AI" for the runtime that actually generates responses and performs work.
## Skills
A **skill** is a playbook or set of instructions you want the AI to reuse. Skills are written in Markdown (SKILL.md format) and carry metadata: a name, a description, and allowed tools.
* Reuse routine know-how such as "How to create an invoice" or "Translation tone guide"
* Skills can live in two places: **workspace-shared** (available to every agent) and **agent-specific**
* During a chat, the AI may detect a procedure worth turning into a skill and suggest saving it
Details: [Skills](/en/pages/jinba_app_neo/skills/overview)
## Connectors
A **connector** is an integration with an external service that extends what the AI can do. Connectors provide tools via MCP (Model Context Protocol), an open standard.
* **Personal connectors** — Connect your own accounts for Gmail, Slack, Google Calendar, Notion, and more, and let the AI act on your behalf
* **jinba-flow connection** — Call published workflows as tools for the AI (one-click connect, call-only)
* **Custom MCP** — Register any MCP server, such as an internal system
* **AI operation** — Let the AI operate Jinba on your behalf (listing, creating, and running flows), with a one-time account-wide setting
Details: [Connectors](/en/pages/jinba_app_neo/connectors/overview)
## Knowledge
**Knowledge** is the reference material the AI grounds its answers in. You can register uploaded files, URLs, and Notion pages.
* Organize sources into folders, and even auto-sync an entire folder to an agent
* Registered sources are kept in sync; they are either loaded automatically when a chat starts, or retrieved by the AI through search
Details: [Knowledge](/en/pages/jinba_app_neo/knowledge/overview)
## Memory
**Memory** is where the AI stores what it learns through chat. There are two kinds:
| Type | What is stored | Who can see it |
| - | - | - |
| **Personal memory** | Your preferences, business terminology, and background | Only you (invisible to other users) |
| **Agent memory** | Procedures and caveats for that agent | Everyone who uses that agent |
You can turn learning on or off, and view, edit, or delete stored memories at any time. Details: [Memory](/en/pages/jinba_app_neo/settings/memory)
## Workspaces and organizations
* A **workspace** is the unit that all your data — chats, agents, knowledge, and more — belongs to. Invite members to collaborate
* Workspaces belong to an **organization**. You can create multiple workspaces and switch between them with the switcher in the sidebar
* Members have one of two roles: **Owner** and **Member**. Administrative operations such as changing settings and managing members are restricted to owners
* Every page URL carries the workspace you are working in — `https://neo.jinba.io/w//…`. A link you copy therefore always points at one specific workspace, and it opens only for members of that workspace (anyone else sees "Page not found"). Links saved before this change still work; they are redirected to the current URL automatically. Switching workspaces in the switcher takes you to the new workspace's home
## Configure (shared resource pages)
The "**Configure**" section of the sidebar contains the **Skills / Knowledge / Connectors** pages, where you manage workspace-shared resources. Agents pull in the resources registered here as needed.
Agent-specific resources (skills or knowledge used by only one agent) are registered from that agent's detail page. They do not appear on the shared pages.
## Models
Responses are generated by models from Anthropic's Claude family.
| Model | Characteristics |
| - | - |
| Claude Opus 4.8 | Top of the line — for complex reasoning and agentic workflows |
| Claude Sonnet 4.6 | Balanced — the default for chat and most tasks |
| Claude Haiku 4.5 | Fastest, lowest latency — for quick lookups and summaries |
* The model is **fixed per chat**. To switch models mid-way, start a new chat
* You can set the model per agent. Ad-hoc chats use the workspace default model
# FAQ
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/faq
Frequently asked questions about Jinba App Neo
## General
Jinba App Neo is the next-generation platform that succeeds Jinba App. What's new includes an agent-centric design (Skills, Connectors, and Knowledge attach directly to agents), AI execution in isolated session environments, continuous learning through Memory, and Skill management in the SKILL.md format.
Data from the Beta period is expected to carry over as a rule, but if there is a major change in the product, we may provide migration guidance. For important data, we recommend keeping the original files — such as knowledge sources — on your side as well.
Anthropic's Claude family (Claude Opus 4.8 / Claude Sonnet 4.6 / Claude Haiku 4.5). You can choose a model per agent or as the workspace default. The model is fixed per chat and never changes mid-conversation.
Yes. Every page is now addressed per workspace (`https://neo.jinba.io/w//…`), and links saved before the change are redirected to the new URL automatically. Because the workspace is part of the URL, a link you share opens only for members of that workspace — anyone else sees "Page not found".
## Chat
By default `Enter` sends and `Shift + Enter` inserts a newline. You can switch to the `⌘ / Ctrl + Enter` style under "Sending messages" in "Settings > Theme & Language" — the choice is saved per device. Either way, `⌘ / Ctrl + Enter` always sends, the Enter that confirms Japanese IME conversion never sends, and on phones and tablets Return inserts a line break (send with the send button).
No. The model and agent are fixed when the chat is created. To use a different model or agent, start a new chat.
Yes. Click the "Stop" button shown during a run to halt at any time. After stopping, you can keep sending follow-up instructions in the same chat.
You've reached the monthly usage allotted by your workspace's plan. Wait for the reset date shown on screen, or talk to a workspace Owner about upgrading the plan.
If the limit is crossed while the AI is still answering, that response is stopped part-way with "This response was stopped because you've reached this month's usage limit." Whatever had already been written stays in the chat, and further messages are blocked until the reset.
## Agents and Skills
No. Chats that were attached to the agent are not deleted — they remain in your history as standalone chats. However, the agent's version history and audit log are deleted.
There is a limit on the number of Skills that can be attached to a single agent (this comes from the underlying Anthropic Managed Agents platform). Consider consolidating or cleaning up existing Skills, or deleting ones you no longer need.
Use "Copy for this agent and edit" (fork) in the Skill editor. The original shared Skill is untouched, and you get a dedicated copy to edit.
## Connections and Knowledge
Check that the flow is **published** on the jinba-flow side. Connections re-sync automatically when you open the Flow page or the composer's connector picker, and you can force a refresh with "**Refresh**" in the workspace's index on the Flow page. If it still doesn't show up, check whether the connection shows "No access" — ask the Flow workspace owner to invite you as a member or add an external access rule.
No. MCP servers need a public URL reachable from Anthropic's cloud. `localhost` and internal-network-only addresses cannot be used, and only the http-stream type is supported.
URL sources keep a snapshot taken at registration time. Run "Re-fetch" on the source to update it to the latest content.
There is a limit on how many items are loaded automatically when a chat starts; anything beyond it gets a "Not auto-loaded" badge. That said, the AI can still retrieve those items via search when needed, so they're worth registering.
## Memory and privacy
Turn off "Learn from chats" under "Settings > Memory" to stop new writes. For content already remembered, edit or delete individual entries from the list, or erase everything with "Delete all."
No. Your personal memory is yours alone. However, a shared agent's "agent memory" is shared among everyone who uses that agent.
No. API keys and tokens are stored encrypted and are designed so the AI cannot access them.
## Other
Send Beta feedback to [contact@carnot.ai](mailto:contact@carnot.ai). Including a screenshot and the steps to reproduce makes investigation much smoother.
# First Login
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/first-login
From the invitation email to your first workspace
Before you can use Jinba App Neo for the first time, you need to **join your organization** — create an account, verify your email address, and accept the invitation. Accounts are managed by Jinba's authentication service, **JinbaAuth** ([https://auth.jinba.io](https://auth.jinba.io)), and are shared across Jinba services such as Jinba App Neo and Jinba Flow.
Jinba App Neo is in Beta. Access requires an invitation to an organization, or an account issued by your administrator.
**If your organization uses SSO** — when single sign-on is enabled for your organization, steps 1–4 (joining through an invitation email) do not apply. Open the sign-in URL your administrator gave you and continue from step 5. Ask your administrator or your Jinba representative which path applies to you.
## Overview
```mermaid theme={null}
graph LR
A["① Receive invitation"] --> B["② Sign up"]
B --> C["③ Verify email"]
C --> D["④ Accept invitation"]
D --> E["⑤ Sign in to Neo"]
E --> F["⑥ Open your workspace"]
```
| Step | Where | What you do |
| - | - | - |
| 1. Receive the invitation email | Your mail client | Open the invitation and check the links it contains |
| 2. Sign up | [auth.jinba.io/signup](https://auth.jinba.io/signup) | Create an account with the invited email address |
| 3. Verify your email | Your mail client | Open the link in the verification email (**required**) |
| 4. Accept the invitation | [auth.jinba.io/organizations](https://auth.jinba.io/organizations) | Click "Accept" under "Pending invites" |
| 5. Sign in to Neo | [neo.jinba.io](https://neo.jinba.io/) | Sign in with the account you created |
| 6. Open your workspace | Jinba App Neo | Open the shared workspace (switch to it if needed) |
**If you already have a JinbaAuth account** (for example because you use Jinba Flow, and your email address is already verified), skip steps 2 and 3 and start at step 4: open the organizations link in the invitation email and accept the invitation.
## 1. Receive the invitation email
When an administrator invites you to an organization, you receive an email from **Jinba `noreply@jinba.ai`** with the subject **"Invitation to join \"**.
The body contains the inviter's name, the role you are granted, and **two links**.
```text Invitation email body theme={null}
invited you to join .
Role: MEMBER
Open the organizations page to review and accept the invitation:
https://auth.jinba.io/organizations
If you are not signed in yet, sign in with the invited email address first.
If you do not have an account yet, sign up first:
https://auth.jinba.io/signup
```
The language of the invitation email follows **the UI language of the person who sent it**, not your own. If it was sent from a Japanese console, the subject reads 「〈組織名〉 への招待」 and the body is the Japanese translation of the text above. Search your inbox for both if you cannot find it.
* **No account yet** — use the second link (`/signup`) to register (go to step 2)
* **Already have an account** — open the first link (`/organizations`) and accept the invitation (go to step 4)
Invitations expire after **7 days**. If yours has expired, contact your Jinba representative — an invitation can only be resent once it has expired. If the email never arrived, check your spam folder first.
## 2. Sign up
Open [https://auth.jinba.io/signup](https://auth.jinba.io/signup) to reach the **Create Account** screen, enter your name, email address, and password, then click **Create account**. If the sign-in screen appears instead, use **"Don't have an account?"** at the bottom to switch to sign-up.
**Register with the exact email address that received the invitation.** Invitations are bound to a specific address — if you sign up with a different one you will not be able to accept the invitation (the comparison is case-insensitive).
You can also sign up with a **Google or Microsoft account** ("Continue with Google" / "Continue with Microsoft"). In that case, pick the account whose address matches the invitation.
Passwords must satisfy the following policy:
| Requirement | Detail |
| - | - |
| Length | **At least 12 characters** (up to 128) |
| Character classes | Must contain **all four**: lowercase, uppercase, digit, and symbol |
| Reuse | Your 5 most recently used passwords cannot be reused |
| Breach screening | Passwords known from public data breaches are rejected |
**Creating the account does not sign you in.** Continue with the email verification in step 3.
## 3. Verify your email address
After the account is created you receive a verification email with the subject **"Verify your email"** (this message is **English only**). Open the link in it.
* Opening the link **signs you in automatically** and takes you straight to the organizations page ([auth.jinba.io/organizations](https://auth.jinba.io/organizations))
* The link is valid for **1 hour**. If it has expired, attempt to sign in at [https://auth.jinba.io](https://auth.jinba.io) and a fresh verification email is sent
**This step is mandatory.** Until your address is verified, clicking "Accept" in step 4 fails with an error and you cannot join the organization. If you signed up with a Google or Microsoft account, your address is already verified and you can skip this step.
## 4. Accept the invitation to your organization
Open [https://auth.jinba.io/organizations](https://auth.jinba.io/organizations) (the **Organizations** screen).
Your organization appears under **Pending invites** — click **Accept**. After accepting, you join the organization and it is listed under **Your memberships**.
* This acceptance is the shared "join an organization" step for all Jinba services, not just Jinba App Neo. Until it is done, signing in at step 5 will not show your organization's workspaces
* Only invitations addressed to the email you are signed in with are listed
* **Your memberships** lists shared organizations only. The personal organization created for you at sign-up is not shown
## 5. Sign in to Jinba App Neo
Go to [https://neo.jinba.io/](https://neo.jinba.io/) and authenticate with one of the following:
* **Email address and password**
* **Google account**
* **Microsoft account**
* **SSO** (if enabled for your organization)
Bookmark [https://neo.jinba.io/](https://neo.jinba.io/) so you can get back to it quickly.
## 6. Open your workspace
On your first sign-in, a workspace of your own (**“\’s Workspace”**) is created automatically. Because that workspace is private to you, agents, skills, and knowledge shared across your organization do not appear there.
If you were invited to a shared workspace beforehand, you also become a member of it automatically on that first sign-in. The **workspace name at the top of the sidebar** tells you which workspace you are currently in.
To switch to the shared workspace, click the **workspace name button at the top of the sidebar**. It lists your current organization and the workspaces you belong to in it — select the shared one. The agents, skills, and knowledge shared with your organization then become available.
If the shared workspace is not listed, check that step 4 is complete and that you have been added as a member of that workspace. Workspace members are added by a workspace owner (see [Workspace settings](/en/pages/jinba_app_neo/settings/workspace)).
## Troubleshooting
Check your spam folder and search for the sender `noreply@jinba.ai`. The subject is either "**Invitation to join \**" or its Japanese equivalent 「**〈組織名〉 への招待**」 (see step 1). If it is still missing, contact your Jinba representative — an invitation can be resent once it has expired (7 days).
The most common cause is that **step 3 (email verification) is not complete**. Open the link in the "Verify your email" message and try again. If you cannot find that email, attempt to sign in at [auth.jinba.io](https://auth.jinba.io) and a new one is sent.
If it still fails, the invitation may have expired (7 days), or it may have already been accepted or cancelled. Contact your Jinba representative.
You may have registered with a different address than the one that received the invitation — invitations are bound to a specific email address (compared case-insensitively). Let your Jinba representative know which address you use and we will reissue the invitation to it.
Note that the personal organization created for you at sign-up is never listed under "Your memberships".
Right after signing in you may be in your own private workspace. Switch using the workspace name button at the top of the sidebar (see step 6). If the workspace is not listed, ask its owner to add you as a member.
Passwords need at least 12 characters and must include lowercase, uppercase, digits, and symbols. Previously used passwords and passwords known from public data breaches are also rejected. If a compliant password is still rejected, try a different one.
An SSO session can be locked to the organization you signed in with. To switch to another organization, sign out and sign in again.
## Next steps
Send your first chat and create an agent
Understand how agents, skills, connectors, knowledge, and memory fit together
Review member invitations, roles, and workspace switching
For administrators: how to issue, resend, and cancel invitations
# Introduction
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/introduction
Welcome to the official documentation for Jinba App Neo (Beta)
**Jinba App Neo is currently in Beta.** Features and screens may change without notice. Send feedback to [contact@carnot.ai](mailto:contact@carnot.ai).
## What is Jinba App Neo?
Jinba App Neo is a next-generation AI agent platform built on Anthropic's Claude. Create an "agent" for each use case and attach skills (playbooks), connectors (external integrations), and knowledge (reference material) to it — then put that purpose-built AI to work through chat.
It is the successor to the original Jinba App, with major advances in the following areas:
* **Agent-centric design** — Create multiple "agents," each bundling a model, system prompt, skills, connectors, and knowledge, and switch between them by purpose
* **AI execution environment** — The AI runs in a session environment isolated per message, safely performing file operations, code execution, web search, and more
* **Memory** — The AI learns your preferences and business terminology through chat and applies them in future conversations
* **Native MCP support** — Connect jinba-flow workflows or any MCP server as tools for the AI
## Key features
Work alongside your agents in conversation, with file attachments, a reference picker, and visibility into what the AI is doing
Create conversation partners that bundle skills, connectors, and knowledge, and share them with your team
Register internal documents, URLs, and Notion pages for the AI to ground its answers in
Manage the playbooks and instructions you want the AI to reuse, written in Markdown
Connect personal connectors like Gmail and Slack, jinba-flow, and custom MCP servers as tools for the AI
## How to use this documentation
* **Signing in for the very first time?** Follow [First Login](/en/pages/jinba_app_neo/first-login) — from the invitation email to your first workspace
* **New here?** Start with the [Quickstart](/en/pages/jinba_app_neo/quickstart)
* **Unfamiliar with a term?** See [Core concepts](/en/pages/jinba_app_neo/core-concepts)
* **Want feature details?** Browse the feature pages in the left navigation
* **Stuck?** Check the [FAQ](/en/pages/jinba_app_neo/faq)
* You can open this documentation from inside the app at any time — choose "**Documentation**" in the account menu
## Notes on the Beta
* Some features are rolled out gradually, so what you see may differ depending on your environment
* Screens and features may change in future updates
* Access the app at [https://neo.jinba.io/](https://neo.jinba.io/). To use the product, you need a workspace invitation or an account issued by an administrator
## Who this documentation is for
This documentation is for all end users of Jinba App Neo. No technical background is required (except for a few administrative features such as connecting custom MCP servers).
# Add sources
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/knowledge/add-sources
Registering from files, URLs, Notion, and Google Drive
## Uploading files
Open "Configure" > "**Knowledge**" in the sidebar and click "**Add source**."
**Drag and drop** files or folders onto the drop zone, or click to select them (multiple allowed). There is a file-size limit; you will see an error if you exceed it.
Set a title, an optional description, and the destination folder, then press "**Add**."
You can also upload by dragging and dropping files directly onto the list view.
## Registering a URL
In "Add source," enter a URL (e.g., `https://example.com/handbook`). HTML pages are supported, along with PDF, Atom, and RSS feeds.
A snapshot is saved on registration. To pick up changes to the original page, run "**Re-fetch**."
## Importing Notion pages
With the Notion integration, you can import Notion pages as knowledge.
If Notion is not connected yet, the "**Import from Notion**" section in "Add source" shows a "**Connect Notion**" button. Authorization opens in a popup and brings you straight back to the dialog — files and inputs you have staged are kept. (Connecting from the Connectors page works too: [Personal connectors](/en/pages/jinba_app_neo/connectors/personal-connectors).) Share the pages you want to import with the integration — only shared pages can be imported.
In the "**Import from Notion**" section, paste the Notion page URL (`notion.so/...`) and click "Add."
If you see "An error occurred with Notion," check that the target page has been shared with the integration.
## Importing from Google Drive
When the Google Drive integration is enabled for your workspace, "Add source" shows an "**Import from Google Drive**" section.
If Drive is not connected yet, click "**Connect Google Drive**." Authorization opens in a popup and brings you straight back to the dialog. You always authorize **your own** Google account — the connection is personal, and other members cannot see your Drive through it. Which authorization route the button takes depends on how your workspace's connectors are set up; importing works the same either way.
Browse My Drive and its folders, or use "**Search in Drive**" to find files. Select the files you want (multiple allowed) and press "**Add**."
* Each file can be up to 25 MB
* Google Docs, Sheets, and Slides are imported as Word, Excel, and PowerPoint files, and Google Drawings as PDF. Other Google-native formats cannot be imported
* Use "**Re-fetch**" to pull in the latest content of an imported file
## Handling duplicate filenames
Adding a file with the same name to the same folder brings up a confirmation dialog.
* **Replace** — overwrite the existing file with the new content
* **Save with a different name** — keep both
## Editing and deleting sources
* Use "Edit" in the list to change the title, description, or folder. **The source type and its target (such as the URL) cannot be changed** — to switch to a different source, delete it and add a new one
* Use "Delete" to remove a source. You can also select multiple sources and delete them in bulk
# Organize with folders
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/knowledge/organize
Folder hierarchy, multi-select and bulk operations, organizing from chat, downloads, auto-sync, and the auto-load limit
## Folders
Knowledge can be organized hierarchically with folders. Folders and files live in a single list, sorted together.
* Create folders with "**New folder**" in the "Add source" menu in the page header, or by right-clicking a blank area of the list. "**New subfolder**" on a folder's menu creates one inside it
* **Expand** a folder in place with the chevron at the start of its row — its contents appear indented underneath, without leaving the level
* **Open** a folder (double-click) to make its contents the list. A breadcrumb starting at "**Workspace**" appears above the list to walk back out; when the trail gets long, the middle folds into a menu. On a touch screen there is no chevron and a single tap opens the folder
* Move sources with "Move to folder," or by dragging them onto a folder. Folders themselves move from their own menu ("Move to folder"), not by dragging
* Rename or delete a folder from its menu
Deleting a folder permanently deletes the folder, all of its subfolders, and every source inside. This cannot be undone. If agents use the folder's contents — attached directly or via folder auto-sync — the confirmation dialog lists the affected agents before you confirm.
## Multi-select and bulk operations
In the desktop layout you can select multiple items — **folders included** — and operate on them at once. Click to select, toggle with `⌘ / Ctrl`, select a range with `Shift`, or drag a rubber-band over the list; Esc clears the selection.
* **Move** — move the whole selection to another folder. Drag and drop works too: dropping a selected row onto a folder moves the entire selection in one gesture, and the drag ghost shows how many items are moving. Dropping onto a **file** row instead means "put it where that file lives" — which is how you move something back out to the top level — and the whole destination level is highlighted while you drag
* **Delete** — remove the whole selection with a single confirmation. If the selection includes items or folders that agents use, the affected agents are listed first
* **Download** — download the selection as a ZIP (workspace knowledge only)
In an agent's Knowledge section (configuration panel), the agent's own folders can join the selection the same way for moving and deleting; folders mirrored from the workspace stay read-only.
### Same-name collisions when moving
If files you are moving collide with same-name files already in the destination folder, a confirmation dialog asks how to handle all of them at once:
* **Keep both** — the moved files are saved under a new name
* **Overwrite** — the existing files' content is discarded
* **Cancel** — the colliding files stay where they are; everything else still moves
## Organizing from chat
You can also tidy up knowledge by asking the AI in chat — "Move the onboarding docs into the HR folder" or "Rename this file to 2026 price list."
* Moving and renaming works for both sources and folders, and applies immediately — to reverse a move, just ask again
* Naming a destination folder that doesn't exist yet creates it
* Deleting is not available from chat — use the Knowledge page
## Downloading
* **Single file** — "**Download**" in the item's context menu, or from the detail panel
* **Multiple items** — select two or more (folders can be part of the selection) and press "Download" in the bulk toolbar to receive one ZIP
* **Folder** — "Download" on the folder's menu zips the folder's entire contents, subfolders included, preserving the folder structure
ZIP downloads (multi-select and folder) are available in workspace knowledge only — not in an agent's Knowledge section — with a limit of 500 files / 200 MB total per archive.
## Folder auto-sync (agent attachment)
When attaching knowledge to an agent, you can sync a folder **wholesale**.
* Folders set to auto-sync show an "**Auto-synced**" badge
* **Files added to the folder later are automatically reflected in the agent**
* "**Stop syncing**" on the folder's menu removes the sync and detaches all items that came from that folder
* Agents that auto-sync a folder count toward the "**Used by**" figure shown in each item's preview, and are included in delete warnings
Auto-sync your "Sales materials" folder to a Sales agent, and the agent will always see the latest content — just drop new files into the folder.
## Type icons
Each row shows the file-type icon for its content — the same artwork the AI's knowledge-search results use — and the "**Type**" column names the kind in words (Document / PDF / Spreadsheet / Slides / Image / Code / Text / Archive / File). URLs and Notion pages take the plain page icon and are named by their source type.
The list's columns are "**Name**," "**Type**," "**Size**," and "**Updated**"; clicking the "Name" header flips the sort order, and folders and files sort together as one list. A narrow list drops the right-hand columns and folds their values onto a second line under the name.
## The auto-load limit
There is a limit on how many knowledge sources are loaded automatically when a chat is created.
* Sources beyond the limit show an "**Auto-load off**" badge
* They are not loaded automatically, but **the AI can still retrieve them via search** when needed
A good pattern: attach a small, curated set of must-read documents so they always load, and sync reference material by the folder so the AI pulls it in via search.
## Search and preview
* Use the search box at the top to find files and folders by name. The search filters the list in place and is scoped to the folder you are in: folders on the way to a hit open automatically, and the footer reports "**N matches**." Once you have opened a folder, a "**Search everywhere (N)**" link appears with the total across the whole workspace — click it to widen the search back out
* Selecting a source shows it in the preview column beside the list, with its sync status, size, folder, who last updated it ("Updated by"), and how many agents it is "Used by"
* Items whose content cannot be previewed show "Preview is not available for this item." instead
* Drag the divider between the list and the preview to resize the list; double-click the divider to reset it, or move it with the arrow keys once it has focus. Your choice is remembered on that device. When the window is too narrow for both columns, the list takes the full width and the preview opens as a drawer over it
* With nothing selected the preview reads "**No knowledge selected**," and the footer counts what you are looking at — "N folders · N documents"
# Knowledge overview
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/knowledge/overview
How knowledge — the material the AI reads and references — works
**Knowledge** is where you keep the material the AI reads to ground its answers. Register internal documents, URLs, Notion pages, and Google Drive files, organize them into folders, and attach them to agents. Workspace-shared knowledge is managed on the "**Knowledge**" page in the "Configure" section of the sidebar.
Folders and files sit in **one list**, sorted together, with a preview of whatever you select in the column beside it. Expand a folder in place with the chevron at the start of its row, or open it to make its contents the list — a breadcrumb starting at "**Workspace**" walks you back out. See [Organize with folders](/en/pages/jinba_app_neo/knowledge/organize) for the details.
## Source types
| Type | Description |
| - | - |
| **Files** | Uploaded PDFs, Office documents, text files, and more |
| **URLs** | Imported web pages (HTML / PDF / Atom / RSS) |
| **Notion pages** | Connect the Notion integration and paste a page URL to import |
| **Google Drive** | Files imported from a connected Google Drive |
Chat is an entry point too: files the AI generates — and files you attach to a chat — can be saved straight into Knowledge, either from the deliverable card's bookmark icon or simply by asking the AI ("save this attachment to Knowledge, in the Sales folder"). A confirmation card shows the name, destination folder, and sharing scope before anything is saved, warns if the name collides with an existing file (it is saved under a new name — nothing is overwritten), and offers "**Change…**" to pick a different name, folder, or scope. See [AI Activity and the Workspace Panel](/en/pages/jinba_app_neo/chat/agent-activity).
## Where knowledge lives
| Location | Where to manage it | Available to |
| - | - | - |
| **Workspace shared** | Sidebar > Configure > Knowledge | Every agent it is attached to |
| **Agent-specific** | The Knowledge section of the agent's configuration panel | That agent only |
Agent-specific knowledge can be shared later: in a chat with the agent, ask the AI to make an item available to the whole workspace. The item moves into the workspace-shared knowledge (to the top level, or a folder you name), and the agent keeps access to it.
## Sync status
Registered sources go through an import (sync) process. Select a source and its state is shown in the preview.
| Status | Meaning |
| - | - |
| **Synced** | Import is complete and the AI can reference it |
| **Pending** | Import is queued or in progress |
| **Error** | Import failed. Edit the source and retry |
For URLs and Notion pages, use "**Re-fetch**" to pull in the latest content.
## How the AI sees knowledge
* Knowledge attached to an agent is loaded automatically when a chat starts
* There is a limit on how many sources are auto-loaded. The AI can still **search for and retrieve** sources beyond the limit, so large libraries remain useful
* You can also reference a specific file or folder on the spot with `[[` in the chat composer
## Next steps
Registering from files, URLs, Notion, and Google Drive
Folder hierarchy, auto-sync, and the auto-load limit
# Quickstart
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/quickstart
The fastest way to get started with Jinba App Neo
Jinba App Neo is available at **[https://neo.jinba.io/](https://neo.jinba.io/)**.
Jinba App Neo is in Beta, so access requires an invitation or an issued account.
## 1. Sign in
Go to [https://neo.jinba.io/](https://neo.jinba.io/) and open the sign-in page.
Sign in using one of the following methods:
* **Email address and password**
* **Google account**
* **Microsoft account**
* **SSO** (if enabled for your organization)
After signing in, the chat screen opens. If you were invited to a workspace, signing in with the email address the invitation was sent to adds you as a member automatically.
On your first sign-in you may land in a workspace of your own — use the workspace name button at the top of the sidebar to switch to a workspace shared with your organization.
If this is your first time, you first need to complete **invitation email → sign up → accepting the organization invitation**. See [First Login](/en/pages/jinba_app_neo/first-login) for the full walkthrough.
## 2. Send your first chat
Select "New chat" in the sidebar.
Write your request in the input box. For example:
> Research our competitors' pricing pages and summarize them in a comparison table
Press `Enter` to send and `Shift + Enter` for a new line (`⌘ / Ctrl + Enter` also sends). The Enter that confirms IME input never sends by accident, and you can change the send key in Settings.
You can see the AI thinking and running tools in real time. Use "Interrupt" at any time to stop the current run.
## 3. Create your first agent
Once you are comfortable with chat, create an agent specialized for a specific purpose.
Select "Agents" in the sidebar and click "New agent".
Enter a name (e.g., Sales Analyst) and a description. With "Auto-generate", the AI drafts a description and system prompt from the name.
Open the configuration panel with the **gear icon** on the new agent's detail page, then attach Skills, Connectors, and Knowledge. See [Attach resources to an agent](/en/pages/jinba_app_neo/agents/attach) for details.
Start a conversation right on the agent's detail page, or pick the agent with `@` in the chat input box.
## 4. Next steps
Understand how agents, Skills, Connectors, Knowledge, and Memory fit together
Make your existing workflows callable as tools for the AI
Register internal documents to improve the accuracy of the AI's answers
Learn how the AI remembers things about you and how to manage it
# Account Settings
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/settings/account
Profile, your custom instructions, and organization usage
Under "**Personal > Account**" in Settings, you manage your own account information.
## Profile
Profile information such as your display name and email address is managed by **JinbaAuth**, the authentication platform.
* To make changes, use the "**Update in JinbaAuth**" button to go to the JinbaAuth screen
* Sign-in settings such as password changes and two-factor authentication are also managed in JinbaAuth
## Your instructions (custom instructions)
You can register instructions that are automatically applied to every chat with every agent (up to 3,000 characters).
* Examples: "Always respond in Japanese," "I prefer concise answers," "I'm a backend engineer in fintech"
* Write anything you always want followed: tone, language, format, your role, and so on
Memory is rewritten automatically by the AI, but "Your instructions" **stay exactly as you wrote them**. Put rules you want enforced reliably here.
## Organization usage
You can view a snapshot of your organization's subscription usage (plan, member count, storage). The figures are aggregated across all workspaces.
# Appearance Settings
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/settings/appearance
Theme, language, text size, the send key, and the sidebar on small screens
Under "**Personal > Theme & Language**" in Settings, you can adjust how the app looks.
Everything on this page is stored in your browser. If you have Jinba App Neo open in several tabs, a change here takes effect in the other tabs immediately — no reload needed.
## Theme
| Option | Description |
| - | - |
| **Light** | Bright color scheme (default) |
| **Dark** | Dark color scheme |
| **System** | Follows your OS setting automatically |
## Language
Choose the app's display language: **日本語 / English**.
This setting changes **the display language of the interface**. In chat, the AI generally responds in the language you write in (an explicit instruction always wins).
If you have never chosen a language here, sending a prompt in Japanese triggers a one-time banner offering to switch the interface to Japanese — accept to switch, or decline to keep the current language. Once you pick a language here, the banner never appears.
## Text size
Choose the app-wide text size: **Small / Standard / Large**. Spacing scales proportionally to keep the layout balanced. Browser zoom (`⌘/Ctrl` + `+` / `-`) works alongside it.
## Sending messages
Choose which key sends a chat message — the other inserts a line break.
| Option | Behavior |
| - | - |
| **Enter** (default) | `Enter` sends; `Shift + Enter` inserts a newline |
| **⌘ / Ctrl + Enter** | `⌘ / Ctrl + Enter` sends; `Enter` inserts a newline |
* In either mode, the Enter combination that is **not** the send key inserts a line break. The choice is saved **per device**
* On phones and tablets, Return inserts a line break by default, regardless of the option above. Touch devices additionally show a "**Keep this behavior on touch screens**" checkbox that applies your chosen send key ("this behavior") to the touch device as well — turn it on for a tablet with a hardware keyboard
## Sidebar on small screens
Choose how the sidebar behaves on portrait devices and narrow desktop windows.
| Option | Behavior |
| - | - |
| **Keep it open** (default) | The sidebar never collapses on its own |
| **Fold to icons** | On those sizes, the sidebar folds down to an icon rail to give the page more room |
This setting only affects those sizes — you can collapse or expand the sidebar yourself at any width, and the choice is saved **per device**.
# Memory
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/settings/memory
How the AI learns about you, and how to manage what it learns
The AI in Jinba App Neo gradually learns your preferences and business terminology through chat and applies them in future conversations. Manage this **personal memory** under "**Personal > Memory**" in Settings.
Your personal memory is **invisible to other users**. [Agent memory](/en/pages/jinba_app_neo/agents/memory), shared per agent, is managed separately.
## Controlling learning and recall
| Switch | Description |
| - | - |
| **Learn from chats** | The AI writes down anything it judges worth remembering, as it happens in chat. Turning it off stops new entries (existing memories remain) |
| **Use past memories** | The AI consults past memories when responding. Turning it off keeps writing new entries but stops using them in responses |
Turning off "Learn from chats" also stops writes to agent memory in chats with shared agents. It does not backfill from past logs.
## Viewing and managing memories
You can review the list of everything the AI remembers about you.
* Each entry can be **edited or deleted individually**
* Recently updated entries carry a "Recent" badge
* If something incorrect was learned, edit or delete the entry
## Bulk export and deletion
For compliance needs (GDPR deletion requests, offboarding cleanup, and the like), you can operate on your memory as a whole.
* **Export all** — download your entire memory as a ZIP
* **Delete all** — permanently erase all memory (including the underlying store). This cannot be undone. Learning starts fresh from an empty state in your next chat
You can also request the export from chat — ask "export my memory" and the AI replies with a download link for the same ZIP. "Delete all," by contrast, is available only on this screen; it cannot be performed from chat.
## Memory vs. "Your instructions"
| | Memory | Your instructions |
| - | - | - |
| Written by | The AI (automatic) | You (manual) |
| Contents | Preferences, terminology, and context learned from conversations | Rules you always want followed |
| Rewritten by the AI | Yes | No |
A good split: put rules you want enforced reliably in [Your instructions](/en/pages/jinba_app_neo/settings/account), and leave day-to-day context to learning.
# Workspace Settings
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/settings/workspace
Workspace info, default model, member management, plan, and the danger zone
The "**Workspace**" group in Settings (General / Members / Activity / Usage) is where you manage settings that affect the whole workspace. Most operations require **owner permission**.
## Workspace info
* **Workspace name** — shown in the sidebar, the account menu, and shared agents (owners only)
* **Workspace ID** — used for things like jinba-flow MCP server integration. It is also the `/w//` segment that every page URL now carries
## Default model
The model used for new chats started without an agent (ad-hoc chats).
* Changes apply **only to new chats created afterwards**. Existing chats keep running on the model they were created with
* Each agent's model is set in the Settings section of that agent's configuration panel
## Default Skill (for ad-hoc chats)
Skills attached here are used by ad-hoc chats.
* There is a limit on how many can be attached
* Changes take effect from new chats only
## Member management
### Invitations
Member additions live under the single "**Invite**" button at the top of the Members list. Use "Invite" > "**Invite a member**" to issue an invitation with an email address and role. When someone signs in with that email address, they are added as a member automatically.
* Invitees do **not** need to belong to this workspace's organization — workspace membership itself grants access. Someone invited from outside the organization joins as a **guest**: they can work in the workspace, but the organization's shared agents and organization settings stay out of reach, and the workspace carries a "**Guest**" badge in their workspace switcher
* **Pending invitations** are listed and can be voided with "Revoke"
* You cannot invite once the plan's member limit is reached
### Add organization members (bulk)
"Invite" > "**Add organization members**" (owners only) opens the organization's member directory so you can add many people at once.
* People already in the workspace or with a pending invitation are not shown. Narrow the list with the filter box and remove individual rows before submitting with "**Add members**"
* People who already have an account become members right away; people who have never signed in join automatically on their first sign-in
* The plan's member limit applies here too
### Roles
| Role | What it allows |
| - | - |
| **Owner** | Everything (changing settings, managing members, deletion, and more) |
| **Member** | Regular use (chatting, creating agents, and more) |
* Change roles with "Promote to owner" and "Demote to member"
* The last owner cannot be demoted. Promote another member first
### Removing members
Remove members from the member list. To remove another owner, demote them to member first.
## Workspace activity
An append-only log of administrative operations such as member removals and role changes. Visible to owners only.
## Usage
The "Usage" tab shows your current plan (Free / Standard / Professional / Enterprise) and a usage summary including credit consumption and member count. To change plans, talk to your workspace owner.
## Organization settings
Organization owners and admins can manage the whole organization from "**Organization settings**" in the Settings screen (workspace list, members, connector / tool access controls, **Shared assets** for agents and skills shared org-wide, workspace auto-creation, usage, run history, audit logs, and more).
## Danger zone
The following operations cannot be undone. Review carefully before proceeding.
* **Leave workspace** — until you are invited again, you lose all access to this workspace's chats, agents, and knowledge. The sole owner cannot leave
* **Delete workspace** — every chat, agent, skill, knowledge source, file, and connector inside is deleted. You must type the workspace name to confirm
## Creating and switching workspaces
* The workspace switcher at the top of the sidebar is organized **organization first**: the menu shows the current organization, a search box, and that organization's workspaces, with "Create workspace," "Workspace settings," and "Invite members" (owners) at the bottom
* To change organizations, open the organization row's submenu and pick one — you land on the workspace you last used in that organization. Organization owners and admins also get a gear shortcut to Organization settings on the organization row
* In the creation dialog, "**Add all organization members**" loads the organization's member directory into a list you can prune (filter by name or email, remove individual rows). Everyone left on the list is added when the workspace is created — members who have never signed in join automatically on their first sign-in. This is a one-time addition, not a continuous sync with the organization
* SSO sessions may be locked to the organization you signed in with. In that case, sign out first, then switch
# Create and Edit Skills
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/skills/create
Using the skill editor — writing by hand, auto-generating, and importing
## Opening the skill editor
* **Workspace-shared skills**: Sidebar > Configure > **Skills** > "New skill"
* **Agent-specific skills**: Agent's configuration panel > **Skills** section > "Create new"
Open an existing skill with "Edit" from the list. On the Skills page, the editor opens as a drawer in card view; in list view it opens in a pane to the right of the list (on narrow screens, as a drawer).
It is the **same editor everywhere** — the Skills page, an agent's Skills section, and a skill chip in a chat message all open it, with the same fields, the same validation and the same save. Only the frame around it changes to fit the surface; the editor scrolls, and the instructions box fills the height it is given.
## The editor
* **Name** (required) — e.g., PDF Extract
* **Description** — what this Skill does and when it should be invoked. Be specific: the AI uses this to decide whether to use the skill
* **Allowed tools** (optional) — comma-separated tool names. Leave blank for no restriction
Write the Markdown body on the "Edit" tab. Check how it looks on the "Preview" tab.
Enter the name and description, then press "**Auto-generate body**" to have the AI draft a body from what you have entered.
* **Workspace shared** — attachable by every agent
* **This agent only** — agent-specific (when created from the agent detail page)
You can change the location later (promote / demote). Creating a **workspace-shared** skill asks for a final confirmation ("**Create new workspace skill?**") — other members will be able to see and use it, so make sure it contains nothing personal or private.
## Importing an existing SKILL.md
When creating a skill, an import dropzone sits at the top of the form — "**Drag a SKILL.md here**," or click it to browse. Pasting SKILL.md text into the editor works too.
* The frontmatter (name, description, tools) and body are filled into the form automatically
* Markdown files (`.md`) only, up to 1 MB each
A SKILL.md can also be registered from chat — attach the file to a conversation and ask the AI to register it ([Create Skills from Chat](/en/pages/jinba_app_neo/skills/from-chat)).
On the workspace Skills page, dropping **several** files at once skips the form and immediately creates one **workspace-shared** skill per file — no per-skill confirmation. Make sure the files contain nothing personal or private before dropping them.
## Editing shared skills, and forking
Editing a workspace-shared skill **affects every agent** it is attached to.
To adapt a shared skill for a specific agent, fork it first: open it from that agent and press "**Copy and edit for this agent only**" on the warning banner in the editor. The editor stays open and switches to the copy, carrying any edits you had already typed, so you can keep working without losing your place. The original skill is unaffected.
## Deleting
Delete from the editor or from the list; the confirmation names the agents the skill is attached to. Deleting an agent-specific skill cannot be undone.
The editor opened from a skill chip in a chat message does not offer "Delete" — delete from the Skills list or from the agent's Skills section instead.
## Writing tips
* **One skill, one purpose** — split multiple procedures into separate skills instead of cramming them into one
* **The description is everything** — the AI reads the description to decide "should I use this skill now?" Spell out "use this when …"
* **Number your steps** — explicit ordering and conditions are more reliable than vague phrasing
# Create Skills from Chat
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/skills/from-chat
How the AI suggests turning procedures established in conversation into Skills — attaching existing ones, importing SKILL.md files, and keeping them up to date
In Jinba App Neo, Skills can grow directly out of your chat conversations. You don't have to write a playbook from scratch — the back-and-forth of real work becomes a Skill.
## Skill suggestions
When a reusable procedure takes shape during a chat, the AI shows a "**Skill suggestion**" card.
Check what will be saved in the card's "Body preview." Click "View full text" to expand it. The tools the Skill uses are also shown.
* **This agent only** — usable only by the current agent. You can promote it to shared later from the Skills list
* **Workspace shared** — usable from every agent
Click "Save" to register the Skill, or "Not now" to pass on it. If the draft is close but not quite right, choose "**Request changes**" and describe what you'd like changed — the AI revises the draft and presents a new proposal card. Once saved, you can edit the skill anytime from the Skills list.
A skill saved mid-conversation can also be refined in the same conversation — just keep going ("actually, add X too") and the AI proposes an update with a diff. Note that the saved skill itself takes effect in new chats.
## Skill update suggestions
While working with an existing Skill, if the AI detects a gap between what the Skill says and what you actually did, it shows a "**Skill update suggestion**" card.
* Review the changes in the "Body diff"
* Click "**Apply update**" to update the existing Skill
* If the target is a shared Skill, note that the change also propagates to every other agent it is attached to
## Attaching existing skills from chat
Skills your workspace already has can be attached to an agent from the conversation, too. In a chat with the agent, ask something like "let this agent use the report-formatting skill" — a "**Skill attach proposed**" card appears with the closest-matching workspace-shared skill preselected.
* If the preselected skill isn't the one you meant, choose another from the card's "**Pick the skill to attach**" list
* "**Attach**" saves it right away; it takes effect in new chats with that agent. "**Dismiss**" passes on it
* Only workspace-shared skills can be attached this way (agent-specific skills belong to a single agent)
## Importing a SKILL.md from chat
An existing SKILL.md file can be registered without opening the Skills screen: attach the file to the conversation and ask the AI to register it as a skill. The AI reads the file and presents the usual suggestion card with the name, description, and body filled in from the file — review and save it like any other suggestion.
## When you've hit the limit
If you've reached the Skill limit, new Skills can't be saved. The card says so and names the limit ("You've reached the skill limit (20).") — consider updating an existing Skill or deleting ones you no longer need.
You can also ask explicitly in chat: "Turn this procedure into a Skill — I'll want it again next time." The AI will draft the body from the conversation.
# Skills Overview
Source: https://carnot.mintlify.app/en/pages/jinba_app_neo/skills/overview
How skills — reusable playbooks and instructions for the AI — work
A **skill** is a reusable playbook or set of instructions the AI can draw on. Write routine know-how in Markdown — "How to create an invoice," "Report formatting," "Translation tone guide" — and the AI will reference it at the right moments.
Workspace-shared skills are managed on the "**Skills**" page in the "Configure" section of the sidebar.
The page opens as a card grid — switch between "**Card view**" and "**List view**" with the toggle in the header. Click a card to open the skill's details.
## Anatomy of a skill
A skill follows the SKILL.md format: metadata (frontmatter) plus a body.
| Field | Description |
| - | - |
| **Name** | The skill's name (e.g., PDF Extract) |
| **Description** | What the skill does and when to use it. This is how the AI decides which skill to pick |
| **Allowed tools** (optional) | Restricts which tools this skill may use. Leave blank for no restriction |
| **Body** | The procedures and instructions, written in Markdown |
## Where skills are saved (scope)
| Location | Description |
| - | - |
| **Workspace shared** | Attachable by every agent. Shown on the Skills page |
| **Agent-specific** | Used by one agent only. Managed in the Skills section of the agent's configuration panel |
You can promote (agent-specific → shared) or demote (shared → agent-specific) a skill later. To tweak a shared skill for one agent, use "Copy and edit for this agent only" (fork).
Attaching a workspace-shared skill to an agent works from the Skills section of the agent's configuration panel — or straight from a chat with the agent ([Create Skills from Chat](/en/pages/jinba_app_neo/skills/from-chat)).
## Four ways to create a skill
Write SKILL.md directly from "New skill" on the Skills page
Enter a name and description, then "Auto-generate body"
Import an existing SKILL.md by drag & drop or paste
The AI suggests turning procedures established in conversation into skills
## Limits
A single agent can have at most **20** skills attached, and the workspace catalog is capped at the same number. You do not have to count them yourself:
* The agent's "Add skills" picker shows the headroom as "**N / 20 left**"
* The Skills page adds an "**n / 20**" counter beside the page title once two or fewer slots are left
* An in-chat skill suggestion that would go over the limit says so and names the number
If you hit a limit, consider consolidating or pruning existing skills.
## Provenance
The skill list shows each skill's provenance (**Manual / AI generated / Imported**), and you can filter by it.
# API Key Management
Source: https://carnot.mintlify.app/en/pages/toolbox/console/api-keys
Create, view, and revoke API keys for authenticating with the Jinba Toolbox API
API keys authenticate requests to the Jinba Toolbox API. Every API call -- whether executing a tool, managing ToolSets, or reading run history -- requires a valid API key. Keys are scoped to an organization and grant access to that organization's resources.
## How API Keys Work
```
Authorization: Bearer jtb_xxxxxxxxxxxx
```
All API keys use the `jtb_` prefix. When you create a key, the full key value is shown exactly once. After that, only a masked prefix is displayed in the console for identification purposes.
API keys are tied to the organization where they were created. A key for Organization A cannot access resources belonging to Organization B (except for executing public tools, which any valid key can do).
## Creating an API Key
Go to **API Keys** in the organization sidebar. You will see the list of existing keys (if any).
Click the **Create API Key** button at the top of the page. A modal will appear.
Give the key a descriptive name to identify its purpose (e.g. "Production Backend", "CI/CD Pipeline", "Local Development"). This name is for your reference only and does not affect the key's permissions.
After clicking **Create Key**, the full API key is displayed. Copy it immediately and store it in a secure location.
The full API key is shown only once at creation time. If you lose it, you must create a new key.
Click **Done** to close the modal. The new key will appear in the list with its name, masked prefix, creator, creation date, and last used date.
## API Key List
The API Keys page displays a table with the following columns:
| Column | Description |
| - | - |
| **Name** | The descriptive name you gave the key |
| **Key Prefix** | A masked preview of the key (e.g. `jtb_abc1...`) for identification |
| **Created By** | The user who created the key |
| **Created** | When the key was created |
| **Last Used** | The timestamp of the most recent API call made with this key |
## Revoking an API Key
To revoke a key, click the delete action next to the key in the list. A confirmation dialog will appear. Once revoked:
* The key is immediately invalidated.
* All API requests using this key will return a `401 Unauthorized` error.
* The action is permanent and cannot be undone.
Revoking a key does not affect past run records or data. It only prevents future API calls using that key.
## Authentication Scopes
API keys provide access based on the following scopes:
List and retrieve ToolSets, tools, versions, runs, and other organization resources.
Create, update, and delete ToolSets, tools, environment variables, and other resources.
Run tools and create run records. Required for both API execution and MCP tool calls.
Manage organization settings, members, and API keys. Full administrative access.
## Using API Keys
### REST API
Include the key in the `Authorization` header:
```bash theme={null}
curl -X POST \
https://toolbox-api.jinba.dev/v1/orgs/{orgId}/toolsets/{slug}/tools/{toolSlug}/run \
-H "Authorization: Bearer jtb_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"name": "Alice"}'
```
### TypeScript SDK
Pass the key when creating the SDK client:
```typescript theme={null}
import { createClient } from "@jinba-toolbox/sdk";
const client = createClient({
apiKey: process.env.JINBA_TR_API_KEY,
organizationId: "your-org-id",
});
const result = await client.run("slack-tools", "post-message", {
channel: "#general",
text: "Hello from Jinba Toolbox!",
});
```
### MCP Endpoint
When connecting an AI agent to a ToolSet's MCP endpoint, provide the API key as part of the connection configuration. The MCP endpoint URL is available in the ToolSet detail page when MCP Server is enabled.
## Personal vs. Organization API Keys
Jinba Toolbox supports two levels of API keys:
| Type | Scope | Location |
| - | - | - |
| **Organization API Key** | Scoped to a single organization's resources | Organization sidebar > API Keys |
| **Personal API Key** | Scoped to the user's account | Dashboard > API Keys |
Organization API keys are recommended for most use cases. They are easier to manage, rotate, and revoke without affecting individual user accounts.
## Best Practices
* **Use descriptive names** -- Name keys by their purpose and environment (e.g. "Production API Server", "Staging CI") so you can identify which key to revoke if needed.
* **Rotate keys regularly** -- Create new keys and revoke old ones periodically to limit the impact of a potential leak.
* **Never commit keys to source control** -- Store keys in environment variables or a secrets manager.
* **Use separate keys per environment** -- Create distinct keys for development, staging, and production.
* **Revoke unused keys** -- If a key is no longer needed, revoke it immediately. Check the "Last Used" column to identify dormant keys.
* **Prefer organization keys** -- Use organization-scoped keys rather than personal keys for application integrations.
# Execution & Testing
Source: https://carnot.mintlify.app/en/pages/toolbox/console/execution
Run tools in sandbox environments, view execution results, and browse run history in the Jinba Toolbox console
Jinba Toolbox executes every tool in an isolated sandbox container. You can test tools interactively from the editor or review the full execution history of your organization.
## Testing from the Tool Editor
The Tool Editor includes a built-in **Test Panel** for running your tool against a live sandbox.
In the Test Panel (bottom section of the editor), type or paste a JSON object that matches the tool's input schema. For example:
```json theme={null}
{
"name": "Alice",
"greeting": "Hi"
}
```
Click the **Run** button or press `Cmd/Ctrl + Enter`. The tool will execute in a sandbox with the ToolSet's configured language, packages, and environment variables.
The Test Panel automatically switches to the **Output** tab, showing:
* **Output** -- The JSON object returned by the `run` function on success.
* **Error** -- The error name and message if the tool failed.
* **Logs** -- `stdout` and `stderr` output captured during execution.
Testing from the editor uses the current **draft** code, not the published version. This lets you iterate quickly before publishing.
### Test Execution Flow
When you click Run, the following happens behind the scenes:
1. The console sends the draft code and input JSON to the API's `/test` endpoint.
2. The API spins up a sandbox instance using the ToolSet's configured provider (E2B or Daytona).
3. Packages defined in the ToolSet are installed in the sandbox.
4. Environment variables are injected into the sandbox process.
5. The code is executed with the provided input.
6. The sandbox captures the return value, stdout, stderr, and any errors.
7. Results are sent back to the console and displayed in the Test Panel.
## Run History
Every tool execution -- whether triggered from the editor, the REST API, or an MCP call -- produces a **Run** record. The Run History page provides a centralized view of all executions within your organization.
### Browsing Runs
Navigate to **Runs** in the organization sidebar to see the execution history.
The runs list displays:
| Column | Description |
| - | - |
| **Tool** | The slug of the tool that was executed |
| **Status** | Current state: `success`, `failed`, `running`, or `pending` |
| **Duration** | Execution time in milliseconds |
| **Date** | When the run was created |
Runs are sorted by creation date with the most recent first.
### Status Indicators
Each run has a status that reflects where it is in the execution lifecycle:
The run has been created but the sandbox has not started execution yet.
The tool is currently executing inside the sandbox.
The tool completed successfully and returned an output.
The tool encountered an error during execution.
### Run Detail Page
Click any run in the list to open its detail page. The detail view shows:
**Summary Card**
A four-column summary at the top showing Duration, Created, Started, and Completed timestamps.
**Tabbed Data View**
* **Input** -- The JSON input that was sent to the tool.
* **Output / Error** -- On success, the JSON output returned by the tool. On failure, the error name and message.
* **Logs** -- Captured `stdout` and `stderr` from the sandbox process. This tab only appears when logs are present.
### Caller vs. Provider View
Runs have two perspectives:
* **Caller view** -- When your organization executed a tool (whether your own or another organization's public tool), you see full details: input, output, error, and logs.
* **Provider view** -- When another organization executed one of your public tools, you can see the run's status and metadata but **not** the input, output, or logs. This protects the caller's data privacy.
The provider view displays a message indicating that execution details are only available to the calling organization, along with the caller's organization name.
## Execution via API
Beyond the console, tools can be executed programmatically:
`POST /v1/orgs/:orgId/toolsets/:slug/tools/:toolSlug/run` -- Execute a published tool version via the API. Requires an API key with execute scope.
`POST /v1/orgs/:orgId/toolsets/:slug/mcp` -- Call tools through the Model Context Protocol. AI agents can discover and invoke tools via the standard MCP JSON-RPC interface.
`POST /v1/public/:orgSlug/:toolsetSlug/run/:toolSlug` -- Execute a public tool using any organization's API key.
Use the `@jinba-toolbox/sdk` to execute tools from your TypeScript application with a simple function call.
All execution methods produce Run records visible in the console's Run History.
## Execution Lifecycle
The complete lifecycle of a tool run:
The API receives the execution request and creates a Run record with status `pending`.
A sandbox instance is created using the configured provider (E2B or Daytona) with the ToolSet's language, packages, and environment variables.
The tool's code is executed inside the sandbox with the validated input. The status changes to `running`.
The sandbox returns the output (or error) along with captured stdout/stderr logs. The status changes to `success` or `failed`, and the duration is recorded.
## Best Practices
* **Test with varied inputs** -- Cover edge cases (empty strings, large numbers, missing optional fields) in the Test Panel before publishing.
* **Check logs for debugging** -- When a tool fails, the `stderr` logs often contain stack traces and error details that pinpoint the issue.
* **Monitor run history** -- Regularly review the Runs page to spot patterns in failures or unexpected durations.
* **Use the Copilot after failures** -- After a failed test run, the AI Copilot has access to the error output and can suggest fixes.
# Organization Management
Source: https://carnot.mintlify.app/en/pages/toolbox/console/organization
Create and manage organizations, invite members, and assign roles in the Jinba Toolbox console
Organizations are the top-level ownership unit in Jinba Toolbox. Every ToolSet, API key, and execution record belongs to an organization. You must create or join an organization before you can start building tools.
## Creating an Organization
After signing in, navigate to the **Dashboard** page. You will see a list of organizations you belong to. If this is your first time, the list will be empty.
Click the **New Organization** button. A form will appear asking for:
* **Name** -- A human-readable name for your team or project (e.g. "Acme Engineering").
* **Slug** -- A URL-safe identifier auto-generated from the name (e.g. `acme-engineering`). You can customize it before creation.
Click **Create**. You will be redirected to the new organization's ToolSets page, ready to start building.
## Organization Dashboard
Once inside an organization, the sidebar provides access to all management areas:
View, create, and manage your ToolSets. This is the default landing page for an organization.
Browse the execution history of all tools within the organization.
Invite team members and manage their roles.
Create and revoke API keys scoped to this organization.
View your credit balance, purchase credits, and review transaction history.
Edit the organization name or delete the organization.
## Member Management
### Inviting Members
Only users with the **Owner** or **Admin** role can invite new members.
Go to **Members** in the organization sidebar.
Click the **Invite Member** button at the top of the page.
Provide the email address of the person you want to invite and select a role: **Owner**, **Admin**, or **Member**.
Click **Send**. An invitation email will be sent. The pending invitation will appear in a separate section on the Members page until the user accepts it.
### Accepting an Invitation
When a user receives an invitation:
1. They click the link in the email, which opens the `/invite/[id]` page.
2. If they are not signed in, they are prompted to log in or sign up.
3. Once signed in, they click **Accept** to join the organization.
4. After acceptance, they are redirected to the organization page.
Invitations that are expired, cancelled, or sent to a different email address will display an error.
## Roles and Permissions
Each member is assigned one of the following roles:
| Permission | Owner | Admin | Member |
| - | - | - | - |
| Create / edit / delete ToolSets and Tools | Yes | Yes | Yes |
| Execute and test tools | Yes | Yes | Yes |
| View run history | Yes | Yes | Yes |
| Manage API keys | Yes | Yes | No |
| Invite and remove members | Yes | Yes | No |
| Change member roles (below own level) | Yes | Yes | No |
| Edit organization settings | Yes | Yes | No |
| Delete the organization | Yes | No | No |
Every organization must have at least one **Owner**. You cannot remove the last remaining owner.
### Changing a Member's Role
Owners and Admins can change the role of any member whose current role is below their own. For example, an Admin can change a Member to Admin, but cannot change another Admin to Member.
### Removing a Member
Click the remove action next to a member's name on the Members page. A confirmation dialog will appear. Removal is immediate.
## Organization Settings
Navigate to **Settings** in the sidebar to:
* **Rename** the organization (Owner and Admin only).
* **Delete** the organization (Owner only). Deletion requires typing the organization name for confirmation and is irreversible -- all ToolSets, tools, versions, runs, and API keys will be permanently removed.
## Best Practices
* **Use organizations to group related teams or projects.** Each organization has its own ToolSets, API keys, and billing.
* **Follow the principle of least privilege.** Assign the minimum role needed for each member.
* **Review members regularly.** Remove access for users who no longer need it.
* **Keep at least two Owners** for redundancy in case one becomes unavailable.
# Tool Development
Source: https://carnot.mintlify.app/en/pages/toolbox/console/tool-development
Write tools with the Monaco code editor, define input/output schemas, and use AI Copilot for code generation in the Jinba Toolbox console
Each tool in a ToolSet is an individual executable unit with a defined input schema, output schema, and code. The console provides a full-featured development environment for writing, testing, and iterating on tools without leaving the browser.
## Creating a Tool
Navigate to the ToolSet where you want to add a tool. Make sure you are on the **Tools** tab.
Click **Add Tool**. A modal will ask for:
* **Slug** -- URL-safe identifier (e.g. `post-message`). Used in API endpoints.
* **Name** -- Human-readable name (e.g. "Post Message").
* **Description** -- What the tool does.
After creation, you are redirected to the **Tool Editor** page with a language-appropriate starter template pre-filled.
## The Tool Editor
The Tool Editor is a resizable, multi-panel workspace:
A Monaco-based editor (the same engine as VS Code) with syntax highlighting, auto-completion, and error markers for TypeScript and Python.
Enter JSON input and run the tool in a live sandbox. View output, errors, and logs without leaving the editor.
Edit the tool's slug, name, and description. Trigger auto-generation of metadata from code.
A built-in chat assistant that can generate code, suggest fixes based on execution output, and update test inputs.
### Keyboard Shortcuts
| Shortcut | Action |
| - | - |
| `Cmd/Ctrl + S` | Save the tool |
| `Cmd/Ctrl + Enter` | Run the tool with current test input |
| `Cmd/Ctrl + B` | Toggle the AI Copilot sidebar |
| `Cmd/Ctrl + ,` | Toggle the Settings panel |
| `Cmd/Ctrl + .` | Toggle the API panel |
| `Escape` | Close the active panel or modal |
## Writing Tools in TypeScript
TypeScript tools use **Zod** for schema definitions. Export `input` and `output` schemas and an async `run` function:
```typescript theme={null}
import { z } from "zod";
// Define the input schema
export const input = z.object({
name: z.string().describe("The user's name"),
greeting: z.string().optional().describe("Custom greeting prefix"),
});
// Define the output schema
export const output = z.object({
message: z.string().describe("The greeting message"),
});
// Implement the tool logic
export async function run(data: z.infer) {
const prefix = data.greeting ?? "Hello";
return { message: `${prefix}, ${data.name}!` };
}
```
**Key conventions for TypeScript tools:**
* Import `z` from `"zod"` -- it is pre-installed in the sandbox.
* Export `input` and `output` as Zod schemas. These are used for validation and to generate JSON Schema for the API.
* Export `run` as the entry point. It receives the validated input and must return an object matching the output schema.
* You can `import` any packages listed in the ToolSet's **Packages** tab.
* Environment variables are accessible via `process.env`.
## Writing Tools in Python
Python tools use **Pydantic** for schema definitions. Define `Input` and `Output` models and a `run` function:
```python theme={null}
from pydantic import BaseModel, Field
class Input(BaseModel):
name: str = Field(description="The user's name")
greeting: str = Field(default="Hello", description="Custom greeting prefix")
class Output(BaseModel):
message: str = Field(description="The greeting message")
def run(input: Input) -> Output:
return Output(message=f"{input.greeting}, {input.name}!")
```
**Key conventions for Python tools:**
* Define `Input` and `Output` as Pydantic `BaseModel` subclasses.
* Define `run` as the entry point. It receives the validated input and must return an instance of the `Output` model.
* You can `import` any packages listed in the ToolSet's **Packages** tab.
* Environment variables are accessible via `os.environ`.
## Input and Output Schemas
Schemas serve two purposes:
1. **Validation** -- The sandbox validates inputs before execution and outputs after execution.
2. **Documentation** -- Schemas are exposed through the API and MCP endpoints so that AI agents understand what a tool expects and returns.
Use `.describe()` (Zod) or `Field(description=...)` (Pydantic) on each field to provide clear descriptions. These descriptions appear in the API documentation and are used by AI agents to understand how to call your tool.
## Auto-Generate Metadata
Click **Auto Generate** in the Settings panel to automatically extract:
* **Slug** -- derived from the function and schema names in your code.
* **Name** -- a human-readable name inferred from the code.
* **Description** -- a summary of what the tool does.
This uses AI to analyze your code and saves time when you have already written the implementation.
## AI Copilot
The AI Copilot sidebar provides a chat interface that is context-aware of your tool's code, language, and execution output. Use it to:
* **Generate code** -- Describe what you want the tool to do and the Copilot will write the implementation.
* **Debug errors** -- After a failed test run, ask the Copilot to analyze the error and suggest a fix.
* **Apply code** -- The Copilot can push generated code directly into the editor and auto-save.
* **Update test input** -- The Copilot can suggest and apply JSON test inputs to the Test panel.
Toggle the Copilot with `Cmd/Ctrl + B` or the bot icon in the sidebar.
## API Panel
Toggle the API panel (`Cmd/Ctrl + .`) to view:
* The REST API endpoint URL for executing this tool.
* The MCP endpoint URL (if MCP is enabled on the ToolSet).
* Example `curl` commands and SDK usage snippets.
* The tool's input schema in JSON Schema format.
This is useful for quickly integrating a tool into external applications while still in the editor.
## Saving and Deleting
* **Save** -- Click the Save button or press `Cmd/Ctrl + S`. Changes are saved to the draft state and do not affect published versions.
* **Delete** -- Click the Delete button in the header. A confirmation dialog will appear. Deleting a tool removes it from the draft state. If it was included in published versions, those snapshots remain unchanged.
## Best Practices
* **Keep tools focused.** Each tool should do one thing well. Use the ToolSet to group related tools.
* **Write descriptive schemas.** Good field descriptions help AI agents call your tools correctly.
* **Test before publishing.** Use the Test panel to verify behavior with various inputs before publishing a new version.
* **Use environment variables for secrets.** Never hard-code API keys or tokens in tool code. Store them in the ToolSet's Environments tab.
* **Leverage the Copilot for iteration.** After a failed test run, the Copilot has access to the error output and can suggest targeted fixes.
# ToolSet Management
Source: https://carnot.mintlify.app/en/pages/toolbox/console/toolsets
Create ToolSets, configure sandbox environments, manage packages, and control visibility in the Jinba Toolbox console
A **ToolSet** is a collection of related tools bundled with a shared execution environment. Think of it as an npm package or Docker image -- it groups tools together, defines their runtime dependencies, and supports semver-based versioning.
## Creating a ToolSet
Inside your organization, click **ToolSets** in the sidebar. This is the default page when entering an organization.
Click the **New ToolSet** button. A creation form will appear with the following fields.
| Field | Description |
| - | - |
| **Slug** | URL-safe identifier (e.g. `slack-tools`). Cannot be changed after creation. |
| **Name** | Human-readable display name (e.g. "Slack Tools"). |
| **Description** | A short summary of what this ToolSet does. |
| **Language** | `TypeScript` or `Python`. Determines the code template and runtime. Cannot be changed after creation. |
| **Provider** | Sandbox provider: `E2B` or `Daytona`. Cannot be changed after creation. |
| **Visibility** | `Public` or `Private`. Can be changed later. |
| **MCP Server** | Enable to expose this ToolSet as an MCP endpoint. Can be toggled later. |
Click **Create**. You will be redirected to the ToolSet detail page where you can start adding tools.
## ToolSet Detail Page
The detail page is the central hub for managing a ToolSet. It is organized into four tabs:
Lists all draft tools in the ToolSet. Add new tools, click a tool to open the code editor, and see at a glance whether there are unpublished changes.
View published version history, publish new versions, and switch the active (deployed) version.
Manage sandbox dependencies. Add or remove npm packages (TypeScript) or pip packages (Python) that your tools need at runtime.
Manage environment variables available to tools during execution. Values are stored encrypted and can be revealed on demand.
## Sandbox Configuration
Every ToolSet defines a sandbox environment that its tools execute in. The sandbox configuration is set at creation time:
* **Language** -- `TypeScript` or `Python`. This controls which runtime is used and what code templates are generated for new tools.
* **Provider** -- `E2B` or `Daytona`. The sandbox provider handles container creation, code execution, and lifecycle management.
### Managing Packages
Navigate to the **Packages** tab to manage runtime dependencies.
Click **Add Package** and enter the package name (e.g. `axios` for TypeScript, `requests` for Python). You can optionally specify a version constraint.
Click the delete icon next to any listed package to remove it from the sandbox configuration.
Package changes are reflected in the draft state. You must **publish a new version** for the updated packages to take effect in production API calls.
### Managing Environment Variables
Navigate to the **Environments** tab to manage secrets and configuration values.
Click **Add Variable**. Enter a key (e.g. `SLACK_TOKEN`), a value, and optionally mark it as a secret. Secret values are masked in the UI.
Click the edit icon to update a variable's value, or the delete icon to remove it.
Use the reveal toggle to temporarily show masked secret values. Revelation is per-variable and requires appropriate permissions.
Environment variables are injected into the sandbox at execution time and are available via `process.env` (TypeScript) or `os.environ` (Python).
## Versioning and Publishing
ToolSets use **semantic versioning** (e.g. `1.0.0`, `1.1.0`, `2.0.0`). Each version is an immutable snapshot of all tools and their code at the time of publishing.
Edit tools, add new tools, or update packages in the draft state.
Click **New Version** on the Versions tab. Enter a version number (the console suggests the next patch version) and optional release notes. Click **Publish**.
The most recently published version automatically becomes the **active** version used by API and MCP calls. You can switch the active version by hovering over any version in the list and clicking **Set as Active**.
Published versions are immutable. To make changes, edit the draft tools and publish a new version.
## Visibility Settings
ToolSet visibility controls who can discover and execute your tools:
| Visibility | Discovery | Execution |
| - | - | - |
| **Private** | Only organization members | Only organization members (via session or API key) |
| **Public** | Anyone on the Explore page | Any organization with a valid API key |
| **Restricted** | Not listed publicly | Only explicitly allowed organizations |
To change visibility, use the visibility toggle in the ToolSet header. Changing to **Public** requires confirmation because it makes tool schemas visible on the Explore page (source code is never shared).
## MCP Server
When **MCP Server** is enabled for a ToolSet, the console provides an MCP connection endpoint URL that you can copy. AI agents and LLM clients that support the Model Context Protocol can connect directly to this endpoint to discover and call the tools in the ToolSet.
Toggle MCP on or off from the ToolSet header at any time.
## Import and Export
The ToolSet detail page supports zip-based import and export:
* **Export** -- Downloads a `.zip` archive containing all tool definitions, code, and metadata. Useful for backup or migration.
* **Import** -- Upload a `.zip` archive to bulk-import tools into the ToolSet. Existing tools with matching slugs will be updated.
## Editing ToolSet Settings
Click the settings/edit link in the ToolSet header to navigate to the edit page where you can:
* Change the **Name** and **Description**.
* Change the **Visibility** setting.
* Toggle **MCP Server** on or off.
The **Language**, **Provider**, and **Slug** are read-only after creation.
## Deleting a ToolSet
Click **Delete** in the ToolSet header. A confirmation dialog will appear warning that all tools, versions, and associated run records will be permanently removed. This action cannot be undone.
# Core Concepts
Source: https://carnot.mintlify.app/en/pages/toolbox/core-concepts
Essential terminology and domain model for understanding Jinba Toolbox
Understanding these core concepts will help you use Jinba Toolbox effectively and navigate the platform with confidence.
## Key Terms
| Term | Definition | Example |
| - | - | - |
| **Organization** | Team or company that owns ToolSets. Users belong to one or more Organizations with roles (owner, admin, member). | `acme-corp` -- a team sharing a collection of AI tools |
| **ToolSet** | Collection of related tools with a shared execution environment. Equivalent to an npm package or Docker image. Belongs to an Organization. | `slack-tools` -- a set of Slack integration tools |
| **Tool** | Individual executable unit within a ToolSet. Has input/output schemas and code written in TypeScript or Python. | `post-message` -- sends a message to a Slack channel |
| **Run** | A single execution record of a Tool. Stores input, output, logs, status, and duration. | Executing `post-message` with channel and text parameters |
| **Version** | Immutable snapshot of a ToolSet at a point in time. Uses semantic versioning (semver). | `1.2.0` -- a published release of `slack-tools` |
| **Sandbox** | Isolated container environment where tool code executes. Prevents unsafe operations from affecting the host system. | An E2B container running a Python tool |
## Domain Relationships
The entities in Jinba Toolbox are organized in a clear hierarchy:
```
Organization
└── ToolSet
├── Tool (1:N)
├── Version (1:N)
└── Run (1:N)
```
* An **Organization** contains one or more **ToolSets**.
* A **ToolSet** contains one or more **Tools**, and can have multiple published **Versions**.
* Each **Run** records a single execution of a Tool within a ToolSet.
* **Users** belong to Organizations through memberships with assigned roles.
### Entity Relationship Diagram
```
┌──────────┐
│ User │
└────┬─────┘
│
├─────1:N─────┐
│ │
│ ┌────┴─────┐
│ │ ApiKey │
│ └──────────┘
│
└─────N:M─────┐
│
┌───────────┴───────────┐
│ OrganizationMember │ (role: owner / admin / member)
└───────────┬───────────┘
│
┌───────────┴───────────┐
│ Organization │
└───────────┬───────────┘
│
1:N
│
┌───────────┴───────────┐
│ ToolSet │
└───────────┬───────────┘
│
┌──────────┼──────────┐
│ │ │
1:N 1:N 1:N
│ │ │
┌────┴────┐ ┌───┴───┐ ┌───┴──────┐
│ Tool │ │ Run │ │ Version │
└─────────┘ └───────┘ └──────────┘
```
## Organizations
An Organization is the top-level ownership unit. All ToolSets, API keys, and billing belong to an Organization.
* Users can be members of multiple Organizations.
* Each membership has a **role**: `owner`, `admin`, or `member`.
* API keys are scoped to an Organization and carry permission scopes: `read`, `write`, `execute`, and `admin`.
## ToolSets
A ToolSet groups related tools together with a shared sandbox configuration. Key properties include:
| Property | Description |
| - | - |
| **Slug** | URL-friendly identifier, unique within the Organization |
| **Sandbox Config** | Defines the execution environment: provider (E2B or Daytona), language (TypeScript or Python), packages, and resource limits |
| **Visibility** | Controls access: `private` (organization only), `public` (anyone), or `restricted` (specific organizations) |
| **Tags** | Searchable labels for discovery in the explore catalog |
## Tools
A Tool is the smallest executable unit. Each Tool defines:
| Property | Description |
| - | - |
| **Slug** | URL-friendly identifier, unique within the ToolSet |
| **Input Schema** | JSON Schema that validates the input before execution |
| **Output Schema** | JSON Schema that describes the expected output structure |
| **Code** | The executable source code (TypeScript or Python) |
| **Entrypoint** | Optional custom entrypoint function name |
Input and output schemas are validated automatically. If the input does not match the schema, the execution is rejected before any sandbox resources are consumed.
## Versions
Versions are immutable snapshots of a ToolSet. Once published, a Version cannot be modified.
* Versions follow **semantic versioning** (e.g., `1.0.0`, `1.2.3`).
* Publishing a Version captures all Tools, schemas, and code at that point in time.
* The `latestVersion` field on a ToolSet always points to the most recently published Version.
* AI agents and external consumers should pin to a specific Version for stability.
## Runs
A Run represents a single tool execution and records everything about it:
| Field | Description |
| - | - |
| **Status** | `pending`, `running`, `success`, `failed`, or `timeout` |
| **Input** | The validated input parameters |
| **Output** | The structured result returned by the tool |
| **Logs** | Captured stdout and stderr from the sandbox |
| **Duration** | Execution time in milliseconds |
| **Error** | Error details if the Run failed |
Runs provide full observability into tool execution, making it easy to debug failures and monitor performance.
## Sandbox Execution
Every tool runs inside an isolated sandbox container. The sandbox system is built on a pluggable provider architecture:
| Provider | Description |
| - | - |
| **E2B** | Cloud-based sandboxes with fast startup and broad language support |
| **Daytona** | Self-hosted sandbox option for teams requiring on-premises execution |
The sandbox provider is configured at the ToolSet level. All Tools in a ToolSet share the same sandbox configuration, including language runtime, installed packages, and resource limits.
## Access Control
Jinba Toolbox provides multiple layers of access control:
* **Organization membership** governs who can manage ToolSets and view Runs.
* **ToolSet visibility** (`private`, `public`, `restricted`) controls who can discover and execute tools.
* **API key scopes** (`read`, `write`, `execute`, `admin`) provide fine-grained permission control for programmatic access.
## What's Next?
Build your first ToolSet and run a tool
Explore the web interface for managing tools
# REST API
Source: https://carnot.mintlify.app/en/pages/toolbox/developer/api
Interact with Jinba Toolbox programmatically through the REST API
## Overview
Jinba Toolbox exposes a REST API built on Hono.js. Every resource -- organizations, toolsets, tools, versions, runs, webhooks, and API keys -- is accessible through conventional HTTP endpoints under the `/v1` prefix.
**Base URL**:
```
https://toolbox-api.jinba.dev/v1
```
## Authentication
All API requests (except explore routes) require authentication via a **Bearer token**. API keys are scoped to an organization and follow the `jtb_` prefix convention.
Include the key in the `Authorization` header:
```bash theme={null}
Authorization: Bearer jtb_xxxxxxxxxxxx
```
Navigate to your organization settings and create a new API key. Give it a descriptive name such as `production` or `ci-cd`.
Copy the key immediately after creation -- it will not be displayed again. Store it in an environment variable or secrets manager.
Pass the key as a Bearer token in every API request.
## Endpoint Reference
### Organization Routes
These endpoints require organization membership. The authenticated API key must belong to the target organization.
| Method | Endpoint | Description |
| - | - | - |
| GET | `/v1/orgs` | List organizations |
| POST | `/v1/orgs` | Create organization |
| GET | `/v1/orgs/:orgId` | Get organization details |
| PATCH | `/v1/orgs/:orgId` | Update organization |
| DELETE | `/v1/orgs/:orgId` | Delete organization |
### ToolSet Routes
| Method | Endpoint | Description |
| - | - | - |
| GET | `/v1/orgs/:orgId/toolsets` | List toolsets |
| POST | `/v1/orgs/:orgId/toolsets` | Create toolset |
| GET | `/v1/orgs/:orgId/toolsets/:slug` | Get toolset |
| PATCH | `/v1/orgs/:orgId/toolsets/:slug` | Update toolset |
| DELETE | `/v1/orgs/:orgId/toolsets/:slug` | Delete toolset |
### Tool Routes
| Method | Endpoint | Description |
| - | - | - |
| GET | `/v1/orgs/:orgId/toolsets/:slug/tools` | List tools in a toolset |
| POST | `/v1/orgs/:orgId/toolsets/:slug/tools` | Create tool |
| GET | `/v1/orgs/:orgId/toolsets/:slug/tools/:toolSlug` | Get tool |
| PATCH | `/v1/orgs/:orgId/toolsets/:slug/tools/:toolSlug` | Update tool |
| DELETE | `/v1/orgs/:orgId/toolsets/:slug/tools/:toolSlug` | Delete tool |
### Execution Routes
| Method | Endpoint | Description |
| - | - | - |
| POST | `/v1/orgs/:orgId/toolsets/:slug/tools/:toolSlug/run` | Execute a published tool |
| POST | `/v1/orgs/:orgId/toolsets/:slug/tools/:toolSlug/test` | Test a tool (runs draft code) |
### Version Routes
| Method | Endpoint | Description |
| - | - | - |
| GET | `/v1/orgs/:orgId/toolsets/:slug/versions` | List versions |
| POST | `/v1/orgs/:orgId/toolsets/:slug/versions` | Publish a new version |
| GET | `/v1/orgs/:orgId/toolsets/:slug/versions/:version` | Get version details |
| PUT | `/v1/orgs/:orgId/toolsets/:slug/published-version` | Set the active published version |
### Run History Routes
| Method | Endpoint | Description |
| - | - | - |
| GET | `/v1/orgs/:orgId/runs` | List runs |
| GET | `/v1/orgs/:orgId/runs/:runId` | Get run details |
### Other Organization Routes
| Method | Endpoint | Description |
| - | - | - |
| GET | `/v1/orgs/:orgId/api-keys` | List API keys |
| POST | `/v1/orgs/:orgId/api-keys` | Create API key |
| GET | `/v1/orgs/:orgId/members` | List members |
| GET | `/v1/orgs/:orgId/webhooks` | List webhooks |
| GET | `/v1/orgs/:orgId/credits` | Get credit balance |
### Public Routes
Public routes allow external consumers to execute tools using an API key, without requiring organization membership context.
| Method | Endpoint | Description |
| - | - | - |
| POST | `/v1/public/:orgSlug/:toolsetSlug/run/:toolSlug` | Execute a tool |
| POST | `/v1/public/:orgSlug/:toolsetSlug/mcp` | MCP endpoint (JSON-RPC) |
### Explore Routes
Explore routes are unauthenticated and allow browsing public toolsets.
| Method | Endpoint | Description |
| - | - | - |
| GET | `/v1/explore/toolsets` | List public toolsets |
| GET | `/v1/explore/tags` | List popular tags |
## Request & Response Examples
### Execute a Tool
**Request**:
```bash theme={null}
curl -X POST https://toolbox-api.jinba.dev/v1/orgs/{orgId}/toolsets/slack-tools/tools/post-message/run \
-H "Authorization: Bearer jtb_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"input": {
"channel": "#general",
"text": "Hello from Jinba Toolbox!"
}
}'
```
**Response** (success):
```json theme={null}
{
"runId": "run_abc123",
"version": "1.2.0",
"success": true,
"output": {
"ts": "1234567890.123456",
"channel": "C01234567"
},
"logs": {
"stdout": [],
"stderr": []
},
"durationMs": 1234
}
```
### Execute via Public Endpoint
```bash theme={null}
curl -X POST https://toolbox-api.jinba.dev/v1/public/my-org/slack-tools/run/post-message \
-H "Authorization: Bearer jtb_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"input": {
"channel": "#general",
"text": "Hello!"
}
}'
```
### Create a ToolSet
```bash theme={null}
curl -X POST https://toolbox-api.jinba.dev/v1/orgs/{orgId}/toolsets \
-H "Authorization: Bearer jtb_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"slug": "slack-tools",
"name": { "default": "Slack Tools" },
"description": { "default": "A collection of Slack integration tools" },
"sandbox": {
"provider": "e2b",
"language": "typescript",
"packages": [{ "name": "@slack/web-api" }],
"resources": { "timeout": 60000 }
},
"visibility": "private",
"tags": ["slack", "messaging"]
}'
```
### Publish a Version
```bash theme={null}
curl -X POST https://toolbox-api.jinba.dev/v1/orgs/{orgId}/toolsets/slack-tools/versions \
-H "Authorization: Bearer jtb_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"version": "1.3.0",
"releaseNotes": "Added thread reply support"
}'
```
## Error Handling
The API uses **RFC 9457 Problem Details** format for errors:
```json theme={null}
{
"type": "https://toolbox-api.jinba.dev/errors/not-found",
"title": "Not Found",
"status": 404,
"detail": "ToolSet 'unknown-toolset' not found in organization."
}
```
### Common Status Codes
| Status | Meaning |
| - | - |
| 200 | Success |
| 201 | Created |
| 400 | Bad Request -- invalid input or missing required fields |
| 401 | Unauthorized -- missing or invalid API key |
| 403 | Forbidden -- API key lacks permission for this action |
| 404 | Not Found -- resource does not exist |
| 429 | Too Many Requests -- rate limit exceeded |
## Best Practices
* **Store API keys in environment variables** -- never hard-code them in source code or commit them to version control.
* **Implement retry logic with exponential backoff** for transient failures and 429 responses.
* **Use the public endpoint** (`/v1/public/...`) when integrating external systems that only need to execute tools.
* **Pin a specific version** in the run request body when reproducibility matters.
## Related
* [SDK](/en/pages/toolbox/developer/sdk) -- Type-safe client library wrapping these endpoints
* [MCP Integration](/en/pages/toolbox/developer/mcp) -- Model Context Protocol endpoints
* [Webhooks](/en/pages/toolbox/developer/webhooks) -- Receive event notifications for tool runs and more
# Quickstart
Source: https://carnot.mintlify.app/en/pages/toolbox/quickstart
Create your first ToolSet and execute a tool in minutes
Get started with Jinba Toolbox by creating an organization, building a ToolSet, writing a tool, and executing it in a sandbox environment.
## What You'll Build
A simple ToolSet containing a tool that:
1. Accepts a text input
2. Processes it in an isolated sandbox
3. Returns structured output
## Prerequisites
* A Jinba Toolbox account ([Sign up here](https://toolbox.jinba.io/))
* No local setup required -- everything runs in the cloud
## Steps
Go to [toolbox.jinba.io](https://toolbox.jinba.io/) and sign in to your account.
After signing in, create a new **Organization**. An Organization is the ownership unit for all your ToolSets and team members.
1. Click **"Create Organization"** in the dashboard
2. Enter a name and slug (e.g., `my-team`)
3. Click **"Create"**
Your organization slug will be used in API URLs and MCP endpoints.
A **ToolSet** is a collection of related tools with a shared execution environment -- similar to an npm package or a Docker image.
1. Navigate to your organization dashboard
2. Click **"New ToolSet"**
3. Fill in the details:
* **Name**: e.g., `text-utils`
* **Description**: e.g., "Text processing utilities"
* **Language**: Choose TypeScript or Python
* **Sandbox Provider**: Select E2B or Daytona
* **Visibility**: Private (default) or Public
4. Click **"Create ToolSet"**
A **Tool** is an individual executable unit inside a ToolSet. Each tool has an input schema, output schema, and code.
1. Open your newly created ToolSet
2. Click **"Add Tool"**
3. Configure the tool:
* **Name**: `word-count`
* **Description**: "Counts words in a given text"
4. Define the **input schema**:
```json theme={null}
{
"type": "object",
"properties": {
"text": {
"type": "string",
"description": "The text to count words in"
}
},
"required": ["text"]
}
```
5. Define the **output schema**:
```json theme={null}
{
"type": "object",
"properties": {
"wordCount": {
"type": "number",
"description": "Number of words in the text"
}
},
"required": ["wordCount"]
}
```
6. Write the **tool code** (TypeScript):
```typescript theme={null}
export default async function run(input: { text: string }) {
const words = input.text.trim().split(/\s+/).filter(Boolean);
return { wordCount: words.length };
}
```
7. Click **"Save"**
Before publishing, test your tool to make sure it works correctly.
1. Click the **"Test"** button on the tool detail page
2. Enter a sample input:
```json theme={null}
{
"text": "Hello world from Jinba Toolbox"
}
```
3. Click **"Run Test"**
4. Verify the output:
```json theme={null}
{
"wordCount": 5
}
```
The tool runs inside an isolated sandbox container. You can inspect stdout, stderr, and execution duration in the run details.
Once testing is successful, publish an immutable version of your ToolSet.
1. Go to the **Versions** tab in your ToolSet
2. Click **"Publish Version"**
3. Enter a semver version number (e.g., `1.0.0`)
4. Click **"Publish"**
Published versions are immutable snapshots. Any future changes require publishing a new version.
Now your tool is ready to be called programmatically.
**Using the REST API:**
```bash theme={null}
curl -X POST https://toolbox-api.jinba.dev/v1/orgs/{orgId}/toolsets/text-utils/tools/word-count/run \
-H "Authorization: Bearer jtb_your_api_key" \
-H "Content-Type: application/json" \
-d '{"text": "Hello world from Jinba Toolbox"}'
```
**Using the TypeScript SDK:**
```typescript theme={null}
import { createClient } from "@jinba-toolbox/sdk";
const client = createClient({
apiKey: process.env.JINBA_TR_API_KEY,
});
const result = await client.run("text-utils", "word-count", {
text: "Hello world from Jinba Toolbox",
});
console.log(result.output); // { wordCount: 5 }
```
**Using the MCP endpoint** (for AI agents):
Your ToolSet is also available as an MCP server at:
```
POST /v1/public/{orgSlug}/{toolsetSlug}/mcp
```
AI agents that support the Model Context Protocol can call your tools directly.
## What's Next?
Understand the domain model and key terminology
Explore the full web console for managing your tools
Browse the complete REST API documentation
Integrate Jinba Toolbox into your applications
# What is Jinba Toolbox?
Source: https://carnot.mintlify.app/en/pages/toolbox/what-is-jinba-toolbox
A centralized tool management and execution platform for AI agents
Jinba Toolbox is currently in **beta**. Features and APIs may change. Try it out at [toolbox.jinba.io](https://toolbox.jinba.io/).
Jinba Toolbox is a centralized tool management and execution platform for AI agents. Register, version, and share tools across your organization, then execute them in isolated sandbox environments. Think of it as npm for AI tools -- publish, discover, and run tools with a simple workflow.
## Why Jinba Toolbox?
Building AI agents requires reliable, reusable tools. Jinba Toolbox solves the common challenges of tool management:
* **Fragmented tooling** -- Tools are scattered across repos, teams, and formats. Jinba Toolbox provides a single registry to organize them all.
* **Unsafe execution** -- Running arbitrary code from AI agents is risky. Jinba Toolbox executes every tool in an isolated sandbox container.
* **No versioning** -- Breaking changes silently break agents. Jinba Toolbox enforces semver-based immutable versioning for every ToolSet.
* **No team sharing** -- Tools built by one engineer are invisible to others. Jinba Toolbox enables organization-wide tool discovery and access control.
## Key Features
**Centralized tool registry for your organization**
Group related tools into ToolSets with metadata, tags, and descriptions
Browse and reuse publicly shared ToolSets from other organizations
Publish immutable snapshots with semantic versioning
**Sandbox execution in isolated containers**
Run tools in E2B or Daytona sandbox environments
Write tools in TypeScript or Python with full dependency support
Input and output schemas validated automatically with Zod
**Multiple integration paths for any workflow**
Full-featured API for programmatic tool management and execution
Native Model Context Protocol support for AI agent integration
Client SDK for seamless integration into your applications
## Use Cases
Give your AI agents a curated set of tools with strict input/output contracts and safe sandbox execution
Publish tools within your organization so every team member can discover and reuse them
Combine Jinba Toolbox tools with Jinba Flow to build end-to-end automated workflows
## Architecture Overview
Jinba Toolbox is structured as a layered system:
| Layer | Description |
| - | - |
| **API Layer** | REST endpoints for ToolSets, Tools, Runs, and MCP integration |
| **Core Services** | Registry, Access Control, and Execution services |
| **Sandbox Providers** | Pluggable adapters for E2B and Daytona container environments |
| **Database** | PostgreSQL with JSONB support for schemas and execution logs |
The Web Console provides a visual interface for managing your ToolSets, while the SDK and API enable programmatic access.
## Get Started
Open the Jinba Toolbox console to start managing your tools
Create your first ToolSet and run a tool in minutes
Learn the key terms and domain model behind Jinba Toolbox
# Firecrawl Module
Source: https://carnot.mintlify.app/en/pages/tools/cms/firecrawl
Automate web crawling and data collection
## Overview
The Firecrawl tool provides functionality for automating website crawling and data collection.
## Key Features
* `FIRECRAWL_SCRAPE`
* Scrape web pages and extract data
* Supports various output formats (markdown, HTML, JSON, links, screenshot)
* Selective content extraction with includeTags (use only when specific elements are requested)
* Content filtering with excludeTags
* Customizable crawling parameters
## Authentication
If you do not have an API key, you can still run Firecrawl tools by using Jinba API credit. If you'd like to use your own API key, you can obtain one from the [official Firecrawl website](https://www.firecrawl.dev/) and follow the developer documentation.
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: Scrape Hacker News
```yaml theme={null}
- id: scrape
tool: FIRECRAWL_SCRAPE
config:
- name: token
value: "{{secrets.FIRECRAWL_API_KEY}}"
input:
- name: url
value: https://news.ycombinator.com
- name: formats
value: '["markdown","html","links"]'
- name: includeTags
value: '[".title a",".score",".age"]'
- name: excludeTags
value: '[".comment"]'
- name: waitFor
value: "1000"
```
# Wordpress
Source: https://carnot.mintlify.app/en/pages/tools/cms/wordpress
Make a new article on Wordpress
## Overview
The Wordpress tool lets you create and publish articles on a Wordpress site. It supports various content formats and allows you to set the status of the article (draft or published).
## Key Features
* `WORDPRESS_POST_ARTICLE`
* Create and publish articles on Wordpress
* Supports various content formats (e.g., HTML, Markdown)
* Options for draft or published status
## Authentication
After setting up your Wordpress site, you need to create an application password for authentication. This is done through the Wordpress admin panel.
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: Creating a New Article
```yaml theme={null}
- id: wordpress
name: Post Article
tool: WORDPRESS_POST_ARTICLE
config:
- name: url
value: https://sample.wordpress.com/
- name: username
value: admin
- name: password
value: "{{secrets.WORDPRESS_APPLICATION_PASSWORD}}"
input:
- name: content
value: |-
Hello World
This is a sample post.
- name: draft
value: false
- name: title
value: Test
```
# Jinba Flows
Source: https://carnot.mintlify.app/en/pages/tools/jinba/jinba
Run Jinba Flows
## Overview
You can run Jinba Flows using the Jinba Flow tool. This tool allows you to execute flows that have been published on Jinba within another flow. Jinba tools also let you manage files in Jinba storage and read/write records in Jinba tables.
## Key Features
* `JINBA_FLOW_RUN`
* This tool allows you to run Jinba Flows by providing the flow ID and any necessary arguments.
* `JINBA_FILE_UPLOAD` / `JINBA_FILE_GET` / `JINBA_FILE_SEARCH` / `JINBA_FILE_DELETE`
* Upload, retrieve, search, and delete files in Jinba storage.
* `JINBA_TABLE_ADD_RECORD` / `JINBA_TABLE_GET_RECORDS` / `JINBA_TABLE_UPDATE_RECORD`
* Insert, read, and update records in Jinba tables.
## Authentication
`JINBA_FLOW_RUN` requires no tool configuration. It runs a published flow in the same workspace: authentication uses the workspace API key (`secrets.JINBAFLOW_WS_API_KEY`), which is handled automatically on the server, and the API base URL is resolved from the server environment. Make sure the target flow is published before running it.
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: Run Other Jinba Flows
```yaml theme={null}
- name: Run flow
id: run_flow
tool: JINBA_FLOW_RUN
input:
- name: id
value: ecd528ac-fc53-44ad-8535-7051507e4958
- name: Run flow with args
id: run_flow_with_args
tool: JINBA_FLOW_RUN
input:
- name: id
value: ecd528ac-fc53-44ad-8535-7051507e4958
- name: args
value: '[{"name":"input_1","value":"Hello, world!"}]'
```
## File Tools
The file tools authenticate with a Jinba Flow Workspace API Token via the `token` config, which defaults to `{{ secrets.JINBAFLOW_WS_API_KEY }}` — you usually do not need to set it explicitly.
### JINBA\_FILE\_UPLOAD
Upload a file to Jinba storage.
**Input**:
| Parameter | Type | Required | Description |
| - | - | - | - |
| `file` | string | Yes | Base64 encoded file content or file URL starting with `https://` or `jinbaflow://` |
| `filename` | string | Yes | Name of the file (extension will be auto-detected from the file) |
| `workspaceId` | string | Yes | Target workspace ID |
**Output**: File metadata including `id`, `name`, `size`, `extension`, `mimeType`, `createdAt`, `updatedAt`, `workspaceId`, `userId`, and `signedUrl`.
### JINBA\_FILE\_GET
Retrieve a file's metadata and a signed URL by file ID.
**Input**:
* `fileId` (string, required): The ID of the file to retrieve
**Output**: Same file metadata fields as `JINBA_FILE_UPLOAD`, including `signedUrl`.
### JINBA\_FILE\_SEARCH
Search files in Jinba storage.
**Input**:
| Parameter | Type | Required | Description |
| - | - | - | - |
| `workspaceId` | string | No | Optional workspace ID to filter files |
| `query` | string | No | Query to search for |
| `limit` | number | No | Maximum number of files to return (default: 50) |
| `cursor` | string | No | Cursor for pagination |
**Output**: `items` (array of file metadata) and `nextCursor` for pagination.
### JINBA\_FILE\_DELETE
Delete a file from Jinba storage.
**Input**:
* `fileId` (string, required): The ID of the file to delete
**Output**: `id` and `success`.
### Example: Upload and Retrieve a File
```yaml theme={null}
- id: upload_file
tool: JINBA_FILE_UPLOAD
input:
- name: file
value: "{{steps.generate_report.result.url}}"
- name: filename
value: "monthly_report.pdf"
- name: workspaceId
value: "{{secrets.WORKSPACE_ID}}"
- id: get_file
tool: JINBA_FILE_GET
input:
- name: fileId
value: "{{steps.upload_file.id}}"
```
## Table Tools
The table tools are workspace-scoped: the workspace's API key is injected automatically, so no config is required.
### JINBA\_TABLE\_ADD\_RECORD
Insert a record into a Jinba table.
**Input**:
| Parameter | Type | Required | Description |
| - | - | - | - |
| `tableId` | string | Yes | The table to insert a record into |
| `fields` | object | Yes | Map of column name → value for the new record (e.g. `{ "Status": "done", "Score": 42 }`). Omitted columns default to the column's default value, or NULL if none is set |
**Output**: `result.recordId` — the ID of the newly inserted record.
### JINBA\_TABLE\_GET\_RECORDS
Read records from a Jinba table.
**Input**:
| Parameter | Type | Required | Description |
| - | - | - | - |
| `tableId` | string | Yes | The table to read records from |
| `filter` | object | No | Equality filter: `{ : }`. Multiple keys are AND-combined |
| `sortColumn` | string | No | Column display name to sort by (defaults to `__updated_at`) |
| `sortDirection` | string | No | `asc` or `desc` (default: `desc`) |
| `limit` | number | No | Number of records to return (1-500, default: 100) |
| `offset` | number | No | Number of records to skip (default: 0) |
**Output**: `result` with `items` (records as `{ __id, __created_at, __updated_at, __version, : , ... }`), `total`, `limit`, and `offset`. NUMBER columns are serialized as strings to preserve precision — coerce with `Number(value)` downstream if you need numeric arithmetic.
### JINBA\_TABLE\_UPDATE\_RECORD
Update a record in a Jinba table.
**Input**:
| Parameter | Type | Required | Description |
| - | - | - | - |
| `tableId` | string | Yes | The table containing the record |
| `recordId` | string | Yes | The ID of the record to update |
| `fields` | object | Yes | Map of column name → new value (e.g. `{ "Status": "done" }`). Omitted columns are left unchanged; pass null to clear a column |
**Output**: `result.recordId`.
### Example: Add and Update Table Records
```yaml theme={null}
- id: add_record
tool: JINBA_TABLE_ADD_RECORD
input:
- name: tableId
value: "{{secrets.TABLE_ID}}"
- name: fields
value: '{ "Status": "pending", "Title": "New task" }'
- id: get_records
tool: JINBA_TABLE_GET_RECORDS
input:
- name: tableId
value: "{{secrets.TABLE_ID}}"
- name: filter
value: '{ "Status": "pending" }'
- name: limit
value: 100
- id: update_record
tool: JINBA_TABLE_UPDATE_RECORD
input:
- name: tableId
value: "{{secrets.TABLE_ID}}"
- name: recordId
value: "{{steps.add_record.result.recordId}}"
- name: fields
value: '{ "Status": "done" }'
```
# Jinba Modules
Source: https://carnot.mintlify.app/en/pages/tools/jinba/jinba_modules
Advanced data extraction, parsing, and validation using Jinba Modules
## Overview
Jinba Modules provide LLM-powered data processing capabilities including extraction, parsing, and rule-based checking. These tools analyze files with large language models to handle complex data transformation and validation tasks with high accuracy and flexibility.
## Key Features
### JINBA\_MODULES\_EXTRACT
Uses an LLM to analyze a file and extract structured data according to a JSON Schema you define.
| Parameter | Type | Required | Description |
| - | - | - | - |
| `name` | string | Yes | Task name |
| `fileUrl` | string | Yes | The URL of the file to extract data from |
| `dataSchema` | object | No | The schema of the data to extract. Must be a valid [JSON Schema](https://json-schema.org/understanding-json-schema/reference) |
| `extractionMode` | string | No | `FAST`, `BALANCED` (default), or `QUALITY` |
Output: `result` — the extracted data, shaped by your `dataSchema`.
### JINBA\_MODULES\_PARSE
A dynamic parser in which the LLM automatically adjusts the parsing approach based on the file type and outputs the extracted content.
| Parameter | Type | Required | Description |
| - | - | - | - |
| `fileUrl` | string | Yes | The URL of the file to parse |
| `outputFormat` | string | No | `MARKDOWN` (default), `TEXT`, or `STRUCTURED` |
| `extractionMode` | string | No | `FAST`, `BALANCED` (default), or `QUALITY` |
Output: `result` — the parsed content as a string.
### JINBA\_MODULES\_CHECKER\_V2
An enhanced LLM-based checker that validates a target file against JSON-defined rules. v2 supports flexible rule structures, higher-precision evaluation, and detailed reasoning for each judgment.
| Parameter | Type | Required | Description |
| - | - | - | - |
| `target_file` | string | Yes | The file to check (PDF, text, JSON, XML, CSV, or DOCX) |
| `task` | string | Yes | The task name |
| `description` | string | No | Task description. Use when you want to add instructions specialized for a specific task |
| `rules` | array | No | JSON array of rule objects (see [Rule Format](#rule-format)) |
| `references` | array | No | Up to 10 reference file URLs. To suppress hallucinations, you can embed company regulations, legal documents, RAG search results, etc. |
| `additionalDataSchema` | object | No | JSON Schema describing additional data to return with each check result |
Output: `result` — an array of check results, one per rule, each with `uniqueId`, `rule`, `status` (`accepted` / `rejected` / `pending`), `range`, `reason`, and optional `additionalData`.
## Authentication
No authentication or tool configuration is required. The Jinba Modules API credentials are managed server-side.
## Example: Intelligent Document Extraction
```yaml theme={null}
- id: upload_document
name: upload_document
tool: INPUT_FILE
input:
- name: description
value: "Upload document for intelligent extraction"
- id: extract_structured_data
name: extract_structured_data
tool: JINBA_MODULES_EXTRACT
input:
- name: name
value: "Invoice Data Extraction"
- name: fileUrl
value: "{{steps.upload_document.result}}"
- name: dataSchema
value: |
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"invoice_number": {
"type": "string",
"description": "Invoice number or ID"
},
"date": {
"type": "string",
"format": "date",
"description": "Invoice date"
},
"vendor": {
"type": "object",
"properties": {
"name": {"type": "string"},
"address": {"type": "string"},
"phone": {"type": "string"},
"email": {"type": "string"}
}
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"description": {"type": "string"},
"quantity": {"type": "number"},
"unit_price": {"type": "number"},
"total": {"type": "number"}
}
}
},
"total_amount": {
"type": "number",
"description": "Total invoice amount"
},
"tax_amount": {
"type": "number",
"description": "Tax amount if present"
}
},
"required": ["invoice_number", "date", "total_amount"]
}
- name: extractionMode
value: "QUALITY" # Options: FAST, BALANCED, QUALITY
- id: validate_document
name: validate_document
tool: JINBA_MODULES_CHECKER_V2
input:
- name: target_file
value: "{{steps.upload_document.result}}"
- name: task
value: "Invoice Validation"
- name: description
value: "Check that the uploaded invoice satisfies the rules below."
- name: rules
value: |
[
{
"uniqueId": "invoice-001",
"name": "Invoice number present",
"description": "The document must contain an invoice number or ID."
},
{
"uniqueId": "invoice-002",
"name": "Positive total amount",
"description": "The total amount must be a positive number."
},
{
"uniqueId": "invoice-003",
"name": "Valid invoice date",
"description": "The invoice date must be present and in a valid date format."
},
{
"uniqueId": "invoice-004",
"name": "Valid vendor email",
"description": "If a vendor email address is present, it must be in a valid email format."
}
]
- id: process_extraction_results
name: process_extraction_results
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
# Process extraction and check results
extracted_data = json.loads('''{{steps.extract_structured_data.result}}''')
check_results = json.loads('''{{steps.validate_document.result}}''')
print("Document Extraction Results")
print("=" * 35)
# Display extracted data
print("Extracted Information:")
print(f"Invoice Number: {extracted_data.get('invoice_number', 'N/A')}")
print(f"Date: {extracted_data.get('date', 'N/A')}")
print(f"Vendor: {extracted_data.get('vendor', {}).get('name', 'N/A')}")
print(f"Total Amount: ${extracted_data.get('total_amount', 0):,.2f}")
if 'items' in extracted_data:
print(f"Items Count: {len(extracted_data['items'])}")
print("\nCheck Results:")
accepted_count = sum(1 for r in check_results if r.get('status') == 'accepted')
total_rules = len(check_results)
print(f"Accepted: {accepted_count}/{total_rules}")
# Show any rejected rules
rejected = [r for r in check_results if r.get('status') == 'rejected']
if rejected:
print("\nRejected Rules:")
for r in rejected:
print(f" - {r.get('rule', 'Unknown')}: {r.get('reason', 'No reason provided')}")
else:
print("All rules accepted")
- id: export_processed_data
name: export_processed_data
tool: OUTPUT_FILE
input:
- name: content
value: "{{steps.extract_structured_data.result}}"
- name: filename
value: "extracted_invoice_data_{{date | format('YYYY-MM-DD')}}.json"
- name: fileType
value: "json"
```
## Example: Batch Document Processing
```yaml theme={null}
- id: process_document_batch
name: process_document_batch
tool: JINBA_MODULES_EXTRACT
input:
- name: name
value: "Batch Document Processing"
- name: fileUrl
value: "{{input.batch_file_url}}"
- name: dataSchema
value: |
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"documents": {
"type": "array",
"items": {
"type": "object",
"properties": {
"document_type": {"type": "string"},
"date": {"type": "string"},
"amount": {"type": "number"},
"vendor": {"type": "string"},
"metadata": {
"type": "object",
"additionalProperties": true
}
},
"required": ["document_type", "date", "amount"]
}
}
}
}
- name: extractionMode
value: "BALANCED"
- id: parse_document_content
name: parse_document_content
tool: JINBA_MODULES_PARSE
input:
- name: fileUrl
value: "{{input.batch_file_url}}"
- name: outputFormat
value: "MARKDOWN" # Options: MARKDOWN, TEXT, STRUCTURED
- name: extractionMode
value: "BALANCED"
- id: comprehensive_validation
name: comprehensive_validation
tool: JINBA_MODULES_CHECKER_V2
input:
- name: target_file
value: "{{input.batch_file_url}}"
- name: task
value: "Batch Document Check"
- name: rules
value: |
[
{
"uniqueId": "doc-001",
"name": "Known document types only",
"description": "Every document must be an invoice, a receipt, or a contract."
},
{
"uniqueId": "doc-002",
"name": "Amount within range",
"description": "Every document amount must be between 0 and 1,000,000."
},
{
"uniqueId": "doc-003",
"name": "Date within range",
"description": "Every document date must be between 2020-01-01 and 2025-12-31."
},
{
"uniqueId": "doc-004",
"name": "Vendor name length",
"description": "Every vendor name must be between 2 and 200 characters."
}
]
- name: additionalDataSchema
value: |
{
"type": "object",
"properties": {
"documentType": {
"type": "string",
"description": "The type of the document the rule was evaluated against"
}
}
}
- id: generate_processing_report
name: generate_processing_report
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
from datetime import datetime
# Compile processing report
extracted = json.loads('''{{steps.process_document_batch.result}}''')
parsed = '''{{steps.parse_document_content.result}}'''
check_results = json.loads('''{{steps.comprehensive_validation.result}}''')
report = {
"processing_summary": {
"timestamp": datetime.now().isoformat(),
"total_documents": len(extracted.get('documents', [])),
"extraction_mode": "BALANCED",
"parsed_characters": len(parsed),
"all_rules_accepted": all(r.get('status') == 'accepted' for r in check_results)
},
"document_breakdown": {},
"check_summary": {
"total_rules": len(check_results),
"accepted": sum(1 for r in check_results if r.get('status') == 'accepted'),
"rejected": sum(1 for r in check_results if r.get('status') == 'rejected'),
"pending": sum(1 for r in check_results if r.get('status') == 'pending')
},
"recommendations": []
}
# Document type breakdown
if 'documents' in extracted:
doc_types = {}
total_amount = 0
for doc in extracted['documents']:
doc_type = doc.get('document_type', 'unknown')
doc_types[doc_type] = doc_types.get(doc_type, 0) + 1
total_amount += doc.get('amount', 0)
report['document_breakdown'] = doc_types
report['processing_summary']['total_amount'] = total_amount
# Add recommendations
if report['check_summary']['rejected'] > 0:
report['recommendations'].append("Review rejected rules and correct data issues")
if report['check_summary']['pending'] > 0:
report['recommendations'].append("Review pending rules manually")
print(json.dumps(report, indent=2))
- id: save_processing_report
name: save_processing_report
tool: OUTPUT_FILE
input:
- name: content
value: "{{steps.generate_processing_report.result.stdout}}"
- name: filename
value: "batch_processing_report_{{date | format('YYYY-MM-DD-HHmm')}}.json"
- name: fileType
value: "json"
```
## Extraction Modes
The `extractionMode` parameter is shared by `JINBA_MODULES_EXTRACT` and `JINBA_MODULES_PARSE`:
* **FAST**: Extracts data quickly. Best for high-volume processing of simple documents
* **BALANCED** (default): Extracts data with a balance of speed and accuracy. A good general-purpose choice
* **QUALITY**: Extracts data with the highest accuracy. Best for critical documents and complex layouts
## Output Formats
The `outputFormat` parameter of `JINBA_MODULES_PARSE` controls the shape of the parsed result:
* **MARKDOWN** (default): Output in Markdown format, preserving headings, tables, and lists
* **TEXT**: Output as plain text
* **STRUCTURED**: Output in a structured format
## Data Schema Design
The `dataSchema` parameter of `JINBA_MODULES_EXTRACT` accepts any valid JSON Schema.
### Basic Schema Structure
```json theme={null}
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"field_name": {
"type": "string|number|object|array",
"description": "Clear description of the field",
"format": "date|email|uri|etc",
"pattern": "regex_pattern_if_needed"
}
},
"required": ["list_of_required_fields"]
}
```
### Advanced Schema Features
* **Nested objects**: Complex data structures
* **Arrays**: Multiple items of the same type
* **Conditional fields**: Fields dependent on other values
* **Pattern matching**: Regex validation
* **Format validation**: Date, email, URL formats
## Rule Format
The `rules` parameter of `JINBA_MODULES_CHECKER_V2` is a JSON array of rule objects. Each rule is evaluated against the target file by the LLM.
| Field | Type | Required | Description |
| - | - | - | - |
| `uniqueId` | string | Yes | Identifier echoed back in the corresponding check result |
| `name` | string | Yes | Short rule name |
| `description` | string | Yes | What the rule checks, written in natural language |
| `references` | array | No | Rule-specific references: objects with `type` (`text` or `url`) and a matching `text` or `url` field |
| `examples` | array | No | Example judgments to guide the evaluation |
### Check Results
Each entry in the `result` output corresponds to one rule:
* **`uniqueId`**: The rule's identifier
* **`rule`**: The rule that was evaluated
* **`status`**: `accepted`, `rejected`, or `pending`
* **`range`**: The location in the target the judgment refers to
* **`reason`**: Detailed reasoning behind the judgment
* **`additionalData`**: Extra fields matching `additionalDataSchema`, when provided
## Use Cases
* **Invoice Processing**: Automated invoice data extraction and validation
* **Document Digitization**: Convert paper documents to structured data
* **Data Migration**: Extract data from legacy systems
* **Compliance Checking**: Validate documents against regulations
* **Research Data**: Extract structured data from research documents
* **Form Processing**: Automate form data extraction
* **Contract Analysis**: Extract key terms from contracts
* **Financial Processing**: Process financial statements and reports
## Best Practices
### Schema Design
* Keep schemas simple and focused
* Use clear, descriptive field names
* Include comprehensive descriptions
* Test schemas with sample data
* Version your schemas for consistency
### Extraction Optimization
* Choose the appropriate extraction mode for your use case
* Provide high-quality input documents
* Use consistent document formats when possible
* Monitor extraction accuracy and adjust as needed
### Checking Strategy
* Write rule descriptions in clear, unambiguous natural language
* Give each rule a stable `uniqueId` so results can be traced over time
* Attach `references` (regulations, legal documents, RAG search results) to suppress hallucinations
* Review `pending` results manually and refine rules based on the `reason` output
### Performance Considerations
* Batch similar documents together
* Use FAST mode for simple, high-volume processing
* Use QUALITY mode only where accuracy is critical
* Implement error handling for failed extractions
# Jinba Knowledge Base
Source: https://carnot.mintlify.app/en/pages/tools/jinba/knowledge_base
Update and manage Jinba knowledge bases for enhanced AI workflows
## Overview
The Jinba Knowledge Base tools allow you to add files to and update files in knowledge bases within the Jinba ecosystem. These tools enable you to maintain up-to-date information repositories that can be accessed by other tools and workflows (such as vector search) for enhanced AI-powered operations.
## Key Features
* `JINBA_KNOWLEDGE_BASE_FILE_ADD`: Add a file to a knowledge base, with configurable chunking
* `JINBA_KNOWLEDGE_BASE_UPDATE`: Update an existing file in a knowledge base with new content
* Integration with vector search capabilities
* Synchronous or asynchronous execution (wait for chunking or return immediately)
## Authentication
These tools authenticate with a workspace secret key via the `token` config, which defaults to `{{ secrets.JINBAFLOW_WS_API_KEY }}` — you usually do not need to set it explicitly.
## Tools
### JINBA\_KNOWLEDGE\_BASE\_FILE\_ADD
Add a file to a knowledge base.
**Input**:
| Parameter | Type | Required | Description |
| - | - | - | - |
| `knowledgeBaseId` | string | Yes | Target knowledge base |
| `file` | string | Yes | Base64 encoded file content or file URL starting with `https://` or `data:` |
| `filename` | string | Yes | Name of the file (extension will be auto-detected from the file) |
| `metadata` | string (JSON) | No | Optional metadata to attach to the file |
| `chunkerSettings` | object | No | Chunking settings: `chunkSize` (1-8192, default: 512), `chunkOverlap` (0-2048, default: 128), `chunkingIdentifier` (default: `"\\n\\n"`) |
| `executionMode` | string | No | `SYNCHRONOUS` to wait for chunking or `ASYNCHRONOUS` to return immediately (default: `ASYNCHRONOUS`) |
**Output**:
| Field | Type | Description |
| - | - | - |
| `knowledgeBaseId` | string | ID of the knowledge base |
| `fileId` | string | ID of the added file |
| `filename` | string | Name of the added file |
| `status` | string | Processing status: `pending`, `processing`, `completed`, or `failed` |
| `contentType` | string | Content type of the file |
| `size` | string | File size |
| `chunkCount` | number | Number of chunks created |
| `createdAt` | string | Creation timestamp |
### JINBA\_KNOWLEDGE\_BASE\_UPDATE
Update an existing file in a knowledge base with new content.
**Input**:
| Parameter | Type | Required | Description |
| - | - | - | - |
| `knowledgeBaseId` | string | Yes | Target knowledge base |
| `knowledgeBaseFileId` | string | Yes | Existing knowledge base file ID to update |
| `fileUrl` | string | Yes | URL of the file content to update with |
| `updateType` | string | No | Update strategy; `FULL_REFRESH` replaces the file in the knowledge base (default: `FULL_REFRESH`) |
| `executionMode` | string | No | `SYNCHRONOUS` to wait for chunking or `ASYNCHRONOUS` to return immediately (default: `SYNCHRONOUS`) |
**Output**:
| Field | Type | Description |
| - | - | - |
| `knowledgeBaseId` | string | ID of the knowledge base |
| `fileId` | string | ID of the updated file |
| `filename` | string | Name of the updated file |
| `status` | string | Processing status: `pending`, `processing`, `completed`, or `failed` |
| `chunkCount` | number | Number of chunks created |
## Examples
### Example: Add a File to a Knowledge Base
```yaml theme={null}
- id: add_file_to_kb
tool: JINBA_KNOWLEDGE_BASE_FILE_ADD
input:
- name: knowledgeBaseId
value: "{{secrets.KNOWLEDGE_BASE_ID}}"
- name: file
value: "https://example.com/product-manual.pdf"
- name: filename
value: "product-manual.pdf"
- name: executionMode
value: "SYNCHRONOUS"
- name: chunkerSettings
value:
chunkSize: 512
chunkOverlap: 128
chunkingIdentifier: "\\n\\n"
```
### Example: Update an Existing Knowledge Base File
```yaml theme={null}
- id: update_kb_file
tool: JINBA_KNOWLEDGE_BASE_UPDATE
input:
- name: knowledgeBaseId
value: "{{secrets.KNOWLEDGE_BASE_ID}}"
- name: knowledgeBaseFileId
value: "{{secrets.FILE_ID}}"
- name: fileUrl
value: "https://example.com/updated-product-manual.pdf"
- name: updateType
value: "FULL_REFRESH"
- name: executionMode
value: "SYNCHRONOUS"
```
### Example: Generate a Report and Store It in a Knowledge Base
```yaml theme={null}
- id: create_report
tool: OUTPUT_FILE
input:
- name: content
value: |
# Weekly Support Summary
{{steps.summarize_tickets.result.content}}
- name: filename
value: "support_summary_{{date | format('YYYY-MM-DD')}}.md"
- name: fileType
value: "md"
- id: add_report_to_kb
tool: JINBA_KNOWLEDGE_BASE_FILE_ADD
input:
- name: knowledgeBaseId
value: "{{secrets.KNOWLEDGE_BASE_ID}}"
- name: file
value: "{{steps.create_report.result.url}}"
- name: filename
value: "support_summary_{{date | format('YYYY-MM-DD')}}.md"
- name: executionMode
value: "ASYNCHRONOUS"
```
## Use Cases
* Maintaining product documentation and changelogs
* Building comprehensive troubleshooting guides
* Creating workflow documentation repositories
* Storing best practices and guidelines
* Building FAQ and support knowledge bases
* Keeping RAG search sources up to date automatically
## Best Practices
* Use descriptive filenames so files are easy to identify later
* Tune `chunkerSettings` for your content: smaller chunks (256-512) for precise retrieval, larger chunks (1024-2048) for maintaining context
* Use `SYNCHRONOUS` execution when downstream steps depend on the file being searchable
* Use `ASYNCHRONOUS` execution for large files to avoid blocking the flow
* Check the `status` output (`pending` / `processing` / `completed` / `failed`) before relying on the file in searches
* Update existing files with `JINBA_KNOWLEDGE_BASE_UPDATE` instead of adding duplicates
# Vector Search
Source: https://carnot.mintlify.app/en/pages/tools/jinba/vector_search
Semantic search for knowledge bases using vector embeddings
## Overview
Jinba Vector Search enables semantic search capabilities for knowledge bases using vector embeddings. This tool uses OpenAI's text-embedding-3-large to vectorize queries and retrieve relevant data from your knowledge base based on similarity scores, providing powerful RAG (Retrieval-Augmented Generation) functionality.
## Key Features
* **Semantic Search**: Find conceptually similar content, not just exact matches
* **Knowledge Base Integration**: Search across uploaded documents and files
* **Similarity Scoring**: Filter results by similarity threshold
* **Configurable Results**: Control the number of results returned
* **RAG Support**: Perfect for building question-answering and information retrieval workflows
## Authentication
This tool requires a Jinba API Token to access knowledge bases.
**Required Configuration:**
* `token` (string): Your Jinba API Token (stored as a secret)
## Input Parameters
| Parameter | Type | Required | Default | Description |
| - | - | - | - | - |
| `query` | string | Yes | - | Search query for semantic search |
| `knowledgeBaseId` | string | Yes | - | ID of the knowledge base to search |
| `topK` | number | No | 3 | Number of top results to return (1-50) |
| `threshold` | number | No | 0.3 | Similarity threshold for filtering results (0-1) |
## Output Structure
Returns an array of search results with:
| Field | Type | Description |
| - | - | - |
| `chunk` | object | Content chunk with ID, file ID, content, and metadata |
| `score` | number | Similarity score (0-1, higher is more similar) |
| `file` | object | File information including filename and content type |
| `query` | string | The original search query |
| `totalResults` | number | Total number of results found |
## Example: Document Q\&A System
```yaml theme={null}
- id: search_knowledge_base
name: search_knowledge_base
tool: JINBA_VECTOR_SEARCH
config:
- name: token
value: "{{secrets.JINBA_API_TOKEN}}"
input:
- name: query
value: "What is our company's return policy?"
- name: knowledgeBaseId
value: "{{secrets.KNOWLEDGE_BASE_ID}}"
- name: topK
value: 5
- name: threshold
value: 0.4
- id: generate_answer
name: generate_answer
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Based on the following search results from our knowledge base, answer the user's question about our return policy.
Search Results:
{{#each steps.search_knowledge_base.results}}
**From: {{file.filename}}**
Content: {{chunk.content}}
Similarity: {{score}}
{{/each}}
Question: {{steps.search_knowledge_base.query}}
Please provide a comprehensive answer based on the search results above.
```
## Example: Research Assistant
```yaml theme={null}
- id: research_query
name: research_query
tool: INPUT_TEXT
input:
- name: description
value: "Enter your research question"
- id: search_research_base
name: search_research_base
tool: JINBA_VECTOR_SEARCH
config:
- name: token
value: "{{secrets.JINBA_API_TOKEN}}"
input:
- name: query
value: "{{steps.research_query.result}}"
- name: knowledgeBaseId
value: "{{secrets.RESEARCH_KB_ID}}"
- name: topK
value: 10
- name: threshold
value: 0.3
- id: analyze_findings
name: analyze_findings
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
results = {{steps.search_research_base.results}}
print("=== Research Findings ===")
print(f"Query: {results['query']}")
print(f"Total Results: {results['totalResults']}")
print()
# Group results by source file
sources = {}
for result in results['results']:
filename = result['file']['filename']
if filename not in sources:
sources[filename] = []
sources[filename].append({
'content': result['chunk']['content'][:200] + "...",
'score': result['score']
})
print("=== Sources Found ===")
for filename, chunks in sources.items():
print(f"\n📄 {filename}")
for i, chunk in enumerate(chunks[:3]): # Top 3 chunks per file
print(f" {i+1}. Score: {chunk['score']:.3f}")
print(f" {chunk['content']}")
# Calculate average similarity
avg_score = sum(r['score'] for r in results['results']) / len(results['results'])
print(f"\n📊 Average Similarity: {avg_score:.3f}")
- id: synthesize_response
name: synthesize_response
tool: ANTHROPIC_INVOKE
config:
- name: token
value: "{{secrets.ANTHROPIC_API_KEY}}"
input:
- name: prompt
value: |
You are a research assistant. Synthesize the following search results into a comprehensive response.
Original Query: {{steps.search_research_base.query}}
Search Results:
{{#each steps.search_research_base.results}}
**Source: {{file.filename}}** (Similarity: {{score}})
{{chunk.content}}
---
{{/each}}
Please provide:
1. A direct answer to the question
2. Key insights from multiple sources
3. Any conflicting information found
4. Suggestions for further research
```
## Example: Content Recommendation
```yaml theme={null}
- id: get_user_interests
name: get_user_interests
tool: INPUT_TEXT
input:
- name: description
value: "Describe topics or content you're interested in"
- id: find_related_content
name: find_related_content
tool: JINBA_VECTOR_SEARCH
config:
- name: token
value: "{{secrets.JINBA_API_TOKEN}}"
input:
- name: query
value: "{{steps.get_user_interests.result}}"
- name: knowledgeBaseId
value: "{{secrets.CONTENT_KB_ID}}"
- name: topK
value: 8
- name: threshold
value: 0.25
- id: format_recommendations
name: format_recommendations
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
results = {{steps.find_related_content.results}}
print("🔍 **Content Recommendations**")
print(f"Based on: *{results['query']}*\n")
recommendations = []
for i, result in enumerate(results['results'][:5], 1):
chunk = result['chunk']
file_info = result['file']
score = result['score']
# Extract first sentence or 100 characters
content_preview = chunk['content'][:100].split('.')[0] + "..."
recommendations.append({
'rank': i,
'title': file_info['filename'],
'preview': content_preview,
'relevance': f"{score:.1%}",
'content_type': file_info['contentType']
})
for rec in recommendations:
print(f"**{rec['rank']}. {rec['title']}**")
print(f" 📋 {rec['preview']}")
print(f" 🎯 Relevance: {rec['relevance']}")
print(f" 📄 Type: {rec['content_type']}")
print()
if len(results['results']) == 0:
print("No relevant content found. Try adjusting your search terms or lowering the threshold.")
```
## Best Practices
### Query Optimization
* **Use natural language**: Write queries as you would ask a human
* **Be specific**: More specific queries often yield better results
* **Include context**: Add relevant keywords and context terms
### Threshold Selection
* **0.7-1.0**: Very high similarity, exact or near-exact matches
* **0.4-0.7**: High similarity, closely related content
* **0.2-0.4**: Moderate similarity, potentially relevant content
* **0.0-0.2**: Low similarity, may include tangentially related content
### Performance Tips
* **Limit topK**: Don't retrieve more results than needed
* **Adjust threshold**: Higher thresholds = fewer, more relevant results
* **Use metadata**: Leverage chunk metadata for additional filtering
## Knowledge Base Setup
Before using vector search, ensure your knowledge base contains relevant documents:
1. **Upload Documents**: Add PDFs, text files, or other supported formats
2. **Processing**: Allow time for document chunking and vectorization
3. **Test Queries**: Start with simple queries to understand your data
4. **Iterate**: Refine queries and thresholds based on results
## Use Cases
* **Customer Support**: Find relevant documentation for user questions
* **Research Assistant**: Discover related research papers and documents
* **Content Discovery**: Recommend similar articles or resources
* **FAQ Automation**: Automatically answer common questions
* **Document Analysis**: Find specific information across large document sets
* **Knowledge Management**: Quick access to institutional knowledge
* **Legal Research**: Search through contracts and legal documents
* **Product Information**: Find technical specifications and manuals
# AI Video Generation
Source: https://carnot.mintlify.app/en/pages/tools/media/video_generation
Create high-quality videos from text descriptions using AI
## Overview
AI Video Generation tools allow you to create high-quality videos from simple text descriptions using advanced AI models. These tools support multiple video formats, aspect ratios, and durations for various use cases.
## Key Features
* `LUMA_TEXT_TO_VIDEO`
* Generate videos using Luma AI's advanced models (ray-2, ray-flash-2, ray-1-6)
* Support for 4K resolution and multiple aspect ratios
* Customizable duration (5s or 10s) with seamless looping options
* `LUMA_TEXT_TO_IMAGE`
* Generate high-quality images from text descriptions
* `KLING_TEXT_TO_VIDEO`
* Generate videos using Kling AI's enhanced models
* Improved motion quality and lifelike character generation
* Support for multiple aspect ratios and durations
## Authentication
For further details, [click here](/en/pages/credentials/luma) and [click here](/en/pages/credentials/kling).
To use video generation tools, you need API keys from the respective services:
* Luma AI: Obtain from [Luma AI website](https://lumalabs.ai/)
* Kling AI: Obtain from [Kling AI website](https://klingai.kuaishou.com/)
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: Basic Video Generation
```yaml theme={null}
- id: generate_marketing_video
name: generate_marketing_video
tool: LUMA_TEXT_TO_VIDEO
config:
- name: api_key
value: "{{secrets.LUMA_API_KEY}}"
- name: model
value: "ray-2"
- name: aspect_ratio
value: "16:9"
- name: duration
value: 10
- name: loop
value: false
input:
- name: prompt
value: |
A professional product showcase video featuring a sleek smartphone
rotating slowly on a white background with soft lighting. The phone
displays a modern app interface. Camera slowly zooms in to highlight
the premium build quality and design details.
- id: generate_social_media_video
name: generate_social_media_video
tool: KLING_TEXT_TO_VIDEO
config:
- name: api_key
value: "{{secrets.KLING_API_KEY}}"
- name: aspect_ratio
value: "9:16"
- name: duration
value: 5
input:
- name: prompt
value: |
A vibrant animated scene of a person working at a coffee shop,
typing on a laptop with steam rising from their coffee cup.
Warm afternoon sunlight streaming through the window.
Perfect for social media content about productivity and lifestyle.
```
### Example: Video Content Creation Pipeline
```yaml theme={null}
- id: get_video_brief
name: get_video_brief
tool: INPUT_JSON_WITH_VALIDATION
input:
- name: value
value: {
"video_type": "product_demo",
"product_name": "Smart Watch",
"target_audience": "fitness enthusiasts",
"duration": 10,
"style": "modern_minimal"
}
- id: generate_video_script
name: generate_video_script
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4
input:
- name: prompt
value: |
Create a detailed video description/prompt for AI video generation based on this brief:
Product: {{steps.get_video_brief.result.product_name}}
Target Audience: {{steps.get_video_brief.result.target_audience}}
Duration: {{steps.get_video_brief.result.duration}} seconds
Style: {{steps.get_video_brief.result.style}}
Type: {{steps.get_video_brief.result.video_type}}
Requirements:
1. Write a detailed visual description for AI video generation
2. Include camera movements, lighting, and composition details
3. Specify product positioning and key features to highlight
4. Ensure the description fits the target duration
5. Match the requested visual style
Format the output as a single, detailed prompt suitable for AI video generation.
- id: create_main_video
name: create_main_video
tool: LUMA_TEXT_TO_VIDEO
config:
- name: api_key
value: "{{secrets.LUMA_API_KEY}}"
- name: model
value: "ray-2"
- name: aspect_ratio
value: "16:9"
- name: duration
value: "{{steps.get_video_brief.result.duration}}"
input:
- name: prompt
value: "{{steps.generate_video_script.result.content}}"
- id: create_social_variant
name: create_social_variant
tool: KLING_TEXT_TO_VIDEO
config:
- name: api_key
value: "{{secrets.KLING_API_KEY}}"
- name: aspect_ratio
value: "9:16"
- name: duration
value: 5
input:
- name: prompt
value: |
Vertical social media version: {{steps.generate_video_script.result.content}}
Optimized for mobile viewing with close-up shots and dynamic movement.
```
### Example: Multi-Format Content Creation
```yaml theme={null}
- id: create_hero_image
name: create_hero_image
tool: LUMA_TEXT_TO_IMAGE
config:
- name: api_key
value: "{{secrets.LUMA_API_KEY}}"
input:
- name: prompt
value: |
A stunning hero image for a tech startup website. Modern office space
with diverse team members collaborating around a large display showing
data visualizations. Professional lighting, clean design, inspiring
atmosphere. High-resolution, photorealistic.
- id: create_background_video
name: create_background_video
tool: LUMA_TEXT_TO_VIDEO
config:
- name: api_key
value: "{{secrets.LUMA_API_KEY}}"
- name: model
value: "ray-flash-2"
- name: aspect_ratio
value: "16:9"
- name: duration
value: 10
- name: loop
value: true
input:
- name: prompt
value: |
Subtle background video for website hero section. Gentle floating
abstract particles and soft geometric shapes in corporate blue colors.
Minimal motion, professional feel, seamless loop. Perfect for website
background without being distracting.
- id: create_product_showcase
name: create_product_showcase
tool: KLING_TEXT_TO_VIDEO
config:
- name: api_key
value: "{{secrets.KLING_API_KEY}}"
- name: aspect_ratio
value: "1:1"
- name: duration
value: 5
input:
- name: prompt
value: |
Square format product showcase for Instagram. Modern laptop computer
on a clean desk setup with plants and coffee. Smooth 360-degree
rotation showing all angles. Premium aesthetic with natural lighting
and minimal shadows.
```
### Example: Video Generation with Quality Control
```yaml theme={null}
- id: generate_video_options
name: generate_video_options
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
base_prompt = "A professional presentation of a new mobile app interface"
# Generate variations for A/B testing
variations = [
{
"name": "version_a_minimal",
"prompt": f"{base_prompt} with minimal design, clean white background, subtle animations",
"model": "ray-2",
"aspect_ratio": "16:9"
},
{
"name": "version_b_dynamic",
"prompt": f"{base_prompt} with dynamic camera movements, colorful gradient background, energetic transitions",
"model": "ray-flash-2",
"aspect_ratio": "16:9"
},
{
"name": "version_c_social",
"prompt": f"{base_prompt} optimized for social media, vertical format, engaging visual effects",
"model": "ray-2",
"aspect_ratio": "9:16"
}
]
print(json.dumps({"variations": variations}))
- id: create_version_a
name: create_version_a
tool: LUMA_TEXT_TO_VIDEO
config:
- name: api_key
value: "{{secrets.LUMA_API_KEY}}"
- name: model
value: "{{steps.generate_video_options.result.variations[0].model}}"
- name: aspect_ratio
value: "{{steps.generate_video_options.result.variations[0].aspect_ratio}}"
- name: duration
value: 10
input:
- name: prompt
value: "{{steps.generate_video_options.result.variations[0].prompt}}"
- id: create_version_b
name: create_version_b
tool: LUMA_TEXT_TO_VIDEO
config:
- name: api_key
value: "{{secrets.LUMA_API_KEY}}"
- name: model
value: "{{steps.generate_video_options.result.variations[1].model}}"
- name: aspect_ratio
value: "{{steps.generate_video_options.result.variations[1].aspect_ratio}}"
- name: duration
value: 10
input:
- name: prompt
value: "{{steps.generate_video_options.result.variations[1].prompt}}"
- id: analyze_results
name: analyze_results
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
import json
# Compile results
results = {
"version_a": {
"url": "{{steps.create_version_a.result.video_url}}",
"status": "{{steps.create_version_a.result.status}}",
"style": "minimal"
},
"version_b": {
"url": "{{steps.create_version_b.result.video_url}}",
"status": "{{steps.create_version_b.result.status}}",
"style": "dynamic"
}
}
print(json.dumps({"video_results": results}))
```
## Tips and Best Practices
* Use specific, detailed prompts for better video quality
* Choose the right model based on your needs (quality vs speed)
* Consider aspect ratio based on intended platform (16:9 for web, 9:16 for mobile)
* Test different prompt variations to find the best results
* Use looping for background videos and website elements
* Plan video duration based on platform requirements
* Include lighting, camera movement, and composition details in prompts
* Consider creating multiple versions for A/B testing
* Monitor API usage and costs for high-volume generation
# Netsea
Source: https://carnot.mintlify.app/en/pages/tools/productivity/netsea
Connect to the Netsea API
## Overview
Netsea is a platform that provides access to a wide range of products and suppliers. This tool allows you to connect with the Netsea API, enabling you to retrieve product information, supplier details, and manage your inventory programmatically. This integration is useful for automating workflows and enhancing productivity within your e-commerce operations.
## Key Features
* `NETSEA_GET_SUPPLIERS`
* Retrieve a list of suppliers from the Netsea platform.
* `NETSEA_GET_CATEGORIES`
* Retrieve a list of product categories from the Netsea platform.
## Authentication
For further details, [click here](/en/pages/credentials/netsea).
To use the Netsea API, you need to set up an API key for buyers. You can sign up up for an account on the [Netsea website](https://netsea.jp/) and generate your API key.
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: Get Suppliers and Categories
```yaml theme={null}
- id: get_suppliers
tool: NETSEA_GET_SUPPLIERS
config:
- name: token
value: "{{secrets.NETSEA_API_TOKEN}}"
input:
[]
- id: get_categories
tool: NETSEA_GET_CATEGORIES
config:
- name: token
value: "{{secrets.NETSEA_API_TOKEN}}"
- name: all_levels
value: false
input:
[]
```
# Shopify
Source: https://carnot.mintlify.app/en/pages/tools/productivity/shopify
Manage Shopify products and orders
## Overview
The Shopify tools allow you to manage products and orders in your Shopify store. You can create, update, and delete products, as well as manage orders and inventory.
## Key Features
* `SHOPIFY_LIST_PRODUCTS`
* Retrieve a list of products from your Shopify store.
* `SHOPIFY_CREATE_PRODUCT`
* Create a new product in your Shopify store.
## Authentication
For further details, [click here](/en/pages/credentials/shopify).
To use the Shopify API, you need to create a private app in your Shopify store. This will provide you with the necessary credentials (API key and password) to authenticate your requests.
**Note**: Treat API keys as sensitive information and never commit them to public repositories.
### Example: List Products and Create a Product
```yaml theme={null}
- name: Get Product List
id: list_products
tool: SHOPIFY_LIST_PRODUCTS
config:
- name: token
value: "{{secrets.SHOPIFY_API_TOKEN}}"
- name: api_version
value: 2025-01
input:
- name: shop_domain
value: jinbaflow.myshopify.com
- name: limit
value: 5
- name: Create New Product
id: create_product
tool: SHOPIFY_CREATE_PRODUCT
config:
- name: token
value: "{{secrets.SHOPIFY_API_TOKEN}}"
- name: api_version
value: 2025-01
input:
- name: shop_domain
value: gzb31e-yv.myshopify.com
- name: title
value: Jinba Flow Test Product
- name: description
value: This is a test product created from Jinba Flow.
- name: vendor
value: Jinba Flow
- name: product_type
value: Test
- name: status
value: DRAFT
```
# Building a RAG Chat System
Source: https://carnot.mintlify.app/en/pages/tutorials/rag-chat-system
A step-by-step tutorial to build a Retrieval-Augmented Generation chat system using Jinba Flow — from knowledge base setup to deploying a live chat interface
Build a fully functional AI chat system that answers questions using your own documents. This tutorial walks you through every step: creating a knowledge base, building a RAG workflow, and deploying it as a chat interface.
## What You'll Build
A chat system that:
1. Accepts a user question (via chat, API, or AI assistant)
2. Searches your knowledge base for relevant information
3. Uses an AI model to generate an accurate answer grounded in your documents
4. Returns the answer with source references
```mermaid theme={null}
flowchart LR
Q["💬 User Question"] --> S["🔍 Vector Search
Knowledge Base"]
S --> C["📋 Context
Assembly"]
C --> G["🤖 AI Generation
with Context"]
G --> A["✅ Grounded
Answer"]
```
## Prerequisites
* A Jinba Flow account ([Sign up here](https://flow.jinba.io/))
* Documents to upload — PDFs, DOCX, or text files you want your chat to reference
* Basic familiarity with [Jinba Flow concepts](/en/pages/basics/core-concepts) — Flows, Steps, and Tools
No coding experience is required. You can build the entire system using the chat panel or graph editor. The YAML manifests shown below are for reference and can be copied directly.
## Architecture Overview
Before we start building, here's how all the pieces fit together:
```mermaid theme={null}
flowchart TB
subgraph input["Chat Input"]
A1["Jinba App Chat"]
A2["REST API"]
A3["MCP / AI Assistant"]
end
subgraph flow["Jinba Flow — RAG Pipeline"]
B1["Receive Question
INPUT_TEXT"]
B2["Search Knowledge Base
JINBA_VECTOR_SEARCH"]
B3["Generate Answer
OPENAI_INVOKE or ANTHROPIC_INVOKE"]
end
subgraph kb["Knowledge Backend"]
C1["Jinba Knowledge Base"]
C2["Pinecone"]
C3["Azure AI Search"]
end
A1 & A2 & A3 --> B1
B1 --> B2
B2 --> C1
B2 -.-> C2
B2 -.-> C3
C1 & C2 & C3 --> B3
B3 --> A1 & A2 & A3
```
This tutorial uses **Jinba Knowledge Base** as the primary backend. For other backends, see [Alternative Backends](#alternative-backends) near the end.
***
## Part 1: Set Up Your Knowledge Base
### Step 1: Create a Knowledge Base
In your workspace sidebar, click **Storage**, then select the **Knowledge Bases** tab.
Click **Create Knowledge Base**. Enter a descriptive name (for example, "Product Documentation" or "Company FAQ").
After creation, open your new knowledge base and confirm it appears in the list. In this tutorial, the example knowledge base is named **RAG Tutorial KB**.
### Step 2: Upload Documents
Click on your newly created knowledge base from the Storage page.
Click **Add files** to open the upload dialog. Select your PDFs, DOCX, Markdown, or text files from your computer.
Files are automatically processed through the following pipeline:
| Stage | What Happens |
| - | - |
| **Parsing** | Text is extracted from your documents |
| **Chunking** | Documents are split into searchable chunks |
| **Embedding** | Chunks are converted to vector embeddings |
| **Indexing** | Vectors are stored for fast similarity search |
Wait until all files show **Ready** status.
Processing may take a few minutes depending on file size. Do not proceed until your files show a completed status.
### Step 3: Store Your Credentials
Before building the flow, store the required secrets in your workspace.
Go to your [workspace credentials](/en/pages/credentials/index) page.
Add the following secrets:
| Secret Name | Value | Purpose |
| - | - | - |
| `JINBA_API_TOKEN` | Your Jinba API token | Authenticates vector search |
| `KNOWLEDGE_BASE_ID` | Your knowledge base ID from Step 1 | Identifies which knowledge base to search |
| `ANTHROPIC_API_KEY` | Your Anthropic API key *(optional)* | For Claude-based generation |
If you do not have an OpenAI API key, you can still use `OPENAI_INVOKE` with [Jinba API credit](/en/pages/tools/ai/openai).
***
## Part 2: Build the RAG Flow
Now let's create the workflow that powers the chat system.
### The Complete Manifest
You can paste this directly into the [YAML Coding Panel](/en/pages/basics/manifest):
```yaml theme={null}
# Step 1: Receive the user's question
- id: user_question
name: Receive Question
tool: INPUT_TEXT
input:
- name: value
value: ""
# Step 2: Search the knowledge base for relevant content
- id: search_knowledge
name: Search Knowledge Base
tool: JINBA_VECTOR_SEARCH
config:
- name: token
value: "{{secrets.JINBAFLOW_WS_API_KEY}}"
input:
- name: query
value: "{{steps.user_question.result}}"
- name: knowledgeBaseId
value: YOUR_KB_ID_HERE
- name: topK
value: 5
- name: threshold
value: 0.3
needs:
- user_question
# Step 3: Generate an answer using the retrieved context
- id: generate_answer
name: Generate Answer
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4o
input:
- name: prompt
value: |
## Instructions
You are a helpful assistant. Answer the user's question based ONLY
on the provided context. If the context doesn't contain the answer,
say "I don't have enough information to answer that question."
Always cite which source document(s) your answer comes from.
## Context (from knowledge base)
{{steps.search_knowledge.results | dump}}
## User Question
{{steps.user_question.result}}
Please provide a clear, concise answer based on the context above.
needs:
- search_knowledge
# Step 4: Output the answer
- id: output_answer
name: Output Answer
tool: OUTPUT_TEXT
input:
- name: value
value: "{{steps.generate_answer.result.content}}"
needs:
- generate_answer
```
Fastest path: paste the full YAML manifest above. If you prefer building flows visually, you can also add the four nodes manually in the editor and configure them one by one.
### Alternative: Build the Flow Manually in the Editor
If you want to learn how each node is assembled visually, follow this manual path instead of pasting YAML.
Open the node picker, search for **Input Text**, and add it as the first node in the graph.
After adding it, rename the node to **Receive Question** so it matches the tutorial manifest.
Click the **+** connector under the first node, search for **Vector Search**, and add the `JINBA_VECTOR_SEARCH` node.
Then configure it with:
* **Token**: `JINBAFLOW_WS_API_KEY` secret
* **Query**: `{{steps.user_question.result}}`
* **Knowledge Base ID**: your knowledge base ID
* **Top K**: `5`
* **Threshold**: `0.3`
Add an **Invoke** node and choose `OPENAI_INVOKE`.
Set the model version to `gpt-4o`, then paste the same prompt shown in the YAML example so the model answers only from retrieved knowledge base context.
Add an **Output Text** node as the final step.
Rename it to **Output Answer**, and set its value to:
```text theme={null}
{{steps.generate_answer.result.content}}
```
### Step-by-Step Walkthrough
#### Step 1: Receive Question (`INPUT_TEXT`)
```yaml theme={null}
- id: user_question
name: Receive Question
tool: INPUT_TEXT
input:
- name: value
value: ""
```
The `INPUT_TEXT` tool creates an input parameter for the flow. When executed manually, it shows a text box. When called via API, this becomes a parameter in the request body. Learn more about [input tools](/en/pages/tools/files/input).
#### Step 2: Search Knowledge Base (`JINBA_VECTOR_SEARCH`)
```yaml theme={null}
- id: search_knowledge
name: Search Knowledge Base
tool: JINBA_VECTOR_SEARCH
config:
- name: token
value: "{{secrets.JINBAFLOW_WS_API_KEY}}"
input:
- name: query
value: "{{steps.user_question.result}}"
- name: knowledgeBaseId
value: YOUR_KB_ID_HERE
- name: topK
value: 5
- name: threshold
value: 0.3
needs:
- user_question
```
This step performs semantic search — finding content by meaning, not just keywords.
| Parameter | Value | Why |
| - | - | - |
| `topK` | 5 | Returns the 5 most relevant chunks |
| `threshold` | 0.3 | Filters out low-relevance results |
The `needs: [user_question]` ensures the search waits for the user's question before executing. See [Step Module Options](/en/pages/basics/step-options) for more details.
Start with `topK: 5` and `threshold: 0.3`. If answers lack context, increase `topK`. If irrelevant content appears, increase `threshold`. See the [Vector Search reference](/en/pages/tools/jinba/vector_search) for more guidance.
#### Step 3: Generate Answer (LLM)
```yaml theme={null}
- id: generate_answer
name: Generate Answer
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4o
input:
- name: prompt
value: |
## Instructions
You are a helpful assistant. Answer the user's question based ONLY
on the provided context. If the context doesn't contain the answer,
say "I don't have enough information to answer that question."
Always cite which source document(s) your answer comes from.
## Context (from knowledge base)
{{steps.search_knowledge.results | dump}}
## User Question
{{steps.user_question.result}}
Please provide a clear, concise answer based on the context above.
needs:
- search_knowledge
```
The `| dump` filter serializes the search results into the prompt so the LLM can read all retrieved chunks and their sources. Learn more about [Variables & Templates](/en/pages/basics/variables).
#### Step 4: Output Answer (`OUTPUT_TEXT`)
```yaml theme={null}
- id: output_answer
name: Output Answer
tool: OUTPUT_TEXT
input:
- name: value
value: "{{steps.generate_answer.result.content}}"
needs:
- generate_answer
```
The `OUTPUT_TEXT` step captures the final answer as the flow's output, making it available when calling the flow via API or chat.
Replace the generation step with:
```yaml theme={null}
- id: generate_answer
name: Generate Answer
tool: ANTHROPIC_INVOKE
config:
- name: version
value: claude-3-5-sonnet-20241022
- name: token
value: "{{secrets.ANTHROPIC_API_KEY}}"
input:
- name: prompt
value: |
... (same prompt as above)
needs:
- search_knowledge
```
See the [Anthropic tool reference](/en/pages/tools/ai/anthropic) for details.
Replace the generation step with:
```yaml theme={null}
- id: generate_answer
name: Generate Answer
tool: GEMINI_INVOKE
config:
- name: version
value: gemini-1.5-flash
- name: token
value: "{{secrets.GEMINI_API_KEY}}"
input:
- name: prompt
value: |
... (same prompt as above)
needs:
- search_knowledge
```
See the [Gemini tool reference](/en/pages/tools/ai/gemini) for details.
### Test Your Flow
Build the four-step flow in the editor, then click the **Run** button in the top right.
When prompted, enter a question that your uploaded documents should be able to answer.
Check the execution results. The answer should reference information from your knowledge base.
***
## Part 3: Deploy as a Chat Interface
Your RAG flow works. Now make it accessible to users.
Best for: End users who need a ready-made chat UI
Best for: Custom applications and integrations
Best for: AI assistant integration
### Option A: Jinba App Chat (Recommended)
Deploy your RAG flow as a chat connector in Jinba App for the simplest end-user experience.
In the flow editor, click the **Publish** button. A dialog will ask **"Who will trigger this workflow?"**:
| Option | Description | When to choose |
| - | - | - |
| **My team** | Simple interface anyone can use | ✅ Choose this for the chat UI path (Option A) |
| **Engineers** | Call it from code via API | Choose this for the API path (Option B) |
| **Automatic** | Runs on schedule or when events happen | Choose this for scheduled/event-driven flows |
Select **My team** and click **Continue →**.
After selecting "My team", an education screen appears explaining that **Jinba Flow** (where you build) and **Jinba App** (where your team uses it) are separate products:
* **Separate products, by design** — Jinba Flow is the builder; Jinba App is the chat interface your team uses
* **Enterprise-grade security** — Jinba App has its own authentication and access controls
* **Simple for your team** — No code, no complexity — just a familiar chat interface
Click **Got it, continue** to proceed to the MCP setup.
The **Create an MCP** dialog appears. This shows a preview of how your flow will appear as a chat tool:
* A chat preview showing `@your_flow_name` with a description
* A **Demo** button to preview the chat experience
* An **Enable MCP for this flow** toggle
You **must** turn on the **Enable MCP for this flow** toggle. This is what creates the connection between Jinba Flow and Jinba App — the "Connect with Jinba App" button only appears after you enable it.
Once enabled, additional options appear:
* **Workspace Token** — used for authentication
* **Connection Snippet** — JSON config for MCP clients (Claude Desktop, Cursor, etc.)
* **Connect with Jinba App** button — click this to open the connector in Jinba App
Enabling MCP also lets AI assistants (Claude, Cursor, etc.) call this flow as a tool — you get both Jinba App chat **and** MCP tool access with a single toggle.
See [Publish](/en/pages/basics/publish) for details.
After enabling MCP, you'll be taken to the **MCP → Connect** tab. This page has several important sections:
1. **Your Token** — your workspace authentication token (keep this secret)
2. **1-Click Connect** — click **Connect** to instantly link this flow to Jinba App
3. **Visibility** — defaults to "Unlisted" (only users in your access rules can use it). Change to "Listed" if you want all workspace members to see it
4. **Access Scope Settings** — configure who can access this tool using JWT claims (e.g., email whitelist)
5. **MCP Configuration JSON Snippet** — copy this to use the flow in external MCP clients (Claude Desktop, Cursor, etc.)
You **must** click the **1-Click Connect** button to make the flow available as a tool in Jinba App. Without this step, the tool won't appear in Jinba App even though MCP is enabled.
Add your team members' emails to the **Access Scope Settings** so they can also use this tool. Click **+ Add Rule** to add more email rules.
Open [Jinba App](https://app.jinba.io/) and start a new chat:
1. Click **New Chat**
2. Click the **connectors** icon (⚙️) at the bottom of the chat input
3. In the "Search agents and connectors..." dropdown, find your workspace's **MCP connector** (e.g., "Tutorial Demonstrations MCP ... 1 tool")
4. Click into the MCP connector to see your **RAG Chat Demo** tool listed
5. Select the tool — it appears as a tag in the chat input bar
6. Type your question and press Enter
The tool runs automatically — you'll see the **Arguments** (your `user_question`) and **Result** (the RAG response content) in an expandable section, followed by the AI's formatted answer.
You can also use **Auto Select** mode — Jinba App will automatically choose the right tool based on your question, so you don't need to manually select the connector each time.
See [Jinba Flow Connectors](/en/pages/jinba_app/connectors/jinbaflow) for the full guide.
You can also create a [Jinba App Agent](/en/pages/jinba_app/agents/overview) that bundles this connector with custom instructions.
### Option B: REST API
Expose your RAG flow as an API endpoint for custom applications.
Follow the same publish steps as above, but select **Engineers** in the "Who will trigger this workflow?" dialog instead. This optimizes the flow for API access.
After publishing, navigate to your flow's settings to find the auto-generated API key.
```bash theme={null}
curl -X POST https://api.jinba.dev/api/v2/external/flows/{flow-id}/published-run \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"args": [
{"name": "user_question", "value": "What is your return policy?"}
],
"mode": "sync"
}'
```
**Python example:**
```python theme={null}
import requests
response = requests.post(
"https://api.jinba.dev/api/v2/external/flows/{flow-id}/published-run",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
json={
"args": [
{"name": "user_question", "value": "What is your return policy?"}
],
"mode": "sync"
}
)
answer = response.json()
print(answer)
```
See the full [API reference](/en/pages/basics/api) for async mode, error handling, and more.
### Option C: MCP Tool (AI Assistant Integration)
Make your RAG flow available as a tool for AI assistants like Claude Desktop.
Publish your flow with MCP enabled. Navigate to the **MCP** tab in your workspace settings.
Add the Jinba Flow MCP server to your AI assistant's configuration:
```json theme={null}
{
"mcpServers": {
"jinbaflow": {
"command": "npx",
"args": [
"-y",
"supergateway",
"--streamableHttp",
"https://api.jinba.io/api/v2/workspaces/YOUR_WORKSPACE_ID/mcp",
"--header",
"Authorization: Bearer YOUR_TOKEN"
]
}
}
}
```
See the [MCP guide](/en/pages/basics/mcp) for the full setup process.
Your RAG flow now appears as a tool. The AI assistant can invoke it to answer questions using your knowledge base.
***
## Part 4: Advanced Patterns
### Multi-Step RAG with Query Refinement
For complex questions, add a refinement step that improves search results:
```yaml theme={null}
- id: user_question
name: Receive Question
tool: INPUT_TEXT
input:
- name: value
value: ""
- id: initial_search
name: Initial Search
tool: JINBA_VECTOR_SEARCH
config:
- name: token
value: "{{secrets.JINBAFLOW_WS_API_KEY}}"
input:
- name: query
value: "{{steps.user_question.result}}"
- name: knowledgeBaseId
value: YOUR_KB_ID_HERE
- name: topK
value: 10
needs:
- user_question
- id: refine_query
name: Refine Query
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4o
input:
- name: prompt
value: |
Based on the initial search results, generate a more specific search query.
Original Question: {{steps.user_question.result}}
Initial Results:
{{steps.initial_search.results | dump}}
Generate a refined search query that will find more specific information.
Output ONLY the refined query, nothing else.
needs:
- initial_search
- id: refined_search
name: Refined Search
tool: JINBA_VECTOR_SEARCH
config:
- name: token
value: "{{secrets.JINBAFLOW_WS_API_KEY}}"
input:
- name: query
value: "{{steps.refine_query.result.content}}"
- name: knowledgeBaseId
value: YOUR_KB_ID_HERE
- name: topK
value: 5
- name: threshold
value: 0.4
needs:
- refine_query
- id: final_answer
name: Generate Final Answer
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4o
input:
- name: prompt
value: |
Answer the user's question using the refined search results.
Question: {{steps.user_question.result}}
Refined Search Results:
{{steps.refined_search.results | dump}}
Provide a detailed, accurate answer with source citations.
needs:
- refined_search
- id: output_answer
name: Output Answer
tool: OUTPUT_TEXT
input:
- name: value
value: "{{steps.final_answer.result.content}}"
needs:
- final_answer
```
### Handling No Results Found
Use [conditional execution](/en/pages/basics/step-options) to handle cases where the knowledge base has no relevant content:
```yaml theme={null}
- id: check_results
name: Check Results
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
results = {{steps.search_knowledge.result}}
has_results = len(results.get('results', [])) > 0
print(has_results)
- name: data_type
value: STRING
needs:
- search_knowledge
- id: generate_answer
name: Generate Answer
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4o
input:
- name: prompt
value: |
... standard RAG prompt with context ...
needs:
- check_results
when: "'{{steps.check_results.result}}' == 'True'"
- id: no_results_response
name: No Results Response
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
result = "I couldn't find relevant information in the knowledge base to answer your question. Please try rephrasing your question or contact support for assistance."
- name: data_type
value: STRING
needs:
- check_results
when: "'{{steps.check_results.result}}' == 'False'"
```
### Keeping Your Knowledge Base Updated
Create a scheduled flow that automatically updates your knowledge base with new documents:
```yaml theme={null}
- id: fetch_new_docs
name: fetch_new_docs
tool: PYTHON_SANDBOX_RUN
input:
- name: code
value: |
new_docs = [
"https://example.com/updated-faq.pdf",
"https://example.com/new-product-guide.pdf"
]
result = new_docs
- name: data_type
value: STRING
- id: add_to_kb
name: Add to Knowledge Base
tool: JINBA_KNOWLEDGE_BASE_FILE_ADD
forEach: "{{steps.fetch_new_docs.result}}"
config:
- name: token
value: "{{secrets.JINBAFLOW_WS_API_KEY}}"
input:
- name: knowledgeBaseId
value: YOUR_KB_ID_HERE
- name: file
value: "{{item}}"
- name: executionMode
value: "SYNCHRONOUS"
- name: chunkerSettings
value:
chunkSize: 512
chunkOverlap: 128
```
You can [schedule this flow](/en/pages/basics/scheduling) to run daily or weekly.
***
## Alternative Backends
The primary tutorial uses Jinba Knowledge Base, but two additional backends are available for teams with specific requirements.
### When to Choose Each Backend
```mermaid theme={null}
flowchart TD
Start["Which backend
should I use?"] --> Q1{"Enterprise with
Azure ecosystem?"}
Q1 -->|Yes| Azure["☁️ Azure AI Search
Enterprise"]
Q1 -->|No| Q2{"Need metadata
filtering, namespaces,
or reranking?"}
Q2 -->|Yes| Pinecone["🌲 Pinecone"]
Q2 -->|No| Q3{"Want simplest
possible setup?"}
Q3 -->|Yes| Jinba["⚡ Jinba Knowledge Base"]
Q3 -->|No| Pinecone
```
| Feature | Jinba Knowledge Base | Pinecone | Azure AI Search |
| - | - | - | - |
| **Setup complexity** | ⭐ Simplest | ⭐⭐ Moderate | ⭐⭐⭐ Advanced |
| **External dependency** | None | Pinecone account | Azure subscription |
| **Document upload** | UI + API | API only | Azure portal / ADLS |
| **Metadata filtering** | ❌ | ✅ Rich filter syntax | ✅ OData filters |
| **Namespace isolation** | ❌ | ✅ | ✅ Indexes |
| **Reranking** | ❌ | ✅ Built-in models | ✅ Semantic ranker |
| **Indexer / pipeline** | Automatic | Manual | ✅ Built-in indexers |
| **Cost** | Included in Jinba plan | Separate Pinecone billing | Azure billing |
| **Best for** | Most use cases, quick start | Advanced search requirements | Enterprise / Azure-native organizations |
### Alternative A: Pinecone
If you need metadata filtering, namespace isolation, or reranking, use [Pinecone](/en/pages/tools/search/pinecone) as your vector backend.
#### Pinecone RAG Manifest
Replace the search step with Pinecone:
```yaml theme={null}
- id: search_pinecone
name: Search Pinecone
tool: PINECONE_QUERY
config:
- name: apiKey
value: "{{secrets.PINECONE_API_KEY}}"
input:
- name: indexName
value: my-knowledge-base
- name: query
value: "{{steps.user_question.result}}"
- name: topK
value: 5
- name: includeMetadata
value: true
- name: rerankModel
value: bge-reranker-v2-m3
- name: rerankTopN
value: 3
needs:
- user_question
```
Then adjust the generation step to use Pinecone's output format:
```yaml theme={null}
- id: generate_answer
name: Generate Answer
tool: OPENAI_INVOKE
config:
- name: version
value: gpt-4o
input:
- name: prompt
value: |
You are a helpful assistant. Answer based on the provided context.
## User Question
{{steps.user_question.result}}
## Relevant Documentation
{{steps.search_pinecone.result.matches | dump}}
Answer accurately based on the documentation above.
needs:
- search_pinecone
```
See the full [Pinecone tool reference](/en/pages/tools/search/pinecone) for index creation and document upsert.
### Alternative B: Azure AI Search (Enterprise)
For enterprise organizations already using the Azure ecosystem, Jinba Flow supports **Azure AI Search** as an external knowledge base backend. This option provides advanced indexing, semantic ranking, and integration with Azure Data Lake Storage Gen2.
Azure AI Search integration is an **enterprise feature**. Contact your Jinba administrator or the Jinba sales team to enable this for your workspace.
#### How It Works
Azure AI Search integration operates differently from the built-in knowledge base:
1. **Documents are stored in Azure** — uploaded to Azure Data Lake Storage Gen2
2. **Indexing is handled by Azure** — Azure AI Search indexers process and index documents
3. **Search queries go through Azure** — either directly or via Azure API Management (APIM)
4. **Results flow back to Jinba Flow** — where the LLM generates answers
```mermaid theme={null}
flowchart LR
Upload["📄 Upload Document"] --> ADLS["Azure Data Lake
Storage Gen2"]
ADLS --> Indexer["Azure AI Search
Indexer"]
Indexer --> Index["Azure AI Search
Index"]
Query["🔍 User Query"] --> Index
Index --> Results["📋 Search Results"]
Results --> LLM["🤖 LLM Generation"]
```
#### Setup Overview
In your workspace settings, navigate to the **External Knowledge Base** configuration. You can connect in two modes:
| Mode | When to Use |
| - | - |
| **APIM Mode** | Routes through Azure API Management — recommended for production |
| **Direct Mode** | Connects directly to Azure AI Search — simpler for development |
Ensure you have:
* An Azure AI Search service with an index configured
* Azure Data Lake Storage Gen2 for document storage
* API keys or APIM subscription keys
* An indexer configured to process uploaded documents
Upload documents through the Jinba workspace UI. Files are automatically sent to Azure Data Lake Storage, and the configured indexer processes them into the search index.
The search step uses the External Knowledge Base configuration from your workspace. The exact tool and parameters depend on your enterprise deployment.
#### Key Configuration Options
| Setting | Description |
| - | - |
| **Endpoint URL** | Azure AI Search or APIM endpoint |
| **API Key** | Authentication key |
| **Index API Path** | Path for index operations |
| **Search API Path** | Path for search queries |
| **ADLS API Path** | Path for file storage operations |
| **Indexer Name** | Indexer to trigger after file uploads |
Connection settings can be configured per workspace through the UI, with environment variables as fallbacks.
#### Azure AI Search Advantages
* **Semantic ranking**: Azure's built-in semantic ranker improves result relevance
* **Hybrid search**: Combine vector search with keyword search
* **Built-in indexers**: Automatically extract and index content from various file formats
* **Enterprise compliance**: Data stays within your Azure tenant
* **Azure ecosystem integration**: Works well with other Azure services such as Azure OpenAI
***
## Tuning & Best Practices
### Chunking Configuration
When adding files, tune chunk parameters for your content:
| Content Type | Chunk Size | Overlap | Why |
| - | - | - | - |
| FAQ / Short answers | 256–512 | 64 | Precise, focused retrieval |
| Technical docs | 512–1024 | 128 | Balance precision and context |
| Long-form content | 1024–2048 | 256 | Maintain narrative context |
### Similarity Threshold Guide
| Threshold | Behavior | Use When |
| - | - | - |
| 0.7–1.0 | Very strict, near-exact matches only | Precise factual lookups |
| 0.4–0.7 | High relevance, closely related | Most Q\&A use cases |
| 0.2–0.4 | Moderate, may include tangential results | Exploratory or broad questions |
| 0.0–0.2 | Very broad, many results | Not recommended for production |
### Prompt Engineering Tips
1. **Be explicit about grounding**: Tell the LLM to answer only from the provided context
2. **Request citations**: Ask the LLM to reference source filenames
3. **Handle uncertainty**: Instruct the LLM to say "I don't know" when context is insufficient
4. **Set the tone**: Add persona instructions for your use case (formal, casual, technical)
***
## What's Next?
Deep dive into knowledge base management, chunking, and RAG patterns
Full parameter reference and advanced search examples
External vector database with filtering and reranking
Complete guide to calling flows via REST API
Connect flows to AI assistants via MCP
Wrap your RAG flow in an agent for enhanced chat
# Sandbox Providers
Source: https://carnot.mintlify.app/en/pages/toolbox/advanced/sandbox
Learn about the provider-agnostic sandbox architecture and how to configure E2B and Daytona execution environments
## Overview
Jinba Toolbox executes tool code in **isolated sandbox environments**. The sandbox system is designed around a provider-agnostic architecture: a shared interface package (`@jinba-toolbox/sandbox-core`) defines the contract, and individual provider packages (`sandbox-e2b`, `sandbox-daytona`) implement it.
This separation means you can switch providers or add new ones without modifying any business logic.
## Architecture
```
┌─────────────────────────────────────────────────────────────┐
│ API Server │
│ │
│ Execution Service ──▶ SandboxProvider interface │
│ │
├─────────────────────────────────────────────────────────────┤
│ Provider Implementations │
│ ┌────────────────┐ ┌─────────────────┐ │
│ │ sandbox-e2b │ │ sandbox-daytona │ │
│ │ (E2B Code │ │ (Daytona SDK) │ │
│ │ Interpreter) │ │ │ │
│ └────────────────┘ └─────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ sandbox-core │
│ (Interfaces & Types only) │
└─────────────────────────────────────────────────────────────┘
```
## Core Interface
The `@jinba-toolbox/sandbox-core` package contains only interfaces and types -- no concrete implementations. All providers must conform to these contracts.
### SandboxProvider
The factory that creates and resumes sandbox instances:
```typescript theme={null}
interface SandboxProvider {
/** Create a new sandbox instance */
create(options: SandboxCreateOptions): Promise;
/** Resume an existing sandbox by ID */
resume(sandboxId: string): Promise;
}
```
### SandboxInstance
A running sandbox environment with code execution, shell commands, and filesystem access:
```typescript theme={null}
interface SandboxInstance {
readonly sandboxId: string;
readonly commands: SandboxCommands;
readonly filesystem: SandboxFilesystem;
executeCode(
code: string,
language: SandboxLanguage,
options?: CodeExecutionOptions
): Promise;
kill(): Promise;
pause(): Promise;
getHost(port: number): Promise;
}
```
### SandboxCommands
Shell command execution within the sandbox:
```typescript theme={null}
interface SandboxCommands {
run(
command: string,
options?: SandboxCommandOptions
): Promise;
}
```
### SandboxFilesystem
File operations within the sandbox:
```typescript theme={null}
interface SandboxFilesystem {
read(path: string): Promise;
readBytes(path: string): Promise;
write(path: string, content: string | Uint8Array): Promise;
list(path: string): Promise;
exists(path: string): Promise;
mkdir(path: string): Promise;
remove(path: string): Promise;
}
```
### Key Types
```typescript theme={null}
type SandboxLanguage = "python" | "typescript";
interface SandboxCreateOptions {
language: SandboxLanguage;
packages?: string[]; // Packages to install
envs?: Record; // Environment variables
workingDirectory?: string; // Working directory inside sandbox
timeoutMs?: number; // Timeout in milliseconds
}
interface CodeExecutionResult {
success: boolean;
output?: unknown; // Parsed JSON output if available
stdout: string;
stderr: string;
durationMs: number;
error?: {
name: string;
message: string;
traceback?: string;
};
}
interface SandboxExecutionResult {
exitCode: number;
stdout: string;
stderr: string;
}
```
## E2B Provider
The `@jinba-toolbox/sandbox-e2b` package implements the sandbox interface using the [E2B Code Interpreter](https://e2b.dev) SDK.
### Configuration
```typescript theme={null}
import { createE2BProvider } from "@jinba-toolbox/sandbox-e2b";
const provider = createE2BProvider({
apiKey: process.env.E2B_API_KEY!,
templateId: "custom-template", // Optional custom sandbox template
timeoutMs: 300000, // Default: 5 minutes
});
```
| Option | Type | Default | Description |
| - | - | - | - |
| `apiKey` | `string` | (required) | E2B API key |
| `templateId` | `string` | `undefined` | Custom sandbox template ID |
| `timeoutMs` | `number` | `300000` | Default timeout (5 minutes) |
### How It Works
1. **Sandbox creation**: The provider creates an E2B Code Interpreter sandbox, optionally using a custom template.
2. **Package installation**: If packages are specified, `pip install` (Python) or `npm install` (TypeScript) runs inside the sandbox.
3. **Code execution**: Tool code is executed via E2B's `runCode` API in a Jupyter-like kernel.
4. **Lifecycle**: Sandboxes can be paused, resumed, or terminated.
### TypeScript Note
E2B's Code Interpreter executes TypeScript in a Jupyter kernel that does not support ESM file imports. For this reason, TypeScript tool code is **inlined** rather than loaded from files. Python tools can use filesystem imports normally.
## Daytona Provider
The `@jinba-toolbox/sandbox-daytona` package implements the sandbox interface using the [Daytona](https://daytona.io) SDK.
### Configuration
```typescript theme={null}
import { createDaytonaProvider } from "@jinba-toolbox/sandbox-daytona";
const provider = createDaytonaProvider({
apiKey: process.env.DAYTONA_API_KEY!,
apiUrl: "https://app.daytona.io/api", // Default
target: "us", // Region: "us" or "eu"
timeoutMs: 300000, // Default: 5 minutes
});
```
| Option | Type | Default | Description |
| - | - | - | - |
| `apiKey` | `string` | (required) | Daytona API key |
| `apiUrl` | `string` | `https://app.daytona.io/api` | Daytona API URL |
| `target` | `string` | `us` | Target region (`us` or `eu`) |
| `timeoutMs` | `number` | `300000` | Default timeout (5 minutes) |
### How It Works
1. **Sandbox creation**: The provider initializes the Daytona SDK and creates a sandbox with the specified language.
2. **Package installation**: If packages are specified, the provider runs `pip install` or `npm install` inside the sandbox.
3. **Code execution**: Tool code is executed via Daytona's `process.codeRun` API.
4. **Lifecycle**: Sandboxes can be started, stopped, and deleted.
## ToolSet Sandbox Configuration
When creating a toolset, you specify which sandbox provider and settings to use:
```typescript theme={null}
await client.createToolSet({
slug: "data-tools",
name: { default: "Data Tools" },
description: { default: "Data processing tools" },
sandbox: {
provider: "e2b", // or "daytona"
language: "python", // or "typescript"
packages: [
{ name: "pandas", version: "2.0" },
{ name: "numpy" }
],
resources: {
cpu: "2",
memory: "4Gi",
timeout: 120000
}
}
});
```
The `SandboxConfig` stored on each toolset:
```typescript theme={null}
interface SandboxConfig {
provider: "e2b" | "daytona";
language: "python" | "typescript";
runtime?: string;
packages: { name: string; version?: string }[];
resources: {
cpu?: string;
memory?: string;
timeout?: number;
};
}
```
## Error Handling
All sandbox packages use a unified `SandboxError` type:
```typescript theme={null}
class SandboxError extends Error {
constructor(
message: string,
code: SandboxErrorCode,
cause?: unknown
);
}
type SandboxErrorCode =
| "CONNECTION_FAILED" // Failed to connect to provider
| "TIMEOUT" // Execution timed out
| "NOT_FOUND" // Sandbox not found (resume)
| "EXECUTION_FAILED" // Code execution failed
| "INTERNAL"; // Unexpected internal error
```
## Adding a New Provider
The architecture is designed for extensibility. To add a new sandbox provider:
Create `packages/sandbox-` with the standard package structure.
Implement `create()` and `resume()` methods that return a `SandboxInstance`.
Add the provider case to the API server's `getSandboxProvider` function. No changes to `sandbox-core` or business logic are needed.
## Related
* [REST API](/en/pages/toolbox/developer/api) -- Endpoints for managing toolsets and running tools
* [Versioning & Publishing](/en/pages/toolbox/advanced/versioning) -- How sandbox config is frozen in versions
* [Security & Access Control](/en/pages/toolbox/advanced/security) -- Isolation and tenant boundaries
# Security & Access Control
Source: https://carnot.mintlify.app/en/pages/toolbox/advanced/security
Understand RBAC, authentication methods, and organization-based isolation in Jinba Toolbox
## Overview
Jinba Toolbox implements a multi-layered security model centered on **organization-based isolation**. Every resource -- toolsets, tools, versions, runs, API keys, and webhooks -- belongs to an organization and is protected by role-based access control (RBAC), authenticated sessions or API keys, and database-level tenant isolation.
## Authentication
Jinba Toolbox supports two authentication methods, each designed for a different access pattern:
Used by the admin web console. Powered by **Better Auth** with session cookies.
* Cookie-based session management
* For human users managing toolsets
* Full CRUD access to organization resources
Used by the SDK, AI agents, and external integrations. Passed as a Bearer token.
* `Authorization: Bearer jtb_xxxxxxxxxxxx`
* For automated and programmatic access
* Scoped to a single organization
### API Key Management
API keys are scoped to an organization and track their issuer:
```
Organization
└── API Keys
├── production (issued by: alice) Last used: 2 hours ago
├── development (issued by: bob) Last used: 30 days ago
└── ci-cd (issued by: alice) Last used: never
```
Key properties:
* **No expiration** by default -- keys remain valid until manually deleted.
* **Last-used timestamp** is recorded for each key.
* **Issuer tracking** -- the member who created the key is recorded.
* **Audit logging** -- key creation and deletion events are logged.
If the member who issued a key leaves the organization, the key remains active to avoid breaking integrations. The admin console displays a warning, and an Owner or Admin can take over or regenerate the key.
### API Key Endpoints
| Method | Endpoint | Description |
| - | - | - |
| GET | `/v1/orgs/:orgId/api-keys` | List API keys |
| POST | `/v1/orgs/:orgId/api-keys` | Create API key |
| DELETE | `/v1/orgs/:orgId/api-keys/:keyId` | Delete API key |
## Role-Based Access Control (RBAC)
### Role Hierarchy
Jinba Toolbox defines roles at two levels:
```
Platform Level
└── super_admin # Service-wide administration
Organization Level
├── Owner # Organization owner (one per org)
├── Admin # Organization administrator
└── Member # Regular member
```
### Organization Roles
| Role | Description |
| - | - |
| **Owner** | Full control over the organization, including transfer and deletion. One Owner per organization. |
| **Admin** | Can manage members, billing, and all organization resources. Cannot delete the organization. |
| **Member** | Can create and manage toolsets and tools. Cannot manage other members or billing. |
### Permission Matrix
| Resource | Owner | Admin | Member |
| - | - | - | - |
| Organization settings | CRUD | Read / Update | Read |
| Delete organization | Yes | No | No |
| Member management | CRUD | CRUD | Read |
| Invite members | Yes | Yes | No |
| ToolSet / Tool | CRUD | CRUD | CRUD |
| API keys (own) | CRUD | CRUD | CRUD |
| API keys (others') | CRUD | CRUD | No |
| Purchase credits | Yes | Yes | No |
| View credit balance | Yes | Yes | Read |
| Audit logs | Read | Read | No |
### Role Rules
* Each organization has exactly **one Owner**.
* Ownership can be **transferred** to another member (the original owner becomes Admin).
* Only Owners and Admins can **invite** new members.
* Members can manage their own API keys but cannot see or delete keys created by others.
## Organization-Based Isolation
Every resource in Jinba Toolbox is scoped to an organization. The isolation is enforced at multiple layers:
### Application Layer
The API server validates that the authenticated user or API key belongs to the target organization before processing any request. This ensures that even if a database query is somehow misconfigured, the application layer blocks unauthorized access.
### Database Layer (Row Level Security)
PostgreSQL Row Level Security (RLS) provides an additional layer of tenant isolation at the database level:
```sql theme={null}
ALTER TABLE tool_set ENABLE ROW LEVEL SECURITY;
CREATE POLICY tool_set_tenant_isolation ON tool_set
USING (organization_id = current_setting('app.current_org_id'));
```
**How it works:**
The API server authenticates the request and determines the organization ID.
Before executing any queries, the server sets the PostgreSQL session variable:
```sql theme={null}
SET app.current_org_id = :orgId
```
PostgreSQL automatically filters all query results to only include rows belonging to the current organization.
**Tables protected by RLS:**
* `tool_set`
* `tool`
* `tool_set_version`
* `run`
* `apikey`
* `webhook`
* `audit_log`
This multi-layer approach (application + database) provides **defense in depth** -- even if a bug bypasses the application checks, the database itself prevents cross-tenant data access.
## Audit Logging
Significant actions within an organization are recorded in an audit log:
| Category | Events |
| - | - |
| API Key | Created, deleted |
| Member | Added, removed, role changed |
| ToolSet | Published, published version changed |
| Settings | Organization settings changed, webhook configuration changed |
Tool executions are tracked separately in the `runs` table with full input/output logging.
### Audit Log Data Model
```typescript theme={null}
interface AuditLog {
id: string;
orgId: string;
userId: string; // Who performed the action
action: string; // e.g., "member.added"
targetType: string; // e.g., "member"
targetId: string; // ID of the affected resource
details: object; // Change details
ipAddress: string;
createdAt: Date;
}
```
### Viewing Audit Logs
Audit logs are available to **Owner** and **Admin** roles in the web console at `/org/:orgId/settings/audit-log`. Logs are retained **indefinitely**.
## Sandbox Isolation
Tool execution occurs in isolated sandbox environments (E2B or Daytona). Each execution runs in a fresh or resumed sandbox instance with:
* **Process isolation** -- each sandbox is a separate container or VM.
* **Network isolation** -- sandboxes cannot access the API server's internal network.
* **Configurable environment variables** -- secrets are injected per toolset, not shared across toolsets.
* **Automatic cleanup** -- sandboxes are terminated after execution completes or times out.
## Best Practices
* **Use separate API keys** for different environments (production, staging, CI/CD) to limit blast radius if a key is compromised.
* **Audit API key usage** -- review the last-used timestamp regularly and delete keys that are no longer needed.
* **Assign the least-privilege role** -- use Member for developers who only need to create and edit tools.
* **Review audit logs** periodically to detect unexpected access patterns.
* **Do not share API keys** between organizations -- each key is scoped to a single organization.
## Related
* [REST API](/en/pages/toolbox/developer/api) -- Authentication details and endpoint reference
* [Webhooks](/en/pages/toolbox/developer/webhooks) -- Event notification security (signature verification)
* [Sandbox Providers](/en/pages/toolbox/advanced/sandbox) -- Execution environment isolation
# Versioning & Publishing
Source: https://carnot.mintlify.app/en/pages/toolbox/advanced/versioning
Understand how Jinba Toolbox manages immutable toolset versions with semantic versioning
## Overview
Jinba Toolbox uses a **semver-based versioning system** with immutable snapshots. Each toolset maintains a draft (the editable working copy) and a list of published versions. When you publish, a complete snapshot of the toolset -- including all tool code, schemas, and sandbox configuration -- is frozen as an immutable version that can never be modified.
This design ensures **reproducibility**: running version `1.0.0` always executes the same code, regardless of when or where it is called.
## Concepts
### Draft vs. Versions
```
ToolSet
├── Draft (editable working copy)
└── Versions (immutable releases)
├── v1.2.0 [published]
├── v1.1.0
└── v1.0.0
```
| State | Description |
| - | - |
| **Draft** | The editable working copy. Modified through the web UI or API. Can only be executed via the `test` endpoint. |
| **Version** | An immutable release. Once published, it cannot be changed. Used by the `run` endpoint. |
| **Published** | The currently active version served by the API. One published version per toolset at a time. |
### Immutable Snapshots
Each version captures a complete snapshot of the toolset at the time of publishing:
* All tool code and entrypoints
* Input and output schemas
* Tool names and descriptions
* Sandbox configuration (provider, language, packages, resources)
This means even if you later update the draft, existing versions remain unchanged.
## Publishing Workflow
Make changes to tools in the draft through the web console or the API. Use the test endpoint to verify behavior:
```bash theme={null}
curl -X POST https://toolbox-api.jinba.dev/v1/orgs/{orgId}/toolsets/slack-tools/tools/post-message/test \
-H "Authorization: Bearer jtb_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{ "input": { "channel": "#test", "text": "Testing..." } }'
```
When the draft is ready, publish it with a semver version number and optional release notes:
```bash theme={null}
curl -X POST https://toolbox-api.jinba.dev/v1/orgs/{orgId}/toolsets/slack-tools/versions \
-H "Authorization: Bearer jtb_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"version": "1.3.0",
"releaseNotes": "Added thread reply support"
}'
```
Or using the SDK:
```typescript theme={null}
const version = await client.publishVersion("slack-tools", {
version: "1.3.0",
releaseNotes: "Added thread reply support",
});
```
Choose which version the API should serve. Newly published versions do not automatically become the active version -- you must explicitly set it:
```bash theme={null}
curl -X PUT https://toolbox-api.jinba.dev/v1/orgs/{orgId}/toolsets/slack-tools/published-version \
-H "Authorization: Bearer jtb_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{ "version": "1.3.0" }'
```
The change takes effect immediately.
The draft remains intact after publishing, so you can keep iterating on the next version without affecting the live published version.
## Version Resolution
When a tool is executed via the `run` endpoint, Jinba Toolbox resolves which version to use:
1. If the request body includes a `version` field, that exact version is used.
2. Otherwise, the currently published (active) version is used.
```bash theme={null}
# Uses the published version
curl -X POST .../tools/post-message/run \
-d '{ "input": { "channel": "#general", "text": "Hello" } }'
# Uses a specific version
curl -X POST .../tools/post-message/run \
-d '{ "input": { "channel": "#general", "text": "Hello" }, "version": "1.2.0" }'
```
## Rollback
Rolling back is simply a matter of changing the published version to a previous one:
```bash theme={null}
# Switch back to v1.2.0
curl -X PUT https://toolbox-api.jinba.dev/v1/orgs/{orgId}/toolsets/slack-tools/published-version \
-H "Authorization: Bearer jtb_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{ "version": "1.2.0" }'
```
Because versions are immutable, no data is lost during a rollback. The newer version remains available and can be re-activated at any time.
## Version API
| Method | Endpoint | Description |
| - | - | - |
| GET | `/v1/orgs/:orgId/toolsets/:slug/versions` | List all versions |
| POST | `/v1/orgs/:orgId/toolsets/:slug/versions` | Publish a new version |
| GET | `/v1/orgs/:orgId/toolsets/:slug/versions/:version` | Get version details |
| PUT | `/v1/orgs/:orgId/toolsets/:slug/published-version` | Set the active published version |
## Version Data Model
Each published version stores a full snapshot:
```typescript theme={null}
interface ToolSetVersion {
id: string;
toolSetId: string;
version: string; // Semver string (e.g., "1.3.0")
sandbox: SandboxConfig; // Frozen sandbox configuration
tools: ToolSnapshot[]; // Frozen tool definitions and code
releaseNotes?: string | null;
publishedBy: string; // User ID of the publisher
publishedAt: string; // ISO 8601 timestamp
}
interface ToolSnapshot {
id: string;
slug: string;
name: LocalizedText;
description: LocalizedText;
inputSchema: JSONSchema;
outputSchema: JSONSchema;
code: string;
entrypoint?: string;
}
```
## Usage Tracking
Jinba Toolbox tracks API call counts per version. You can view usage statistics in the web console or retrieve run history through the API:
```typescript theme={null}
const runs = await client.listRuns();
// Filter by version in your application logic
```
Usage data helps you determine when it is safe to deprecate older versions.
## Best Practices
* **Follow semantic versioning** -- use major bumps for breaking schema changes, minor bumps for new tools or features, and patch bumps for fixes.
* **Write release notes** -- they help your team understand what changed between versions.
* **Test before publishing** -- use the `test` endpoint to validate the draft before creating an immutable version.
* **Do not skip the publish step for MCP** -- MCP endpoints serve the published version, not the draft.
* **Monitor per-version usage** -- before deprecating a version, verify that no consumers still depend on it.
## Related
* [REST API](/en/pages/toolbox/developer/api) -- Full endpoint reference including version routes
* [SDK](/en/pages/toolbox/developer/sdk) -- Programmatic version management
* [Security & Access Control](/en/pages/toolbox/advanced/security) -- Who can publish versions
# MCP Integration
Source: https://carnot.mintlify.app/en/pages/toolbox/developer/mcp
Connect AI agents to Jinba Toolbox via the Model Context Protocol (MCP)
## Overview
Jinba Toolbox provides native **Model Context Protocol (MCP)** endpoints that expose your toolsets as MCP-compatible servers. This allows AI agents and LLM-based applications -- such as Claude Desktop, Cursor, and custom agent frameworks -- to discover and execute your tools through a standardized JSON-RPC interface.
Each MCP-enabled toolset becomes an MCP server. The endpoint accepts JSON-RPC requests conforming to the MCP specification and returns tool definitions, executes tools, and streams results.
## MCP Endpoints
Jinba Toolbox offers two types of MCP endpoints:
For internal use within your organization. Requires organization-scoped API key authentication.
```
POST /v1/orgs/:orgId/toolsets/:slug/mcp
```
For external consumers accessing public toolsets. Requires an API key for usage tracking and rate limiting.
```
POST /v1/public/:orgSlug/:toolsetSlug/mcp
```
## Enabling MCP for a ToolSet
MCP must be enabled on a per-toolset basis. You can toggle it in the web console or through the API:
```bash theme={null}
curl -X PATCH https://toolbox-api.jinba.dev/v1/orgs/{orgId}/toolsets/slack-tools \
-H "Authorization: Bearer jtb_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{ "mcpEnabled": true }'
```
Or via the SDK:
```typescript theme={null}
await client.updateToolSet("slack-tools", { mcpEnabled: true });
```
## Connecting AI Agents
### Claude Desktop
Add a Jinba Toolbox MCP server to your Claude Desktop configuration file (`claude_desktop_config.json`):
```json theme={null}
{
"mcpServers": {
"slack-tools": {
"url": "https://toolbox-api.jinba.dev/v1/public/my-org/slack-tools/mcp",
"headers": {
"Authorization": "Bearer jtb_xxxxxxxxxxxx"
}
}
}
}
```
### Cursor
In Cursor's MCP settings, add a new server using the streamable HTTP transport:
```json theme={null}
{
"mcpServers": {
"slack-tools": {
"url": "https://toolbox-api.jinba.dev/v1/public/my-org/slack-tools/mcp",
"headers": {
"Authorization": "Bearer jtb_xxxxxxxxxxxx"
}
}
}
}
```
### Custom Agent Integration
If you are building a custom agent, connect to the MCP endpoint using any MCP-compatible client library. The endpoint supports JSON-RPC over HTTP.
**Example using the MCP TypeScript SDK:**
```typescript theme={null}
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
const transport = new StreamableHTTPClientTransport(
new URL("https://toolbox-api.jinba.dev/v1/public/my-org/slack-tools/mcp"),
{
requestInit: {
headers: {
Authorization: "Bearer jtb_xxxxxxxxxxxx",
},
},
}
);
const client = new Client({ name: "my-agent", version: "1.0.0" });
await client.connect(transport);
// List available tools
const { tools } = await client.listTools();
console.log(tools);
// Call a tool
const result = await client.callTool({
name: "post-message",
arguments: {
channel: "#general",
text: "Hello from my AI agent!",
},
});
console.log(result);
```
## How It Works
The agent sends a `tools/list` JSON-RPC request to the MCP endpoint. Jinba Toolbox responds with the list of tools in the toolset, including their names, descriptions, and input schemas.
When the agent needs to use a tool, it sends a `tools/call` request with the tool name and arguments. The request is validated against the tool's input schema.
Jinba Toolbox executes the tool code in an isolated sandbox environment (E2B or Daytona). The published version of the tool is used.
The execution result -- including output, logs, and any errors -- is returned to the agent through the MCP response.
## Organization vs. Public Endpoints
| Aspect | Organization Endpoint | Public Endpoint |
| - | - | - |
| URL pattern | `/v1/orgs/:orgId/toolsets/:slug/mcp` | `/v1/public/:orgSlug/:toolsetSlug/mcp` |
| Authentication | Org-scoped API key | API key |
| Access scope | Private and public toolsets | Public toolsets only |
| Use case | Internal agents, CI/CD | External consumers, shared agents |
## Authentication
Both MCP endpoints require a Bearer token in the `Authorization` header:
```
Authorization: Bearer jtb_xxxxxxxxxxxx
```
The API key determines:
* Which organization the request is associated with
* Usage tracking and credit consumption
* Rate limiting
## Best Practices
* **Enable MCP selectively** -- only activate MCP on toolsets that you intend to expose to AI agents.
* **Use the public endpoint** for external integrations and the organization endpoint for internal workflows.
* **Monitor usage** through the run history API to track which tools agents are calling and how frequently.
* **Publish a version** before exposing a toolset via MCP -- the endpoint executes the published version, not the draft.
* **Provide clear tool descriptions** -- AI agents rely on tool names and descriptions to decide which tool to invoke.
## Related
* [REST API](/en/pages/toolbox/developer/api) -- Full endpoint reference
* [SDK](/en/pages/toolbox/developer/sdk) -- Programmatic access via the TypeScript SDK
* [Versioning & Publishing](/en/pages/toolbox/advanced/versioning) -- How published versions are resolved
# SDK
Source: https://carnot.mintlify.app/en/pages/toolbox/developer/sdk
Use the @jinba-toolbox/sdk package to interact with Jinba Toolbox from TypeScript and JavaScript applications
## Overview
The `@jinba-toolbox/sdk` package provides a type-safe client library for consuming tools registered in Jinba Toolbox. It wraps the REST API with convenient methods for listing toolsets, executing tools, managing versions, and retrieving run history.
**Target consumers:**
* AI agents executing tools
* CLI tools for automation
* Third-party applications integrating with Jinba Toolbox
* Developers building on Jinba Toolbox
## Installation
```bash theme={null}
# npm
npm install @jinba-toolbox/sdk
# pnpm
pnpm add @jinba-toolbox/sdk
# yarn
yarn add @jinba-toolbox/sdk
```
## Quick Start
```typescript theme={null}
import { createClient } from "@jinba-toolbox/sdk";
const client = createClient({
apiKey: process.env.JINBA_TB_API_KEY!,
organizationId: "org-id", // optional default
});
```
```typescript theme={null}
const toolSets = await client.listToolSets();
console.log(toolSets);
```
```typescript theme={null}
const result = await client.run("slack-tools", "post-message", {
channel: "#general",
text: "Hello from Jinba Toolbox!",
});
console.log(result.output);
// { ts: "1234567890.123456", channel: "C01234567" }
```
## Client Configuration
The `createClient` function accepts a `JinbaTBClientConfig` object:
```typescript theme={null}
interface JinbaTBClientConfig {
/** API base URL (default: https://toolbox-api.jinba.dev) */
baseUrl?: string;
/** API key for authentication */
apiKey: string;
/** Default organization ID (optional, can be overridden per request) */
organizationId?: string;
/** Request timeout in milliseconds (default: 30000) */
timeout?: number;
}
```
**Example** with all options:
```typescript theme={null}
const client = createClient({
baseUrl: "https://toolbox-api.jinba.dev",
apiKey: "jtb_xxxxxxxxxxxx",
organizationId: "org_abc123",
timeout: 60000,
});
```
If you set `organizationId` in the constructor, you can omit it from individual method calls. Every method also accepts an optional `orgId` parameter to override the default.
## API Reference
### Organizations
```typescript theme={null}
// List organizations the authenticated user belongs to
const orgs = await client.listOrganizations();
// Returns: OrganizationWithRole[]
// Get organization details
const org = await client.getOrganization("org-id");
// Returns: Organization
```
### ToolSets
```typescript theme={null}
// List toolsets in an organization
const toolSets = await client.listToolSets();
// Returns: ToolSet[]
// Get a toolset by slug (includes tools)
const toolSet = await client.getToolSet("slack-tools");
// Returns: ToolSet & { tools: Tool[] }
// Create a new toolset
const newToolSet = await client.createToolSet({
slug: "slack-tools",
name: { default: "Slack Tools" },
description: { default: "Slack integration tools" },
sandbox: {
provider: "e2b",
language: "typescript",
packages: [{ name: "@slack/web-api" }],
resources: { timeout: 60000 },
},
visibility: "private",
tags: ["slack"],
});
// Update a toolset
await client.updateToolSet("slack-tools", {
visibility: "public",
tags: ["slack", "messaging"],
});
// Delete a toolset
await client.deleteToolSet("slack-tools");
```
### Tools
```typescript theme={null}
// List tools in a toolset
const tools = await client.listTools("slack-tools");
// Returns: Tool[]
// Get a tool by slug
const tool = await client.getTool("slack-tools", "post-message");
// Returns: Tool
// Create a new tool
const newTool = await client.createTool("slack-tools", {
slug: "post-message",
name: { default: "Post Message" },
description: { default: "Post a message to a Slack channel" },
inputSchema: {
type: "object",
properties: {
channel: { type: "string", description: "Channel name or ID" },
text: { type: "string", description: "Message text" },
},
required: ["channel", "text"],
},
outputSchema: {
type: "object",
properties: {
ts: { type: "string" },
channel: { type: "string" },
},
},
code: `// tool implementation code`,
});
// Update a tool
await client.updateTool("slack-tools", "post-message", {
description: { default: "Post a message to any Slack channel" },
});
// Delete a tool
await client.deleteTool("slack-tools", "post-message");
```
### Execution
```typescript theme={null}
// Execute a published tool
const result = await client.run("slack-tools", "post-message", {
channel: "#general",
text: "Hello!",
});
// Returns: RunResult
console.log(result.success); // true
console.log(result.output); // { ts: "...", channel: "..." }
console.log(result.durationMs); // 1234
// Execute a specific version
const result = await client.run(
"slack-tools",
"post-message",
{ channel: "#general", text: "Hello!" },
{ version: "1.2.0" }
);
// Test a tool (runs draft code, no published version required)
const testResult = await client.test("slack-tools", "post-message", {
channel: "#test",
text: "Testing...",
});
```
### Versions
```typescript theme={null}
// List versions of a toolset
const versions = await client.listVersions("slack-tools");
// Returns: ToolSetVersion[]
// Publish a new version
const version = await client.publishVersion("slack-tools", {
version: "1.3.0",
releaseNotes: "Added thread reply support",
});
// Returns: ToolSetVersion
```
### Run History
```typescript theme={null}
// List runs in an organization
const runs = await client.listRuns();
// Returns: Run[]
// Get run details
const run = await client.getRun("run_abc123");
// Returns: Run
```
## Key Types
### RunResult
The object returned from `run()` and `test()`:
```typescript theme={null}
interface RunResult {
runId: string;
version: string;
success: boolean;
output?: Record;
error?: { name: string; message: string; traceback?: string };
logs?: { stdout: string[]; stderr: string[] };
durationMs?: number;
}
```
### ToolSet
```typescript theme={null}
interface ToolSet {
id: string;
organizationId: string;
slug: string;
name: LocalizedText;
description: LocalizedText;
sandbox: SandboxConfig;
visibility: "public" | "private" | "restricted";
mcpEnabled: boolean;
tags: string[];
latestVersion?: string | null;
publishedVersion?: string | null;
createdAt: string;
updatedAt: string;
}
```
### Tool
```typescript theme={null}
interface Tool {
id: string;
toolSetId: string;
slug: string;
name: LocalizedText;
description: LocalizedText;
inputSchema: JSONSchema;
outputSchema: JSONSchema;
code: string;
entrypoint?: string | null;
createdAt: string;
updatedAt: string;
}
```
## Error Handling
The SDK throws `JinbaTBError` for non-2xx responses:
```typescript theme={null}
import { JinbaTBError } from "@jinba-toolbox/sdk";
try {
const result = await client.run("my-toolset", "my-tool", { input: "data" });
} catch (error) {
if (error instanceof JinbaTBError) {
console.error(`Status: ${error.statusCode}`);
console.error(`Message: ${error.message}`);
console.error(`Details: ${JSON.stringify(error.details)}`);
}
}
```
A 408 status code is thrown when a request exceeds the configured timeout.
## Best Practices
* **Set a default `organizationId`** in the constructor to avoid passing it to every method.
* **Use environment variables** for the API key -- never hard-code credentials.
* **Handle `JinbaTBError`** to distinguish between client errors (4xx) and server errors (5xx).
* **Increase `timeout`** for tool executions that run complex sandbox workloads.
* **Pin a version** when calling `run()` if your application depends on deterministic behavior.
## Related
* [REST API](/en/pages/toolbox/developer/api) -- Full endpoint reference
* [MCP Integration](/en/pages/toolbox/developer/mcp) -- Use toolsets as MCP servers for AI agents
* [Versioning & Publishing](/en/pages/toolbox/advanced/versioning) -- Understand the version lifecycle
# Webhooks
Source: https://carnot.mintlify.app/en/pages/toolbox/developer/webhooks
Receive real-time event notifications from Jinba Toolbox via webhooks
## Overview
Webhooks allow you to receive HTTP notifications whenever significant events occur in your organization. Instead of polling the API, you register a URL and Jinba Toolbox pushes event payloads to it in real time.
Webhooks are configured **per organization** and can subscribe to one or more event types.
## Event Types
| Event | Description |
| - | - |
| `tool.run.completed` | A tool execution finished successfully |
| `tool.run.failed` | A tool execution failed |
| `toolset.published` | A new toolset version was published |
| `member.added` | A new member was added to the organization |
| `member.removed` | A member was removed from the organization |
## Setting Up Webhooks
Set up an HTTP endpoint on your server that can receive POST requests. The endpoint must return a `2xx` status code to acknowledge receipt.
Use the API or the web console to register your endpoint URL and select the events you want to subscribe to.
```bash theme={null}
curl -X POST https://toolbox-api.jinba.dev/v1/orgs/{orgId}/webhooks \
-H "Authorization: Bearer jtb_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/webhooks/jinba",
"events": ["tool.run.completed", "tool.run.failed"]
}'
```
When you create a webhook, a signing secret is generated. Store it securely -- you will use it to verify incoming payloads.
Verify your endpoint is working by sending a test event:
```bash theme={null}
curl -X POST https://toolbox-api.jinba.dev/v1/orgs/{orgId}/webhooks/{webhookId}/test \
-H "Authorization: Bearer jtb_xxxxxxxxxxxx"
```
## Webhook Configuration
Each webhook has the following properties:
```typescript theme={null}
interface Webhook {
id: string;
orgId: string;
url: string; // Destination URL
events: string[]; // Subscribed event types
secret: string; // HMAC signing secret
enabled: boolean; // Whether the webhook is active
createdAt: Date;
}
```
## Payload Format
Every webhook delivery sends a JSON payload with the following structure:
```json theme={null}
{
"event": "tool.run.completed",
"timestamp": "2026-02-01T12:00:00Z",
"data": {
"runId": "run_abc123",
"toolSetSlug": "slack-tools",
"toolSlug": "post-message",
"status": "success",
"durationMs": 1234
}
}
```
### Event-Specific Payloads
**`tool.run.completed`**
```json theme={null}
{
"event": "tool.run.completed",
"timestamp": "2026-02-01T12:00:00Z",
"data": {
"runId": "run_abc123",
"toolSetSlug": "slack-tools",
"toolSlug": "post-message",
"status": "success",
"durationMs": 1234
}
}
```
**`tool.run.failed`**
```json theme={null}
{
"event": "tool.run.failed",
"timestamp": "2026-02-01T12:05:00Z",
"data": {
"runId": "run_def456",
"toolSetSlug": "slack-tools",
"toolSlug": "post-message",
"status": "failed",
"error": {
"name": "SlackAPIError",
"message": "channel_not_found"
},
"durationMs": 567
}
}
```
**`toolset.published`**
```json theme={null}
{
"event": "toolset.published",
"timestamp": "2026-02-01T10:00:00Z",
"data": {
"toolSetSlug": "slack-tools",
"version": "1.3.0",
"publishedBy": "user_abc123",
"releaseNotes": "Added thread reply support"
}
}
```
**`member.added`**
```json theme={null}
{
"event": "member.added",
"timestamp": "2026-02-01T09:00:00Z",
"data": {
"userId": "user_xyz789",
"email": "newmember@example.com",
"role": "member"
}
}
```
## Signature Verification
Every webhook request includes an `X-Webhook-Signature` header containing an HMAC-SHA256 signature of the request body, computed with your webhook's signing secret.
```
X-Webhook-Signature: sha256=a1b2c3d4e5f6...
```
**Verify the signature** on your server to ensure payloads have not been tampered with:
```typescript theme={null}
import { createHmac, timingSafeEqual } from "node:crypto";
function verifyWebhookSignature(
payload: string,
signature: string,
secret: string
): boolean {
const expected = "sha256=" + createHmac("sha256", secret)
.update(payload)
.digest("hex");
return timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
// In your request handler
const isValid = verifyWebhookSignature(
requestBody,
request.headers["x-webhook-signature"],
process.env.WEBHOOK_SECRET!
);
if (!isValid) {
return new Response("Invalid signature", { status: 401 });
}
```
## Webhook Management API
| Method | Endpoint | Description |
| - | - | - |
| GET | `/v1/orgs/:orgId/webhooks` | List webhooks |
| POST | `/v1/orgs/:orgId/webhooks` | Create webhook |
| PATCH | `/v1/orgs/:orgId/webhooks/:id` | Update webhook |
| DELETE | `/v1/orgs/:orgId/webhooks/:id` | Delete webhook |
| POST | `/v1/orgs/:orgId/webhooks/:id/test` | Send test event |
## Retry Behavior
If your endpoint does not return a `2xx` status code, Jinba Toolbox retries the delivery:
| Attempt | Delay |
| - | - |
| 1st retry | 1 minute |
| 2nd retry | 5 minutes |
| 3rd retry | 30 minutes |
After 3 consecutive failures, the webhook is automatically **disabled**. You can re-enable it manually from the web console or via the API once the underlying issue is resolved.
## Best Practices
* **Always verify the signature** before processing a payload to prevent tampering.
* **Return a `200` status quickly** -- perform any heavy processing asynchronously after acknowledging the webhook.
* **Use idempotent processing** -- webhook deliveries may arrive more than once due to retries. Use the `runId` or event timestamp to deduplicate.
* **Monitor webhook health** -- re-enable disabled webhooks promptly and investigate delivery failures.
* **Subscribe only to needed events** -- reduce noise by selecting only the events your integration requires.
## Related
* [REST API](/en/pages/toolbox/developer/api) -- Full endpoint reference
* [Security & Access Control](/en/pages/toolbox/advanced/security) -- Authentication and authorization details