
Claude To Deerflow
Send messages to a running DeerFlow gateway from a coding agent via the bundled chat script, with health checks, threads, and streaming modes.
Overview
claude-to-deerflow is an agent skill most often used in Build (also Idea, Validate) that connects coding agents to DeerFlow through chat.sh—health check, LangGraph threads, modes, and streaming responses.
Install
npx skills add https://github.com/bytedance/deer-flow --skill claude-to-deerflowWhat is this skill?
- Bash `chat.sh` entry: message, optional thread_id, and mode (flash, standard, pro default, ultra)
- Configurable endpoints: DEERFLOW_URL, DEERFLOW_GATEWAY_URL, DEERFLOW_LANGGRAPH_URL
- Gateway health check before send; clear error when DeerFlow is unreachable
- Creates or reuses LangGraph threads for multi-turn DeerFlow conversations
- Streams collected response from DeerFlow unified proxy (default localhost:2026)
- 4 DeerFlow modes: flash, standard, pro, ultra
- default gateway port 2026 on localhost
Adoption & trust: 2.4k installs on skills.sh; 70.7k GitHub stars; 2/3 security scanners passed (skills.sh audits); trending (+100% hot-view momentum).
What problem does it solve?
You run DeerFlow for heavy agent workflows but your IDE agent has no reliable, documented way to open threads and send messages to the gateway.
Who is it for?
Indie builders experimenting with DeerFlow alongside Claude/Codex who want a copy-paste script contract for local or custom proxy URLs.
Skip if: Projects not using DeerFlow at all, or full in-repo DeerFlow deployment/topology tasks without a running gateway endpoint.
When should I use this skill?
DeerFlow is running and you need to send a message, continue a thread, or select flash/standard/pro/ultra mode via chat.sh and configurable DEERFLOW_* URLs.
What do I get? / Deliverables
A validated HTTP conversation flow runs against DeerFlow with the right thread and mode, returning the streamed answer or a actionable reachability error.
- Streaming or collected DeerFlow response for the submitted prompt
- Reusable thread_id for follow-up messages when continuing a conversation
Recommended Skills
Journey fit
Spans multiple journey phases - primary shelf plus alternate fits below.
DeerFlow is an external multi-agent runtime you wire into your toolchain—primary shelf is Build integrations where agent backends are composed. integrations captures HTTP/LangGraph proxy calls and thread continuity rather than product frontend or generic CLI utilities.
Where it fits
Kick off a DeerFlow pro-mode thread to explore a problem space before locking a build spec.
Continue an existing thread_id to narrow MVP scope based on DeerFlow's streamed analysis.
Call chat.sh from an agent workflow so implementation tasks can fetch DeerFlow outputs mid-session.
Point DEERFLOW_URL at a remote staging proxy while developing agent orchestration locally.
How it compares
HTTP bridge script to an external agent runtime—not an MCP server catalog entry or a generic brainstorming methodology skill.
Common Questions / FAQ
Who is claude-to-deerflow for?
Solo developers wiring Claude Code, Cursor, or Codex to a DeerFlow instance for delegated multi-agent runs via LangGraph threads.
When should I use claude-to-deerflow?
In Build when integrating agent backends; in Idea or Validate when delegating open-ended research or scoping questions to DeerFlow before you commit to implementation plans.
Is claude-to-deerflow safe to install?
It triggers network calls to your DeerFlow deployment—review the Security Audits panel on this page and only point URLs at infrastructure you control.
SKILL.md
READMESKILL.md - Claude To Deerflow
#!/usr/bin/env bash # chat.sh — Send a message to DeerFlow and collect the streaming response. # # Usage: # bash chat.sh "Your question here" # bash chat.sh "Your question" <thread_id> # continue conversation # bash chat.sh "Your question" "" pro # specify mode # DEERFLOW_URL=http://host:2026 bash chat.sh "hi" # custom endpoint # # Environment variables: # DEERFLOW_URL — Unified proxy base URL (default: http://localhost:2026) # DEERFLOW_GATEWAY_URL — Gateway API base URL (default: $DEERFLOW_URL) # DEERFLOW_LANGGRAPH_URL — LangGraph API base URL (default: $DEERFLOW_URL/api/langgraph) # # Modes: flash, standard, pro (default), ultra set -euo pipefail DEERFLOW_URL="${DEERFLOW_URL:-http://localhost:2026}" GATEWAY_URL="${DEERFLOW_GATEWAY_URL:-$DEERFLOW_URL}" LANGGRAPH_URL="${DEERFLOW_LANGGRAPH_URL:-$DEERFLOW_URL/api/langgraph}" MESSAGE="${1:?Usage: chat.sh <message> [thread_id] [mode]}" THREAD_ID="${2:-}" MODE="${3:-pro}" # --- Health check --- HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "${GATEWAY_URL}/health" 2>/dev/null || echo "000") if [ "$HTTP_CODE" = "000" ] || [ "$HTTP_CODE" -ge 400 ]; then echo "ERROR: DeerFlow is not reachable at ${GATEWAY_URL} (HTTP ${HTTP_CODE})" >&2 echo "Make sure DeerFlow is running. Start it with: cd <deerflow-dir> && make dev" >&2 exit 1 fi # --- Create or reuse thread --- if [ -z "$THREAD_ID" ]; then THREAD_RESP=$(curl -s -X POST "${LANGGRAPH_URL}/threads" \ -H "Content-Type: application/json" \ -d '{}') THREAD_ID=$(echo "$THREAD_RESP" | python3 -c "import sys,json; print(json.load(sys.stdin)['thread_id'])" 2>/dev/null) if [ -z "$THREAD_ID" ]; then echo "ERROR: Failed to create thread. Response: ${THREAD_RESP}" >&2 exit 1 fi echo "Thread: ${THREAD_ID}" >&2 fi # --- Build context based on mode --- case "$MODE" in flash) CONTEXT='{"thinking_enabled":false,"is_plan_mode":false,"subagent_enabled":false,"thread_id":"'"$THREAD_ID"'"}' ;; standard) CONTEXT='{"thinking_enabled":true,"is_plan_mode":false,"subagent_enabled":false,"thread_id":"'"$THREAD_ID"'"}' ;; pro) CONTEXT='{"thinking_enabled":true,"is_plan_mode":true,"subagent_enabled":false,"thread_id":"'"$THREAD_ID"'"}' ;; ultra) CONTEXT='{"thinking_enabled":true,"is_plan_mode":true,"subagent_enabled":true,"thread_id":"'"$THREAD_ID"'"}' ;; *) echo "ERROR: Unknown mode '${MODE}'. Use: flash, standard, pro, ultra" >&2 exit 1 ;; esac # --- Escape message for JSON --- ESCAPED_MSG=$(python3 -c "import json,sys; print(json.dumps(sys.argv[1]))" "$MESSAGE") # --- Build request body --- BODY=$(cat <<ENDJSON { "assistant_id": "lead_agent", "input": { "messages": [ { "type": "human", "content": [{"type": "text", "text": ${ESCAPED_MSG}}] } ] }, "stream_mode": ["values", "messages-tuple"], "stream_subgraphs": true, "config": { "recursion_limit": 1000 }, "context": ${CONTEXT} } ENDJSON ) # --- Stream the run and extract final response --- # We collect the full SSE output, then parse the last values event to get the AI response. TMPFILE=$(mktemp) trap "rm -f '$TMPFILE'" EXIT curl -s -N -X POST "${LANGGRAPH_URL}/threads/${THREAD_ID}/runs/stream" \ -H "Content-Type: application/json" \ -d "$BODY" > "$TMPFILE" # Parse the SSE output: extract the last "event: values" data block and get the final AI message python3 - "$TMPFILE" "$GATEWAY_URL" "$THREAD_ID" << 'PYEOF' import json import sys sse_file = sys.argv[1] if len(sys.argv) > 1 else None gateway_url = sys.argv[2].rstrip("/") if len(sys.argv) > 2 else "http://localhost:2026" thread_id = sys.argv[3] if len(sys.argv) > 3 else "" if not sse_file: sys.exit(1) with open(sse_file, "r") as f: raw = f.read() # Parse SSE events events = [] current_event = None current_data_lines = [] for line in raw.split("\n"): if line.startswith("event:"): if current_event and current_data_lines: