Forward Skill
Skill: /forward
MCP Server: forward-mcp
Source: https://github.com/forwardnetworks/forward-mcp
Use When
Use this skill for Forward snapshot assurance, collection, and analysis:
- Discover Forward networks, snapshots, and devices
- Verify paths and reachability
- Discover and run NQE checks
- Review predefined checks, failed checks, and vulnerability analysis
- Compare NQE, snapshot, and config diffs
- Search configurations
- Analyze blast radius for a source location to destination IPv4 subnets
- Review hardware and OS lifecycle support
- Find missing devices inferred during collection
- Support lab or real-network collection workflows
Startup
- Start with
get_default_settings to see configured defaults.
- If no default network is set, use
list_networks with a small limit and ask
the user which network to use.
- Prefer explicit
network_id and snapshot_id values for repeatable results.
- Use bounded limits by default. Use
all_results only when the user needs the
complete dataset.
- In Forward SaaS, prefer
FORWARD_API_BASE_URL=https://fwd.app and set
FORWARD_INSTANCE_ID for local cache partitioning when multiple SaaS orgs or
accounts are used on the same NetClaw host.
Tool Routing
| User intent |
Preferred tools |
| "List Forward networks" |
list_networks |
| "Use this network by default" |
set_default_network |
| "Show collection sources" |
list_classic_devices, get_classic_device |
| "Add lab devices" |
upsert_classic_devices |
| "Show collector status" |
get_collector_status |
| "Start collection" |
start_collection_task, get_collector_task, then wait_for_latest_snapshot; use start_collection only for legacy flows |
| "Show snapshots" |
list_snapshots, get_latest_snapshot |
| "List devices" |
list_devices, get_device_basic_info |
| "Find missing collection neighbors" |
get_missing_devices |
| "Trace paths" |
search_paths_bulk, then search_paths for one-off traces |
| "Trace app-aware paths" |
list_l7_applications, then search_paths_bulk or search_paths with app_id, url, or domain |
| "Show blast radius" |
suggest_blast_radius_sources, then get_blast_radius |
| "Find NQE checks" |
search_nqe_queries, list_nqe_queries |
| "Run an NQE check" |
run_nqe_query_by_id; use start_nqe_query for long-running checks |
| "Write or run ad-hoc NQE" |
Prefer search_nqe_queries first; use run_nqe_query only when no built-in query fits and async NQE for long-running or large results |
| "Show predefined checks" |
list_predefined_checks |
| "Show failed checks or intent status" |
list_checks, then get_check |
| "Show vulnerabilities or CVE exposure" |
search_nqe_queries, then run_nqe_query_by_id with the /Security/CVEs/... query IDs |
| "Draw topology from Forward" |
get_snapshot_topology, then search NQE for CDP/LLDP and protocol-peer evidence when needed |
| "Summarize large results" |
get_nqe_result_summary, get_nqe_result_chunks, analyze_nqe_result_sql |
| "Search configs" |
search_configs |
| "Compare NQE or intent/check results" |
get_nqe_diff |
| "Summarize snapshot diffs" |
get_snapshot_diff_summary |
| "Show route, ACL, NAT, interface, check, or vulnerability diffs" |
get_snapshot_diff |
| "Compare snapshots/configs" |
get_config_diff |
| "Check hardware or OS support" |
get_device_hardware, get_hardware_support, get_os_support |
| "Show locations" |
list_locations, get_device_locations |
NQE Discovery Notes
Forward MCP owns the NQE catalog. Do not copy catalog contents into NetClaw.
For natural-language NQE requests:
- Prefer first-class tools when they match the intent, such as
get_device_basic_info, get_device_hardware, get_hardware_support, or
get_os_support.
- Otherwise use
search_nqe_queries with the user's intent.
- Use
list_nqe_queries only when the directory or query family is already
known.
- Preserve the returned
FQ_... query ID in the answer and execute it with
run_nqe_query_by_id.
- Keep limits bounded unless the user asks for complete data.
Use run_nqe_query for ad-hoc NQE source only after checking whether a
built-in query already answers the question and the expected result fits a
bounded synchronous call. For long-running or large queries, use
start_nqe_query, poll get_nqe_query_status, then fetch rows with
get_nqe_query_result. These execute raw NQE or query IDs through Forward's
native NQE APIs; they do not create or save a new query in the NQE Library. Keep
ad-hoc queries narrow, set limits by default, and explain when the result is
from custom source rather than a built-in Forward query. Use all_results: true
only when the user needs the complete table.
Constructing Ad-Hoc NQE
Prefer built-in query IDs when they fit. When a question needs raw NQE, build it
incrementally and execute it through Forward MCP:
- Start with a tiny selector such as
foreach d in network.devices select { Name: d.name }.
- Add one model surface at a time, then run
start_nqe_query, poll
get_nqe_query_status, and page with get_nqe_query_result.
- Keep filters inside NQE instead of post-processing large result sets.
- Use schema-native types and OneOf patterns. Enumerations can be compared as
NatType.LB; data-bearing OneOf values use when ... is.
Useful raw NQE patterns:
On-prem load balancer VIPs, DNAT-style rewrites, and backend targets:
foreach device in network.devices
foreach natEntry in device.natEntries
where natEntry.natType == NatType.LB
foreach rewrite in natEntry.rewrites
select {
LoadBalancer: device.name,
Vip: natEntry.headerMatches.ipv4Dst,
Ports: natEntry.headerMatches.tpDst,
Backends: rewrite.ipv4Dst,
BackendPorts: rewrite.tpDst
}
Other VIPs in the same subnet:
targetSubnet = ipSubnet("110.240.240.0/24");
foreach device in network.devices
foreach natEntry in device.natEntries
where natEntry.natType == NatType.LB
foreach vip in natEntry.headerMatches.ipv4Dst
where vip in targetSubnet
foreach rewrite in natEntry.rewrites
select {
LoadBalancer: device.name,
Vip: vip,
Ports: natEntry.headerMatches.tpDst,
Backends: rewrite.ipv4Dst
}
Cloud VPC load balancers:
foreach cloudAccount in network.cloudAccounts
foreach vpc in cloudAccount.vpcs
foreach loadBalancer in vpc.loadBalancers
foreach rule in loadBalancer.loadBalancerRules
foreach backend in rule.backends
let server = when backend is
server(backendServerData) -> backendServerData;
otherwise -> null : BackendServer
where isPresent(server)
select {
CloudAccount: cloudAccount.name,
Vpc: vpc.name,
LoadBalancer: loadBalancer.name,
FrontendIps: rule.frontendIps,
FrontendPorts: rule.frontendPorts,
BackendIps: server.backendIps,
BackendPorts: server.backendPorts
}
VIP route propagation:
targetVip = ipSubnet("110.240.240.240/32");
foreach device in network.devices
foreach vrf in device.networkInstances
where isPresent(vrf.afts.ipv4Unicast)
foreach route in vrf.afts.ipv4Unicast.ipEntries
where targetVip in route.prefix
where length(route.prefix) >= 24
foreach nextHop in route.nextHops
select {
Device: device.name,
Vrf: vrf.name,
Prefix: route.prefix,
OriginProtocol: nextHop.originProtocol,
NextHopType: nextHop.nextHopType,
NextHopIp: nextHop.ipAddress,
Interface: nextHop.interfaceName
}
For topology, start with get_snapshot_topology for native directed links.
Then search for both link evidence and protocol-peer evidence when needed.
CDP/LLDP can describe physical neighbors; peer queries such as BGP can describe
relationships Forward models beyond discovery protocols.
If search_nqe_queries or list_nqe_queries reports that the query index is
empty, do this only in a persistent OpenClaw session and only after user
confirmation:
- Run
hydrate_database with regenerate_embeddings: false.
- Run
refresh_query_index.
- Retry
search_nqe_queries or list_nqe_queries.
Safety Rules
Default to read-only Forward tools. Require explicit human confirmation before
tools that create, update, delete, clear, hydrate, rebuild, start/cancel
collection, or set persistent defaults. This includes collector/source,
credential, network, snapshot, location, entity/relation, observation, local
cache/index, and set_default_network operations. Creating new Forward
networks requires full org admin privileges; do not use create_network unless
the user explicitly confirms that role. Updating an existing Forward network
requires network admin privileges.
Never put Forward credentials in repository files. Use ~/.openclaw/.env.
For private CA deployments, use FORWARD_CA_CERT_PATH; do not disable TLS
verification.
Workflows
Diffs
- Use
get_snapshot_diff_summary first for a bounded overview.
- Use
get_snapshot_diff for focused route, ACL, NAT, interface, check,
file/config, inventory-query, routing-loop, or vulnerability diffs.
- Use
get_nqe_diff for arbitrary NQE and intent-style query diffs.
- Use
get_config_diff when the user specifically asks for config text drift.
Blast Radius
- Use
suggest_blast_radius_sources if the source name or location filter is
uncertain.
- Use
get_blast_radius with source_device for a device source, or source
when the prompt already supplies Forward LocationFilter JSON.
- Keep
dst_subnets, timeout_seconds, and paging_options bounded.
- Use blast radius for security/exposure questions; use NQE for tabular
snapshot facts and
search_paths_bulk for specific path traces.
Checks and CVEs
- Use
list_checks with statuses such as FAIL, WARN, or ERROR to
triage intent/check state for a snapshot.
- Use
get_check for the detailed rows behind a specific failed check.
- Use
list_predefined_checks when the user asks what built-in checks exist.
- Use NQE for CVE posture. Prefer
search_nqe_queries for natural-language
discovery, then run_nqe_query_by_id.
- Useful built-in CVE query paths include
/Security/CVEs/CVE violations by CVE, /Security/CVEs/CVE violations by device,
/Security/CVEs/CVE violation details by device, and
/Security/CVEs/Vendor CVE metadata.
- Use
get_nqe_diff for CVE query drift between snapshots. Use
get_snapshot_diff with diff_type: "vulnerabilities" for the Forward
vulnerability diff domain.
Collection and Lab Demo
- Treat collection setup and start/cancel actions as admin workflows.
- Use them only on lab/admin networks or after explicit user confirmation.
- Treat collector installation/onboarding as a separate prerequisite. Anyone
can install or onboard a collector, but a network admin must assign that
collector to the target network. The stable Linux collector download URL is
https://fwd.app/api/software/client?type=LINUX.
- Before starting collection, run
get_collector_status and
list_classic_devices.
- Prefer
start_collection_task, poll it with get_collector_task, then use
wait_for_latest_snapshot. Use start_collection only when task creation is
unavailable in the target deployment.
Topology Drawing
- Prefer Forward NQE evidence for collected topology questions: link queries
plus relevant protocol-peer queries.
- If the NQE result only shows management-plane neighbors or incomplete links in
a real or emulated network, use the originating topology source as the edge
source and Forward as the collected assurance source.
- Use the available lab backend, source-of-truth, inventory, or discovery tool
to identify device names, management IPs, physical links, and credentials
before Forward collection.
- Before
start_collection, confirm the assigned Forward collector can reach
the target management network. If not, the missing step is collector
installation, assignment, or routing.
- Render a normalized node/edge list with Draw.io, Markmap, or another diagram
skill. Never infer links from names or management IPs alone.
Result Discipline
- Summarize large tables before presenting them.
- Preserve network IDs, snapshot IDs, query IDs, and device names in the answer.
- When a path or NQE result is inconclusive, say what data was missing and which
next read-only Forward tool should be run.
- For config and NQE diffs, separate intended changes from unexpected changes.
- For snapshot diffs, start with counts/summary and drill into the changed
domain that matters.
1---2name: forward3description: Forward snapshot assurance, path search, app-aware path search, NQE, checks, vulnerabilities, diffs, configuration, lifecycle, collection, and topology workflows through the upstream forward-mcp server.4license: Apache-2.05---6
7# Forward Skill
8
9**Skill**: `/forward`
10**MCP Server**: `forward-mcp`
11**Source**: <https://github.com/forwardnetworks/forward-mcp>
12
13## Use When
14
15Use this skill for Forward snapshot assurance, collection, and analysis:
16
17- Discover Forward networks, snapshots, and devices
18- Verify paths and reachability
19- Discover and run NQE checks
20- Review predefined checks, failed checks, and vulnerability analysis
21- Compare NQE, snapshot, and config diffs
22- Search configurations
23- Analyze blast radius for a source location to destination IPv4 subnets
24- Review hardware and OS lifecycle support
25- Find missing devices inferred during collection
26- Support lab or real-network collection workflows
27
28## Startup
29
301. Start with `get_default_settings` to see configured defaults.
312. If no default network is set, use `list_networks` with a small limit and ask
32 the user which network to use.
333. Prefer explicit `network_id` and `snapshot_id` values for repeatable results.
344. Use bounded limits by default. Use `all_results` only when the user needs the
35 complete dataset.
365. In Forward SaaS, prefer `FORWARD_API_BASE_URL=https://fwd.app` and set
37 `FORWARD_INSTANCE_ID` for local cache partitioning when multiple SaaS orgs or
38 accounts are used on the same NetClaw host.
39
40## Tool Routing
41
42| User intent | Preferred tools |
43|-------------|-----------------|
44| "List Forward networks" | `list_networks` |
45| "Use this network by default" | `set_default_network` |
46| "Show collection sources" | `list_classic_devices`, `get_classic_device` |
47| "Add lab devices" | `upsert_classic_devices` |
48| "Show collector status" | `get_collector_status` |
49| "Start collection" | `start_collection_task`, `get_collector_task`, then `wait_for_latest_snapshot`; use `start_collection` only for legacy flows |
50| "Show snapshots" | `list_snapshots`, `get_latest_snapshot` |
51| "List devices" | `list_devices`, `get_device_basic_info` |
52| "Find missing collection neighbors" | `get_missing_devices` |
53| "Trace paths" | `search_paths_bulk`, then `search_paths` for one-off traces |
54| "Trace app-aware paths" | `list_l7_applications`, then `search_paths_bulk` or `search_paths` with `app_id`, `url`, or `domain` |
55| "Show blast radius" | `suggest_blast_radius_sources`, then `get_blast_radius` |
56| "Find NQE checks" | `search_nqe_queries`, `list_nqe_queries` |
57| "Run an NQE check" | `run_nqe_query_by_id`; use `start_nqe_query` for long-running checks |
58| "Write or run ad-hoc NQE" | Prefer `search_nqe_queries` first; use `run_nqe_query` only when no built-in query fits and async NQE for long-running or large results |
59| "Show predefined checks" | `list_predefined_checks` |
60| "Show failed checks or intent status" | `list_checks`, then `get_check` |
61| "Show vulnerabilities or CVE exposure" | `search_nqe_queries`, then `run_nqe_query_by_id` with the `/Security/CVEs/...` query IDs |
62| "Draw topology from Forward" | `get_snapshot_topology`, then search NQE for CDP/LLDP and protocol-peer evidence when needed |
63| "Summarize large results" | `get_nqe_result_summary`, `get_nqe_result_chunks`, `analyze_nqe_result_sql` |
64| "Search configs" | `search_configs` |
65| "Compare NQE or intent/check results" | `get_nqe_diff` |
66| "Summarize snapshot diffs" | `get_snapshot_diff_summary` |
67| "Show route, ACL, NAT, interface, check, or vulnerability diffs" | `get_snapshot_diff` |
68| "Compare snapshots/configs" | `get_config_diff` |
69| "Check hardware or OS support" | `get_device_hardware`, `get_hardware_support`, `get_os_support` |
70| "Show locations" | `list_locations`, `get_device_locations` |
71
72## NQE Discovery Notes
73
74Forward MCP owns the NQE catalog. Do not copy catalog contents into NetClaw.
75For natural-language NQE requests:
76
771. Prefer first-class tools when they match the intent, such as
78 `get_device_basic_info`, `get_device_hardware`, `get_hardware_support`, or
79 `get_os_support`.
802. Otherwise use `search_nqe_queries` with the user's intent.
813. Use `list_nqe_queries` only when the directory or query family is already
82 known.
834. Preserve the returned `FQ_...` query ID in the answer and execute it with
84 `run_nqe_query_by_id`.
855. Keep limits bounded unless the user asks for complete data.
86
87Use `run_nqe_query` for ad-hoc NQE source only after checking whether a
88built-in query already answers the question and the expected result fits a
89bounded synchronous call. For long-running or large queries, use
90`start_nqe_query`, poll `get_nqe_query_status`, then fetch rows with
91`get_nqe_query_result`. These execute raw NQE or query IDs through Forward's
92native NQE APIs; they do not create or save a new query in the NQE Library. Keep
93ad-hoc queries narrow, set limits by default, and explain when the result is
94from custom source rather than a built-in Forward query. Use `all_results: true`
95only when the user needs the complete table.
96
97### Constructing Ad-Hoc NQE
98
99Prefer built-in query IDs when they fit. When a question needs raw NQE, build it
100incrementally and execute it through Forward MCP:
101
1021. Start with a tiny selector such as
103 `foreach d in network.devices select { Name: d.name }`.
1042. Add one model surface at a time, then run `start_nqe_query`, poll
105 `get_nqe_query_status`, and page with `get_nqe_query_result`.
1063. Keep filters inside NQE instead of post-processing large result sets.
1074. Use schema-native types and OneOf patterns. Enumerations can be compared as
108 `NatType.LB`; data-bearing OneOf values use `when ... is`.
109
110Useful raw NQE patterns:
111
112On-prem load balancer VIPs, DNAT-style rewrites, and backend targets:
113
114```nqe
115foreach device in network.devices
116foreach natEntry in device.natEntries
117where natEntry.natType == NatType.LB
118foreach rewrite in natEntry.rewrites
119select {
120 LoadBalancer: device.name,
121 Vip: natEntry.headerMatches.ipv4Dst,
122 Ports: natEntry.headerMatches.tpDst,
123 Backends: rewrite.ipv4Dst,
124 BackendPorts: rewrite.tpDst
125}
126```
127
128Other VIPs in the same subnet:
129
130```nqe
131targetSubnet = ipSubnet("110.240.240.0/24");
132foreach device in network.devices
133foreach natEntry in device.natEntries
134where natEntry.natType == NatType.LB
135foreach vip in natEntry.headerMatches.ipv4Dst
136where vip in targetSubnet
137foreach rewrite in natEntry.rewrites
138select {
139 LoadBalancer: device.name,
140 Vip: vip,
141 Ports: natEntry.headerMatches.tpDst,
142 Backends: rewrite.ipv4Dst
143}
144```
145
146Cloud VPC load balancers:
147
148```nqe
149foreach cloudAccount in network.cloudAccounts
150foreach vpc in cloudAccount.vpcs
151foreach loadBalancer in vpc.loadBalancers
152foreach rule in loadBalancer.loadBalancerRules
153foreach backend in rule.backends
154let server = when backend is
155 server(backendServerData) -> backendServerData;
156 otherwise -> null : BackendServer
157where isPresent(server)
158select {
159 CloudAccount: cloudAccount.name,
160 Vpc: vpc.name,
161 LoadBalancer: loadBalancer.name,
162 FrontendIps: rule.frontendIps,
163 FrontendPorts: rule.frontendPorts,
164 BackendIps: server.backendIps,
165 BackendPorts: server.backendPorts
166}
167```
168
169VIP route propagation:
170
171```nqe
172targetVip = ipSubnet("110.240.240.240/32");
173foreach device in network.devices
174foreach vrf in device.networkInstances
175where isPresent(vrf.afts.ipv4Unicast)
176foreach route in vrf.afts.ipv4Unicast.ipEntries
177where targetVip in route.prefix
178where length(route.prefix) >= 24
179foreach nextHop in route.nextHops
180select {
181 Device: device.name,
182 Vrf: vrf.name,
183 Prefix: route.prefix,
184 OriginProtocol: nextHop.originProtocol,
185 NextHopType: nextHop.nextHopType,
186 NextHopIp: nextHop.ipAddress,
187 Interface: nextHop.interfaceName
188}
189```
190
191For topology, start with `get_snapshot_topology` for native directed links.
192Then search for both link evidence and protocol-peer evidence when needed.
193CDP/LLDP can describe physical neighbors; peer queries such as BGP can describe
194relationships Forward models beyond discovery protocols.
195
196If `search_nqe_queries` or `list_nqe_queries` reports that the query index is
197empty, do this only in a persistent OpenClaw session and only after user
198confirmation:
199
2001. Run `hydrate_database` with `regenerate_embeddings: false`.
2012. Run `refresh_query_index`.
2023. Retry `search_nqe_queries` or `list_nqe_queries`.
203
204## Safety Rules
205
206Default to read-only Forward tools. Require explicit human confirmation before
207tools that create, update, delete, clear, hydrate, rebuild, start/cancel
208collection, or set persistent defaults. This includes collector/source,
209credential, network, snapshot, location, entity/relation, observation, local
210cache/index, and `set_default_network` operations. Creating new Forward
211networks requires full org admin privileges; do not use `create_network` unless
212the user explicitly confirms that role. Updating an existing Forward network
213requires network admin privileges.
214
215Never put Forward credentials in repository files. Use `~/.openclaw/.env`.
216For private CA deployments, use `FORWARD_CA_CERT_PATH`; do not disable TLS
217verification.
218
219## Workflows
220
221### Diffs
222
2231. Use `get_snapshot_diff_summary` first for a bounded overview.
2242. Use `get_snapshot_diff` for focused route, ACL, NAT, interface, check,
225 file/config, inventory-query, routing-loop, or vulnerability diffs.
2263. Use `get_nqe_diff` for arbitrary NQE and intent-style query diffs.
2274. Use `get_config_diff` when the user specifically asks for config text drift.
228
229### Blast Radius
230
2311. Use `suggest_blast_radius_sources` if the source name or location filter is
232 uncertain.
2332. Use `get_blast_radius` with `source_device` for a device source, or `source`
234 when the prompt already supplies Forward `LocationFilter` JSON.
2353. Keep `dst_subnets`, `timeout_seconds`, and `paging_options` bounded.
2364. Use blast radius for security/exposure questions; use NQE for tabular
237 snapshot facts and `search_paths_bulk` for specific path traces.
238
239### Checks and CVEs
240
2411. Use `list_checks` with `statuses` such as `FAIL`, `WARN`, or `ERROR` to
242 triage intent/check state for a snapshot.
2432. Use `get_check` for the detailed rows behind a specific failed check.
2443. Use `list_predefined_checks` when the user asks what built-in checks exist.
2454. Use NQE for CVE posture. Prefer `search_nqe_queries` for natural-language
246 discovery, then `run_nqe_query_by_id`.
2475. Useful built-in CVE query paths include `/Security/CVEs/CVE violations by
248 CVE`, `/Security/CVEs/CVE violations by device`,
249 `/Security/CVEs/CVE violation details by device`, and
250 `/Security/CVEs/Vendor CVE metadata`.
2516. Use `get_nqe_diff` for CVE query drift between snapshots. Use
252 `get_snapshot_diff` with `diff_type: "vulnerabilities"` for the Forward
253 vulnerability diff domain.
254
255### Collection and Lab Demo
256
2571. Treat collection setup and start/cancel actions as admin workflows.
2582. Use them only on lab/admin networks or after explicit user confirmation.
2593. Treat collector installation/onboarding as a separate prerequisite. Anyone
260 can install or onboard a collector, but a network admin must assign that
261 collector to the target network. The stable Linux collector download URL is
262 `https://fwd.app/api/software/client?type=LINUX`.
2634. Before starting collection, run `get_collector_status` and
264 `list_classic_devices`.
2655. Prefer `start_collection_task`, poll it with `get_collector_task`, then use
266 `wait_for_latest_snapshot`. Use `start_collection` only when task creation is
267 unavailable in the target deployment.
268
269### Topology Drawing
270
2711. Prefer Forward NQE evidence for collected topology questions: link queries
272 plus relevant protocol-peer queries.
2732. If the NQE result only shows management-plane neighbors or incomplete links in
274 a real or emulated network, use the originating topology source as the edge
275 source and Forward as the collected assurance source.
2763. Use the available lab backend, source-of-truth, inventory, or discovery tool
277 to identify device names, management IPs, physical links, and credentials
278 before Forward collection.
2794. Before `start_collection`, confirm the assigned Forward collector can reach
280 the target management network. If not, the missing step is collector
281 installation, assignment, or routing.
2825. Render a normalized node/edge list with Draw.io, Markmap, or another diagram
283 skill. Never infer links from names or management IPs alone.
284
285## Result Discipline
286
287- Summarize large tables before presenting them.
288- Preserve network IDs, snapshot IDs, query IDs, and device names in the answer.
289- When a path or NQE result is inconclusive, say what data was missing and which
290 next read-only Forward tool should be run.
291- For config and NQE diffs, separate intended changes from unexpected changes.
292- For snapshot diffs, start with counts/summary and drill into the changed
293 domain that matters.