cyanheads avatar

Bls Labor Mcp Server

cyanheads/bls-labor-mcp-server

Wraps the US Bureau of Labor Statistics v2 API with seven tools that handle the full workflow from series discovery to analysis. Start with bls_search_series to decode natural language queries into cryptic SeriesIDs like LNS14000000, then pull time series data for up to 50 series at once with optional period-over-period calculations. Large result sets automatically spill to a DuckDB-backed DataCanvas layer where you can run SQL queries across multiple series without burning through your 500 daily API quota. The search runs entirely offline against bundled LABSTAT flat files. Useful when you need CPI, unemployment, JOLTS, or wage data programmatically and want to avoid manually parsing BLS identifiers or stitching together multi-series comparisons in spreadsheets.

GitHub stars
1
tools
6
transport
STDIO, HTTP
env vars
7
last updated
Nov 1, 2026

Install

From registry metadata
$ npx add-mcp https://bls-labor.caseyjhand.com/mcp --name bls-labor

Run in your terminal. add-mcp asks which agents to add it to (Claude Code, Codex, Cursor and more). Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http bls-labor https://bls-labor.caseyjhand.com/mcp

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 6 tools

Verified live against the running server on Nov 6, 2026.

bls_list_surveysList BLS survey programs with their abbreviation codes, full names, and metadata about calculation support and annual averages. Use to discover which survey covers a topic before calling bls_search_series; each row's searchCoverage says whether bls_search_series reaches the su...1 params

List BLS survey programs with their abbreviation codes, full names, and metadata about calculation support and annual averages. Use to discover which survey covers a topic before calling bls_search_series; each row's searchCoverage says whether bls_search_series reaches the su...

Parameters* required
categorystring
Optional category filter. One of: prices, employment, wages, productivity, injuries, time_use. A survey can appear under more than one category (CES under employment and wages). Omit to list all su...one of prices · employment · wages · productivity · injuries · time_use
bls_search_seriesSearch the BLS series catalog by natural language query, survey code, geographic area, or keywords to resolve cryptic SeriesIDs. Returns matching series with decoded components (survey, area, item, seasonal flag, and publication frequency for surveys that publish one series at...6 params

Search the BLS series catalog by natural language query, survey code, geographic area, or keywords to resolve cryptic SeriesIDs. Returns matching series with decoded components (survey, area, item, seasonal flag, and publication frequency for surveys that publish one series at...

Parameters* required
areastring
Geographic area to narrow results to, case-insensitive. A USPS state code (TX) or 2-digit state FIPS code (48) selects the state: its statewide series, the areas in it (metro areas reaching into it...
limitinteger
Maximum number of results to return (default 10); requests above 50 are clamped to 50 with notice.default: 10
offsetinteger
Number of ranked results to skip, for paging past the first page (default 0). Pass nextOffset from the previous response to get the next page.default: 0
query*string
Natural language or keyword query (e.g. "unemployment rate", "CPI food", "nonfarm payrolls"). Also accepts a SeriesID directly for exact lookup.
seasonal_adjustmentboolean
When true, return only seasonally adjusted series. When false, return only not-seasonally-adjusted. Omit to return both.
surveystring
Two-letter LABSTAT survey abbreviation to filter results, case-insensitive (e.g. CU for CPI, CE for CES, SM for state and metro CES, LN for CPS, LA for LAUS, JT for JOLTS). Indexed surveys: CU, AP,...
bls_get_latestReturn the single most recent observation for BLS series. SeriesIDs are trimmed, uppercased, and deduplicated in first-occurrence order. Processes the first 50 unique IDs and returns the exact remainder as unprocessedSeriesIds for a separate request. Each processed series cost...1 params

Return the single most recent observation for BLS series. SeriesIDs are trimmed, uppercased, and deduplicated in first-occurrence order. Processes the first 50 unique IDs and returns the exact remainder as unprocessedSeriesIds for a separate request. Each processed series cost...

Parameters* required
series_ids*array
BLS SeriesIDs, trimmed, uppercased, and deduplicated in first-occurrence order. Processes the first 50 unique IDs; unprocessedSeriesIds names the exact remainder. Each processed ID consumes one dai...
bls_get_seriesFetch BLS time-series data in a single API request (one query). SeriesIDs are trimmed, uppercased, and deduplicated in first-occurrence order. Processes up to 25 unique IDs without a key or 50 with one; unprocessedSeriesIds names the exact remainder for a separate request. Sup...5 params

Fetch BLS time-series data in a single API request (one query). SeriesIDs are trimmed, uppercased, and deduplicated in first-occurrence order. Processes up to 25 unique IDs without a key or 50 with one; unprocessedSeriesIds names the exact remainder for a separate request. Sup...

Parameters* required
annual_averageboolean
When true, include BLS-computed annual summary rows named "Annual": M13 for monthly series, Q05 for quarterly, S03 for semiannual. These are not universally arithmetic means or additional periods;...default: false
calculationsboolean
When true, request BLS-computed period-over-period net/percent changes. BLS returns supported types and intervals; some surveys omit calculations while preserving observations, while an explicit un...
end_yearinteger
End year for the data range (inclusive). Supplying it without start_year is rejected before the request — BLS applies no default start year alongside an explicit end year. Pair it with start_year,...
series_ids*array
BLS SeriesIDs, trimmed, uppercased, and deduplicated in first-occurrence order. Process up to 25 unique IDs without a key or 50 with one; the exact remainder is returned as unprocessedSeriesIds. Th...
start_yearinteger
Start year for the data range (inclusive). BLS allows up to 20 years per request and requires both bounds or neither: supplying start_year alone resolves end_year to the current year, capped at sta...
bls_dataframe_describeList canvas dataframes materialized by bls_get_series or by bls_dataframe_query register_as, with provenance (source tool, query parameters), TTL, row count, and column schema. Use before writing SQL to confirm column names and types. Lazy-sweeps expired tables before responding.1 params

List canvas dataframes materialized by bls_get_series or by bls_dataframe_query register_as, with provenance (source tool, query parameters), TTL, row count, and column schema. Use before writing SQL to confirm column names and types. Lazy-sweeps expired tables before responding.

Parameters* required
namestring
Optional dataframe name to describe a single dataframe — a df_XXXXX_XXXXX name from bls_get_series, or a register_as name from bls_dataframe_query. Omit, or leave blank, to list all active dataframes.
bls_dataframe_queryRun a single-statement SELECT against the canvas dataframes registered by bls_get_series or by an earlier register_as. Read-only: writes, DDL, DROP, COPY, PRAGMA, ATTACH, and external-file table functions are rejected. System catalogs (information_schema, pg_catalog, sqlite_ma...4 params

Run a single-statement SELECT against the canvas dataframes registered by bls_get_series or by an earlier register_as. Read-only: writes, DDL, DROP, COPY, PRAGMA, ATTACH, and external-file table functions are rejected. System catalogs (information_schema, pg_catalog, sqlite_ma...

Parameters* required
previewinteger
Inline row preview count, clamped to the applied row_limit (at most 10000) with notice. Defaults to row_limit. Set lower (e.g. 50) when chaining via register_as and only a sample is needed immediat...
register_asstring
When set, persist the query result as a new dataframe under this name. Fresh TTL — not inherited from parent tables. Use to chain analyses without re-running source SQL or consuming additional BLS...
row_limitinteger
Response row limit (default 1000); requests above 10000 are clamped with notice. Full results live on-canvas under register_as when provided.default: 1000
sql*string
Single-statement SELECT against df_<id> tables on the shared canvas. Reference dataframes by the names returned in bls_get_series responses or listed by bls_dataframe_describe. Standard DuckDB SQL...

Sponsors

Configuration

BLS_API_KEY

Optional — works without one (25 req/day). With key: 500 req/day + calculations and annual averages. Register free at bls.gov/developers.

MCP_LOG_LEVELdefault: info

Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').

MCP_HTTP_HOSTdefault: 127.0.0.1

The hostname for the HTTP server.

MCP_TRANSPORT_TYPEdefault: http

Selects the HTTP transport.

MCP_HTTP_PORTdefault: 3010

The port to run the HTTP server on.

MCP_HTTP_ENDPOINT_PATHdefault: /mcp

The endpoint path for the MCP server.

MCP_AUTH_MODEdefault: none

Authentication mode to use: 'none', 'jwt', or 'oauth'.

Readme

@cyanheads/bls-labor-mcp-server

Fetch US Bureau of Labor Statistics data — CPI, unemployment, wages, JOLTS, and more via MCP. STDIO or Streamable HTTP.

6 Tools by default · 7 with opt-in drop

Details

Repository
github.com/cyanheads/bls-labor-mcp-server
Categories
Search & Web Crawling, Data & Analytics
Package
@cyanheads/bls-labor-mcp-server
Transport
STDIO, HTTP
Registry
MCP registry, active
Resources
1
Tools verified
Nov 6, 2026

More from cyanheads

Related Search & Web Crawling MCP servers

View all
1egoughnour avatarCowork Historyegoughnour/cowork-historyHybrid search for Cowork history: FTS, Spotlight, and semantic vectors1stars
2generect avatarGenerectgenerect/generect_mcpB2B lead and company data for AI agents: free search, pay only for emails, phones, profiles.1stars
3hifriendbot avatarAilist Mcphifriendbot/ailist-mcpMCP server for AiList — search and discover Ai projects from Claude Code1stars
4dan1d avatarCobroyadan1d/mercadopago-toolMercado Pago payments for AI agents: payment links, search, refunds, merchant info.0stars
5jbeshir avatarUK Supermarketsjbeshir/mcp-serversSearch and compare grocery prices across UK supermarkets with product details.0stars
6spacemandomains avatarTOP GUN GEO-Lensspacemandomains/top_gun_mcp_serverBrand visibility auditing across LLMs, AI search, and answer engines with GEO reports and scores.1stars