Compound tools
Pack tools usually map 1:1 to an upstream API call. Compound tools bundle multiple underlying calls — across packs — into a single response. They’re how Pipeworx turns “I need 5 things about X” into one round trip.
By convention, compound tools live in packs ending in -intel (housing-intel, fintech-intel, pharma-intel, govcon-intel, trade-intel, supply-chain-intel).
Where to find them: each of the five domain -intel packs is mounted in full on its matching vertical — ?vertical=housing gives you all ten housing-intel tools, ?vertical=pharma all six pharma-intel tools, and so on. That was only made true on 2026-08-11; before then several verticals carried a partial set or none of their own compounds, so if you connected earlier and concluded a compound didn’t exist, re-check. supply-chain-intel is not in a vertical — reach it on the full gateway or by pack path.
How they work
The pack receives one input, fans out to N upstream calls in parallel (via Promise.all, with a per-sub-call timeout so one slow upstream can’t stall the whole response), and merges the results into a single structured object with per-source provenance:
fintech_company_deep_dive({ ticker: "AAPL" })
Internally (verified live 2026-08-10):
- In parallel:
edgar_ticker_to_cik(CIK) +edgar_company_filings(recent 10-Ks) +cfpb_company_complaints+sec_8k_recent(material-event triage) +finra.short_volume_daily - If you pass
_avKey:av_quote+av_overview+av_income_statement(Alpha Vantage), in parallel - If you pass
_fredKey: fed funds rate + 10Y Treasury (FRED), in parallel - Merge results into one response, keyed by source, with
unavailable/reasonon any leg that failed
AlphaVantage and FRED are optional — omit the keys and you still get EDGAR + CFPB + the 8-K/short-volume legs. A 2026-08 fix corrected a param-name bug (edgar_company_filings wants ticker_or_cik/form_type, not ticker/type) that had made the sec_filings section silently unavailable on every call since the tool shipped (fleet #127) — a live call on 2026-08-10 confirms sec_filings now returns real filing data.
You wrote one tool call. The agent context grew by one transcript entry. The compound returns up to 8 sources’ worth of data depending on which optional keys you pass.
When to use a compound vs. individual tools
Compound when the task is “tell me about this entity” with a fixed set of dimensions. The compound’s structure is opinionated; you get a curated view.
Individual tools when you need fine control — different time windows, alternative concepts, specific HS codes, etc. Compound tools take simple inputs (ticker, drug name, NCT ID); they don’t expose every knob.
Currently available
Each -intel pack has grown past its original 1–2 tools — housing-intel alone is up to 10. The table below is what we’ve verified directly: a live call against most rows on 2026-08-10, plus the eight housing-intel rows added 2026-08-14 from a source read and a live tools/list. For the current, complete list on any pack, call get_pack_tools({slug: "housing-intel"}) or discover_tools({task: "..."}) rather than trusting a table to stay current.
| Compound tool | Pack | Inputs | Wraps |
|---|---|---|---|
housing_market_snapshot | housing-intel | metro_name (optional) | FRED + BLS + Zillow — not Census |
housing_property_report | housing-intel | _attomKey, address1, address2 | ATTOM only — not Altos or FEMA |
case_shiller_metro_compare | housing-intel | metros (array of names from the 20-city composite) | FRED Case-Shiller series, one per metro — level, 3m/12m change, peak, drawdown |
housing_affordability_check | housing-intel | metro (optional) | FRED (rate, median price) + HUD income limits → monthly payment and required income |
housing_rental_analysis | housing-intel | _attomKey, address1, address2, state | ATTOM rental AVM + HUD fair market rents + BLS CPI rent |
housing_employment_outlook | housing-intel | none | BLS — total, construction and residential-building employment, unemployment, openings |
housing_mortgage_history | housing-intel | none / date range | FRED — Freddie Mac PMMS weekly mortgage rate back to 1971 (not a price index) |
housing_market_screen | housing-intel | none | Zillow — ranks metros by gross rent yield (median rent × 12 ÷ typical home value) |
housing_metro_demand | housing-intel | metros | Census ACS — population + 5y growth, renter share, median income, unemployment, by CBSA |
housing_signal_scan | housing-intel | none | 45+ FRED/BLS indicators, flagged for anomalies and reversals |
trade_bilateral_analysis | trade-intel | reporter_code, partner_code (numeric ISO, not reporter/partner) | Comtrade + Census + FRED (optional). Treasury’s exchange-rate leg is currently returning unavailable on live calls (fleet #136/#137 partially fixed — Census and FRED work; Treasury doesn’t, verified 2026-08-10) |
trade_country_profile | trade-intel | country_code, not country | Comtrade only — not IMF or Census |
trade_macro_dashboard | trade-intel | none | Treasury + Census + BLS + IMF PortWatch + FRED (optional) |
fintech_company_deep_dive | fintech-intel | ticker | EDGAR + CFPB + sec-events (8-K triage) + FINRA (short volume), plus AlphaVantage + FRED if you pass their keys |
fintech_bank_health_check | fintech-intel | bank_name (not rssd_id) | FDIC + CFPB |
fintech_market_snapshot | fintech-intel | none | CFPB + FDIC, plus FRED macro (rates/spreads/VIX) if you pass _fredKey |
pharma_drug_profile | pharma-intel | drug_name | RxNorm + FDA (approvals/labels/events) + ClinicalTrials + PubMed + DailyMed |
pharma_safety_report | pharma-intel | drug_name | FDA (events/recalls/label text) + RxNorm. Explicitly returns drug_drug_interaction_check: {available: false} — Pipeworx has no interaction source (see prompts) |
pharma_pipeline_scan, pharma_pipeline_catalysts, pharma_sponsor_diligence, pharma_indication_landscape | pharma-intel | sponsor/condition | ClinicalTrials.gov + PubMed + FDA (pack has grown to 6 compound tools total) |
govcon_contractor_profile | govcon-intel | company_name (not “contractor name/duns” — no DUNS field) | SAM.gov + USAspending + SBIR |
govcon_opportunity_scan | govcon-intel | keywords — plural, required; optional set_aside | SAM.gov + USAspending + SBIR — not Federal Register |
govcon_agency_landscape | govcon-intel | agency | USAspending + SBIR |
supply_chain_risk | supply-chain-intel | ecosystem, package | deps.dev + OSV.dev + the ecosystem’s own registry (npm/PyPI/Cargo/Go) |
Cost model
A compound counts as 1 call against your daily quota, not N — it’s a single tools/call from the gateway’s point of view, metered at a flat per-pack credit cost: 5 for trade-intel, 10 for fintech-intel, pharma-intel, govcon-intel and supply-chain-intel, 50 for housing-intel (verified in pack source 2026-08-14; the authoritative number for any call is _meta.cost on the response). The sub-calls aren’t separate gateway requests at all: the compound pack imports the underlying packs and calls their callTool() functions directly, in-process, so they never touch the gateway’s own billing or rate-limit path a second time. Each upstream API still gets hit for every leg that runs, though — so the gateway-to-upstream traffic is several times a single call, scaling with however many legs the compound fans out to.
Building a custom compound
If you keep running the same 3-tool sequence:
- File via
pipeworx_feedback({type: "feature", message: "Compound tool for X"}) - Or chain manually using
Promise.allin your client and pass_meta.cache.fresh_untilthrough
The Pipeworx team adds compounds based on feedback signal — see meta-tools.