{"id":"74558213-bd35-47d8-b62e-21cad3c11b9c","shortId":"XBNbf6","kind":"skill","title":"find-engineering-firm","tagline":"Use whenever the user wants to find, shortlist, vet, or enrich US engineering firms — civil, structural, MEP, mechanical, electrical, geotechnical, transportation, environmental, and manufacturing. **For real-world engineering (buildings, infrastructure, manufacturing) — NOT soft","description":"# find-engineering-firm\n\nDrive the **ServiceGraph API** (`https://api.servicegraph.co`) to find,\nshortlist, and enrich US **real-world** engineering firms — buildings,\ninfrastructure, energy, manufacturing. The catalog tags firms with\n`industry:engineering_services` and a 23-tag service sub-taxonomy spanning\ncivil, structural, MEP, mechanical, electrical, geotechnical,\nsurveying, transportation, environmental, manufacturing, energy,\naerospace, biomedical, materials-testing, and more.\n\n**This is NOT for software engineering.** \"Software engineering firm\",\n\"engineering team\", \"engineering manager hire\", \"system architecture\nreview\" — those are all software-developer territory. The first thing\nthis skill confirms is that the user means real engineering, not\nsoftware.\n\n**Always pin `industry:engineering_services`.** Sub-disciplines are typically\nstructured `service_provided` tags (`civil-engineering`,\n`structural-engineering`, `mep-engineering`, etc.) — confirm exact\nnames via `/v1/tags`.\n\nAny HTTP client works (curl, fetch, requests). Examples below use curl.\n\n## When NOT to use this skill\n\nThe dominant failure mode is firing on software-engineering asks. Refuse those.\n\n- **Software / SaaS / app-development asks** — even when phrased as\n  \"software engineering firm\", \"engineering team partner\", \"build our\n  platform\" → defer to `find-software-developer`.\n- **In-house \"engineering manager\" hires** — in modern B2B usage this\n  is almost always software-engineering recruiting. Refuse.\n- **System / cloud / database architecture questions** (\"Postgres vs\n  DynamoDB\", \"monolith vs microservices\") — software topics, not\n  engineering firms.\n- **Architecture (buildings)** — `find-architecture-firm` covers that\n  industry. This skill covers engineering disciplines that *work\n  with* architects (structural, MEP, civil) but the architect-of-record\n  procurement goes to that skill.\n- **Consumer/residential** (\"architect for a residential remodel\",\n  \"engineer to inspect my house\") — the catalog is B2B procurement\n  only.\n- **Non-US firms / individual freelance engineers / DIY questions /\n  engineering-software product comparisons (Revit, AutoCAD,\n  SolidWorks, Ansys).**\n\nIf the user is a *business* (real-estate developer, contractor,\nproperty owner, manufacturer, energy company, public agency, etc.)\nprocuring real-world engineering services, this skill applies —\ndefaults to fire on B2B procurement intent.\n\n## MCP server (preferred for authed calls)\n\nIf your agent harness has the **ServiceGraph MCP server** loaded\n(`https://mcp.servicegraph.co`), prefer its tools for the **authed**\ntier (`/search`, `/get`, `/stats`). The MCP server uses OAuth 2.1 +\nPKCE — the host harness handles credentials in its own audited\nsandbox, so there's no `.env.local`, no shell dispatch, and no token\nvalue ever enters the LLM context.\n\nFor the **anonymous** tier (`/tags`, `/check`, `/explore`), MCP is\n**not** preferred — every MCP tool requires OAuth (the server has no\nanonymous tier), so plain curl against the REST URL is the simpler\npath for discovery calls. Use the REST patterns below for those.\n\nThe MCP tools 1:1-map to the public REST endpoints — same backend,\nsame quota, same data:\n\n| MCP tool | REST endpoint | Anon? | Recommended path |\n|---|---|---|---|\n| `list_tags` | `GET /v1/tags` | yes | curl |\n| `check_filter` | `GET /v1/check` | yes | curl |\n| `explore_firms` | `GET /v1/explore` | yes | curl |\n| `search_firms` | `GET /v1/search` | no | MCP if loaded, else curl + OTP |\n| `get_firm` | `GET /v1/get/:id` | no | MCP if loaded, else curl + OTP |\n| `catalog_stats` | `GET /v1/stats` | no | MCP if loaded, else curl + OTP |\n\n**Detection**: if you see any MCP tools with `servicegraph` in the\nname (the harness-specific prefix varies — agents pattern-match the\nsubstring), the ServiceGraph MCP server is loaded. Prefer those\ntools for the authed tier; complete any auth flow the harness\ninitiates if needed. If no `servicegraph` MCP tools are present,\nfall through to the REST + OTP flow below for the authed tier.\n\n## The four-tier funnel\n\n| Tier | Auth | Cost | Use it for |\n|---|---|---|---|\n| `GET /v1/tags` | none | free | **First call of every session.** Discover legal field names, kinds, operators, values. |\n| `GET /v1/check?filter=...` | none | free | Validate a filter before spending an explore/search call. |\n| `GET /v1/explore?filter=...` | none | free, IP-throttled | Scope: count + breakdowns. Use to size the candidate pool before quota-spending. |\n| `GET /v1/search?filter=...` | bearer | 200 unique firms / month free | Brief firm cards. **No url, no contact info.** Use for ranking / shortlisting. |\n| `GET /v1/get/:id` | bearer | 50 unique firms / month free | Full bundle: url, phone, email, social, legal name, address. **Only call for shortlisted firms.** |\n| `POST /v1/research` | paid | not in MVP | Deferred — skip. |\n\n**Quota rule that matters**: `/search` and `/get` charge per *unique\nfirm viewed per calendar month*, not per call. Re-paging the same\nquery is free. Two different filters that overlap charge once for\nthe overlap. Re-fetching a firm you already pulled this month is free.\n\n## Session-start ritual\n\nBefore constructing any filter, call:\n\n```\nGET https://api.servicegraph.co/v1/tags?include_values=1\n```\n\nCache the response for the conversation. Confirm `engineering` is in\nthe `industry` value list and that the relevant sub-discipline tags\n(`civil-engineering`, `structural-engineering`, `mep-engineering`,\n`mechanical-engineering`, `electrical-engineering`, etc.) are in\n`service_provided`. Tag names sometimes drift (e.g. `mep` vs\n`mep-engineering`); verify before constructing filters.\n\nField kinds you'll use most:\n- **categorical**: `industry` (always `engineering`), `state`, `pricing_model`, `company_size_signal`, `geography_served` — op `:`\n- **tag_set_with_evidence**: `service_provided` (e.g. `civil-engineering`, `structural-engineering`, `mep-engineering`) — op `:` with optional `@evidence`\n- **numeric**: `rating`, `review_count_total`, `founded_year` — ops `= >= <= > <`\n- **presence**: `has:phone`, `has:clutch`, `has:rating`, `has:linkedin_company`, …\n- **keyword**: free-text substring across firm name / brand / title / meta / legal_name. **Verticals (hospital, high-rise, retail, transportation, semiconductor, etc.) and credentials (PE, LEED, etc.) are keyword-only.**\n\n## Auth\n\n`/tags`, `/check`, and `/explore` are anonymous. `/search` and `/get`\nrequire a bearer token.\n\n**Security model — keep the token out of the LLM context.**\n\n- **Never** read `.env`, `.env.local`, or any other credential file\n  into your context. The token's literal value should never appear\n  in the conversation.\n- Use shell dispatch for every authed request so the token flows\n  directly from the user's environment / dotenv file into the\n  `Authorization` header without round-tripping through the LLM.\n- **Always ask the user once per session** before using a detected\n  token, even if it's already in their shell or `.env.local`.\n\n**Resolution rule**:\n\n1. **Detect** whether a token is available — without reading its\n   value. Run a shell check that only inspects exit codes:\n\n   ```bash\n   ( [ -n \"${SERVICEGRAPH_TOKEN:-}\" ] \\\n     || grep -qs '^SERVICEGRAPH_TOKEN=' .env.local \\\n     || grep -qs '^SERVICEGRAPH_TOKEN=' .env )\n   ```\n\n   Exit code `0` = token is available somewhere; non-zero = no token.\n\n2. **Confirm with the user** before the first authed call this session:\n\n   > \"I found a `SERVICEGRAPH_TOKEN` in your environment / `.env.local`.\n   > OK to use it for ServiceGraph API requests this session?\"\n\n   If the user says no, stay on the anonymous tiers (`/tags`, `/check`,\n   `/explore`) and skip authed calls. Don't re-ask later unless the\n   user asks for authed work.\n\n3. **Dispatch via shell** — every authed call goes through a shell\n   wrapper so the literal token never enters the conversation:\n\n   ```bash\n   # If exported in the shell environment:\n   curl -H \"Authorization: Bearer $SERVICEGRAPH_TOKEN\" \\\n        'https://api.servicegraph.co/v1/search?filter=...'\n\n   # If in .env.local — source it inside a subshell so it doesn't\n   # leak into the parent shell either:\n   ( set -a; . ./.env.local; set +a;\n     curl -H \"Authorization: Bearer $SERVICEGRAPH_TOKEN\" \\\n          'https://api.servicegraph.co/v1/search?filter=...' )\n   ```\n\n   Capture the response body to a tmp file or jq-process it, but do\n   NOT echo the request command with the token expanded.\n\n4. **OTP flow** if no token is detected — capture the new token\n   directly into `.env.local` without surfacing its value to the LLM:\n\n   ```bash\n   # 1. trigger the email — agent prompts the user for $EMAIL\n   curl -fsS -X POST 'https://api.servicegraph.co/v1/auth/request-otp' \\\n     -H 'Content-Type: application/json' \\\n     -d \"{\\\"email\\\":\\\"$EMAIL\\\"}\"\n\n   # 2. exchange the code — agent prompts the user for $CODE.\n   #    The ?format=env query param returns SERVICEGRAPH_TOKEN=<token>\n   #    as plain text appended to .env.local — no jq needed. The -f\n   #    flag makes curl exit non-zero on 4xx so a wrong code doesn't\n   #    pollute the file (the error mirror is also a `# comment` line,\n   #    safe to ignore even if it lands).\n   curl -fsS -X POST 'https://api.servicegraph.co/v1/auth/verify-otp?format=env' \\\n     -H 'Content-Type: application/json' \\\n     -d \"{\\\"email\\\":\\\"$EMAIL\\\",\\\"code\\\":\\\"$CODE\\\",\\\"name\\\":\\\"claude-cli\\\"}\" \\\n     >> .env.local\n\n   # 3. confirm capture without revealing the value\n   grep -q '^SERVICEGRAPH_TOKEN=' .env.local && echo \"OTP token captured.\"\n   ```\n\n   After a successful capture, the user has implicitly consented\n   (they just completed the flow), so proceed to dispatch (step 3).\n   The token is now persistent in `.env.local` for future sessions.\n\n5. If a `/search` or `/get` returns `401 unauthorized` mid-session,\n   the token expired or was revoked — re-run the OTP flow.\n\n## Filter DSL\n\nOne query parameter, GitHub-search-style.\n\n```\nfilter   := orExpr\norExpr   := andExpr (\"OR\" andExpr)*\nandExpr  := notExpr ((\"AND\")? notExpr)*    # whitespace = implicit AND\nnotExpr  := (\"NOT\" | \"-\") notExpr | atom\natom     := \"(\" filter \")\" | predicate\npredicate:= IDENT op valueOrList | bareword\nop       := \":\" | \"=\" | \">=\" | \"<=\" | \">\" | \"<\"\nvalueOrList := value (\",\" value)*\nvalue    := IDENT | NUMBER | tagAtEvidence\ntagAtEvidence := IDENT \"@\" (\"low\"|\"medium\"|\"high\")\nbareword := IDENT | NUMBER          # → keyword:<bareword>\n```\n\n**Four rules that bite:**\n\n1. **AND binds tighter than OR.** `a OR b c` parses as `a OR (b AND c)`.\n   Use parens.\n2. **Comma list = OR within one predicate.** `state:CA,NY,TX` matches\n   any of the three.\n3. **Negation is `-x` or `NOT x`.** Negative literals inside a comma\n   list are **not** allowed: `state:CA,-NY` is rejected. Use\n   `state:CA -state:NY`.\n4. **Bareword = keyword search.** Any IDENT or NUMBER not followed by\n   an operator becomes a free-text substring across name / brand /\n   title / meta / legal_name. Multiple barewords AND.\n\n**Engineering-flavored examples** (validate yours with `/v1/check`):\n\n```\nindustry:engineering_services service_provided:civil-engineering state:FL transportation\nindustry:engineering_services service_provided:structural-engineering high-rise\nindustry:engineering_services service_provided:mep-engineering hospital\nindustry:engineering_services service_provided:mechanical-engineering hvac industrial\nindustry:engineering_services service_provided:environmental-engineering remediation\nindustry:engineering_services service_provided:geotechnical-engineering state:CA seismic\nindustry:engineering_services service_provided:civil-engineering@high rating>=4 has:clutch\nindustry:engineering_services service_provided:electrical-engineering manufacturing\n```\n\nWhen in doubt, hit `/v1/check?filter=...` first.\n\n**Sub-discipline → tag mapping** (verify exact names via `/v1/tags`;\nthe catalog has 23 sub-tags so this isn't exhaustive):\n\n| User asks for | Use |\n|---|---|\n| Civil engineering / sitework / transportation | `service_provided:civil-engineering` |\n| Structural engineering / building structure | `service_provided:structural-engineering` |\n| MEP (mechanical/electrical/plumbing) | `service_provided:mep-engineering` |\n| Mechanical engineering / HVAC | `service_provided:mechanical-engineering` |\n| Electrical engineering | `service_provided:electrical-engineering` |\n| Geotechnical / soils / foundations | `service_provided:geotechnical-engineering` |\n| Surveying / land surveys / mapping | `service_provided:surveying-mapping` |\n| Transportation engineering | `service_provided:transportation-engineering` |\n| Environmental / remediation | `service_provided:environmental-engineering` |\n| Manufacturing / process | `service_provided:manufacturing-engineering` |\n| Aerospace | `service_provided:aerospace-engineering` |\n| Energy (oil/gas/renewables) | `service_provided:energy-engineering` |\n| Industrial automation / controls | `service_provided:industrial-automation` |\n| Materials testing | `service_provided:materials-testing` |\n| Acoustic / vibration | `service_provided:acoustic-engineering` |\n| Biomedical | `service_provided:biomedical-engineering` |\n\nVerticals (hospital, high-rise, semiconductor, retail, datacenter,\netc.) and credentials (PE-licensed, LEED, AICP) are keyword-only.\n\n## firm_id contract\n\n`firm_id` is a stable 12-hex-char handle:\n\n```\nfirm_id = sha256(apex.lower().rstrip(\".\")).hexdigest()[:12]\n```\n\n```python\nimport hashlib\ndef firm_id(apex):\n    return hashlib.sha256(apex.lower().rstrip(\".\").encode()).hexdigest()[:12]\n```\n\n```bash\necho -n \"aecom.com\" | tr 'A-Z' 'a-z' \\\n  | openssl dgst -sha256 -hex | awk '{print substr($2,1,12)}'\n```\n\n## Recipes\n\n### A. Civil engineering for transportation, in a state\n\nUser: *\"Civil engineering firms in Florida that focus on transportation\ninfrastructure.\"*\n\n```\nGET /v1/explore?filter=industry:engineering_services+service_provided:civil-engineering+state:FL+transportation\nGET /v1/search?filter=industry:engineering_services+service_provided:civil-engineering+state:FL+transportation&limit=10\nGET /v1/get/<firm_id>     # ×3\n```\n\n### B. Structural engineering + commercial high-rise\n\nUser: *\"Structural engineering firms with high-rise commercial\nbuilding experience.\"*\n\n```\nGET /v1/search?filter=industry:engineering_services+service_provided:structural-engineering+(high-rise OR commercial)\n```\n\n### C. MEP for a hospital project\n\nUser: *\"MEP engineering consultancy for a hospital project.\"*\n\n```\nGET /v1/search?filter=industry:engineering_services+service_provided:mep-engineering+hospital\n```\n\n### D. Mechanical / HVAC for industrial facility\n\nUser: *\"Mechanical engineering firms specializing in HVAC for industrial\nfacilities.\"*\n\n```\nGET /v1/search?filter=industry:engineering_services+service_provided:mechanical-engineering+hvac+industrial\n```\n\n### E. Indirect intent — \"stamp the drawings\"\n\nUser: *\"We're building a 10-story office and need a structural engineer\nto stamp the drawings.\"*\n\nThat's structural engineering for commercial-building permitting:\n\n```\nGET /v1/search?filter=industry:engineering_services+service_provided:structural-engineering+commercial\n```\n\nThe \"PE stamp\" angle isn't structured — surface PE-license details\nfrom `/get` after picking briefs. If the user wants only PE-licensed\nfirms, add `pe` as a keyword.\n\n### F. Geotechnical + seismic for California\n\nUser: *\"Geotechnical engineering firms in California with seismic-design\nexperience.\"*\n\n```\nGET /v1/search?filter=industry:engineering_services+service_provided:geotechnical-engineering+state:CA+seismic\n```\n\n### G. Quality threshold + PE-licensed\n\nUser: *\"Three civil engineering firms with at least 4-star ratings and\nPE-licensed engineers.\"*\n\n```\nGET /v1/search?filter=industry:engineering_services+service_provided:civil-engineering@high+rating>=4+pe&limit=10\n```\n\n`pe` as a bareword catches \"PE License\", \"PE-licensed\", \"Professional\nEngineer\" via substring.\n\n### H. BYO apex list — enrich domains\n\nUser pastes 8–20 engineering firm domains. For each:\n\n1. Compute `firm_id` locally.\n2. `GET /v1/get/<firm_id>` — full bundle if in catalog, 404 if not.\n3. Aggregate, present, flag the not-found ones to the user. A 404\n   here often means the domain is a software firm tagged\n   `industry:it_services` instead of real engineering.\n\n## Gotchas\n\n- **Always pin `industry:engineering_services`.** Without it, `civil-engineering` / `mep-engineering` / `electrical-engineering` keywords could leak into other industries (architecture firms sometimes list MEP coordination as a sub-service).\n- **The hardest boundary is software-engineering.** \"Engineering firm\" / \"engineering team\" in modern B2B usage almost always means software in tech contexts. Defer those to `find-software-developer`. Real engineering is for buildings, infrastructure, energy, manufacturing — not for SaaS apps.\n- **\"Engineering manager\" hires are recruiting**, not procurement. Refuse.\n- **Architecture firms are a separate industry.** When the user wants the architect-of-record (the firm that designs the building's form and aesthetics), defer to `find-architecture-firm`. This skill is for the engineering disciplines that work with architects (structural, MEP, civil).\n- **Consumer/residential is out of scope** (\"architect for my house remodel\", \"engineer to inspect my deck\"). The catalog is B2B-only.\n- **`looks_not_pro_services` 404 is not a bug.** A `firm_id` may exist in `/search` but 404 on `/get` if it's been flagged. Skip and continue; not charged.\n- **`/v1/explore` k=20 suppression.** When fewer than 20 firms match, the response is `{\"count\": \"<20\", \"suppressed\": true, \"breakdowns\": {}}`. Drilling further makes the count smaller. Broaden or escalate to `/v1/search`.\n- **Briefs from `/search` do NOT include `apex`, `url`, `phone_primary`, `email_primary`, `legal_name`, or address.** If the user asks for contact info, you must `/get/:id`.\n- **Engineering-software product comparisons (Revit, AutoCAD, SolidWorks, Ansys, Bentley)** are NOT procurement.\n- **Quota is per-user-per-month, deduped on first view.** Re-views are free; re-pagination is free.\n\n## Errors\n\nAll errors return JSON: `{\"error\": {\"code\": \"...\", \"message\": \"...\"}}`.\n\n| Status | Code | What to do |\n|---|---|---|\n| 400 | `filter_parse_error` | Payload includes `position`. Fix the filter, re-validate with `/v1/check`. |\n| 400 | `filter_required` | Empty filter where one is required. |\n| 400 | `invalid_firm_id` | firm_id must be 12 lowercase hex chars. Re-derive. |\n| 401 | `unauthorized` | Token missing/expired. Re-run OTP. |\n| 404 | `not_found` | Firm not in catalog or flagged. Not charged. Skip and continue. |\n| 429 | `rate_limited` | Honor `Retry-After` header / `retry_after` field. |\n| 429 | `monthly_quota_exhausted` | Switch to `/v1/explore`-only mode for the rest of the month. Tell the user. |\n\n## End-to-end example\n\nUser: *\"Three civil engineering firms in Florida focused on\ntransportation infrastructure, ideally with PE-licensed engineers\nand 4-star ratings.\"*\n\n```\nGET /v1/tags?include_values=1\nGET /v1/check?filter=industry:engineering_services+service_provided:civil-engineering+state:FL+transportation+pe+rating>=4\nGET /v1/explore?filter=industry:engineering_services+service_provided:civil-engineering+state:FL+transportation+pe+rating>=4\nGET /v1/search?filter=...&limit=10\nGET /v1/get/<firm_id>     # ×3\n```\n\nEnd of session: report `X-Quota-Remaining-Month`.","tags":["find","engineering","firm","servicegraph","nostrband","agent-skills","ai-agents","b2b-data","claude-code-marketplace","claude-code-plugins","claude-code-skills","claude-plugins"],"capabilities":["skill","source-nostrband","skill-find-engineering-firm","topic-agent-skills","topic-ai-agents","topic-b2b-data","topic-claude-code-marketplace","topic-claude-code-plugins","topic-claude-code-skills","topic-claude-plugins","topic-claude-skills","topic-mcp-server","topic-openapi","topic-professional-services","topic-vendor-discovery"],"categories":["ServiceGraph"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/nostrband/ServiceGraph/find-engineering-firm","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add nostrband/ServiceGraph","source_repo":"https://github.com/nostrband/ServiceGraph","install_from":"skills.sh"}},"qualityScore":"0.530","qualityRationale":"deterministic score 0.53 from registry signals: · indexed on github topic:agent-skills · 160 github stars · SKILL.md body (19,422 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:56:03.018Z","embedding":null,"createdAt":"2026-05-06T12:58:10.764Z","updatedAt":"2026-05-18T18:56:03.018Z","lastSeenAt":"2026-05-18T18:56:03.018Z","tsv":"'/.env.local':1185 '/check':424,923,1110 '/explore':425,925,1111 '/get':383,722,930,1404,2085,2416,2481 '/search':382,720,928,1402,2412,2458 '/stats':384 '/tags':423,922,1109 '/v1/auth/request-otp''':1260 '/v1/auth/verify-otp?format=env''':1337 '/v1/check':495,631,1575,1663,2544,2652 '/v1/explore':501,644,1907,2427,2608,2669 '/v1/get':518,686,1937,2208,2691 '/v1/research':709 '/v1/search':507,665,1921,1958,1988,2016,2061,2120,2156,2455,2686 '/v1/search?filter=...''':1164,1196 '/v1/stats':530 '/v1/tags':165,489,615,1675,2647 '/v1/tags?include_values=1':776 '0':1058 '1':465,466,1022,1244,1478,1884,2201,2650 '10':1935,2039,2171,2689 '12':1839,1850,1864,1885,2562 '2':1068,1269,1497,1883,2206 '2.1':390 '20':2195,2429,2434,2441 '200':668 '23':73,1679 '3':1129,1353,1388,1513,1938,2217,2692 '4':1221,1539,1647,2147,2168,2643,2667,2684 '400':2530,2545,2554 '401':1406,2569 '404':2214,2230,2401,2414,2577 '429':2591,2602 '4xx':1306 '5':1399 '50':689 '8':2194 'a-z':1870,1873 'acoust':1798,1803 'acoustic-engin':1802 'across':895,1558 'add':2098 'address':702,2471 'aecom.com':1868 'aerospac':91,1770,1774 'aerospace-engin':1773 'aesthet':2355 'agenc':340 'agent':366,556,1248,1273 'aggreg':2218 'aicp':1826 'allow':1528 'almost':233,2297 'alreadi':758,1014 'also':1320 'alway':137,234,841,998,2249,2298 'andexpr':1435,1437,1438 'angl':2075 'anon':483 'anonym':421,439,927,1107 'ansi':322,2491 'apex':1857,2188,2462 'apex.lower':1847,1860 'api':46,1095 'api.servicegraph.co':47,775,1163,1195,1259,1336 'api.servicegraph.co/v1/auth/request-otp''':1258 'api.servicegraph.co/v1/auth/verify-otp?format=env''':1335 'api.servicegraph.co/v1/search?filter=...''':1162,1194 'api.servicegraph.co/v1/tags?include_values=1':774 'app':199,2322 'app-develop':198 'appear':964 'append':1290 'appli':350 'application/json':1265,1342 'architect':273,280,289,2343,2372,2381 'architect-of-record':279,2342 'architectur':113,243,256,260,2271,2331,2360 'ask':193,201,999,1120,1125,1689,2475 'atom':1448,1449 'audit':400 'auth':362,380,573,577,601,609,921,973,1076,1114,1127,1134 'author':989,1158,1190 'autocad':320,2489 'autom':1784,1790 'avail':1028,1061 'awk':1880 'b':1486,1492,1939 'b2b':229,302,355,2295,2395 'b2b-only':2394 'backend':474 'bareword':1456,1470,1540,1566,2175 'bash':1042,1149,1243,1865 'bearer':667,688,933,1159,1191 'becom':1552 'bentley':2492 'bind':1480 'biomed':92,1805,1809 'biomedical-engin':1808 'bite':1477 'bodi':1200 'boundari':2284 'brand':898,1560 'breakdown':653,2444 'brief':673,2088,2456 'broaden':2451 'bug':2405 'build':34,59,212,257,1703,1955,2037,2058,2315,2351 'bundl':695,2210 'busi':328 'byo':2187 'c':1487,1494,1973 'ca':1505,1530,1536,1635,2131 'cach':777 'calendar':729 'california':2107,2113 'call':363,454,619,642,704,733,772,1077,1115,1135 'candid':658 'captur':1197,1229,1355,1368,1372 'card':675 'catalog':64,300,527,1677,2213,2392,2583 'catch':2176 'categor':839 'char':1842,2565 'charg':723,747,2426,2587 'check':492,1036 'civil':19,80,152,276,800,860,1582,1643,1692,1699,1888,1896,1915,1929,2141,2164,2257,2375,2627,2660,2677 'civil-engin':151,799,859,1581,1642,1698,1914,1928,2163,2256,2659,2676 'claud':1350 'claude-c':1349 'cli':1351 'client':168 'cloud':241 'clutch':884,1649 'code':1041,1057,1272,1278,1310,1346,1347,2523,2526 'comma':1498,1524 'command':1216 'comment':1322 'commerci':1942,1954,1972,2057,2071 'commercial-build':2056 'compani':338,846,889 'comparison':318,2487 'complet':575,1380 'comput':2202 'confirm':127,161,783,1069,1354 'consent':1377 'construct':769,831 'consult':1982 'consumer/residential':288,2376 'contact':679,2477 'content':1263,1340 'content-typ':1262,1339 'context':418,944,956,2303 'continu':2424,2590 'contract':1833 'contractor':333 'control':1785 'convers':782,967,1148 'coordin':2276 'cost':610 'could':2266 'count':652,875,2440,2449 'cover':262,267 'credenti':396,913,952,1821 'curl':170,176,443,491,497,503,513,525,536,1156,1188,1254,1300,1331 'd':1266,1343,1999 'data':478 'databas':242 'datacent':1818 'deck':2390 'dedup':2503 'def':1854 'default':351 'defer':215,714,2304,2356 'deriv':2568 'design':2117,2349 'detail':2083 'detect':538,1008,1023,1228 'develop':120,200,220,332,2310 'dgst':1877 'differ':743 'direct':979,1233 'disciplin':144,269,797,1668,2368 'discov':623 'discoveri':453 'dispatch':409,970,1130,1386 'diy':312 'doesn':1175,1311 'domain':2191,2198,2235 'domin':184 'dotenv':985 'doubt':1661 'draw':2033,2050 'drift':822 'drill':2445 'drive':43 'dsl':1424 'dynamodb':247 'e':2028 'e.g':823,858 'echo':1213,1365,1866 'either':1182 'electr':23,84,812,1656,1725,1730,2263 'electrical-engin':811,1655,1729,2262 'els':512,524,535 'email':698,1247,1253,1267,1268,1344,1345,2466 'empti':2548 'encod':1862 'end':2621,2623,2693 'end-to-end':2620 'endpoint':472,482 'energi':61,90,337,1776,1781,2317 'energy-engin':1780 'engin':3,17,33,41,57,69,103,105,107,109,134,140,153,156,159,192,207,209,224,237,254,268,294,311,315,346,784,801,804,807,810,813,828,842,861,864,867,1569,1577,1583,1588,1594,1599,1605,1608,1614,1618,1624,1627,1633,1638,1644,1651,1657,1693,1700,1702,1709,1716,1718,1724,1726,1731,1739,1750,1755,1762,1769,1775,1782,1804,1810,1889,1897,1910,1916,1924,1930,1941,1948,1961,1967,1981,1991,1997,2007,2019,2025,2046,2054,2064,2070,2110,2123,2129,2142,2154,2159,2165,2183,2196,2247,2252,2258,2261,2264,2288,2289,2291,2312,2323,2367,2386,2484,2628,2641,2655,2661,2672,2678 'engineering-flavor':1568 'engineering-softwar':314,2483 'enrich':15,52,2190 'enter':415,1146 'env':947,1055,1281 'env.local':406,948,1019,1050,1088,1167,1235,1292,1352,1364,1395 'environ':984,1087,1155 'environment':26,88,1623,1756,1761 'environmental-engin':1622,1760 'error':1317,2517,2519,2522,2533 'escal':2453 'estat':331 'etc':160,341,814,911,916,1819 'even':202,1010,1327 'ever':414 'everi':430,621,972,1133 'evid':855,871 'exact':162,1672 'exampl':173,1571,2624 'exchang':1270 'exhaust':1687,2605 'exist':2410 'exit':1040,1056,1301 'expand':1220 'experi':1956,2118 'expir':1413 'explor':498 'explore/search':641 'export':1151 'f':1297,2103 'facil':2004,2014 'failur':185 'fall':591 'fetch':171,754 'fewer':2432 'field':625,833,2601 'file':953,986,1204,1315 'filter':493,632,637,645,666,744,771,832,1423,1432,1450,1664,1908,1922,1959,1989,2017,2062,2121,2157,2531,2539,2546,2549,2653,2670,2687 'find':2,11,40,49,218,259,2308,2359 'find-architecture-firm':258,2358 'find-engineering-firm':1,39 'find-software-develop':217,2307 'fire':188,353 'firm':4,18,42,58,66,106,208,255,261,308,499,505,516,670,674,691,707,726,756,896,1831,1834,1844,1855,1898,1949,2008,2097,2111,2143,2197,2203,2239,2272,2290,2332,2347,2361,2407,2435,2556,2558,2580,2629 'first':123,618,1075,1665,2505 'fix':2537 'fl':1585,1918,1932,2663,2680 'flag':1298,2220,2421,2585 'flavor':1570 'florida':1900,2631 'flow':578,597,978,1223,1382,1422 'focus':1902,2632 'follow':1548 'form':2353 'format':1280 'found':877,1081,2224,2579 'foundat':1734 'four':605,1474 'four-tier':604 'free':617,634,647,672,693,741,763,892,1555,2511,2516 'free-text':891,1554 'freelanc':310 'fss':1255,1332 'full':694,2209 'funnel':607 'futur':1397 'g':2133 'geographi':849 'geotechn':24,85,1632,1732,1738,2104,2109,2128 'geotechnical-engin':1631,1737,2127 'get':488,494,500,506,515,517,529,614,630,643,664,685,773,1906,1920,1936,1957,1987,2015,2060,2119,2155,2207,2646,2651,2668,2685,2690 'github':1429 'github-search-styl':1428 'goe':284,1136 'gotcha':2248 'grep':1046,1051,1360 'h':1157,1189,1261,1338,2186 'handl':395,1843 'har':367,394,552,580 'hardest':2283 'harness-specif':551 'hashlib':1853 'hashlib.sha256':1859 'header':990,2598 'hex':1841,1879,2564 'hex-char':1840 'hexdigest':1849,1863 'high':906,1469,1596,1645,1814,1944,1952,1969,2166 'high-ris':905,1595,1813,1943,1951,1968 'hire':111,226,2325 'hit':1662 'honor':2594 'hospit':904,1606,1812,1977,1985,1998 'host':393 'hous':223,298,2384 'http':167 'hvac':1615,1719,2001,2011,2026 'id':519,687,1832,1835,1845,1856,2204,2408,2482,2557,2559 'ideal':2636 'ident':1453,1462,1466,1471,1544 'ignor':1326 'implicit':1376,1443 'import':1852 'in-hous':221 'includ':2461,2535,2648 'indirect':2029 'individu':309 'industri':68,139,264,788,840,1576,1587,1598,1607,1616,1617,1626,1637,1650,1783,1789,1909,1923,1960,1990,2003,2013,2018,2027,2063,2122,2158,2241,2251,2270,2336,2654,2671 'industrial-autom':1788 'info':680,2478 'infrastructur':35,60,1905,2316,2635 'initi':581 'insid':1170,1522 'inspect':296,1039,2388 'instead':2244 'intent':357,2030 'invalid':2555 'ip':649 'ip-throttl':648 'isn':1685,2076 'jq':1207,1294 'jq-process':1206 'json':2521 'k':2428 'keep':937 'keyword':890,919,1473,1541,1829,2102,2265 'keyword-on':918,1828 'kind':627,834 'land':1330,1741 'later':1121 'leak':1177,2267 'least':2146 'leed':915,1825 'legal':624,700,901,1563,2468 'licens':1824,2082,2096,2138,2153,2178,2181,2640 'limit':1934,2170,2593,2688 'line':1323 'linkedin':888 'list':486,790,1499,1525,2189,2274 'liter':960,1143,1521 'll':836 'llm':417,943,997,1242 'load':373,511,523,534,567 'local':2205 'look':2397 'low':1467 'lowercas':2563 'make':1299,2447 'manag':110,225,2324 'manufactur':28,36,62,89,336,1658,1763,1768,2318 'manufacturing-engin':1767 'map':467,1670,1743,1748 'match':559,1508,2436 'materi':94,1791,1796 'materials-test':93,1795 'matter':719 'may':2409 'mcp':358,371,386,426,431,463,479,509,521,532,543,564,587 'mcp.servicegraph.co':374 'mean':132,2233,2299 'mechan':22,83,809,1613,1717,1723,2000,2006,2024 'mechanical-engin':808,1612,1722,2023 'mechanical/electrical/plumbing':1711 'medium':1468 'mep':21,82,158,275,806,824,827,866,1604,1710,1715,1974,1980,1996,2260,2275,2374 'mep-engin':157,805,826,865,1603,1714,1995,2259 'messag':2524 'meta':900,1562 'microservic':250 'mid':1409 'mid-sess':1408 'mirror':1318 'missing/expired':2572 'mode':186,2610 'model':845,936 'modern':228,2294 'monolith':248 'month':671,692,730,761,2502,2603,2616,2701 'multipl':1565 'must':2480,2560 'mvp':713 'n':1043,1867 'name':163,549,626,701,820,897,902,1348,1559,1564,1673,2469 'need':583,1295,2043 'negat':1514,1520 'never':945,963,1145 'new':1231 'non':306,1064,1303 'non-us':305 'non-zero':1063,1302 'none':616,633,646 'not-found':2222 'notexpr':1439,1441,1445,1447 'number':1463,1472,1546 'numer':872 'ny':1506,1531,1538 'oauth':389,434 'offic':2041 'often':2232 'oil/gas/renewables':1777 'ok':1089 'one':1425,1502,2225,2551 'op':851,868,879,1454,1457 'openssl':1876 'oper':628,1551 'option':870 'orexpr':1433,1434 'otp':514,526,537,596,1222,1366,1421,2576 'overlap':746,751 'owner':335 'page':736 'pagin':2514 'paid':710 'param':1283 'paramet':1427 'paren':1496 'parent':1180 'pars':1488,2532 'partner':211 'past':2193 'path':451,485 'pattern':458,558 'pattern-match':557 'payload':2534 'pe':914,1823,2073,2081,2095,2099,2137,2152,2169,2172,2177,2180,2639,2665,2682 'pe-licens':1822,2080,2094,2136,2151,2179,2638 'per':724,728,732,1003,2499,2501 'per-user-per-month':2498 'permit':2059 'persist':1393 'phone':697,882,2464 'phrase':204 'pick':2087 'pin':138,2250 'pkce':391 'plain':442,1288 'platform':214 'pollut':1313 'pool':659 'posit':2536 'post':708,1257,1334 'postgr':245 'predic':1451,1452,1503 'prefer':360,375,429,568 'prefix':554 'presenc':880 'present':590,2219 'price':844 'primari':2465,2467 'print':1881 'pro':2399 'proceed':1384 'process':1208,1764 'procur':283,303,342,356,2329,2495 'product':317,2486 'profession':2182 'project':1978,1986 'prompt':1249,1274 'properti':334 'provid':149,818,857,1580,1591,1602,1611,1621,1630,1641,1654,1697,1706,1713,1721,1728,1736,1745,1752,1759,1766,1772,1779,1787,1794,1801,1807,1913,1927,1964,1994,2022,2067,2126,2162,2658,2675 'public':339,470 'pull':759 'python':1851 'q':1361 'qs':1047,1052 'qualiti':2134 'queri':739,1282,1426 'question':244,313 'quota':476,662,716,2496,2604,2699 'quota-spend':661 'rank':683 'rate':873,886,1646,2149,2167,2592,2645,2666,2683 're':735,753,1119,1418,2036,2508,2513,2541,2567,2574 're-ask':1118 're-der':2566 're-fetch':752 're-pag':734 're-pagin':2512 're-run':1417,2573 're-valid':2540 're-view':2507 'read':946,1030 'real':31,55,133,330,344,2246,2311 'real-est':329 'real-world':30,54,343 'recip':1886 'recommend':484 'record':282,2345 'recruit':238,2327 'refus':194,239,2330 'reject':1533 'relev':794 'remain':2700 'remedi':1625,1757 'remodel':293,2385 'report':2696 'request':172,974,1096,1215 'requir':433,931,2547,2553 'residenti':292 'resolut':1020 'respons':779,1199,2438 'rest':446,457,471,481,595,2613 'retail':908,1817 'retri':2596,2599 'retry-aft':2595 'return':1284,1405,1858,2520 'reveal':1357 'review':114,874 'revit':319,2488 'revok':1416 'rise':907,1597,1815,1945,1953,1970 'ritual':767 'round':993 'round-trip':992 'rstrip':1848,1861 'rule':717,1021,1475 'run':1033,1419,2575 'saa':197,2321 'safe':1324 'sandbox':401 'say':1102 'scope':651,2380 'search':504,1430,1542 'secur':935 'see':541 'seismic':1636,2105,2116,2132 'seismic-design':2115 'semiconductor':910,1816 'separ':2335 'serv':850 'server':359,372,387,436,565 'servic':70,75,141,148,347,817,856,1578,1579,1589,1590,1600,1601,1609,1610,1619,1620,1628,1629,1639,1640,1652,1653,1696,1705,1712,1720,1727,1735,1744,1751,1758,1765,1771,1778,1786,1793,1800,1806,1911,1912,1925,1926,1962,1963,1992,1993,2020,2021,2065,2066,2124,2125,2160,2161,2243,2253,2281,2400,2656,2657,2673,2674 'servicegraph':45,370,546,563,586,1044,1048,1053,1083,1094,1160,1192,1285,1362 'session':622,765,1004,1079,1098,1398,1410,2695 'session-start':764 'set':853,1183,1186 'sha256':1846,1878 'shell':408,969,1017,1035,1132,1139,1154,1181 'shortlist':12,50,684,706 'signal':848 'simpler':450 'sitework':1694 'size':656,847 'skill':126,182,266,287,349,2363 'skill-find-engineering-firm' 'skip':715,1113,2422,2588 'smaller':2450 'social':699 'soft':38 'softwar':102,104,119,136,191,196,206,219,236,251,316,2238,2287,2300,2309,2485 'software-develop':118 'software-engin':190,235,2286 'soil':1733 'solidwork':321,2490 'sometim':821,2273 'somewher':1062 'sourc':1168 'source-nostrband' 'span':79 'special':2009 'specif':553 'spend':639,663 'stabl':1838 'stamp':2031,2048,2074 'star':2148,2644 'start':766 'stat':528 'state':843,1504,1529,1535,1537,1584,1634,1894,1917,1931,2130,2662,2679 'status':2525 'stay':1104 'step':1387 'stori':2040 'structur':20,81,147,155,274,803,863,1593,1701,1704,1708,1940,1947,1966,2045,2053,2069,2078,2373 'structural-engin':154,802,862,1592,1707,1965,2068 'style':1431 'sub':77,143,796,1667,1681,2280 'sub-disciplin':142,795,1666 'sub-servic':2279 'sub-tag':1680 'sub-taxonomi':76 'subshel':1172 'substr':561,894,1557,1882,2185 'success':1371 'suppress':2430,2442 'surfac':1237,2079 'survey':86,1740,1742,1747 'surveying-map':1746 'switch':2606 'system':112,240 'tag':65,74,150,487,798,819,852,1669,1682,2240 'tagatevid':1464,1465 'taxonomi':78 'team':108,210,2292 'tech':2302 'tell':2617 'territori':121 'test':95,1792,1797 'text':893,1289,1556 'thing':124 'three':1512,2140,2626 'threshold':2135 'throttl':650 'tier':381,422,440,574,602,606,608,1108 'tighter':1481 'titl':899,1561 'tmp':1203 'token':412,934,939,958,977,1009,1026,1045,1049,1054,1059,1067,1084,1144,1161,1193,1219,1226,1232,1286,1363,1367,1390,1412,2571 'tool':377,432,464,480,544,570,588 'topic':252 'topic-agent-skills' 'topic-ai-agents' 'topic-b2b-data' 'topic-claude-code-marketplace' 'topic-claude-code-plugins' 'topic-claude-code-skills' 'topic-claude-plugins' 'topic-claude-skills' 'topic-mcp-server' 'topic-openapi' 'topic-professional-services' 'topic-vendor-discovery' 'total':876 'tr':1869 'transport':25,87,909,1586,1695,1749,1754,1891,1904,1919,1933,2634,2664,2681 'transportation-engin':1753 'trigger':1245 'trip':994 'true':2443 'two':742 'tx':1507 'type':1264,1341 'typic':146 'unauthor':1407,2570 'uniqu':669,690,725 'unless':1122 'url':447,677,696,2463 'us':16,53,307 'usag':230,2296 'use':5,175,180,388,455,611,654,681,837,968,1006,1091,1495,1534,1691 'user':8,131,325,982,1001,1072,1101,1124,1251,1276,1374,1688,1895,1946,1979,2005,2034,2091,2108,2139,2192,2228,2339,2474,2500,2619,2625 'valid':635,1572,2542 'valu':413,629,789,961,1032,1239,1359,1459,1460,1461,2649 'valueorlist':1455,1458 'vari':555 'verifi':829,1671 'vertic':903,1811 'vet':13 'via':164,1131,1674,2184 'vibrat':1799 'view':727,2506,2509 'vs':246,249,825 'want':9,2092,2340 'whenev':6 'whether':1024 'whitespac':1442 'within':1501 'without':991,1029,1236,1356,2254 'work':169,271,1128,2370 'world':32,56,345 'wrapper':1140 'wrong':1309 'x':1256,1333,1516,1519,2698 'x-quota-remaining-month':2697 'year':878 'yes':490,496,502 'z':1872,1875 'zero':1065,1304","prices":[{"id":"42f4721d-a834-42d0-b3d4-1e12d2eada8b","listingId":"74558213-bd35-47d8-b62e-21cad3c11b9c","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"nostrband","category":"ServiceGraph","install_from":"skills.sh"},"createdAt":"2026-05-06T12:58:10.764Z"}],"sources":[{"listingId":"74558213-bd35-47d8-b62e-21cad3c11b9c","source":"github","sourceId":"nostrband/ServiceGraph/find-engineering-firm","sourceUrl":"https://github.com/nostrband/ServiceGraph/tree/main/skills/find-engineering-firm","isPrimary":false,"firstSeenAt":"2026-05-06T12:58:10.764Z","lastSeenAt":"2026-05-18T18:56:03.018Z"}],"details":{"listingId":"74558213-bd35-47d8-b62e-21cad3c11b9c","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"nostrband","slug":"find-engineering-firm","github":{"repo":"nostrband/ServiceGraph","stars":160,"topics":["agent-skills","ai-agents","b2b-data","claude-code-marketplace","claude-code-plugins","claude-code-skills","claude-plugins","claude-skills","mcp-server","openapi","professional-services","vendor-discovery"],"license":"mit","html_url":"https://github.com/nostrband/ServiceGraph","pushed_at":"2026-05-07T12:11:52Z","description":"AI Agent skills for a structured catalog of 100k+ US professional-services firms","skill_md_sha":"569ef8191670ec611e42a080c0877f87442494c6","skill_md_path":"skills/find-engineering-firm/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/nostrband/ServiceGraph/tree/main/skills/find-engineering-firm"},"layout":"multi","source":"github","category":"ServiceGraph","frontmatter":{"name":"find-engineering-firm","license":"MIT","description":"Use whenever the user wants to find, shortlist, vet, or enrich US engineering firms — civil, structural, MEP, mechanical, electrical, geotechnical, transportation, environmental, and manufacturing. **For real-world engineering (buildings, infrastructure, manufacturing) — NOT software engineering.** Triggers on \"find civil engineering firms in Florida for transportation\", \"shortlist three structural engineering firms with high-rise experience\", \"MEP consultancy for a hospital project\", or \"pull contact info for these 12 engineering firm domains\", even when described indirectly (PE-stamped drawings, building-permit review). Drives the ServiceGraph API (api.servicegraph.co) — a 100k+ US firm catalog filterable by industry, services, location, size, ratings. Defer software-dev / \"engineering team\" / SaaS-architecture asks to find-software-developer. Skip in-house engineering-manager hires, DIY questions, software-product comparisons (Revit, AutoCAD), non-US firms, individual freelancers."},"skills_sh_url":"https://skills.sh/nostrband/ServiceGraph/find-engineering-firm"},"updatedAt":"2026-05-18T18:56:03.018Z"}}