Search
Ctrl+K
On this page
With AI becoming increasingly cheap and useful, Shuffle provides an AI framework built from the ground up to be controllable and transparent. Whether you are generating workflows, running investigations, or connecting your private tools to ChatGPT and Claude via the Model Context Protocol (MCP), Shuffle gives you full control over your models, prompts, data residency, and execution boundaries.
Shuffle's AI buildout is primarily based on LLMs, and all LLM-related functionality passes through the RunAiQuery() function, which you can look into here.
These two subjects are often spoken about interchangeably, but the reality is that they differ by quite a bit. Short breakdown:
Shuffle offers a unified interface for language models across cloud, hybrid, and fully air-gapped environments. You can leverage managed AI credits out of the box or connect to your own models with zero container restarts.
In Shuffle Cloud, LLM interactions, Agent reasoning loops, and workflow AI actions are powered by built-in Shuffle AI credits.
SHUFFLE_GCE_LOCATION (e.g. EU or US regional boundaries). This ensures full compliance with strict data residency requirements.POST /api/v1/chat/completions.For on-premises and private cloud installations, Shuffle provides two distinct architectural deployment models depending on whether you choose to run local GPU infrastructure:
Option A: Cloud Sync (Zero-GPU Infrastructure)
/admin -> Cloud Sync and enter your Shuffler.io API key.https://shuffler.io/api/v1.Option B: Air-Gapped Local Model (100% Isolated)
Shuffle enables tenants to configure or switch their active LLM provider directly through the user interface without editing configuration files or restarting backend containers:
/agents or click the interactive button above.http://localhost:11434/v1), LM Studio (http://localhost:1234/v1), or Custom OpenAI-compatible endpoints.http://localhost:11434/v1 for local Ollama, or your internal reverse proxy URL).llama3.3, qwen3, deepseek-r1) or type a custom model identifier.Agents in Shuffle are autonomous, goal-oriented systems that interact with the world using tools (playbooks, MCP apps, and custom scripts) to achieve specific operational outcomes.
When you open /agents (or open an agent drawer on an alert or incident), you get a prompt box with a few buttons around it. Here is what they actually do:
| Button | Where it is | What it does | Example |
|---|---|---|---|
| Skill | Floating chip above the prompt | Loads a pre-tuned system prompt and locks in the right tools for a discipline (like incident triage). | Pick Incident Response to triage an observable with shuffle_incidents. |
| Tools | Bottom toolbar (+ Tools & chips) | Picks which apps the agent can call. Stops it from calling tools you do not want it to touch. | Pick virustotal and jira so it can only look up IPs and open tickets. |
| LLM | Bottom toolbar (provider name) | Switches between Shuffle AI cloud credits, your own API key, or a local model (Ollama / LM Studio). | Switch to on-prem Ollama llama3.3 if alert data cannot leave your network. |
| Attachments | Paperclip | Attach up to 3 images or screenshots for vision models. | Paste an alert screenshot or network map to extract IOCs. |
| Schedule | Calendar button | Runs the prompt on a recurring cron, or auto-detects a schedule from your text. | Type check threat feed every day at 8am and click Save schedule. |
| Run / Stop | Right-hand button | Starts the run, or stops an agent mid-way through if it is going down the wrong path. | Stop an agent if it starts investigating an irrelevant IP. |
Pick a discipline (like Incident Response, Build Workflow, Computer Use, or Vulnerability Management):
shuffle_incidents for incident response) so they cannot be removed by accident.By default, the agent only gets the tools you attach to the prompt. This keeps context small, saves tokens, and stops the model from calling things you did not want it to touch (like firing off Slack messages or updating tickets when you only asked it to check VirusTotal).
+ Tools to pick any app in your catalog.You can switch the model running your agent at any time:
http://localhost:11434/v1) or LM Studio instance. Essential if alert data or customer PII cannot leave your network.Click the paperclip, drag and drop files into the prompt box, or paste a screenshot from your clipboard (up to 3 images):
If you want an agent prompt to run repeatedly instead of just once (like checking a threat feed every morning or cleaning up stale tickets every hour):
run every 15 minutes or check threat feed every day at 8am, Shuffle spots the schedule in your text, highlights the schedule button, and pre-fills the cron for you.Every 15 min, Hourly, Daily 9am, Weekdays 9am, etc.) or write your own cron expression (0 9 * * 1-5).workflow_type: "AGENT_SCHEDULE") with a Schedule trigger wired directly into an AI Agent node with your prompt, LLM, and tools, and registers it with the scheduler engine./agents page, open the workflow dropdown in the activity feed. Pick your scheduled workflow to see past runs, click Edit to tweak the prompt or tools, or click Stop to turn it off.When you run an agent in Shuffle (from /agents, inside a workflow node, or via the API), it executes an autonomous decision loop implemented in Shuffle's open source execution engine (HandleAiAgentExecutionStart).
AgentDecision). Each decision encapsulates:
tool: The app to call (e.g. virustotal, jira, slack).action: The exact action within that app (e.g. get_ip_report, create_ticket).fields: Key-value parameters passed to the action.confidence: Confidence score (0.0 to 1.0) for the selected action.reason: A concise natural language explanation of why this step was selected.approval_required: Flags whether human authorization is required before execution.data_filter: Field-level extraction rules to keep context windows compact and cost-effective.execution_mode: "direct") or normalized through Schemaless (execution_mode: "singul"). The core execution structures are defined in shuffle-shared.finish decision and renders the final summary.ask decision and pauses in WAITING status.approval_required: true, the run pauses until confirmed by an operator.Under the hood, every step the agent plans follows this JSON schema:
{
"i": 0,
"tool": "virustotal",
"action": "get_ip_report",
"fields": [
{"key": "ip", "value": "1.1.1.1"}
],
"reason": "Check reputation of the suspicious IP extracted from the alert",
"confidence": 0.95,
"approval_required": false,
"data_filter": "last_analysis_stats"
}
Shuffle includes a persistent, context-aware Ask AI assistant available across every view in the platform (including Incidents, Workflows, Apps, and Documentation).
shuffle_incidents when investigating a case, shuffle_workflows_builder when designing automations).Agent Skills are specialized capability bundles that combine specific tools, prompt seeds, and domain-tailored reasoning strategies.
Shuffle provides built-in predefined skills out of the box:
build-workflows):
shuffle_workflows_builder, shuffle_apps.incident-response):
shuffle_incidents.host-monitor-control):
shuffle_host_monitors.vulnerability):
shuffle_vulnerabilities, shuffle_software_and_packages.support): Navigates platform settings, runs connectivity diagnostics, and answers operational questions.detection): Drafts and tunes Sigma detection rules and pipelines to minimize false positives.handle-notifications): Automates incoming incident triage, enrichment, and rule-based escalation.In Shuffle, every app is an MCP tool. This architecture makes creating custom skills straightforward:
/agents, invoked automatically via incoming webhooks, or scheduled to run as background monitors.Control and transparency are the foundational pillars of Shuffle's AI architecture. In security operations and enterprise automation, opaque black-box AI is unacceptable. Analysts and engineers must know exactly what prompt was sent to the model, which tool schemas were injected, how the model reasoned through intermediate steps, and the unedited response payload returned by the provider.
Shuffle records every single interaction with LLMs (whether cloud-hosted Gemini, OpenAI, Anthropic, or local inference engines like Ollama and vLLM) directly on the execution record under llm_requests and llm_responses.
In the web interface at /agents (and in the interactive panel above), Shuffle displays the AI Executions activity feed. This view aggregates all past and ongoing agent tasks across your tenant.
Every execution row displays a badge indicating where the run originated:
| Source | Trigger Origin | Description |
|---|---|---|
Manual | /agents UI | Operator triggered the run directly from the prompt composer. |
Workflow | Workflow Canvas | An AI Agent workflow node executed the run as part of an automated playbook (execution_mode: "direct" or "singul"). |
Datastore automation | Datastore / Enrichments | Fired automatically by datastore triggers (e.g. new incident alert enrichment in shuffle-security_incidents). |
Schedule | Scheduled Trigger | Cron-based background agent monitoring or recurring threat hunts. |
Webhook | Inbound HTTP | Triggered by an external webhook or third-party alert ingestion. |
Form | Interactive Form | Triggered by a user form submission. |
Agent executions progress through well-defined operational statuses:
RUNNING / EXECUTING: The agent is actively planning, querying LLMs, or executing tool actions.SUCCESS / FINISHED: The agent completed its objective, emitted a final summary, and closed the run.FAILED: Execution stopped due to an unrecoverable error (e.g. tool API failure or script error).ABORTED: Run was manually stopped by an operator clicking the cancel button.WAITING: The run is paused waiting for operator input (e.g. clarifying questions or human approval for sensitive actions).LIMIT_REACHED: Synthetic status surfaced when the run terminated because an AI token or iteration ceiling was reached.Clicking on any execution row opens the slide-out Agent Execution Drawer (AgentExecutionDrawer). The drawer provides two inspection modes:
Simple / Timeline View:
AgentDecision) the agent made.virustotal.get_ip_report, jira.create_issue), the parameters passed, runtime duration, and the resulting response.Raw JSON Debugger:
react18-json-view.llm_requests, llm_responses, observables) are collapsed by default to keep the interface fast and responsive, but can be expanded with one click for forensic audit.llm_requests & llm_responsesShuffle attaches raw LLM payloads directly to the execution data returned by /api/v1/streams/results. This eliminates guesswork when prompt engineering or investigating unexpected model decisions.
llm_requests?llm_requests contains an array of every outbound prompt sent to the inference endpoint. Each entry captures:
model: The model identifier used for this inference step (e.g. gemini-2.5-flash, gpt-4o, ollama/llama3).messages: The complete message stack, including:
tools: The full JSON schemas of every MCP app action exposed to the model for this step.temperature & parameters: Generation parameters governing randomness and sampling.[
{
"model": "gemini-2.5-flash",
"temperature": 0.2,
"messages": [
{
"role": "system",
"content": "You are a Shuffle Security Agent. Analyze the provided indicators and recommend containment steps."
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "Investigate suspicious outbound communication to 198.51.100.23 reported on host-prod-04."
}
]
}
],
"tools": [
{
"type": "function",
"function": {
"name": "virustotal_get_ip_report",
"description": "Retrieve reputation and threat report for an IP address",
"parameters": {
"type": "object",
"properties": {
"ip": { "type": "string", "description": "IPv4 or IPv6 address" }
},
"required": ["ip"]
}
}
}
]
}
]
llm_responses?llm_responses records the verbatim response from the model provider before Shuffle parses it into decisions:
choices: Array of generation candidates containing message roles and tool calls.message.tool_calls: Structured function call invocations generated by the model with action names and arguments.finish_reason: Indicates why the model stopped generating (tool_calls, stop, length, etc.).usage: Exact token consumption statistics (prompt_tokens, completion_tokens, total_tokens), critical for cost monitoring and diagnosing context truncation.[
{
"id": "chatcmpl-9xL829",
"choices": [
{
"index": 0,
"finish_reason": "tool_calls",
"message": {
"role": "assistant",
"content": null,
"tool_calls": [
{
"id": "call_vt_01",
"type": "function",
"function": {
"name": "virustotal_get_ip_report",
"arguments": "{\"ip\": \"198.51.100.23\"}"
}
}
]
}
}
],
"usage": {
"prompt_tokens": 1240,
"completion_tokens": 38,
"total_tokens": 1278
}
}
]
When an agent processes screenshots, network diagrams, or image observables, the image is encoded and tracked inside llm_requests:
data:image/...;base64 URI or HTTP URL) is indexed.Shuffle gives operators granular governance over how agents deliberate and act:
minimal: Rapid single-step lookups (e.g. single indicator reputation query).low: Short 2-3 step operational sequences.medium: Default balanced mode for incident triage and investigation.high: Deep recursive planning that cross-references multiple data sources and tests intermediate hypotheses.ask decision, pauses in WAITING status, and presents a structured question.approval_required: true. The agent pauses execution until an authorized analyst reviews the proposed payload and clicks approve.You can query agent activity and inspect raw llm_requests / llm_responses directly from terminal scripts, CI pipelines, or your SIEM.
Search for agent runs across your tenant using the workflow search endpoint:
API Call
curl -X POST 'https://uk.shuffle.security/api/v1/workflows/search?top=10' \ -H 'Authorization: Bearer $SHUFFLE…' \ -H 'Content-Type: application/json' \ -d '{ "workflow_id": "AGENT", "limit": 10, "cursor": "" }'
Response
No response received.
Retrieve the complete execution output, decision timeline, and raw LLM traces using the streams endpoint:
API Call
curl -X GET 'https://uk.shuffle.security/api/v1/streams/results?execution_id=c1a2b3d4-e5f6-7890-abcd-ef1234567890' \ -H 'Authorization: Bearer $SHUFFLE…'
Response
No response received.
To extract only the raw llm_requests and llm_responses using jq:
API Call
curl -X GET 'https://uk.shuffle.security/api/v1/streams/results?execution_id=c1a2b3d4-e5f6-7890-abcd-ef1234567890' \ -H 'Authorization: Bearer $SHUFFLE…'
Response
No response received.
The Model Context Protocol (MCP) standardizes how AI models discover and execute tools. In Shuffle, every single app in the catalog is an MCP server, enabling seamless interoperability with internal agents as well as external AI platforms like ChatGPT and Claude.
You can interact with Shuffle tools using the standard MCP specification:
POST /api/v1/mcp allows calling any tool across your tenant using the standard tools/call and tools/list JSON-RPC methods.GET / POST /api/v1/apps/{app_id}/mcp scopes interactions exclusively to the actions of a single app.In Shuffle, every app is an MCP tool. If an integration exists in your tenant, it is already an MCP server that your agents (and external clients like Claude or ChatGPT) can use.
When you need an integration that is not in Shuffle yet, you don't have to write Python wrappers, build Docker images, or wait for someone else to build it. You can add or generate them in three ways:
If a tool or service has web API documentation, you can generate an MCP tool on the spot without writing code:
/agents, click + Tools (or go to /apps) and click Add App.https://api.abuseipdb.com/api/v2/docs or a Swagger UI page).doc-to-openapi engine reads the page, extracts the endpoints, parameters, request bodies, and auth methods, and generates a clean OpenAPI 3.0 spec.POST /api/v1/verify_openapi and registers it directly on your tenant.This takes about 15 seconds. No Docker builds or service restarts required. Add your API key in the credentials card, and the tool is immediately usable in your prompt.
If you already have an OpenAPI (v2/v3) or Swagger spec file:
API Call
curl -X POST 'https://uk.shuffle.security/api/v1/verify_openapi' \ -H 'Authorization: Bearer $SHUFFLE…' \ -H 'Content-Type: application/json' \ -d '@my-api-spec.json'
Response
No response received.
Shuffle parses the paths and creates the MCP actions automatically.
If you need to query an internal database, run an SSH command, or parse a proprietary format that does not have a REST API:
/apps/new to open the App Creator.Because every Shuffle app gets an MCP endpoint automatically, your Python code is immediately callable by agents on /agents and externally through POST /api/v1/apps/{app_id}/mcp.
Shuffle provides a full-featured OAuth 2.0 Authorization Code flow with PKCE (code_challenge / code_challenge_method=S256) to allow external applications to connect securely to your tools:
External AI (ChatGPT / Claude) Shuffle OAuth Server Your Tenant Tools
│ │ │
│ ── 1. Redirect to /oauth/authorize ──> │ │
│ │ (Prompt user: Select Org, │
│ │ Review Granular Scopes) │
│ <── 2. Return Authorization Code ───── │ │
│ │ │
│ ── 3. Exchange Code for Token ───────> │ │
│ <── 4. Access Token Issued ─────────── │ │
│ │
│ ── 5. Standard MCP tools/call (Bearer Token) ───────────────────────────> │
mcps:read: Discover and inspect available MCP servers and tool definitions.mcps:execute / tools:call: Execute tools and functions.apps:execute: Trigger third-party app actions (Jira, Slack, CrowdStrike, etc.).workflows:run: Execute automated security workflows and playbooks.incidents:read / incidents:write: Query and update incident cases.You can connect custom GPTs and ChatGPT Actions directly to Shuffle:
https://shuffler.io/api/v1/wazuh,iris/mcp.https://shuffler.io/oauth/authorize) and Token URL (https://shuffler.io/oauth/token).Anthropic's Claude Desktop and Claude.ai can execute Shuffle tools via the MCP protocol:
claude_desktop_config.json).{
"mcpServers": {
"shuffle": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-fetch", "https://shuffler.io/api/v1/mcp"],
"env": {
"SHUFFLE_API_KEY": "YOUR_SHUFFLE_API_KEY"
}
}
}
}
One of the largest hurdles in security automation is data fragmentation: an IP reputation alert looks different in Splunk, Elastic, CrowdStrike, and Microsoft Defender.
Schemaless eliminates vendor lock-in by standardizing disparate security data against the Open Cybersecurity Schema Framework (OCSF).
Raw Alerts of any format Schemaless Normalization Standardized OCSF Output
┌───────────────────────┐ ┌──────────────────────┐ ┌────────────────────────┐
│ Splunk / Elastic SIEM │ ──┐ │ │ │ OCSF Class 2001: │
├───────────────────────┤ ├───────────> │ Context Mapping │ ─────────> │ Security Incident / │
│ CrowdStrike / Defender│ ──┤ │ + Deterministic │ │ Finding │
├───────────────────────┤ │ │ OCSF Translation │ │ (Uniform Observables) │
│ Jira / TheHive Alerts │ ──┘ │ │ └────────────────────────┘
└───────────────────────┘ └──────────────────────┘
Learn more and explore the schemas at schemaless.org.
You can drag and drop AI Agents as native nodes inside any Shuffle workflow canvas to merge autonomous reasoning with deterministic business logic.
/workflows.Click on the node to configure its parameters in the right-hand panel:
input): Natural language instructions for the agent. Use workflow variable substitution (e.g. Investigate alert: $webhook.body.details and check $webhook.body.ip in VirusTotal).virustotal and jira).minimal, low, medium, or high.The AI Agent returns a structured JSON payload available to subsequent workflow nodes:
$ai_agent.output / $ai_agent.message: The final textual conclusion or executive summary.$ai_agent.decisions: Full array of individual tool calls, parameters, and action results.$ai_agent.execution_id: The execution ID for streaming or auditing.$ai_agent.llm_requests: Array of verbatim outbound inference prompts and tool schemas.$ai_agent.llm_responses: Array of verbatim model responses, token counts, and reasoning traces.Shuffle provides natural language workflow generation directly inside the workflow builder:
Shuffle's AI architecture is designed for enterprise scalability, regulatory compliance, and total environment flexibility.
In Shuffle Cloud, the architecture separates control plane orchestration from model execution:
SHUFFLE_GCE_LOCATION). Requests are routed to regional Google Cloud Platform (Vertex AI / Gemini) clusters within your legal jurisdiction (e.g. EU or US data boundaries).Shuffle's on-premises deployment allows you to run all automation, agent decisions, and tool executions inside your own datacenter or private VPC:
https://shuffler.io/api/v1 authenticated by your /admin Cloud Sync key.Key components of Shuffle's agentic decision engine, execution loop, and MCP protocol parsers are open source and can be inspected in the official repository:
shuffle-sharedAll AI and Agent features in Shuffle can be accessed programmatically via REST and JSON-RPC APIs:
POST /api/v1/agent — Launches asynchronous agent tasks, returning an execution_id and stream authorization.POST /api/v1/workflows/search?top={n} — Lists agent workflow executions, trigger sources, and statuses across your tenant.GET /api/v1/streams/results?execution_id={id} — Streams real-time decision updates and returns complete llm_requests and llm_responses payloads.POST /api/v1/mcp — Executes tools synchronously via the standardized MCP tools/call method.GET / POST /api/v1/apps/{app_id}/mcp — Scopes MCP interactions to a single tool integration.POST /api/v1/mcp (method: tools/list) — Returns tool definitions and JSON schemas.POST /api/v1/chat/completions — Direct OpenAI-compatible chat completions interface powered by Shuffle AI credits or local models.POST /api/v1/mcp (method: initialize) — Performs protocol version handshake.POST /api/v1/mcp (method: ping) — Health check validating agent service availability.http://host.docker.internal:11434/v1 or the host's LAN IP rather than localhost./admin -> Cloud Sync and ensure your Shuffler.io API key is valid and connected.https://shuffler.io/api/v1.mcps:execute, tools:call) have been approved during the authorization prompt.llava on local Ollama).Need additional assistance? Reach out to the Shuffle team at support@shuffler.io or join our community discussions.