Servidor MCP

FMCSA Carrier Intelligence

io.github.KMCTO/fmcsa-carrier-intelligence
Negocio y operaciones Seguridad Público y accesible MCP 2025-11-25

Qué hace este MCP

Provides FMCSA carrier profiles, safety histories, authority data, filtered searches, and identity-linkage screening for motor-carrier due diligence.

check_address_consistency
How many distinct business addresses and phones this carrier reports across FMCSA's independent records of it (census registration, licensing and insurance filings, and its own self-reported crash records). Mailing addresses are excluded — differing from the physical address there is normal. Paid. Cheaper than either identity tool; one row, no graph.
Esquema de entrada
{'type': 'object', 'title': 'check_address_consistencyArguments', 'required': ['usdot_number'], 'properties': {'usdot_number': {'type': 'integer', 'title': 'Usdot Number'}}}
check_applicant_against_roster
Screens one applicant carrier against a roster of carriers you already do business with (or are vetting) — the batch generalization of confirm_identity_link, for the real-world case of catching a carrier that was previously cut from your network (revoked, suspended, or otherwise let go) trying to re-enter under a new USDOT number. usdot_number is the applicant; roster_usdot_numbers is your own list, supplied by you. Returns linked (true if the applicant shares an identity cluster with ANY roster member) and matched_roster_usdot_numbers (which ones, always a subset of what you supplied — never a carrier you didn't already name). roster_not_found lists any roster entries that simply don't resolve to a known carrier (still your own input, not a new disclosure). usdot_number's own cluster_id is always included, same as check_carrier_identity's convention — it's the applicant's own data, not something withheld pending a match. usdot_number must not also appear in roster_usdot_numbers, and roster_usdot_numbers must be a non-empty list of at most settings.roster_screen_max_size distinct entries (currently 100) — either violation is a free invalid_arguments; split a larger roster into multiple calls rather than expecting it to be truncated for you. An unresolved usdot_number (the applicant itself) is a free not_found, same as confirm_identity_link/check_carrier_identity. Paid, metered: price = price_check_applicant_against_roster_base + price_check_applicant_against_roster_per_entry * (the deduped roster size) — see get_catalog for current rates. A "not linked to anything on your roster" result is a complete, valuable answer and bills the same as a match, same reasoning as check_carrier_identity's cluster_size == 1.
Esquema de entrada
{'type': 'object', 'title': 'check_applicant_against_rosterArguments', 'required': ['usdot_number', 'roster_usdot_numbers'], 'properties': {'usdot_number': {'type': 'integer', 'title': 'Usdot Number'}, 'roster_usdot_numbers': {'type': 'array', 'items': {'type': 'integer'}, 'title': 'Roster Usdot Numbers'}}}
check_carrier_identity
Full identity-linkage detail for a carrier: why it's flagged and how confident that is. Priced meaningfully above the free screen_carrier_identity — call that first if you only need the flag and a count. Never names or points at another carrier (redesigned 2026-09-18 — see schemas.IdentityAssessment's docstring): no linked USDOT number, legal name, or shared-identifier hash. A linked carrier's own identity was never this caller's to receive, and an unsalted hash of a low-entropy value like a phone number or address doesn't meaningfully withhold it from a determined party anyway (confirmed by reading Truckin's own hashing code). Every field here is either the subject carrier's own data or a derivative signal — a score, a match-term-type label (which *kind* of identifier matched, never the value), a count, a boolean. SSN and EIN matches carry weight 2.0 each in FMCSA's ARCHI methodology and are not present in public data; D&B is nominally weight 2.0 too but is only genuinely available for ~4% of carriers, and officer data (needed for the name x officer term) is missing for another ~15%. So score_provenance.match_score_ceiling is computed per carrier, not a flat 4.5 — most responses cap out at 2.5 or lower. It also states plainly that recall against FMCSA's own declared-predecessor label set is not measurable. flagged applies FMCSA's own ARCHI flag rule (match_score >= 1.5 AND a linked motive >= 1); it is not a fraud determination and must not be presented as one. Note flagged and match_score >= 1.5 are NOT the same condition — clustering requires 2+ independent identifier-type families to agree, so materially more carriers clear the score threshold than are ever flagged. Paid. A carrier with no linked carriers is a complete answer and bills; an unknown USDOT number is a free not_found.
Esquema de entrada
{'type': 'object', 'title': 'check_carrier_identityArguments', 'required': ['usdot_number'], 'properties': {'usdot_number': {'type': 'integer', 'title': 'Usdot Number'}}}
confirm_identity_link
Confirms or denies that two carriers YOU ALREADY SUSPECT are linked in fact share an identity cluster — the lower-risk alternative to check_carrier_identity's removed linked_carriers field (see schemas.IdentityAssessment's docstring for why that was removed 2026-09-18). This never discloses a carrier's identity to a caller who didn't already have it: both usdot_number_a and usdot_number_b are supplied by you. It only ever answers "do these two specific carriers share a cluster?", never "who is linked to this carrier?" — call check_carrier_identity for that, which stops at a score and a count for exactly this reason. cluster_id is returned only when linked is true, and isn't new information even then — you could obtain the same value directly from either carrier's own check_carrier_identity or screen_carrier_identity response. usdot_number_a and usdot_number_b must differ (invalid_arguments, free — there is no comparison to make). Either number failing to resolve in carrier_identity_cluster is a free not_found, same as check_carrier_identity. Paid — pricier than check_carrier_identity, since it resolves two carriers' clusters per call, not one. A "not linked" result is a complete, valuable answer and bills the same as "linked", same reasoning as check_carrier_identity's cluster_size == 1.
Esquema de entrada
{'type': 'object', 'title': 'confirm_identity_linkArguments', 'required': ['usdot_number_a', 'usdot_number_b'], 'properties': {'usdot_number_a': {'type': 'integer', 'title': 'Usdot Number A'}, 'usdot_number_b': {'type': 'integer', 'title': 'Usdot Number B'}}}
get_catalog
Free, unauthenticated dataset catalog. Describes every table this service sells, its fields, current pricing, and freshness. Read this before paying for anything.
Esquema de entrada
{'type': 'object', 'title': 'get_catalogArguments', 'properties': {}}
get_identity_sample
Free, unauthenticated sample of identity/fraud responses, covering both screen_carrier_identity's free IdentityScreen shape and check_carrier_identity's paid IdentityAssessment shape. Lets a buying agent see the paid response shape and evaluate data quality before spending USDC on check_carrier_identity.
Esquema de entrada
{'type': 'object', 'title': 'get_identity_sampleArguments', 'properties': {}}
get_safety_history
Historical snapshots and changelog entries for a carrier. Paid — you pay only when a call returns records; an exact-key miss is free. changelog may legitimately be empty for a carrier without two distinct-date snapshots yet — a diff needs both. authority_types, oos_orders_active, insurance_bipd_on_file, insurance_cargo_on_file, insurance_bond_on_file, has_been_revoked, and last_revocation_date are null (not false/empty) on a history row recorded before 2026-09-02 — carrier_history wasn't tracking those fields yet, so null there means "not tracked on this date," not a negative answer. Likewise has_been_suspended/last_suspension_date are null before 2026-09-06, and has_authority_reinstated/last_reinstatement_date/ has_insurance_identity_mismatch are null before 2026-09-12. Carries no contact information (legal_name, dba_name, addresses, phone, email — removed 2026-09-19, see schemas.CarrierProfile); changelog excludes field_name in {legal_name, dba_name, phone, email} for the same reason — a changed value is still the value.
Esquema de entrada
{'type': 'object', 'title': 'get_safety_historyArguments', 'required': ['usdot_number'], 'properties': {'since_date': {'anyOf': [{'type': 'string', 'format': 'date'}, {'type': 'null'}], 'title': 'Since Date', 'default': None}, 'usdot_number': {'type': 'integer', 'title': 'Usdot Number'}}}
get_sample
Free, unauthenticated sample of carrier_profile rows. Lets a buying agent evaluate data quality before spending USDC on the paid tools.
Esquema de entrada
{'type': 'object', 'title': 'get_sampleArguments', 'properties': {}}
lookup_carrier
Look up a single carrier's current profile by USDOT number. Paid — you pay only when a call returns records; an exact-key miss is free. Returns every carrier_status (Active, Inactive, Pending) — check the carrier_status field, don't assume Active. Carries no contact information (legal_name, dba_name, addresses, phone, email — removed 2026-09-19, see schemas.CarrierProfile). The one legitimate use those fields served — confirming a carrier's claimed identity against records, e.g. to catch a carrier-identity-theft ("double brokering") attempt — is available instead via claimed_name (matched against legal_name OR dba_name) and claimed_street/ claimed_city/claimed_state/claimed_zip (matched against physical_address; supply any subset). Returns name_match/ physical_address_match as a boolean per claim actually supplied, `null` for a claim not supplied — never the value on file itself.
Esquema de entrada
{'type': 'object', 'title': 'lookup_carrierArguments', 'required': ['usdot_number'], 'properties': {'claimed_zip': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Claimed Zip', 'default': None}, 'claimed_city': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Claimed City', 'default': None}, 'claimed_name': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Claimed Name', 'default': None}, 'usdot_number': {'type': 'integer', 'title': 'Usdot Number'}, 'claimed_state': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Claimed State', 'default': None}, 'claimed_street': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Claimed Street', 'default': None}}}
screen_carrier_identity
Free triage screen for a carrier: whether it's flagged under FMCSA's own chameleon-carrier methodology, how big its identity cluster is, and how many linked carriers carry a motive — with no member detail. Call check_carrier_identity (paid) for that. This is the entire discovery/sales motion in an agent-only channel, not a discount tier — free by design (Identity-API-Revision- 2026-09-06.md Section 1), so it never bills and never requires payment. By the same design, it withholds anything that identifies a linked carrier: no member USDOT number, no legal name, no link type, no identifier hash. A caller learns THAT there is something to look at here, not WHAT. confidence_caveat discloses the known ~6% artifact rate and that recall is not measurable in FMCSA's public data — read it, don't just check the flagged boolean. match_score_practical_ceiling is computed per carrier from which ARCHI terms were actually available for it, not a flat constant — most carriers cap out well below the theoretical 8.5. An unknown USDOT number returns a not_found error.
Esquema de entrada
{'type': 'object', 'title': 'screen_carrier_identityArguments', 'required': ['usdot_number'], 'properties': {'usdot_number': {'type': 'integer', 'title': 'Usdot Number'}}}
search_carriers
Filtered carrier search. Paid — you pay only when a call returns records; a zero-row result is free, same as an exact-key miss. Defaults to Active carriers only — pass include_inactive=true to also see Inactive/Pending. Capped at 100 rows per response regardless of the requested limit; never a full-table dump. Carries no contact information (legal_name, dba_name, addresses, phone, email — removed 2026-09-19, see schemas.CarrierProfile) — a filterable, multi-result endpoint returning personal contact details for whoever matched a filter was the sharpest version of that risk in this product; use lookup_carrier's claimed_name/claimed_street/etc. if you need to confirm a specific carrier's claimed identity.
Esquema de entrada
{'type': 'object', 'title': 'search_carriersArguments', 'properties': {'limit': {'type': 'integer', 'title': 'Limit', 'default': 20}, 'state': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'State', 'default': None}, 'cargo_type': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Cargo Type', 'default': None}, 'safety_tier': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Safety Tier', 'default': None}, 'authority_status': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Authority Status', 'default': None}, 'include_inactive': {'type': 'boolean', 'title': 'Include Inactive', 'default': False}}}
Añadido
get_identity_sample
4 de October de 2026 a las 02:40
Añadido
check_applicant_against_roster
4 de October de 2026 a las 02:40
Añadido
confirm_identity_link
4 de October de 2026 a las 02:40
Añadido
check_address_consistency
4 de October de 2026 a las 02:40
Añadido
check_carrier_identity
4 de October de 2026 a las 02:40
Añadido
screen_carrier_identity
4 de October de 2026 a las 02:40
Añadido
get_safety_history
4 de October de 2026 a las 02:40
Añadido
search_carriers
4 de October de 2026 a las 02:40
Añadido
lookup_carrier
4 de October de 2026 a las 02:40
Añadido
get_sample
4 de October de 2026 a las 02:40
Añadido
get_catalog
4 de October de 2026 a las 02:40