Citations with pipeworx:// URIs
Agents using Pipeworx should cite their sources. The standard pattern is to embed pipeworx:// Resource URIs in output. They’re stable, machine-resolvable, and survive tool changes.
The pattern
Agents do this:
Apple (EDGAR filings) reported revenue of $383.3B in FY 2023.
Not this:
Per a tool I called called edgar_company_filings with cik 0000320193, Apple’s revenue was $383.3B.
The first version is durable. Anyone (or any agent) can resources/read the URI and get the current state. The second version is just opaque text.
How agents discover URIs
Three paths:
From resolve_entity
resolve_entity({ type: "company", value: "AAPL" })
// → { resources: {
// edgar_filings: "pipeworx://edgar/company/0000320193/filings",
// edgar_facts: "pipeworx://edgar/company/0000320193/facts"
// }
// }
These URIs are ready to embed.
From the resource template list
resources/templates/list()
// → the current template list, which the agent can fill in itself
For example, the agent fills pipeworx://clinicaltrials/study/{nct_id} with an NCT it discovered earlier and embeds the URI in output.
From ask_pipeworx, when the routed tool has a template
ask_pipeworx puts a ready-to-embed URI in _meta.provenance.citation_uri:
ask_pipeworx({ question: "What SEC filings has Apple filed recently?" })
// → _meta.provenance.citation_uri === "pipeworx://edgar/company/AAPL/filings"
Treat this field as optional, and never as your check that the call worked.
It is present only when the tool the router happened to pick is one of the
templates below — 16 templates against a catalog of ~5,900 tools — so most answers
carry no citation_uri, and that is normal rather than a failure.
Absence is not even stable per question, because routing is not. Asking “What
is the current US unemployment rate?” five times in a row returns the FRED
series (pipeworx://fred/series/UNRATE/observations), the macro_snapshot
composite (no template, so no URI), or the BLS series — same question, different
tool, citation present or absent accordingly.
What is always present is the rest of _meta.provenance: source (the
publisher), upstream (the exact URL called) and replay (the arguments to
re-run it). Cite from those when citation_uri is missing.
Available templates
pipeworx://fred/series/{series_id}
pipeworx://fred/series/{series_id}/observations
pipeworx://clinicaltrials/study/{nct_id}
pipeworx://rxnorm/concept/{rxcui}
pipeworx://uspto/patent/{number}
pipeworx://edgar/company/{ticker_or_cik}/filings
pipeworx://edgar/company/{cik}/facts
pipeworx://edgar/company/{cik}/facts/{concept}
pipeworx://edgar/company/{cik}/filings/{accession}
pipeworx://edgar/company/{cik}
pipeworx://gleif/lei/{lei}
pipeworx://federal-register/document/{number}
pipeworx://semanticscholar/paper/{paper_id}
pipeworx://openalex/work/{work_id}
pipeworx://wikipedia/article/{title}
pipeworx://gutenberg/book/{book_id}
See Resources for the full list and how resources/read resolves them.
Citation styles
Inline (preferred for prose):
Per pipeworx://fred/series/MORTGAGE30US, the 30-year mortgage rate was 7.12% as of 2026-05-08.
Trailing reference list (preferred for structured reports):
Mortgage rate: 7.12%1
Both work. Pick one and stay consistent within a single output. The rate and date in these examples are illustrative — your call returns the current values.
What clients do with the URIs
MCP clients that support resources/read (Claude Desktop 1.0+, Cline, the Claude Agent SDK, raw JSON-RPC clients) can fetch the resource:
{
"jsonrpc": "2.0",
"id": 1,
"method": "resources/read",
"params": { "uri": "pipeworx://fred/series/MORTGAGE30US" }
}
The gateway dispatches to the underlying tool (fred_series_info in this case) and wraps the response in a resource envelope. So agents reading another agent’s output can re-verify any claim.
What about non-MCP clients?
Plain links to pipeworx.io/llms.txt or specific pack pages also work for general human readability. But within the MCP ecosystem, pipeworx:// URIs are first-class.
Avoid these citation antipatterns
- Don’t cite tool calls — agents shouldn’t say “I called fred_get_series with series_id=MORTGAGE30US”; that’s implementation detail. Cite the resource URI or the underlying source.
- Don’t paraphrase the source — if you say “per FRED” and the data was actually pulled from BLS, that’s wrong. Cite what you actually used.
- Don’t make up URIs — only embed
pipeworx://URIs that the gateway returned to you inresourcesblocks or viaresources/templates/list.
Footnotes
-
pipeworx://fred/series/MORTGAGE30US (FRED, U.S. Treasury, May 8 2026) ↩