Skip to main content
Glama

KeyVex

get_nlrb_cases

Read-only

Returns NLRB (National Labor Relations Board) case filings: unfair- labor-practice charges and union representation/election petitions. Use this when the user asks about: union organizing at a company, labor disputes or ULP charges, union election petitions and outcomes, decertification efforts, or a company's labor-relations record. Case numbers follow {region}-{type}-{sequence}, e.g. '03-CA-390171' (NLRB Region 03, CA charge). The middle code determines the case family: C-cases are ULP CHARGES against an employer (CA) or a union (CB, CC, CD, CE, CG, CP) — allegations of unlawful labor practices. R-cases are REPRESENTATION petitions — RC (union seeks certification), RD (employees seek decertification), RM (employer-filed), plus UD/UC/AC unit matters. Each record carries case_type ('ULP' or 'representation') and case_subtype (the raw code). The name field is the named party on the filing — usually the employer, but on CB/CC-type charges it is the union being charged. employer_name matches against it as a substring. Representation cases carry eligible_voters, certified_representative (filled after a won election), and unit_sought (the bargaining-unit description). FRESHNESS CAVEAT: cases mutate after filing — status flips Open→Closed and date_closed / reason_closed / certified_representative fill in later. The daily sync re-pulls a trailing 180-day date_filed window, so those fields on cases FILED MORE THAN ~180 DAYS AGO may lag the source until a periodic full re-pull; the source_url case page is always current. Filter combinations note: server-side indexes support ONE of state / case_type combined with the date_filed sort + since/until. Other filters (employer_name substring, case_subtype, status, region, state+case_type together) post-filter client-side over a widened fetch window. Pure-publisher posture: NLRB's public case rows as published — no outcome scoring. Each record's source_url links to the nlrb.gov public case page (which also carries docket activity and related documents not in this dataset).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum cases to return. Default 50, max 500.
sinceNodate_filed lower bound (YYYY-MM-DD inclusive).
stateNoTwo-letter state/territory code of the case site (e.g., 'NY', 'CA', 'PR').
untilNodate_filed upper bound (YYYY-MM-DD inclusive).
regionNoTwo-digit NLRB region number from the case-number prefix (e.g., '03' Buffalo, '13' Chicago). Client-side filter.
statusNoCase status. Client-side filter.
sort_byNoSort key. Only date_filed is supported (the default).
case_typeNoCase family: 'ULP' = unfair-labor-practice charges (C-cases), 'representation' = election/unit petitions (R-cases).
sort_orderNoDefault: desc (most recently filed first).
case_numberNoDirect lookup by NLRB case number (e.g., '03-CA-390171'). Fastest path.
case_subtypeNoExact case-number code (e.g., 'CA' charge against employer, 'CB' against union, 'RC' certification petition, 'RD' decertification). Client-side filter.
employer_nameNoCase-insensitive substring against the named party (e.g., 'starbucks', 'amazon'). Usually the employer; on CB-type charges the union. Client-side filter.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly, non-destructive, openWorld), and the description goes well beyond that: it discloses the freshness caveat (trailing 180-day re-pull window; older cases may lag the source), the split between server-side indexed filters and client-side post-filtering over a widened window, and the fact that source_url is always current. This is exactly the kind of behavioral context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and triggering contexts are front-loaded, then grammar, then caveats — a sensible order for a dense tool. It is long and a few clauses (e.g., the 'Pure-publisher posture' editorial) are near-filler, but given 12 parameters and no output schema most sentences carry necessary information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter, zero-required, no-output-schema tool, the description supplies what the structured fields omit: what each record family contains (eligible_voters, certified_representative, unit_sought), how filters interact, and how fresh the data is. An agent has everything needed to build a correct query and interpret the results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the baseline is 3, but the description adds real meaning: the {region}-{type}-{sequence} case-number format, what the middle code signifies, and the important caveat that the `name` field (matched by employer_name substring) is usually the employer but the union on CB/CC charges. It also explains which filter combinations the server-side indexes actually support, which the schema only hints at with 'Client-side filter'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb (Returns) and resource (NLRB case filings) and immediately scopes it to two concrete families (ULP charges and representation/election petitions). It is unmistakable against siblings like get_osha_enforcement or get_enforcement_actions because it defines the domain, the case-number grammar, and the record families.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use this when the user asks about: union organizing... labor disputes or ULP charges... decertification efforts... a company's labor-relations record' clause gives clear triggering contexts. It stops short of naming alternatives (e.g., unified_search) or stating when NOT to use it, so it is strong context without explicit routing/exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources