xippios-usda-psd
Typed Python client, MCP server and FastAPI routes for USDA FAS PSD Online, part of the xippios SDK family. Names and semantics follow the upstream documentation; every response carries release metadata (source, endpoint, retrieved_at, published_at, vintage).
Install
uv add xippios-usda-psd # client only
uv add "xippios-usda-psd[mcp]" # + MCP server
uv add "xippios-usda-psd[http]" # + FastAPI router
Set DATA_GOV_API_KEY in the environment. Nothing is read from files.
30-second example
from xippios.usda.psd import get_data
from xippios.usda.psd.enums import AttributeId
result = get_data("0410000", 2023, "US") # wheat, market year 2023, United States
production = next(r for r in result.data if r.attribute_id == AttributeId.PRODUCTION)
production.value, production.unit_id # Decimal('49095.0'), 8 (UnitId._1000_MT)
result.meta.vintage # "2026-07": the PSD release that last revised these figures
result.meta.published_at # None: PSD gives a month, no day
result.meta.retrieved_at, result.meta.request
Codes are PSD's own (commodity 0410000 wheat, 0440000 corn, 2222000 soybeans;
country US, BR, E4), checked against the lists packaged in reference/ before any
call. Leave out the country for every country at once, or use get_world_data for the
world total. attribute_id and unit_id are PSD's integer ids; enums.AttributeId and
enums.UnitId name the packaged ones and compare equal to them. The MCP server returns
at most 200 rows per call, and every country at once is up to about 1,900 rows, so pass a
country there. get_release_dates tells when PSD last revised each country and market
year; compare it with a stored meta.vintage to fetch only what changed.
The list_* tasks look codes up in the packaged lists, without a call:
from xippios.usda.psd import list_commodities, list_countries
result = list_countries(region_code="R01") # PSD's region North America (list_regions)
[c.country_code for c in result.data] # ["CA", "GL", "MX", "SB", "US"], upstream order
result.meta.endpoint, result.meta.vintage # "PSDData_GetCountries", "2026-10-23" (fetched)
list_countries(search="united").data # TC, UK, US: code, name or GENC code, ignoring case
list_countries(search="usa").data # US United States, by its GENC code "USA"
list_commodities(search="soybean").data # meal, oil and oilseed, each also "(Local)"
meta.vintage of a list is the day the package fetched it (upstream gives these lists no
version), meta.retrieved_at when the task answered. Over MCP usda_psd_list_countries
stops at 200 of its 251 countries, before the United States; pass region_code or
search there.
The slices answer the common questions from the same operations. They select, order or pivot upstream's records and change none: no derived totals, no unit conversion, no gap filling.
from xippios.usda.psd import (
get_balance_sheet,
get_latest_release,
get_time_series,
get_top_countries,
)
from xippios.usda.psd.enums import AttributeId
sheet = get_balance_sheet("0410000", "US", 2023).data # wheat, United States, one request
list(sheet.attributes) # ["Area Harvested", "Beginning Stocks", "Production", ...], 15
sheet.attributes["Production"] # attribute_id=28, unit_id=8 (1000 MT), value=Decimal("49095.0")
series = get_time_series("0440000", "US", AttributeId.PRODUCTION, 2021, 2023) # 3 requests
[(r.market_year, r.value) for r in series.data] # one record per year with data, oldest first
top = get_top_countries("2222000", 2023, AttributeId.PRODUCTION, n=5) # soybeans, one request
[r.country_code for r in top.data] # largest first; "E4" (EU) and aggregates rank too
latest = get_latest_release("0410000") # the countries and market years of the newest release
latest.meta.vintage # "2026-10", comparable with get_data's meta.vintage
get_balance_sheet keys each entry by the attribute's upstream name; an id whose name
upstream gives to several ids ("Total Disappearance" is 126 and 173) always carries the
id, "Total Disappearance (126)", and each entry keeps its own unit_id.
get_time_series starts at 1960 at the earliest, spans at most 100 market years per
call, spends one request per market year,
leaves a year without data out, and counts against the hourly quota like every other
request.
get_top_countries excludes nothing: PSD's groupings (E4 European Union, T3 Africa,
NEC, ...) rank alongside countries; filter with list_countries if you must.
MCP
{
"mcpServers": {
"usda-psd": {
"command": "uvx",
"args": ["--from", "xippios-usda-psd[mcp]", "xippios-usda-psd-mcp"],
"env": { "DATA_GOV_API_KEY": "..." }
}
}
}
Tools are read-only and named usda_psd_<verb>_<noun>. Results are capped at
200 rows or 64 KB with a note on how to narrow the query. --http serves streamable
HTTP instead of stdio.
Status
| Upstream operation | Task function | MCP tool | Status |
|---|---|---|---|
PSDData_GetCountryCommodityDataByYear (commodity/{commodityCode}/country/{countryCode}/year/{marketYear}) |
get_data(commodity_code, market_year, country_code) |
usda_psd_get_data |
alpha |
PSDData_GetCommodityDataByYear (commodity/{commodityCode}/country/all/year/{marketYear}) |
get_data(commodity_code, market_year) |
usda_psd_get_data |
alpha |
PSDData_GetWorldCommodityDataByYear (commodity/{commodityCode}/world/year/{marketYear}) |
get_world_data(commodity_code, market_year) |
usda_psd_get_world_data |
alpha |
PSDData_GetDataReleaseInfo (commodity/{commodityCode}/dataReleaseDates) |
get_release_dates(commodity_code, market_year, country_code) |
usda_psd_get_release_dates |
alpha |
PSDData_GetCommodities (commodities) |
list_commodities(search) |
usda_psd_list_commodities |
packaged; list_* task |
PSDData_GetCountries (countries) |
list_countries(region_code, search) |
usda_psd_list_countries |
packaged; list_* task |
PSDData_GetRegions (regions) |
list_regions() |
usda_psd_list_regions |
packaged; list_* task |
PSDData_GetUnitsOfMeasure (unitsOfMeasure) |
list_units_of_measure() |
usda_psd_list_units_of_measure |
packaged; list_* task |
PSDData_GetCommodityAttributes (commodityAttributes) |
list_commodity_attributes(search) |
usda_psd_list_commodity_attributes |
packaged; list_* task |
The slices: task-shaped functions over the operations above, no new endpoint.
| Upstream operation | Task function | MCP tool | Example | Status |
|---|---|---|---|---|
PSDData_GetCountryCommodityDataByYear, one request |
get_balance_sheet(commodity_code, country_code, market_year) |
usda_psd_get_balance_sheet |
get_balance_sheet("0410000", "US", 2023): wheat US 2023 as one record, 15 attributes |
alpha |
PSDData_GetCountryCommodityDataByYear, one request per market year |
get_time_series(commodity_code, country_code, attribute_id, start_year, end_year) |
usda_psd_get_time_series |
get_time_series("0440000", "US", 28, 2021, 2023): US corn production, three years |
alpha |
PSDData_GetCommodityDataByYear, one request |
get_top_countries(commodity_code, market_year, attribute_id, n=10) |
usda_psd_get_top_countries |
get_top_countries("2222000", 2023, 28, n=5): the five largest soybean producers |
alpha |
PSDData_GetDataReleaseInfo, one request |
get_latest_release(commodity_code) |
usda_psd_get_latest_release |
get_latest_release("0410000"): what wheat's newest release revised; MCP returns at most 200 rows, a release adding a market year can exceed that (wheat 2026-10: 146), get_release_dates(commodity_code, market_year=..., country_code=...) returns any part in full |
alpha |
All twelve tasks are covered in 0.1.0, the first release. Alpha: the public surface may
change in a minor version before 1.0 (conventions §12); CHANGELOG.md lists every change.
Every request counts against api.data.gov's quota of 1,000 requests per hour per key,
shared by every package using the same DATA_GOV_API_KEY; the list_* tasks spend none.
The client keeps its own pace of one request per second; once the quota is spent it waits
for the quota to come back when that takes at most 30 s, and otherwise raises
RateLimitError with retry_after instead of sending.
Upstream terms and attribution
Data comes from USDA FAS PSD Online (https://apps.fas.usda.gov/psdonline/) under its own terms of use;
this package adds no rights to it. Documentation snapshot: docs/upstream/.
Licence
Apache-2.0. See LICENSE.
Metadata
Release files for xippios-usda-psd 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| xippios_usda_psd-0.1.0.tar.gz | 141.6 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| xippios_usda_psd-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 197.2 kB
Release files / xippios_usda_psd-0.1.0.tar.gz
| Download URL | xippios_usda_psd-0.1.0.tar.gz |
|---|---|
| Size | 141.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
549e4e3f54edf145e99a17554958d4f6d6e9daabf9da7a1bc3a3b2656d3d3d1f
|
|
BLAKE2b-256 checksum How to use checksums |
72c0c83ff454f722b0f14ea9cb356e7fd9ff6ca8b50171180698a8aa80ce571b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logRelease files / xippios_usda_psd-0.1.0-py3-none-any.whl
| Download URL | xippios_usda_psd-0.1.0-py3-none-any.whl |
|---|---|
| Size | 55.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3f89d8887762b85d8b18bebbf82eb9fb1eada9e6e9a9a090eeba1696893a36bd
|
|
BLAKE2b-256 checksum How to use checksums |
8b439be8960fe2f7d111d1e62e291081ed885fef3a530a00e39e1c6d2affbe24
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logSecurity for xippios-usda-psd 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for xippios_usda_psd-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.