{"id":"8bbbfee9-c89f-4c80-93e8-cfda04285d4d","shortId":"PVetTE","kind":"skill","title":"find-software-developer","tagline":"Use whenever the user wants to find, shortlist, vet, or enrich US software development firms — custom software, web development, mobile app development, backend/API development, DevOps/cloud, system integration, and hosting. Triggers on \"find a software dev shop in Austin\", \"shor","description":"# find-software-developer\n\nDrive the **ServiceGraph API** (`https://api.servicegraph.co`) to find,\nshortlist, and enrich US software development firms. The catalog has\ntens of thousands of US IT-services firms tagged across 21 service\nsub-tags including web-development, mobile-app-development,\napi-integration, devops-services, cloud-services, system-integration,\napplication-modernization, staff-augmentation, and managed-services.\n(Note: there is no `custom-software` or `hosting` tag — for those\nuser-facing concepts, pin `system-integration` or `application-\nmodernization` as the closest tag and add keywords like `custom`,\n`software`, `hosting`.)\n\n**Always pin `industry:it_services` in the filter.** This skill\nexists to do that automatically — the user shouldn't have to think\nabout catalog taxonomy.\n\nAny HTTP client works (curl, fetch, requests). Examples below use curl.\n\n## Sibling skills — defer when scope is narrow\n\nIf the user's ask is **strictly** website / landing-page work (build\nor refresh a site, marketing-site replacement, simple WordPress site),\ndefer to `find-web-developer`. If unsure, this skill is the safer\ndefault — it covers web development too and won't over-narrow.\n\nIf the user wants AI/ML modeling specifically (recommendation engines,\nLLM apps, ML pipelines as the core deliverable), that lives in a\ndifferent industry (`data_ai_consulting`) — defer to\n`find-service-providers` for now (a dedicated AI/ML skill is planned).\n\nIf the user wants strictly marketing work (SEO, paid media, branding,\ncontent), defer to `find-marketing-agency` or `find-seo-agency`.\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 IT-relevant tags\nexist in the returned `service_provided` taxonomy (web-development,\nmobile-app-development, api-integration, devops-services,\ncloud-services, system-integration, application-modernization,\nstaff-augmentation, managed-services). Note the catalog has **no**\n`custom-software` or `hosting` tags — those are user-facing concepts\nthat map to `system-integration` / `application-modernization` plus\nkeyword. The parser silently accepts unknown tags and returns zero\nresults, so verify before pinning.\n\nField kinds you'll use most:\n- **categorical**: `industry` (always `it_services`), `state`, `pricing_model`, `company_size_signal`, `geography_served` — op `:`\n- **tag_set_with_evidence**: `service_provided` — Map<tag, evidence∈{low,medium,high}>. 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. Bareword in the filter becomes a keyword.\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**IT-flavored examples** (validate yours with `/v1/check`):\n\n```\nindustry:it_services custom software state:TX\nindustry:it_services service_provided:mobile-app-development\nindustry:it_services service_provided:devops-services aws\nindustry:it_services service_provided:api-integration fintech\nindustry:it_services python aws state:CA\nindustry:it_services service_provided:system-integration@high rating>=4 has:clutch\nindustry:it_services service_provided:application-modernization legacy\n```\n\nWhen in doubt about whether a filter parses, hit `/v1/check?filter=...`\nfirst — it's free and returns the canonical normalized form.\n\n**Tech stack / vertical → keyword mapping** (the catalog tags services,\nnot languages or industries served, so stack and client-vertical are\nkeyword searches):\n\n| User mentions | Add as keyword |\n|---|---|\n| Python / Django / Flask | `python` |\n| Node.js / TypeScript / React | `node` or `react` |\n| Go / Rust / Java / .NET | `go`, `rust`, `java`, `.net` |\n| AWS / GCP / Azure | `aws`, `gcp`, `azure` |\n| Fintech / healthcare / govtech / SaaS | `fintech`, `healthcare`, `govtech`, `saas` |\n| SOC 2 / HIPAA / compliance | `soc2`, `hipaa`, `compliance` |\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`apex` is the registered domain (`thoughtworks.com`, not\n`www.thoughtworks.com/about`). Anyone with an apex list can compute\nfirm_ids locally and call `/v1/get/:id` directly — no `/search`\nneeded for BYO enrichment.\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 \"thoughtworks.com\" | tr 'A-Z' 'a-z' \\\n  | openssl dgst -sha256 -hex | awk '{print substr($2,1,12)}'\n```\n\n## Recipes\n\n### A. Custom-software shop in a state\n\nUser: *\"Software dev shop in Austin for a custom B2B platform.\"*\n\n```\nGET /v1/explore?filter=industry:it_services+service_provided:system-integration@high+custom+software+state:TX\n# → pool size + breakdowns\n\nGET /v1/search?filter=industry:it_services+service_provided:system-integration@high+custom+software+state:TX&limit=10\n# → 10 brief cards; user picks 3\n\nGET /v1/get/<firm_id>     # ×3\n# → urls, phones, emails for outreach\n```\n\n### B. Mobile app — vertical and platform\n\nUser: *\"Mobile app developer to ship our iOS app in Q1.\"*\n\niOS / Android distinctions aren't separate tags — use barewords:\n\n```\nGET /v1/search?filter=industry:it_services+service_provided:mobile-app-development+ios&limit=10\n```\n\n### C. DevOps + cloud migration\n\nUser: *\"DevOps consultancy to migrate us from on-prem to AWS.\"*\n\n```\nGET /v1/search?filter=industry:it_services+service_provided:devops-services+aws+migration\n```\n\nIf breakdowns come back thin, drop `migration` first — it's a vertical\nkeyword, not a service tag.\n\n### D. Indirect intent — \"technical partner to build out tooling\"\n\nUser: *\"We need a technical partner to build out our internal tooling,\nNortheast preferred.\"*\n\nThat's a custom-software ask. Translate:\n\n```\nGET /v1/search?filter=industry:it_services+custom+software+state:NY,MA,CT,NJ,PA\n# → 10 brief cards; user narrows\n```\n\n### E. Vertical + cert (fintech + SOC 2)\n\nUser: *\"Software houses that specialize in fintech and have SOC 2 readiness.\"*\n\n`fintech` and `soc2` are not structured facets — keyword them:\n\n```\nGET /v1/search?filter=industry:it_services+custom+software+fintech+soc2\n```\n\n### F. Quality threshold + third-party signals\n\nUser: *\"Three custom software firms with at least 4-star ratings, 50+ reviews.\"*\n\n```\nGET /v1/search?filter=industry:it_services+service_provided:system-integration@high+custom+software+rating>=4+review_count_total>=50&limit=10\n```\n\n### G. API/backend specialty + remote\n\nUser: *\"API/backend team to extend our SaaS — Bay Area or remote-friendly.\"*\n\n`remote-friendly` isn't structured. Use `geography_served:national_US`\n(a national-scope firm is more likely to serve remotely) and add\n`api` / `backend` keywords:\n\n```\nGET /v1/search?filter=industry:it_services+service_provided:api-integration+(state:CA OR geography_served:national_US)+saas\n```\n\n### H. BYO apex list — enrich domains the user already has\n\nUser pastes 8–20 domains. For each:\n\n1. Compute `firm_id` locally (see contract above).\n2. `GET /v1/get/<firm_id>` — full bundle if in catalog, 404 (not\n   charged) if not.\n3. Aggregate, present, flag the not-found ones to the user.\n\nUseful for confirming whether a list of dev-firm domains is in the\nUS IT-services catalog and pulling contact info in one pass.\n\n## Gotchas\n\n- **Always pin `industry:it_services`.** Without it, `web-development` / `mobile-app-development` keywords leak into marketing or design firms that also offer software-adjacent services.\n- **`industry:data_ai_consulting` is a sibling industry, not a sub-tag.** AI/ML-focused firms live there. If the user wants strictly an AI/ML/data-engineering firm, this skill returns an under-precise list — defer to `find-service-providers` (or a future AI-focused skill).\n- **Defer to `find-web-developer` for strictly website/landing-page projects** when that skill is loaded. This skill covers web dev as a sub-service, but the dedicated skill will out-rank it on narrow web-only asks.\n- **Programming language and tech stack are NOT structured tags.** `python`, `react`, `aws`, `kubernetes`, `rust`, etc. are keyword substring matches. Multi-word stacks (`ruby on rails`) split into separate AND'd keywords.\n- **Client-vertical (fintech, healthcare, govtech) is NOT a structured tag.** Keyword it.\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`. Do not pretend to have it from the brief.\n- **Catalog is US-only B2B.** Refuse offshore asks (\"a software firm in Bangalore\"), individual freelancers (\"a freelance developer\"), in-house engineering hires (\"hire a senior backend engineer\"), and DIY/code tasks (\"debug this\", \"review this PR\").\n- **Cloud product comparisons aren't procurement.** \"Which is better, AWS or GCP?\" is a knowledge question, not a firm shortlist.\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\nAuthed responses carry `X-RateLimit-*` and `X-Quota-*` headers. Surface\nthe remaining-month value to the user when it gets low so they can\nbudget.\n\n## End-to-end example\n\nUser: *\"Three custom software firms with healthcare-industry experience,\nSOC 2-ready, ideally with at least a 4-star rating.\"*\n\n```\n# 1. Discover fields (once per session)\nGET /v1/tags?include_values=1\n# Confirms 'system-integration' is a valid service_provided tag, 'rating'\n# is numeric, has:clutch is a presence flag.\n\n# 2. Validate the filter and scope the pool (free, no auth)\nGET /v1/check?filter=industry:it_services+service_provided:system-integration@high+custom+software+healthcare+soc2+rating>=4\n# → {\"valid\": true, \"normalized\": \"...\"}\n\nGET /v1/explore?filter=industry:it_services+service_provided:system-integration@high+custom+software+healthcare+soc2+rating>=4\n# → {\"count\": 31, \"breakdowns\": {...}}\n\n# 3. Search briefs\nGET /v1/search?filter=...&limit=10\n# Header: Authorization: Bearer $SERVICEGRAPH_TOKEN\n# → 10 brief cards with service tags, size, state.\n\n# 4. Present briefs to user, get their pick of 3.\n\n# 5. Pull full bundles for the 3 picks\nGET /v1/get/<firm_id>     # ×3\n# → urls, phones, emails for outreach\n```\n\nEnd of session: report `X-Quota-Remaining-Month` so the user knows how\nmuch budget is left.","tags":["find","software","developer","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-software-developer","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-software-developer","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 (18,875 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:04.064Z","embedding":null,"createdAt":"2026-05-06T12:58:11.827Z","updatedAt":"2026-05-18T18:56:04.064Z","lastSeenAt":"2026-05-18T18:56:04.064Z","tsv":"'/.env.local':1145 '/about':1716 '/check':366,883,1070 '/explore':367,885,1071 '/get':325,664,890,1364,2378,2443 '/search':324,662,888,1362,1733,2374,2420 '/stats':326 '/tags':365,882,1069 '/v1/auth/request-otp''':1220 '/v1/auth/verify-otp?format=env''':1297 '/v1/check':437,573,1535,1608,2559,2731 '/v1/explore':443,586,1794,2389,2623,2752 '/v1/get':460,628,1729,1837,2150,2812 '/v1/research':651 '/v1/search':449,607,1813,1871,1902,1963,2009,2039,2105,2417,2776 '/v1/search?filter=...''':1124,1156 '/v1/stats':472 '/v1/tags':431,557,2696 '/v1/tags?include_values=1':718 '0':1018 '1':407,408,982,1204,1438,1771,2140,2689,2699 '10':1829,1830,1884,1976,2059,2779,2785 '12':1695,1706,1751,1772,2577 '2':1028,1229,1457,1681,1770,1986,1997,2148,2679,2719 '2.1':332 '20':2136,2391,2396,2403 '200':610 '21':76 '3':1089,1313,1348,1473,1835,1838,2161,2772,2802,2809,2813 '31':2770 '4':1181,1499,1587,2033,2053,2686,2747,2768,2793 '400':2545,2560,2569 '401':1366,2584 '404':2156,2363,2376,2592 '429':2606,2617 '4xx':1266 '5':1359,2803 '50':631,2036,2057 '8':2135 'a-z':1757,1760 'accept':796 'across':75,866,1518 'add':139,1645,2100 'address':644,2433 'adjac':2226 'agenc':294,299 'agent':308,498,1208,1233 'aggreg':2162 'ai':261,2230,2271 'ai-focus':2270 'ai/ml':241,273 'ai/ml-focused':2241 'ai/ml/data-engineering':2251 'allow':1488 'alreadi':700,974,2131 'also':1280,2222 'alway':145,815,958,2200 'andexpr':1395,1397,1398 'android':1862 'anon':425 'anonym':363,381,887,1067 'anyon':1717 'apex':1707,1720,1744,2125,2424 'apex.lower':1703,1747 'api':51,90,745,1055,1567,2101,2113 'api-integr':89,744,1566,2112 'api.servicegraph.co':52,717,1123,1155,1219,1296 'api.servicegraph.co/v1/auth/request-otp''':1218 'api.servicegraph.co/v1/auth/verify-otp?format=env''':1295 'api.servicegraph.co/v1/search?filter=...''':1122,1154 'api.servicegraph.co/v1/tags?include_values=1':716 'api/backend':2061,2065 'app':25,87,247,742,1550,1846,1852,1858,1880,2212 'appear':924 'append':1250 'applic':102,132,757,789,1596 'application-modern':101,756,788,1595 'application/json':1225,1302 'area':2072 'aren':1864,2494 'ask':192,959,1080,1085,1960,2313,2437,2462 'atom':1408,1409 'audit':342 'augment':106,761 'austin':42,1787 'auth':304,322,515,519,543,551,881,933,1036,1074,1087,1094,2635,2729 'author':949,1118,1150,2781 'automat':159 'avail':988,1021 'aw':1560,1574,1666,1669,1900,1912,2325,2500 'awk':1767 'azur':1668,1671 'b':1446,1452,1844 'b2b':1791,2459 'back':1917 'backend':416,2102,2481 'backend/api':27 'bangalor':2467 'bareword':874,1416,1430,1500,1526,1869 'bash':1002,1109,1203,1752 'bay':2071 'bearer':609,630,893,1119,1151,2782 'becom':878,1512 'better':2499 'bind':1440 'bite':1437 'bodi':1160 'brand':287,869,1520 'breakdown':595,1811,1915,2406,2771 'brief':615,1831,1977,2418,2453,2774,2786,2795 'broaden':2413 'budget':2662,2834 'bug':2367 'build':200,1937,1947 'bundl':637,2152,2806 'byo':1736,2124 'c':1447,1454,1885 'ca':1465,1490,1496,1576,2116 'cach':719 'calendar':671 'call':305,396,561,584,646,675,714,1037,1075,1095,1728 'candid':600 'canon':1617 'captur':1157,1189,1315,1328,1332 'card':617,1832,1978,2787 'carri':2637 'catalog':63,168,469,767,1626,2155,2191,2454,2598 'categor':813 'cert':1983 'char':1698,2580 'charg':665,689,2158,2388,2602 'check':434,996 'claud':1310 'claude-c':1309 'cli':1311 'client':172,1638,2347 'client-vert':1637,2346 'closest':136 'cloud':96,751,1887,2491 'cloud-servic':95,750 'clutch':855,1589,2714 'code':1001,1017,1232,1238,1270,1306,1307,2538,2541 'come':1916 'comma':1458,1484 'command':1176 'comment':1282 'compani':821,860 'comparison':2493 'complet':517,1340 'complianc':1683,1686 'comput':1723,2141 'concept':126,781 'confirm':725,1029,1314,2175,2700 'consent':1337 'construct':711 'consult':262,1891,2231 'contact':621,2194,2439 'content':288,1223,1300 'content-typ':1222,1299 'context':360,904,916 'continu':2386,2605 'contract':1689,2146 'convers':724,927,1108 'core':252 'cost':552 'count':594,846,2055,2402,2411,2769 'cover':227,2291 'credenti':338,912 'ct':1973 'curl':174,180,385,433,439,445,455,467,478,1116,1148,1214,1260,1291 'custom':20,116,142,771,1539,1776,1790,1805,1824,1958,1968,2014,2027,2050,2670,2742,2763 'custom-softwar':115,770,1775,1957 'd':1226,1303,1931,2344 'data':260,420,2229 'debug':2486 'dedic':272,2301 'dedup':2518 'def':1741 'default':225 'defer':183,212,263,289,656,2261,2274 'deliver':253 'deriv':2583 'design':2219 'detect':480,968,983,1188 'dev':39,1784,2181,2293 'dev-firm':2180 'develop':4,18,23,26,28,47,60,84,88,217,229,739,743,1551,1853,1881,2209,2213,2279,2472 'devop':93,748,1558,1886,1890,1910 'devops-servic':92,747,1557,1909 'devops/cloud':29 'dgst':1764 'differ':258,685 'direct':939,1193,1731 'discov':565,2690 'discoveri':395 'dispatch':351,930,1090,1346 'distinct':1863 'diy/code':2484 'django':1649 'doesn':1135,1271 'domain':1711,2128,2137,2183 'dotenv':945 'doubt':1601 'drill':2407 'drive':48 'drop':1919 'dsl':1384 'e':1981 'echo':1173,1325,1753 'either':1142 'els':454,466,477 'email':640,1207,1213,1227,1228,1304,1305,1841,2428,2816 'empti':2563 'encod':1749 'end':2664,2666,2819 'end-to-end':2663 'endpoint':414,424 'engin':245,2476,2482 'enrich':15,57,1737,2127 'enter':357,1106 'env':907,1015,1241 'env.local':348,908,979,1010,1048,1127,1195,1252,1312,1324,1355 'environ':944,1047,1115 'error':1277,2532,2534,2537,2548 'escal':2415 'etc':2328 'even':970,1287 'ever':356 'everi':372,563,932,1093 'evid':830,835,842 'exampl':177,1531,2667 'exchang':1230 'exhaust':2620 'exist':155,730,2372 'exit':1000,1016,1261 'expand':1180 'experi':2677 'expir':1373 'explor':440 'explore/search':583 'export':1111 'extend':2068 'f':1257,2018 'face':125,780 'facet':2005 'fall':533 'fetch':175,696 'fewer':2394 'field':567,807,2616,2691 'file':913,946,1164,1275 'filter':152,435,574,579,587,608,686,713,877,1383,1392,1410,1605,1609,1795,1814,1872,1903,1964,2010,2040,2106,2546,2554,2561,2564,2722,2732,2753,2777 'find':2,11,36,45,54,215,266,292,297,2264,2277 'find-marketing-ag':291 'find-seo-ag':296 'find-service-provid':265,2263 'find-software-develop':1,44 'find-web-develop':214,2276 'fintech':1569,1672,1676,1984,1993,1999,2016,2349 'firm':19,61,73,441,447,458,612,616,633,649,668,698,867,1687,1690,1700,1724,1742,2029,2092,2142,2182,2220,2242,2252,2369,2397,2465,2509,2571,2573,2595,2672 'first':560,1035,1610,1921,2520 'fix':2552 'flag':1258,2164,2383,2600,2718 'flask':1650 'flavor':1530 'flow':520,539,938,1183,1342,1382 'focus':2272 'follow':1508 'form':1619 'format':1240 'found':848,1041,2168,2594 'four':547,1434 'four-tier':546 'free':559,576,589,614,635,683,705,863,1515,1613,2526,2531,2727 'free-text':862,1514 'freelanc':2469,2471 'friend':2076,2079 'fss':1215,1292 'full':636,2151,2805 'funnel':549 'futur':1357,2269 'g':2060 'gcp':1667,1670,2502 'geographi':824,2084,2118 'get':430,436,442,448,457,459,471,556,572,585,606,627,715,1793,1812,1836,1870,1901,1962,2008,2038,2104,2149,2657,2695,2730,2751,2775,2798,2811 'github':1389 'github-search-styl':1388 'go':1658,1662 'goe':1096 'gotcha':2199 'govtech':1674,1678,2351 'grep':1006,1011,1320 'h':1117,1149,1221,1298,2123 'handl':337,1699 'har':309,336,494,522 'harness-specif':493 'hashlib':1740 'hashlib.sha256':1746 'header':950,2613,2645,2780 'healthcar':1673,1677,2350,2675,2744,2765 'healthcare-industri':2674 'hex':1697,1766,2579 'hex-char':1696 'hexdigest':1705,1750 'high':838,1429,1585,1804,1823,2049,2741,2762 'hipaa':1682,1685 'hire':2477,2478 'hit':1607 'honor':2609 'host':33,119,144,335,774 'hous':1989,2475 'http':171 'id':461,629,1688,1691,1701,1725,1730,1743,2143,2370,2444,2572,2574 'ideal':2681 'ident':1413,1422,1426,1431,1504 'ignor':1286 'implicit':1336,1403 'import':1739 'in-hous':2473 'includ':81,2423,2550,2697 'indirect':1932 'individu':2468 'industri':147,259,814,1536,1543,1552,1561,1570,1577,1590,1632,1796,1815,1873,1904,1965,2011,2041,2107,2202,2228,2235,2676,2733,2754 'info':622,2195,2440 'initi':523 'insid':1130,1482 'inspect':999 'integr':31,91,100,130,746,755,787,1568,1584,1803,1822,2048,2114,2703,2740,2761 'intent':1933 'intern':1950 'invalid':2570 'io':1857,1861,1882 'ip':591 'ip-throttl':590 'isn':2080 'it-flavor':1528 'it-relev':726 'it-servic':70,2188 'java':1660,1664 'jq':1167,1254 'jq-process':1166 'json':2536 'k':2390 'keep':897 'keyword':140,792,861,880,1433,1501,1623,1641,1647,1926,2006,2103,2214,2330,2345,2357 'kind':569,808 'know':2831 'knowledg':2505 'kubernet':2326 'land':197,1290 'landing-pag':196 'languag':1630,2315 'later':1081 'leak':1137,2215 'least':2032,2684 'left':2836 'legaci':1598 'legal':566,642,872,1523,2430 'like':141,2095 'limit':1828,1883,2058,2608,2778 'line':1283 'linkedin':859 'list':428,1459,1485,1721,2126,2178,2260 'liter':920,1103,1481 'live':255,2243 'll':810 'llm':246,359,903,957,1202 'load':315,453,465,476,509,2288 'local':1726,2144 'look':2359 'low':836,1427,2658 'lowercas':2578 'ma':1972 'make':1259,2409 'manag':109,763 'managed-servic':108,762 'map':409,783,833,1624 'market':206,282,293,2217 'marketing-sit':205 'match':501,1468,2332,2398 'matter':661 'may':2371 'mcp':300,313,328,368,373,405,421,451,463,474,485,506,529 'mcp.servicegraph.co':316 'media':286 'medium':837,1428 'mention':1644 'messag':2539 'meta':871,1522 'mid':1369 'mid-sess':1368 'migrat':1888,1893,1913,1920 'mirror':1278 'missing/expired':2587 'ml':248 'mobil':24,86,741,1549,1845,1851,1879,2211 'mobile-app-develop':85,740,1548,1878,2210 'mode':2625 'model':242,820,896 'modern':103,133,758,790,1597 'month':613,634,672,703,2517,2618,2631,2650,2827 'much':2833 'multi':2334 'multi-word':2333 'multipl':1525 'must':2442,2575 'mvp':655 'n':1003,1754 'name':491,568,643,868,873,1308,1519,1524,2431 'narrow':187,236,1980,2309 'nation':2086,2090,2120 'national-scop':2089 'need':525,1255,1734,1942 'negat':1474,1480 'net':1661,1665 'never':905,923,1105 'new':1191 'nj':1974 'node':1655 'node.js':1652 'non':1024,1263 'non-zero':1023,1262 'none':558,575,588 'normal':1618,2750 'northeast':1952 'not-found':2166 'note':111,765 'notexpr':1399,1401,1405,1407 'number':1423,1432,1506 'numer':843,2712 'ny':1466,1491,1498,1971 'oauth':331,376 'offer':2223 'offshor':2461 'ok':1049 'on-prem':1896 'one':1385,1462,2169,2197,2566 'op':826,839,850,1414,1417 'openssl':1763 'oper':570,1511 'option':841 'orexpr':1393,1394 'otp':456,468,479,538,1182,1326,1381,2591 'out-rank':2304 'outreach':1843,2818 'over-narrow':234 'overlap':688,693 'pa':1975 'page':198,678 'pagin':2529 'paid':285,652 'param':1243 'paramet':1387 'paren':1456 'parent':1140 'pars':1448,1606,2547 'parser':794 'parti':2023 'partner':1935,1945 'pass':2198 'past':2134 'path':393,427 'pattern':400,500 'pattern-match':499 'payload':2549 'per':666,670,674,963,2514,2516,2693 'per-user-per-month':2513 'persist':1353 'phone':639,853,1840,2426,2815 'pick':1834,2800,2810 'pin':127,146,806,2201 'pipelin':249 'pkce':333 'plain':384,1248 'plan':276 'platform':1792,1849 'plus':791 'pollut':1273 'pool':601,1809,2726 'posit':2551 'post':650,1217,1294 'pr':2490 'precis':2259 'predic':1411,1412,1463 'prefer':302,317,371,510,1953 'prefix':496 'prem':1898 'presenc':851,2717 'present':532,2163,2794 'pretend':2447 'price':819 'primari':2427,2429 'print':1768 'pro':2361 'proceed':1344 'process':1168 'procur':2496 'product':2492 'program':2314 'project':2283 'prompt':1209,1234 'provid':268,735,832,1547,1556,1565,1581,1594,1800,1819,1877,1908,2045,2111,2266,2708,2737,2758 'public':412 'pull':701,2193,2804 'python':1573,1648,1651,1738,2323 'q':1321 'q1':1860 'qs':1007,1012 'qualiti':2019 'queri':681,1242,1386 'question':2506 'quota':418,604,658,2511,2619,2644,2825 'quota-spend':603 'rail':2339 'rank':625,2306 'rate':844,857,1586,2035,2052,2607,2688,2710,2746,2767 'ratelimit':2640 're':677,695,1079,1378,2523,2528,2556,2582,2589 're-ask':1078 're-der':2581 're-fetch':694 're-pag':676 're-pagin':2527 're-run':1377,2588 're-valid':2555 're-view':2522 'react':1654,1657,2324 'read':906,990 'readi':1998,2680 'recip':1773 'recommend':244,426 'refresh':202 'refus':2460 'regist':1710 'reject':1493 'relev':728 'remain':2649,2826 'remaining-month':2648 'remot':2063,2075,2078,2098 'remote-friend':2074,2077 'replac':208 'report':2822 'request':176,934,1056,1175 'requir':375,891,2562,2568 'resolut':980 'respons':721,1159,2400,2636 'rest':388,399,413,423,537,2628 'result':802 'retri':2611,2614 'retry-aft':2610 'return':733,800,1244,1365,1615,1745,2255,2535 'reveal':1317 'review':845,2037,2054,2488 'revok':1376 'ritual':709 'round':953 'round-trip':952 'rstrip':1704,1748 'rubi':2337 'rule':659,981,1435 'run':993,1379,2590 'rust':1659,1663,2327 'saa':1675,1679,2070,2122 'safe':1284 'safer':224 'sandbox':343 'say':1062 'scope':185,593,2091,2724 'search':446,1390,1502,1642,2773 'secur':895 'see':483,2145 'senior':2480 'seo':284,298 'separ':1866,2342 'serv':825,1633,2085,2097,2119 'server':301,314,329,378,507 'servic':72,77,94,97,110,149,267,734,749,752,764,817,831,1538,1545,1546,1554,1555,1559,1563,1564,1572,1579,1580,1592,1593,1628,1798,1799,1817,1818,1875,1876,1906,1907,1911,1929,1967,2013,2043,2044,2109,2110,2190,2204,2227,2265,2298,2362,2707,2735,2736,2756,2757,2789 'servicegraph':50,312,488,505,528,1004,1008,1013,1043,1054,1120,1152,1245,1322,2783 'session':564,707,964,1039,1058,1358,1370,2694,2821 'session-start':706 'set':828,1143,1146 'sha256':1702,1765 'shell':350,929,977,995,1092,1099,1114,1141 'ship':1855 'shop':40,1778,1785 'shor':43 'shortlist':12,55,626,648,2510 'shouldn':162 'sibl':181,2234 'signal':823,2024 'silent':795 'simpl':209 'simpler':392 'site':204,207,211 'size':598,822,1810,2791 'skill':154,182,221,274,2254,2273,2286,2290,2302 'skill-find-software-developer' 'skip':657,1073,2384,2603 'smaller':2412 'soc':1680,1985,1996,2678 'soc2':1684,2001,2017,2745,2766 'social':641 'softwar':3,17,21,38,46,59,117,143,772,1540,1777,1783,1806,1825,1959,1969,1988,2015,2028,2051,2225,2464,2671,2743,2764 'software-adjac':2224 'somewher':1022 'sourc':1128 'source-nostrband' 'special':1991 'specialti':2062 'specif':243,495 'spend':581,605 'split':2340 'stabl':1694 'stack':1621,1635,2318,2336 'staff':105,760 'staff-augment':104,759 'star':2034,2687 'start':708 'stat':470 'state':818,1464,1489,1495,1497,1541,1575,1781,1807,1826,1970,2115,2792 'status':2540 'stay':1064 'step':1347 'strict':194,281,2249,2281 'structur':2004,2082,2321,2355 'style':1391 'sub':79,2239,2297 'sub-servic':2296 'sub-tag':78,2238 'subshel':1132 'substr':503,865,1517,1769,2331 'success':1331 'suppress':2392,2404 'surfac':1197,2646 'switch':2621 'system':30,99,129,754,786,1583,1802,1821,2047,2702,2739,2760 'system-integr':98,128,753,785,1582,1801,1820,2046,2701,2738,2759 'tag':74,80,120,137,429,729,775,798,827,834,1627,1867,1930,2240,2322,2356,2709,2790 'tagatevid':1424,1425 'task':2485 'taxonomi':169,736 'team':2066 'tech':1620,2317 'technic':1934,1944 'tell':2632 'ten':65 'text':864,1249,1516 'thin':1918 'think':166 'third':2022 'third-parti':2021 'thoughtworks.com':1712,1755 'thousand':67 'three':1472,2026,2669 'threshold':2020 'throttl':592 'tier':323,364,382,516,544,548,550,1068 'tighter':1441 'titl':870,1521 'tmp':1163 'token':354,894,899,918,937,969,986,1005,1009,1014,1019,1027,1044,1104,1121,1153,1179,1186,1192,1246,1323,1327,1350,1372,2586,2784 'tool':319,374,406,422,486,512,530,1939,1951 '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':847,2056 'tr':1756 'translat':1961 'trigger':34,1205 'trip':954 'true':2405,2749 'two':684 'tx':1467,1542,1808,1827 'type':1224,1301 'typescript':1653 'unauthor':1367,2585 'under-precis':2257 'uniqu':611,632,667 'unknown':797 'unless':1082 'unsur':219 'url':389,619,638,1839,2425,2814 'us':16,58,69,1894,2087,2121,2187,2457 'us-on':2456 'use':5,179,330,397,553,596,623,811,928,966,1051,1455,1494,1868,2083,2173 'user':8,124,161,190,239,279,779,942,961,1032,1061,1084,1211,1236,1334,1643,1782,1833,1850,1889,1940,1979,1987,2025,2064,2130,2133,2172,2247,2436,2515,2634,2654,2668,2797,2830 'user-fac':123,778 'valid':577,1532,2557,2706,2720,2748 'valu':355,571,921,992,1199,1319,1419,1420,1421,2651,2698 'valueorlist':1415,1418 'vari':497 'verifi':804 'vertic':1622,1639,1847,1925,1982,2348 'vet':13 'via':1091 'view':669,2521,2524 'want':9,240,280,2248 'web':22,83,216,228,738,2208,2278,2292,2311 'web-develop':82,737,2207 'web-on':2310 'websit':195 'website/landing-page':2282 'whenev':6 'whether':984,1603,2176 'whitespac':1402 'within':1461 'without':951,989,1196,1316,2205 'won':232 'word':2335 'wordpress':210 'work':173,199,283,1088 'wrapper':1100 'wrong':1269 'www.thoughtworks.com':1715 'www.thoughtworks.com/about':1714 'x':1216,1293,1476,1479,2639,2643,2824 'x-quota':2642 'x-quota-remaining-month':2823 'x-ratelimit':2638 'year':849 'yes':432,438,444 'z':1759,1762 'zero':801,1025,1264","prices":[{"id":"19390440-f79e-448b-bb93-ce3534982d8d","listingId":"8bbbfee9-c89f-4c80-93e8-cfda04285d4d","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:11.827Z"}],"sources":[{"listingId":"8bbbfee9-c89f-4c80-93e8-cfda04285d4d","source":"github","sourceId":"nostrband/ServiceGraph/find-software-developer","sourceUrl":"https://github.com/nostrband/ServiceGraph/tree/main/skills/find-software-developer","isPrimary":false,"firstSeenAt":"2026-05-06T12:58:11.827Z","lastSeenAt":"2026-05-18T18:56:04.064Z"}],"details":{"listingId":"8bbbfee9-c89f-4c80-93e8-cfda04285d4d","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"nostrband","slug":"find-software-developer","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":"f059c3e3cf2d8ea2c3086d28df1ff4cf656ae6c2","skill_md_path":"skills/find-software-developer/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/nostrband/ServiceGraph/tree/main/skills/find-software-developer"},"layout":"multi","source":"github","category":"ServiceGraph","frontmatter":{"name":"find-software-developer","license":"MIT","description":"Use whenever the user wants to find, shortlist, vet, or enrich US software development firms — custom software, web development, mobile app development, backend/API development, DevOps/cloud, system integration, and hosting. Triggers on \"find a software dev shop in Austin\", \"shortlist three custom-software firms with healthcare experience\", \"we need a mobile app developer for our iOS launch\", or \"pull contact info for these 10 dev shop domains\", even when described indirectly (build a tool, ship a feature, technical partner). Drives the ServiceGraph API (api.servicegraph.co) — a 100k+ US firm catalog filterable by industry, services, location, size, ratings. Defer to find-web-developer for strictly website/landing-page projects. Defer AI/ML, ML pipelines, model building, and data-engineering asks — those are a sibling industry, not software development. Skip in-house engineer hires, code-writing/debugging tasks, cloud-product comparisons, hardware/civil engineering, non-US firms, individual freelancers."},"skills_sh_url":"https://skills.sh/nostrband/ServiceGraph/find-software-developer"},"updatedAt":"2026-05-18T18:56:04.064Z"}}