swmm-network — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited swmm-network (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Part of Agentic SWMM — install the project first for the executable toolchain (aiswmm CLI, SWMM solver, MCP servers).
prepare_storm_inputs → infer_outfall → reorient_pipes → import_city_network → qa) for typical city storm-pipe + manhole layers that arrive as bare LineString shapefiles.import_city_network directly, or import_network for a fully field-mapped GeoJSON/CSV) when the source already contains explicit from/to nodes, inverts, and diameters.assign_subcatchment_outlets) that ensures surface runoff actually enters the pipe network at a real upstream junction rather than dumping straight to the outfall.qa).summary).export_inp).Use when a SWMM model needs a real pipe network. Specifically:
swmm-builder.Do not use this skill when the user only wants subcatchment delineation (use swmm-gis) or only wants to run a finished INP (use swmm-runner).
mcp/swmm-network/server.js exposes nine tools. Pick by what stage of the pipeline you're at.
<municipal>StormGravityMain.shp (+ optional <municipal>StormManhole.shp) to a basin polygon and emit pipes.geojson, manholes.geojson, and a filled mapping.json from a template.pipesShpPath, manholesShpPath (optional), basinClipGeojsonPath, mappingTemplatePath, outDir, caseName, sourceDescription, diameterPolicy (optional).templates/city_mapping_raw_shapefile.template.json as the mapping template.import_city_network infers separate junctions for drifting endpoints and the network ends up as disconnected fragments. Also drops pipes whose two endpoints collapse into the same cluster (self-loop conduits that SWMM rejects).pipesGeojsonPath, toleranceM, outPath.pipes_in / pipes_out / pipes_dropped_as_self_loops / clusters_merged / max_snap_distance_m.endpoint_nearest_watercourse (default; needs a watercourse GeoJSON).lowest_endpoint (uses min y, no watercourse needed; assumes a projected, north-positive CRS).pipesGeojsonPath, watercourseGeojsonPath (mode-dependent), mode, outPath.node_id=OUT1, type=FREE, invert_elev=0.0).from_node/to_node assignments.pipesGeojsonPath, outfallsGeojsonPath, outPath, coordinatePrecision (default 3).pipes_reversed, pipes_unreached so connectivity gaps are visible.network.json with inferred junctions if needed.pipesCsvPath OR pipesGeojsonPath, outfallsCsvPath OR outfallsGeojsonPath, optional junctions, mappingPath, outputPath.templates/README.md (raw-shapefile vs structured-export shapes).import_city_network for new work.outlet column of a subcatchments CSV so each subcatchment drains into a real upstream node (not the literal outfall). Without this step the pipe network sits idle in the SWMM model.subcatchmentsCsvIn, subcatchmentsGeojson, outCsv, mode.nearest_junction (default; needs networkJsonPath)nearest_catch_basin (needs candidatesGeojsonPath + candidatesIdField)manual_lookup (needs lookupCsvPath with columns subcatchment_id,outlet_node_id)networkJsonPath or inpPath (provide exactly one). inpPath runs the same checks on a SWMM .inp via inp_to_network.py — use it to QA a SWMManywhere-synthesized model (which emits an INP but no network.json) or any INP-only path, so structural QA is uniform across the real-data and synth paths. Returns a structured QA report (warnings include isolated_node, no_outfall_path, missing inverts, etc.). CLI: python3 scripts/network_qa.py --inp <model.inp>.network.json to SWMM INP sections (junctions/outfalls/conduits/xsections/coordinates). Args: networkJsonPath. Used internally by swmm-builder; rarely called directly by an agent.networkJsonPath. For diagnostics.For a raw municipal shapefile dataset, the canonical chain is:
prepare_storm_inputs → pipes.geojson + manholes.geojson + mapping.json
snap_pipe_endpoints → pipes_snapped.geojson (heal vertex drift; also drops self-loop pipes)
infer_outfall → outfalls.geojson
reorient_pipes → pipes_oriented.geojson
import_city_network → network.json
qa → ok / warnings
assign_subcatchment_outlets → subcatchments_routed.csv (required if subcatchments came from swmm-gis basin_shp_to_subcatchments)
↓
hand off to swmm-builder.build_inpFor a structured CAD export with explicit from/to nodes, skip prepare_storm_inputs/infer_outfall/reorient_pipes and call import_city_network directly with the CSVs.
templates/city_mapping_raw_shapefile.template.json — fully-specified mapping for raw LineString-only pipe shapefiles. The adapter infers junctions from endpoints. Used by the prepare_storm_inputs chain.templates/README.md — decision walkthrough between the two mapping shapes.examples/city-dual-system/mapping.json — fully-specified mapping for structured exports with explicit from/to/x/y/invert columns.examples/import-mapping.json + examples/import-junctions.geojson etc. — example inputs for the older import_network path.scripts/prepare_storm_inputs.py — backs prepare_storm_inputs.scripts/infer_outfall.py — backs infer_outfall.scripts/reorient_pipes.py — backs reorient_pipes.scripts/city_network_adapter.py — backs import_city_network.scripts/network_import.py — backs import_network.scripts/assign_subcatchment_outlets.py — backs assign_subcatchment_outlets.scripts/network_qa.py — backs qa.scripts/network_to_inp.py — backs export_inp.scripts/minimal_stub_network.py — emits a 1-junction + 1-outfall stub network.json from a subcatchment shapefile that carries OUTLET/X/Y attrs. Use only for real-data smoke tests when no pipe-network geometry exists yet; the resulting network must not be treated as a calibrated drainage system.scripts/schema/network_model.schema.json — stable schema target.J_AUTO_<x>p<y> IDs for inferred junctions.BACKLOG.md F12.infer_outfall always emits exactly one outfall (OUT1). Multi-outfall networks need a follow-up tool.snap_pipe_endpoints only heals vertex drift, not physically missing pipes. If a basin clip cuts out a trunk sewer that connects two sub-graphs, the sub-graphs remain disconnected. A future "buffered basin clip" feature in prepare_storm_inputs would address this.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.