Recipe: Lobbying activity
The task
You want a company’s federal political footprint: lobbying disclosures, PAC finances, federal contract awards, and regulatory engagement.
Tools used: search_filings (senate-lobbying pack — exposed on the combined gateway as
senate_lobbying_search_filings, see below), search_committees + committee_financials
(+ optionally search_contributions), usa_recipient_profile, search_documents
(federal-register pack, similarly exposed as federal_register_search_documents).
Calls: 4-6.
Copy-paste prompt
Map <company>'s federal political footprint using Pipeworx: lobbying disclosures (spend, issue
areas), PAC receipts, federal contract awards, and any Federal Register engagement. For the
contract-awards figure, confirm the awards actually name <company> as the recipient — don't just
report a number that happened to match a keyword search.
What a good answer looks like
senate_lobbying_search_filings({ client_name: "Microsoft", filing_year: 2025 })
returns (live call, 2026-08-06 — trimmed):
{
"total": 88,
"filings": [
{
"registrant": "AKIN GUMP STRAUSS HAUER & FELD",
"client": "MICROSOFT CORPORATION",
"filing_year": 2025, "period": "1st Quarter (Jan 1 - Mar 31)",
"type": "Registration", "issues": ["Computer Industry", "Science/Technology"]
}
]
}
A trustworthy answer has:
registrantdistinct fromclient— lobbying firms reportincome(what the client paid them); in-house lobbyists reportexpenses. Don’t sum the two as if they were the same unit.issuesnaming the actual issue-area codes filed, not a paraphrase.- for FEC data, a
committee_idyou can chain intocommittee_financialsfor cycle-by-cycle totals.
A plausible-sounding failure looks like a huge, real, correctly-formatted dollar figure — for the wrong company. This is live, not hypothetical, and it’s the single biggest risk in this recipe:
usa_recipient_profile({ recipient_name: "Microsoft", start_date: "2025-01-01", end_date: "2025-12-31" })
// → { recipient_name: "Microsoft", total_results: 0, awards: [
// { award_id: "36C10B22F0089", recipient_name: "DELL FEDERAL SYSTEMS L.P",
// award_amount: 1590136261.87, awarding_agency: "Department of Veterans Affairs",
// description: "VA MICROSOFT ENTERPRISE LICENSE AGREEMENT." },
// { award_id: "FA877223F0001", recipient_name: "DELL MARKETING L.P.",
// award_amount: 1271592441.44, awarding_agency: "Department of Defense",
// description: "MICROSOFT ESA AGREEMENT" },
// ...
// ] }
Every award here is real. None of them were awarded to Microsoft — every recipient_name in the
results says Dell. Microsoft only appears in the contract description (Dell resells
Microsoft licensing to federal agencies under its own contract vehicle). If you read the top-level
recipient_name: "Microsoft" echo and report the award totals as “Microsoft’s federal contract
awards,” you’d be attributing hundreds of millions of dollars in Dell revenue to the wrong
company. Checked against source (mcps/usaspending/src/index.ts, recipientProfile): the tool
sends your recipient_name to USAspending as a free-text keyword search across award text
(including descriptions), not as an actual recipient-name filter. Always check that
awards[].recipient_name matches the company you asked about before reporting any dollar figure
from this tool — filed as fleet task #161 for a fix.
Step-by-step tool calls
On the combined gateway endpoint, pack-local names that collide across packs are exposed
slug-prefixed. Both search_filings and search_documents collide (senate-lobbying vs. sec-xbrl
for the former; Federal Register vs. Swedish Riksdagen vs. USPTO PTAB for the latter) — the
examples below use the resolved prefixed names, which is the reliable form. (Bare search_filings
with ambiguous arguments currently returns a hard ambiguous_tool_name error rather than
guessing; bare search_documents currently auto-routes to Federal Register via the collision
router, but don’t rely on that continuing to hold as more packs ship.)
1. Lobbying disclosures
senate_lobbying_search_filings({ client_name: "Microsoft", filing_year: 2025 })
Aggregate by quarter for a trend. Lobbying firms report income; in-house lobbyists report
expenses — sum only within one type.
2. PAC finances
search_committees({ query: "Microsoft" })
// → committees whose name matches (PACs, super PACs), with committee IDs — live example returns
// both "MICROSOFT CORPORATION STAKEHOLDERS VOLUNTARY PAC - MSVPAC" and an unrelated 1996-era
// "COMMITTEE TO FIGHT MICROSOFT CORP" (opposition PAC, not affiliated) — check the name
committee_financials({ committee_id: "C00227546" })
// → { cycles: [ { cycle: 2026, receipts: 1253480.95, disbursements: 1305253.04,
// cash_on_hand: 241153.16, contributions: 1253480.95 }, ... ] }
For itemized donors — who gave to the PAC, employer, amount, date — chain search_contributions
with the committee ID:
search_contributions({ committee_id: "C00227546", cycle: 2026 })
// → { total: 16280, contributions: [ { contributor: "LORD, KATHRINE", amount: 1300,
// employer: "MICROSOFT", occupation: "DIR GTM MGR", city: "REDMOND" }, ... ] }
Note the direction: this is money coming into the committee from individual donors, not the PAC’s own outbound giving to candidates — don’t characterize this as “the PAC gave $X to candidate Y” from this data.
3. Federal contract awards — verify the recipient
usa_recipient_profile({ recipient_name: "Microsoft", start_date: "2025-01-01", end_date: "2025-12-31" })
Check every awards[].recipient_name against the company you queried before summing or
reporting — see “What a good answer looks like” above. Companies that both lobby and hold large
federal contracts (as an actual, verified recipient) have a different posture than ones that just
lobby.
4. Federal Register engagement
federal_register_search_documents({ query: "Microsoft" })
Use this to spot proposed-rule comments and mentions, but expect low relevance on a bare company
name — live-verified, a plain "Microsoft" query returned 10,000 hits, with the top results
being unrelated IRS meeting notices held over “Microsoft Teams.” Narrow with agency or type
filters, or search topically instead (e.g. the issue areas surfaced by the lobbying filings) and
check for the company by name within results.
Citation pattern
Microsoft federal political footprint (2025): 88 Senate LDA filings per Senate LDA, top issue areas Computer Industry / Science-Technology. Microsoft Corporation Stakeholders PAC (MSVPAC) 2026-cycle-to-date receipts $1.25M per FEC. Federal contract awards: not independently confirmed — the keyword-search tool’s results were all awarded to other companies (Dell) reselling Microsoft licensing, not Microsoft directly; no verified Microsoft-as-recipient figure available pending fleet task #161.
Use the prompt
prompts/get({ name: "lobbying_activity", arguments: { company: "Microsoft" } })
Caveats
usa_recipient_profileis a keyword search, not a recipient filter — it can attribute another company’s contract dollars to the company you queried. Always verifyawards[].recipient_namebefore reporting a figure (fleet task #161).- Lobbying disclosures lag 45 days after the quarter ends. Q1 2026 isn’t fully visible until mid-May.
- Affiliated PACs, and unaffiliated similarly-named ones.
search_committeescan return both a company’s real PAC and an unrelated opposition committee with the company’s name in its title (see the live example above) — checkdesignation/organization_type, not just the name match. search_contributionsshows money into a committee, not the committee’s outbound giving — don’t characterize inbound itemized donations as the PAC’s political spending.- Soft money / 501(c)(4)s. Not in FEC data. Public lobbying disclosures are the floor, not the full picture.
search_filingsandsearch_documentsboth collide across multiple packs. Use the slug-prefixed names shown above rather than the bare form.