MCP Server Builder
anthropics/skills
Guides the design and implementation of Model Context Protocol servers in TypeScript or Python, from tool naming and error messages to evaluation.
Analyzes IBM watsonx Orchestrate agentic workflow artefacts (JSON or Python @flow) and returns prioritised architecture recommendations grouped by impact.
$ npx skills add IBM/ibm-watsonx-orchestrate-adk --skill agentic-workflow-advisor -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install IBM/ibm-watsonx-orchestrate-adk agentic-workflow-advisor --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/IBM/ibm-watsonx-orchestrate-adk.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/agentic-workflow-advisor .claude/skills/agentic-workflow-advisor && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "agentic-workflow-advisor" agent skill from https://github.com/IBM/ibm-watsonx-orchestrate-adk/tree/main/skills/agentic-workflow-advisor into .claude/skills/agentic-workflow-advisor/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentic-workflow-advisor", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/IBM/ibm-watsonx-orchestrate-adk/tree/main/skills/agentic-workflow-advisorType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add IBM/ibm-watsonx-orchestrate-adk --skill agentic-workflow-advisor -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install IBM/ibm-watsonx-orchestrate-adk agentic-workflow-advisor --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/IBM/ibm-watsonx-orchestrate-adk.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/agentic-workflow-advisor .agents/skills/agentic-workflow-advisor && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "agentic-workflow-advisor" agent skill from https://github.com/IBM/ibm-watsonx-orchestrate-adk/tree/main/skills/agentic-workflow-advisor into .agents/skills/agentic-workflow-advisor/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentic-workflow-advisor", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add IBM/ibm-watsonx-orchestrate-adk --skill agentic-workflow-advisor -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install IBM/ibm-watsonx-orchestrate-adk agentic-workflow-advisor --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/IBM/ibm-watsonx-orchestrate-adk.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/agentic-workflow-advisor .cursor/skills/agentic-workflow-advisor && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "agentic-workflow-advisor" agent skill from https://github.com/IBM/ibm-watsonx-orchestrate-adk/tree/main/skills/agentic-workflow-advisor into .cursor/skills/agentic-workflow-advisor/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentic-workflow-advisor", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/IBM/ibm-watsonx-orchestrate-adk.git --path skills/agentic-workflow-advisor--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add IBM/ibm-watsonx-orchestrate-adk --skill agentic-workflow-advisor -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install IBM/ibm-watsonx-orchestrate-adk agentic-workflow-advisor --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/IBM/ibm-watsonx-orchestrate-adk.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/agentic-workflow-advisor .gemini/skills/agentic-workflow-advisor && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "agentic-workflow-advisor" agent skill from https://github.com/IBM/ibm-watsonx-orchestrate-adk/tree/main/skills/agentic-workflow-advisor into .gemini/skills/agentic-workflow-advisor/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentic-workflow-advisor", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install IBM/ibm-watsonx-orchestrate-adk agentic-workflow-advisorInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add IBM/ibm-watsonx-orchestrate-adk --skill agentic-workflow-advisor -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/IBM/ibm-watsonx-orchestrate-adk.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/agentic-workflow-advisor .github/skills/agentic-workflow-advisor && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "agentic-workflow-advisor" agent skill from https://github.com/IBM/ibm-watsonx-orchestrate-adk/tree/main/skills/agentic-workflow-advisor into .github/skills/agentic-workflow-advisor/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentic-workflow-advisor", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add IBM/ibm-watsonx-orchestrate-adk --skill agentic-workflow-advisor -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install IBM/ibm-watsonx-orchestrate-adk agentic-workflow-advisor --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/IBM/ibm-watsonx-orchestrate-adk.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/agentic-workflow-advisor .opencode/skills/agentic-workflow-advisor && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "agentic-workflow-advisor" agent skill from https://github.com/IBM/ibm-watsonx-orchestrate-adk/tree/main/skills/agentic-workflow-advisor into .opencode/skills/agentic-workflow-advisor/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "agentic-workflow-advisor", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
agentic-workflow-advisorAnalyzes IBM watsonx Orchestrate agentic workflow artefacts (JSON or Python @flow) and returns prioritised architecture recommendations grouped by impact.
Agentic Workflow Advisor is an agent skill from IBM/ibm-watsonx-orchestrate-adk, published by the product's own GitHub organization. Analyzes IBM watsonx Orchestrate agentic workflow artefacts (JSON or Python @flow) and returns prioritised architecture recommendations grouped by impact. Use when the user wants to review, analyze, or audit a workflow for performance issues, routing failures, or design best practices. Triggers on phrases like "review my workflow", "analyze my agentic workflow", "audit this flow", "what's wrong with my workflow", or when a workflow JSON or Python flow file is provided with a request for feedback.
Its SKILL.md is about 10k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including scripts (for example `README.md` and `scripts/extract_flow_info.py`).
It works with Python. The repository describes itself as: The command line client for watsonx Orchestrate's agent builder experience. The licence is MIT.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 15d588c. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
kindpython3From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Agentic Workflow Advisor loads about 10k tokens when it runs. Until then it costs about 132 tokens; SKILL.md has 5,005 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from IBM/ibm-watsonx-orchestrate-adk at commit 15d588c, republished under its MIT licence (© IBM). 5,005 words, ~10,459 tokens.
.claude/skills/agentic-workflow-advisor/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.This skill defines the process for analyzing IBM watsonx Orchestrate agentic workflow artefacts (JSON or Python @flow) and generating a structured, prioritised set of architecture recommendations that help builders identify and fix design issues before they reach production.
The skill performs static analysis only — it does not invoke, modify, or connect to any running workflow or platform API. It works entirely from the artefact the builder provides.
Use this skill when you need:
Analyze an agentic workflow artefact and produce a structured recommendation report that:
This skill applies to:
@flow decoratorIn scope:
"spec": { "kind": "flow", ... }, or any Python file with a @flow-decorated function, regardless of whether they contain an Agent nodetool, agent, script, branch, parallel, foreach, loop, prompt, docproc, docext, decisions, user, user_flowparallel, foreach, loop, user_flow)Python @flow artefacts:
When the artefact is a Python file using the ADK @flow decorator, the same 6 checks apply. Run scripts/extract_flow_info.py <file.py> to pre-extract the structural summary before analysis (see Step 1).
Out of scope:
IMPORTANT: Generate findings based ONLY on what is present in the provided artefact.
Rules:
display_name values from the artefact — never use internal node IDs like tool_562086metadata.is_under_specified: true), note this and scope findings accordinglyPlatform-managed fields — do NOT flag or comment on:
assignees — this field on user_flow nodes is populated automatically by the platform (defaulting to the flow initiator). It does not require an explicit input_map. Never suggest mapping assignees to a user list.input_map is intentional platform behaviour — if in doubt, do not flag it.Excluded from this assessment:
input_map on a user_flow node is not an architecture issue detectable by this skillEvaluate the workflow artefact for what it will do at runtime — not for how it looks on the canvas. A flow that appears clean may have sequential tool nodes with no dependencies, auto-mapped fields invoking an LLM on every call, or an agent used purely to route a result that is already deterministic. These patterns are invisible in the UI and only surface under load or in production. This skill makes them visible before deployment.
Before running analysis, understand the structure of a watsonx Orchestrate workflow JSON export:
{
"spec": { "kind": "flow", "name": "...", "display_name": "...", "private_schema": { ... } },
"nodes": {
"<node_name>": {
"spec": {
"kind": "<node_kind>",
"name": "...",
"display_name": "...",
"input_schema": { "type": "object", "required": [...], "properties": { ... } },
"output_schema": { ... }
},
"input_map": {
"spec": {
"fallback_strategy": "ask_the_user" | "no_value",
"maps": [
{
"metadata": { "assignmentType": "variable" | "literal" | "pyExpression" | "automap" },
"target_variable": "self.input.<field>",
"value_expression": "...",
"has_no_value": false | true
}
]
}
},
"edges": [...],
"nodes": { ... }
}
},
"edges": [
{ "id": "...", "start": "<node_name>", "end": "<node_name>", "display_name": "..." }
],
"metadata": { "source_kind": "ui" | "adk", "is_under_specified": true | false }
}Key structural facts:
node.input_map.spec.maps[] — not at data_mapfallback_strategy lives at node.input_map.spec.fallback_strategymaps[] — detection is purely structural (gap between input_schema.required[] and maps[].target_variable)maps: [] means all required fields fall through to fallback_strategyscript nodes ("kind": "script") ARE Logic Code Blocks — inline fn expression, no external callsparallel, foreach, loop, user_flow) have their own inner edges and nodesparallel container are already concurrent — do not flag them for sequential execution"kind": "tool" means exactly that — a tool node.
Do NOT infer what lies behind it (MCP, OpenAPI, Python, sub-flow, or anything else) from the node's name, display_name, or description. Treat every tool node uniformly for all detection checks.
Supported node kinds:
tool | agent | script | branch | parallel | foreach | loop | prompt | docproc | docext | decisions | user | user_flow | start | end
If the user has not yet provided a workflow artefact in this message, reply with exactly this:
"Please paste your workflow JSON or provide the file path to analyze."
Then stop. Do nothing else.
STOP. The following are strictly forbidden before the user provides content in this message:
.bob/tmp/, not resource/, not anywhereThe artefact must come from the user in this conversation turn. Nothing else is acceptable.
Valid inputs (once the user provides one):
resource/MyFlow/MyFlow.json) — fastest, Bob runs the script directly on it@flow content — Bob saves to temp file and runs the scriptIf only partial artefacts are provided, proceed with what is available and clearly state at the end of the review what could not be assessed.
Do NOT ask the user any question.
Path A — User provided a file path (e.g. resource/MyFlow/MyFlow.json):
Run exactly this one command and nothing else:
python3 .bob/skills/agentic-workflow-advisor/scripts/extract_flow_info.py <file_path>Use python3. If not found, try python. Use the full path to the script relative to workspace root.
This single command produces all data needed for all 6 checks. Run it once. That is all.
STRICTLY FORBIDDEN for Path A — these are never acceptable under any circumstances:
python3 -c "..." inline scripts to read or inspect the JSON fileread_file or any other toolIf the script output seems incomplete, proceed with what it produced — do not supplement with ad-hoc commands.
After the script runs once, map its output keys to checks using the table at the end of this step, then proceed to Step 3.
Path B — User pasted raw JSON content:
Do NOT write the JSON to any file. Do NOT use write_file. Do NOT run execute_command. Do NOT use a heredoc. Do NOT re-emit the JSON content in any tool call. Re-emitting thousands of lines of JSON through any tool takes 10+ minutes. It must never happen.
Apply the extraction algorithm (E0–E3) below against the JSON in context. Then go directly to Step 4 output.
OUTPUT RULE — strictly enforced:
The first token Bob outputs to the user must be ## (the report header: ## Agentic Workflow Advisor — [flow name]).
Nothing else comes before it — no sentence, no label, no acknowledgement. Do not say "Running…", "Analysing…", "Working through…", "E0–E3…", "silently…", "against the pasted JSON", or any other intro phrase. The report header is the very first thing the user sees.
Everything from the report header onward is shown normally: flow name, execution path, findings, review scope line.
E0 — Resolve schemas
data.spec.input_schema or data.spec.private_schema{"$ref": "#/schemas/SomeName"}, resolve it: top_input_schema = data.schemas["SomeName"]top_properties = keys of top_input_schema.properties (or [])top_required = top_input_schema.required (or [])flow_name = data.spec.display_name or data.spec.nameE1 — Walk all nodes
Iterate data.nodes (top-level dict, keys are node IDs). For each node:
kind = node.spec.kinddisplay_name = node.spec.display_name or node_iddescription = node.spec.description (or "")input_schema_required = node.spec.input_schema.required (or [])input_schema_properties = keys of node.spec.input_schema.properties (or [])explicitly_mapped_fields = all target_variable values in node.input_map.spec.maps[] that start with "self.input.", with the "self.input." prefix strippedunmapped_required_fields = fields in input_schema_required NOT in explicitly_mapped_fieldsphantom_mapped_fields = fields in explicitly_mapped_fields NOT in input_schema_propertiesfallback_strategy = node.input_map.spec.fallback_strategy (or "")kind == "agent": also capture message = node.spec.message, thread_control_policy = node.spec.thread_control_policy, output_schema_properties = keys of node.spec.output_schema.propertieskind == "branch": also capture branch_conditions = node.spec.evaluator.conditions[] → each as {expression, default, edge_id}kind == "parallel": also capture parallel_children = entries in node.nodes{} where kind is NOT "start" or "end" → each as {id, kind, display_name}; parallel_is_conditional = any condition in node.spec.evaluator.conditions[] where default != truekind is "start" or "end": skip (internal plumbing)parallel): also walk node.nodes{} with the same rules aboveE2 — Build edge maps
From data.edges[]:
successors[start_id] = list of end_id valuespredecessors[end_id] = list of start_id valuesE3 — Derive check inputs (populate these named results for Step 3):
check_1_sequential_tool_pairs: For each node where kind == "tool", for each successor where kind == "tool":
node.input_map.spec.maps[] → collect all value_expression stringsvalue_expression contains the current node's display_name, name (node.spec.name), or node_id → has dependency → skip{node_a: display_name, node_b: successor_display_name}check_1_parallel_containers: All nodes where kind == "parallel" → {display_name, children: parallel_children, is_conditional: parallel_is_conditional}
check_2_unmapped_required_fields: All nodes where unmapped_required_fields is non-empty AND kind is NOT one of start, end, branch, parallel, foreach, loop, user_flow → {display_name, kind, unmapped_required_fields, fallback_strategy}
check_2_phantom_mappings: All nodes where phantom_mapped_fields is non-empty → {display_name, kind, phantom_mapped_fields}
check_3_branch_nodes: All nodes where kind == "branch" → {display_name, conditions: branch_conditions}
check_3_6_agent_nodes: All nodes where kind == "agent" → {display_name, message, thread_control_policy, output_schema_properties, predecessors: [{display_name, kind}] from predecessors map}
check_4_input_schema_field_count: len(top_properties)
check_5_tool_nodes: All nodes where kind == "tool" → {display_name, description}
node_kinds_present: sorted unique set of all kind values across all nodes
is_under_specified: data.metadata.is_under_specified (default false)
Script output keys (Path A — map script output directly to checks):
check_1_sequential_tool_pairs → Check 1 candidatescheck_1_parallel_containers → Check 1 exemptions (children already concurrent)check_2_unmapped_required_fields → Check 2 unmapped field findingscheck_2_phantom_mappings → Check 2 phantom mapping findingscheck_3_branch_nodes → Check 3 branch condition evidencecheck_3_6_agent_nodes → Check 3 (predecessors) and Check 6 (message, tools, output_schema)check_4_input_schema_field_count → Check 4 field countcheck_5_tool_nodes → Check 5 tool descriptionsnode_kinds_present → which checks will produce findingsis_under_specified: true → note at top that flow is incomplete, findings may be partialWork through every check below. Collect all findings before composing the output — do not output findings one by one.
What to look for:
Two or more "kind": "tool" nodes connected sequentially in the top-level edges array with no data dependency between them.
How to detect:
edges arrayuser_flow, script, branch, prompt, parallel, etc.)node_B.input_map.spec.maps:value_expression referencing node A's output (e.g. contains flow["<node_A_display_name>"] or flow.<node_A_name>), there IS a dependency — do not flagparallel container — they are intentionally concurrentFlag when: 2 or more consecutive top-level tool nodes share no data dependency.
Recommendation:
Sequential tool execution detected: [list node display_names]. These tool nodes execute one after the other but share no data dependency. Wrap them in a Parallel Node — in the Flow Builder, add a Parallel Node container and move these tool nodes inside it. The Parallel Node runs all contained nodes at the same time, so the total wait time becomes the duration of the slowest node rather than the sum of all nodes. Typical saving: 2–4s for tools averaging 1–2s each, plus 35ms orchestration overhead per eliminated sequential step.
What to look for:
Any node where input_schema.required[] lists fields that have no explicit entry in input_map.spec.maps — meaning the runtime must resolve the value another way. Also covers the flow-level output_map if output fields are defined but not explicitly mapped. Applies to all node kinds that have an input_schema, including tool, agent, prompt, docproc, and docext.
Context — automap is a supported feature with a known performance cost: Auto-mapping is valid and intentional — the runtime uses an LLM to resolve unmapped required fields from available context. However, it always costs 500–3000ms per invocation regardless of whether it was chosen deliberately or left as a default. This check always reports unmapped required fields with those numbers so the builder can make an informed decision. If explicit mapping is not feasible or the latency is acceptable for the use case, there is no need to act.
How to detect:
input_schema.required and input_map:input_schema.required[]input_map.spec.maps[].target_variable (extract field name after self.input.)output_map.spec.maps[] — only if output_map.spec.maps is non-empty (i.e. the builder has defined at least one output field). If any output field has no explicit mapping source, flag it. If output_map.spec.maps is empty or absent, skip — there are no output fields to evaluate.input_map.spec.maps entry, extract the field name from target_variable (after self.input.) and verify it exists as a key in input_schema.properties. If it does NOT exist in input_schema.properties, it is a phantom mapping: the value is assigned to a field the node does not declare, so it is silently discarded at runtime. This is a copy-paste error signal — flag it regardless of performance intent. Common pattern: a field is renamed in the node spec but an old mapping with the previous name was not removed, resulting in both a phantom entry (old name) and a potentially missing entry (new name, which may or may not have a separate correct mapping).Flag when: Any required field on a node has no explicit mapping (performance-mode recommendation), OR any input_map.spec.maps entry targets a field name not present in input_schema.properties (phantom mapping — always flag).
Recommendation (node input — unmapped required field):
Unmapped required field on [display_name]: required field(s) [list field names] have no explicit mapping in input_map. The runtime will use an LLM to resolve each unmapped field at execution time — this costs 500–3000ms per invocation regardless of how many fields are unmapped. Explicit mapping costs <10ms. If this latency is acceptable for the use case, no action is needed; otherwise add explicit mappings under input_map.spec.maps for each field.
Recommendation (flow output_map — unmapped output field):
Unmapped flow output field: output field(s) [list field names] in output_map have no explicit mapping source. The runtime will use an LLM to resolve these at execution time — this costs 500–3000ms per invocation. If this latency is acceptable, no action is needed; otherwise add an explicit data mapping pointing to the node output that produces each value.
Recommendation (phantom mapping):
Phantom mapping on [display_name]: input_map entry targeting
self.input.[field_name]does not match any field ininput_schema.properties. This value is silently discarded at runtime — the node never receives it. This is typically a copy-paste error where a field was renamed in the node spec but the old mapping was not removed. Remove the phantom entry and verify the intended field has a correctly named mapping. Cross-checkinput_schema.requiredto confirm no required field is inadvertently left unmapped as a result.
What to look for:
An agent node that exists solely to route based on an already-deterministic result — where a branch node or tool could make the same decision without an LLM call.
How to detect:
edgesdecisions, docproc, docext, or a tool that produces a categorical/classification output (e.g. feature_match_tool returning is_match + feature_match), inspect the agent's message field for routing language ("route", "call", "invoke", "initiate", "based on", "depending on")branch, __end__, or another flow invocation, this is a routing-only agentbranch evaluator is a strong signalinstructions describe routing exclusively via a variable like {llm_instruct} or {feature_match} that was already computed by an upstream tool, this is LLM-based routing over a deterministic result — the agent adds latency without adding intelligenceDo NOT flag:
Signal that separates the two:
feature_match = "Block_Card_Flow") and passes it to another flow. The decision was already made.Flag when: An agent exists solely to route based on a deterministic upstream result (the decision was already made before the agent was called).
Recommendation:
LLM-based routing detected: agent [display_name] appears to route based on the output of [upstream display_name], which already produces a deterministic result. Passing this through an agent ReACT loop adds 2–10s per turn and introduces routing failures due to LLM variability. A Branch node evaluates the condition in <10ms with no LLM call. Replace with a Branch node — set the condition to evaluate the upstream result directly (e.g.
flow["<upstream>"].output.value == "category_x"), eliminating the agent call entirely.
What to look for:
The top-level flow spec.input_schema.properties or any node's input_schema.properties has more than 20 fields.
How to detect:
spec.input_schema.properties for the flow and for each nodeFlag when: Any input schema has more than 20 fields.
Recommendation:
Oversized input schema on [display_name]: [N] fields defined. Large schemas increase token footprint across every auto-mapping call and agent context retrieval. Critically, if the accumulated flow context exceeds 6500 tokens, the platform automatically triggers context compression — an LLM-based summarisation that adds 1000–5000ms of latency. Audit which fields are actually referenced in any input_map.spec.maps[].value_expression across the flow — unused fields can be removed or moved to flow.private (private_schema) to keep the context lean and prevent compression from triggering.
What to look for:
A "kind": "tool" node whose evidence — across description, display_name, tool name, and output_schema shape — suggests pure in-process computation: string manipulation, formatting, arithmetic, data transformation, log item construction, timestamp generation — with no mention of external APIs, databases, or services.
How to detect: Work through each signal in order. A node is a candidate if any signal points to pure computation and none contradicts it with an external-call indicator:
description field — read it. Explicit mentions of "API", "webhook", "database", "service", "HTTP", "external" rule it out. Phrases like "formats", "constructs", "matches", "computes", "prepares a log item", "returns a timestamp" are strong positive signals.display_name and tool field (the tool identifier string) — when description is absent or empty, use these. Names like prep_log_item_*, prep_log_event_item_*, timestamp, feature_match_tool, format_*, build_* with no service qualifier are positive signals. Names like post_*, send_*, fetch_*, get_*_from_api, notify_* are negative (likely external calls).output_schema shape — a schema with only simple string/boolean/number/object fields constructed from the inputs (no pagination, no status codes, no HTTP response wrapper) supports a pure-computation classification.input_schema fields — if inputs are all primitive values (strings, booleans, numbers) and there are no fields like url, endpoint, api_key, auth_token, the tool likely makes no external call.tool identifier and that identifier's name suggests data construction (e.g. four nodes all using prep_log_event_item_6003BU), evaluate them as a group. If the tool is a Logic Code Block candidate, flag all instances together."kind": "script" nodes ARE already Logic Code Blocks — do not flag these, they are the correct pattern"kind": "tool" nodesdescription is absent, rely on signals 2–5 above — do not skip the nodeFlag when: A tool node's signals (description, tool name, display_name, output_schema, input_schema) collectively indicate pure in-process computation with no external calls. When multiple nodes share the same tool identifier and that tool is a candidate, flag all of them together as a group.
Recommendation:
Logic Code Block candidate: tool node(s) [list display_names] appear to perform pure computation with no external API calls. Toolkit tools carry the overhead of a Python runtime invocation and network call (100–500ms per call). This logic can be moved into Script nodes (Logic Code Blocks) using inline Python expressions in the
fnfield. See any existing"kind": "script"nodes in this flow for the correct pattern. If these tools do make an external call not described in their metadata, disregard this finding.
What to look for:
An agent node whose message field contains a simple static prompt — plain text with no tool invocations, no RAG lookups, no multi-turn conversation, and no conditional logic — where a prompt node ("kind": "prompt") would produce the same result at a fraction of the cost.
Platform background:
agent node starts a full ReACT loop: it creates or reuses a conversation thread, sends the message to the LLM, evaluates whether to call tools, waits for tool results, and iterates. This costs 2–10s per turn and carries thread management overhead.prompt node ("kind": "prompt") makes a single direct LLM call with a system prompt and optional user input. It has no ReACT loop, no thread, no tool calls. It is faster, cheaper, and simpler for tasks that only need one LLM response.How to detect:
agent node, inspect the message field{flow., {self., {context.) — a hardcoded instruction like "Tell a joke" or "Summarise the following"tools array in the agent's spec, and confirm no tool calls are implied by the message textdescription and output_schema indicate a single text response (e.g. output_schema.properties.value of type string) — no structured multi-field outputmemory configuration, a knowledge_base reference, or description language indicating conversation history or knowledge base retrievalprompt node could doImportant — thread_control_policy caveat:
If the agent node has "thread_control_policy": "REUSE_AND_CORRELATE", note this explicitly in the recommendation. A prompt node does not maintain a conversation thread — replacing the agent with a prompt node will lose any conversation context continuity that REUSE_AND_CORRELATE was providing. Only suggest the replacement if thread continuity is not needed for this node's purpose.
Do NOT flag:
message references flow variables (e.g. {flow.input.user_query}) — they are receiving dynamic input, not a static promptoutput_schema defines multiple structured fields beyond a single value stringprompt node has no memory and no knowledge base retrieval capability; replacing it would silently drop that functionalityFlag when: Agent message is a static string, the agent has no tools, no memory, no knowledge base, and the output is a single text response.
Recommendation (without REUSE_AND_CORRELATE, no memory/knowledge):
Agent node [display_name] has a static message (
"[message text]") with no tool calls and a single text output. This is a simple LLM call — a Generative Prompt node (kind: "prompt") will produce the same result without the overhead of a full agent ReACT loop (saving 2–10s per invocation). In the Flow Builder, replace this agent node with a Generative AI node and set its system prompt to the same text.
Recommendation (with REUSE_AND_CORRELATE):
Agent node [display_name] has a static message (
"[message text]") with no tool calls and a single text output — a Generative Prompt node would normally be more efficient here. However, this node hasthread_control_policy: REUSE_AND_CORRELATE, which means it is reusing an existing conversation thread to maintain context continuity. A Generative Prompt node does not support thread continuity. Only replace it if conversation context from previous turns is not needed for this node's purpose.
Recommendation (agent uses memory or knowledge base):
Agent node [display_name] appears to use [memory / a knowledge base] — a Generative Prompt node does not support these capabilities, so no replacement is suggested. If the memory or knowledge base access can be removed, revisit this node for a potential simplification.
Use exactly the format below. Do not fabricate issues.
## Agentic Workflow Advisor — [spec.display_name]
> ⚠️ Note: This flow is marked as incomplete (is_under_specified: true). Findings may be partial.
> (Include this line only if metadata.is_under_specified is true)
**Execution path:** [display_name_1] → [display_name_2] → [display_name_3] → …
(Derive this from data.edges[] in order. Use display_name values only — no internal node IDs. Omit start/end nodes.)
---
### Check Results
| Check | Finding |
|---|---|
| Check 1 — Sequential Tool Execution | ⚠ [list sequential pairs found, e.g. "timestamp → prep_intent (no dependency)"] OR ✓ None |
| Check 2 — Unmapped Required Fields | ⚠ [node: field list] OR ✓ None |
| Check 2 — Phantom Mappings | ⚠ [node: field list] OR ✓ None |
| Check 3 — LLM-based Routing | ⚠ [agent name] OR ✓ None |
| Check 4 — Oversized Input Schema | ⚠ [N fields — exceeds 20] OR ✓ [N fields — within limit] |
| Check 5 — Logic Code Block Candidates | ⚠ [node names] OR ✓ None |
| Check 6 — Agent → Prompt Node | ⚠ [agent name] OR ✓ None |
---
### 🔴 High Impact
**[Issue title]**
- Observed: [what was found — use display_name values, not internal node IDs like tool_562086]
- Why it matters: [performance or stability impact with numbers where available]
- Recommended action: [specific, actionable step]
### 🟡 Medium Impact
**[Issue title]**
- Observed: [what was found]
- Why it matters: [impact]
- Recommended action: [action]
### 🟢 Low Impact / Housekeeping
**[Issue title]**
- Observed: [what was found]
- Why it matters: [impact]
- Recommended action: [action]
---
_Review scope: workflow JSON ✅ | agent YAML [✅/❌ not provided] | Checks skipped: [list any and why]_If the workflow is clean:
## Agentic Workflow Advisor — [spec.display_name]
**Execution path:** [display_name_1] → [display_name_2] → …
### Check Results
| Check | Finding |
|---|---|
| Check 1 — Sequential Tool Execution | ✓ None |
| Check 2 — Unmapped Required Fields | ✓ None |
| Check 2 — Phantom Mappings | ✓ None |
| Check 3 — LLM-based Routing | ✓ None |
| Check 4 — Oversized Input Schema | ✓ [N fields] |
| Check 5 — Logic Code Block Candidates | ✓ None |
| Check 6 — Agent → Prompt Node | ✓ None |
✅ No architecture issues found across all applicable detection categories.
---
_Review scope: workflow JSON ✅ | agent YAML [✅/❌ not provided]_Be evidence-based:
display_name values and field names from the artefactBe operational, not academic:
Do not fabricate:
Prioritise high-impact changes:
| Situation | Handling |
|---|---|
No agent nodes in the flow | Check 3 will produce no findings — continue with the remaining checks |
| Agent does genuine NLP work (RAG, free-text matching from scratch) | Do NOT flag for Check 3 — the agent is the decision-maker, not routing a pre-computed result |
kind: "script" nodes | Already Logic Code Blocks — correct pattern, do not flag for Check 5 |
Nodes inside parallel container | Already concurrent — do not flag for Check 1 |
decisions node with empty rules | Partially configured — note in review but do not flag as architecture issue |
metadata.is_under_specified: true | Note at top of review that flow is incomplete, findings may be partial |
Any node with fallback_strategy: ask_the_user | Do NOT flag — valid HITL behaviour everywhere; the platform interrupts and prompts the user for the missing value |
output_map with non-empty spec.maps and unmapped output fields | Flag for Check 2 (performance-mode) — output fields will be resolved at execution time, adding 500–3000ms |
output_map with empty or absent spec.maps | Skip Check 2 on output_map — nothing to evaluate |
| Large workflow exceeding context window | Review top-level nodes first, then recurse into container nodes; consolidate into a single output |
| Multiple flows provided | Review each separately, then add a cross-flow summary for shared issues |
Every review must produce:
The report must be:
display_name values, field names, and node types from the artefactReview my agentic workflow
<paste workflow JSON here>Analyze my agentic workflow for architecture issues
<attach workflow JSON file>What architecture issues does my workflow have?
<paste or attach workflow JSON and optionally agent YAML>Run an agentic workflow advisor check on this flow
<paste workflow JSON here>| Artefact | Required | Notes |
|---|---|---|
| Workflow JSON | ✅ Yes | Export from Flow Builder or ADK |
| Agent YAML | Optional | Useful for Check 3 (LLM-based routing) analysis |
## Agentic Workflow Advisor — Customer Support Flow
### 🔴 High Impact
**Sequential tool execution**
- Observed: Nodes "Get Account Details", "Get Order History", and "Get Open Tickets" are connected sequentially with no data dependencies between them
- Why it matters: Each tool averages ~1.5s. Running sequentially costs ~4.5s; running in parallel costs ~1.5s — a saving of ~3s per invocation
- Recommended action: Wrap all three nodes in a Parallel Node
### 🟡 Medium Impact
**Auto-mapped input field**
- Observed: Node "Create Ticket" has required field "customer_id" with no explicit mapping in input_map
- Why it matters: The flow engine will invoke an LLM to resolve this field at runtime, adding 500–3000ms per invocation
- Recommended action: Add an explicit mapping for "customer_id" under input_map.spec.maps
---
_Review scope: workflow JSON ✅ | agent YAML ❌ not provided_display_name values from the artefact© IBM, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files (scripts) in skills/agentic-workflow-advisor of IBM/ibm-watsonx-orchestrate-adk.
Open the folder on GitHubat commit 15d588c
Agentic Workflow Advisor next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Agentic Workflow Advisor this skillIBM/ibm-watsonx-orchestrate-adk | 178 | — | ~10k | Automated safety check: Pass | MIT | |
| MCP Server Builderanthropics/skills | 180k | 64 repos | ~2.3k | Automated safety check: Pass | Apache-2.0 | |
| PDF Processinganthropics/skills | 180k | 48 repos | ~2k | Automated safety check: Pass | Proprietary | |
| NotebookLM Research AssistantPleasePrompto/notebooklm-skill | 7.8k | 14 repos | ~2.4k | Automated safety check: Notes | MIT | |
| Manim Video Productionbrowser-use/video-use | 28k | 6 repos | ~3k | Automated safety check: Pass | MIT | |
| Code Review ChecklistshareAI-lab/learn-claude-code | 78k | 5 repos | ~1.1k | Automated safety check: Pass | MIT |
anthropics/skills
Guides the design and implementation of Model Context Protocol servers in TypeScript or Python, from tool naming and error messages to evaluation.
anthropics/skills
Handles everyday PDF jobs in Python and on the command line: extract text and tables, merge, split, rotate, watermark, fill forms, encrypt and OCR.
PleasePrompto/notebooklm-skill
Lets Claude Code ask questions of your Google NotebookLM notebooks through browser automation and return answers grounded in your uploaded sources.
browser-use/video-use
Produces math and technical explainer videos with Manim Community Edition: concept animations, equation derivations, algorithm walkthroughs and data stories.
shareAI-lab/learn-claude-code
Reviews code against a five-part checklist covering security, correctness, performance, maintainability and testing, and reports findings in a fixed format.
hugohe3/ppt-master
Generates editable PowerPoint decks, rebuilds slides from images, fills .pptx templates and polishes existing presentations through routed workflows.
IBM/ibm-watsonx-orchestrate-adk
A skill your agent uses when the user wants to analyze agent telemetry traces to find bugs and get fix recommendations — walks through exporting traces from a local or remote watsonx Orchestrate…
IBM/ibm-watsonx-orchestrate-adk
Build MCP servers for customer care agents following Watson Orchestrate specifications.
IBM/ibm-watsonx-orchestrate-adk
A skill your agent uses when building, testing, debugging, or publishing IBM watsonx Orchestrate agents, tools, flows, connections, knowledge bases, or custom models with the orchestrate CLI or ADK…
IBM/ibm-watsonx-orchestrate-adk
Evaluate an agent instructions or agent definition for achievability and produce a structured, evidence-backed report artifact with per-dimension scores, findings, deterministic signals, and…
IBM/ibm-watsonx-orchestrate-adk
Expert guidance for creating high-level solution architecture documents from business requirements, use cases, or problem statements.
IBM/ibm-watsonx-orchestrate-adk
Expert guidance for building a Standard Operating Procedure (SOP) from a workflow diagram, Langflow JSON, n8n JSON, BPMN model or workflow description.
Works with
Analyzes IBM watsonx Orchestrate agentic workflow artefacts (JSON or Python @flow) and returns prioritised architecture recommendations grouped by impact. Agentic Workflow Advisor is an agent skill from IBM/ibm-watsonx-orchestrate-adk, published by the product's own GitHub organization. Analyzes IBM watsonx Orchestrate agentic workflow artefacts (JSON or Python @flow) and returns prioritised architecture recommendations grouped by impact.
Agentic Workflow Advisor fits situations like: the user wants to review; audit a workflow for performance issues; routing failures; design best practices.
Run `npx skills add IBM/ibm-watsonx-orchestrate-adk --skill agentic-workflow-advisor -a claude-code`. Or copy the skill folder (skills/agentic-workflow-advisor in IBM/ibm-watsonx-orchestrate-adk) into .claude/skills/agentic-workflow-advisor in your project. Claude Code loads it when a task matches its description.
Run `npx skills add IBM/ibm-watsonx-orchestrate-adk --skill agentic-workflow-advisor -a codex`. Or copy the skill folder (skills/agentic-workflow-advisor in IBM/ibm-watsonx-orchestrate-adk) into .agents/skills/agentic-workflow-advisor in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add IBM/ibm-watsonx-orchestrate-adk --skill agentic-workflow-advisor -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/agentic-workflow-advisor, .gemini/skills/agentic-workflow-advisor, .github/skills/agentic-workflow-advisor and .opencode/skills/agentic-workflow-advisor in your project.
Going by SKILL.md and its folder, Agentic Workflow Advisor needs Python for the scripts in its folder and the command-line tools its instructions call (kind and python3). Our summary lists: Python 3.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Agentic Workflow Advisor is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 10k tokens (SKILL.md is roughly 42k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Agentic Workflow Advisor: MCP Server Builder (anthropics/skills, 180k stars), PDF Processing (anthropics/skills, 180k stars), NotebookLM Research Assistant (PleasePrompto/notebooklm-skill, 7.8k stars) and Manim Video Production (browser-use/video-use, 28k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
IBM (a GitHub organization, an official publisher) maintains it in IBM/ibm-watsonx-orchestrate-adk, which has 178 GitHub stars. The repository holds 8 skills in this directory. The repository was last updated on October 7, 2026.
Source: IBM/ibm-watsonx-orchestrate-adk on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.