{"id":"986efedd-64cd-469a-8e26-5b859f0a395e","shortId":"3r4BzY","kind":"skill","title":"find-ai-consultancy","tagline":"Use whenever the user wants to find, shortlist, vet, or enrich US AI/ML/data consulting firms (consultancies) — AI/ML development, MLOps, generative AI / LLM apps (RAG, chatbots, agents), computer vision, NLP, recommendation systems, data engineering, BI/analytics. Triggers on \"f","description":"# find-ai-consultancy\n\nDrive the **ServiceGraph API** (`https://api.servicegraph.co`) to find,\nshortlist, and enrich US AI/ML and data consultancies. The catalog\ntags firms with `industry:data_ai_consulting` and a 4-tag service\nsub-taxonomy: `ai-ml-development` (the largest at ~12k firms),\n`data-analytics`, `cloud-services`, and `api-integration`. Confirm\nexact tag names via `/v1/tags` since taxonomy can drift between\ncatalog releases.\n\n**Always pin `industry:data_ai_consulting`.** This skill exists to do\nthat automatically — the user shouldn't have to think about catalog\ntaxonomy.\n\nAny HTTP client works (curl, fetch, requests). Examples below use curl.\n\n## Sibling skills — defer when scope is different\n\n- **General application or backend dev that just uses AI as a feature**\n  (e.g. \"build us a SaaS with an AI chatbot tab\") → `find-software-developer`.\n  This skill is for engagements where the AI/ML/data work IS the deliverable.\n- **Web/site projects that include some AI** → `find-web-developer`.\n- **AI-related marketing or content** → `find-marketing-agency`.\n\nIf the user wants AI/ML/data engineering as the primary deliverable\n(model building, pipelines, agents, MLOps, BI), this skill applies.\n\n## When NOT to use this skill\n\n- **Consumer AI courses or learning** (\"find me an online course to learn\n  ML\") — out of scope; the catalog is firm-procurement.\n- **AI/LLM product comparisons** (\"ChatGPT vs Claude vs Gemini\",\n  \"Cursor vs Copilot\") — software-product questions, not procurement.\n- **DIY/code tasks** (\"how do I fine-tune Llama\", \"review this PyTorch\n  training loop\").\n- **In-house ML/data hires** (Machine Learning Engineer, Data Scientist,\n  ML Platform Engineer).\n- **Generic AI knowledge** (\"explain how transformers work\").\n- **Non-US firms.**\n- **Individual freelance ML engineers / data scientists.**\n\nIf the user is a *business* procuring external AI/ML/data services,\nthis skill applies — defaults 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 `data_ai_consulting`\nis present in the `industry` value list. The relevant sub-tags under\n`service_provided` are `ai-ml-development`, `data-analytics`,\n`cloud-services`, and `api-integration` — verify exact names before\nconstructing filters with `service_provided:` predicates.\n\nField kinds you'll use most:\n- **categorical**: `industry` (always `data_ai_consulting`), `state`, `pricing_model`, `company_size_signal`, `geography_served` — op `:`\n- **tag_set_with_evidence**: `service_provided` (e.g. `ai-ml-development`, `data-analytics`, `cloud-services`, `api-integration`) — 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. **Sub-niches like RAG, LLM, MLOps, computer vision, NLP, recommendation systems are typically 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**AI-flavored examples** (validate yours with `/v1/check`):\n\n```\nindustry:data_ai_consulting service_provided:ai-ml-development\nindustry:data_ai_consulting service_provided:ai-ml-development@high state:CA\nindustry:data_ai_consulting service_provided:data-analytics pipelines\nindustry:data_ai_consulting llm rag\nindustry:data_ai_consulting computer vision healthcare\nindustry:data_ai_consulting mlops\nindustry:data_ai_consulting (service_provided:ai-ml-development OR service_provided:data-analytics)\nindustry:data_ai_consulting service_provided:ai-ml-development@high rating>=4 has:clutch\n```\n\nWhen in doubt, hit `/v1/check?filter=...` first.\n\n**Sub-niche → keyword/tag mapping**:\n\n| User asks for | Use |\n|---|---|\n| AI/ML model building | `service_provided:ai-ml-development` |\n| Data engineering / pipelines | `service_provided:data-analytics` + keywords `pipelines`/`engineering` (no `data-engineering` tag exists) |\n| BI / analytics | `service_provided:data-analytics` (covers BI too — no separate `business-intelligence` tag) |\n| Cloud architecture for data/ML | `service_provided:cloud-services` |\n| API integration / data integration | `service_provided:api-integration` |\n| LLM apps / RAG / agents | `llm`, `rag`, `agent` (keywords) |\n| Generative AI | `generative ai`, `genai` (keywords) |\n| Computer vision | `computer vision`, `cv` (keywords) |\n| NLP / IDP / document understanding | `nlp`, `idp`, `document understanding` |\n| MLOps / model deployment | `mlops`, `deployment` |\n| Recommendation systems | `recommendation`, `recsys` |\n| Predictive analytics / churn / forecasting | `predictive`, `forecasting`, `churn` |\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 \"scaleai.com\" | tr 'A-Z' 'a-z' \\\n  | openssl dgst -sha256 -hex | awk '{print substr($2,1,12)}'\n```\n\n## Recipes\n\n### A. AI/ML consultancy for a recommendation engine\n\nUser: *\"AI/ML consultancy to build our recommendation engine for an\necommerce site.\"*\n\n```\nGET /v1/explore?filter=industry:data_ai_consulting+service_provided:ai-ml-development+(recommendation OR recsys)+ecommerce\nGET /v1/search?filter=industry:data_ai_consulting+service_provided:ai-ml-development+recommendation+ecommerce&limit=10\nGET /v1/get/<firm_id>     # ×3\n```\n\n### B. RAG / LLM consultancies for a chatbot\n\nUser: *\"Three RAG/LLM consultancies for an enterprise chatbot.\"*\n\n```\nGET /v1/search?filter=industry:data_ai_consulting+(rag OR llm)+chatbot+enterprise\n```\n\nIf thin, drop `enterprise` and surface client-tier signals from\n`/get` after.\n\n### C. Data engineering partner\n\nUser: *\"Data-engineering partner to build our analytics pipelines.\"*\n\nThe catalog has no `data-engineering` tag — `data-analytics` is the\nclosest sub-tag and it covers both BI and engineering work. Pin the\ntag and add keywords for the engineering flavor:\n\n```\nGET /v1/search?filter=industry:data_ai_consulting+service_provided:data-analytics+(pipelines OR engineering)\n```\n\n### D. MLOps for model deployment\n\nUser: *\"MLOps consultancy to help us deploy models to production.\"*\n\n```\nGET /v1/search?filter=industry:data_ai_consulting+mlops\n```\n\n### E. Indirect intent — \"use AI to predict customer churn\"\n\nUser: *\"We want to use AI to predict customer churn — who can help us\nbuild that?\"*\n\nThat's a custom-ML consulting ask in the predictive-analytics niche:\n\n```\nGET /v1/search?filter=industry:data_ai_consulting+service_provided:ai-ml-development+(churn OR predictive)\n```\n\nIf the user gave a vertical (SaaS, retail, telco), add it as a\nkeyword.\n\n### F. Computer vision + healthcare vertical\n\nUser: *\"AI consultancies specializing in computer vision for healthcare.\"*\n\n```\nGET /v1/search?filter=industry:data_ai_consulting+computer vision+healthcare\n```\n\n### G. Quality threshold + Fortune 500 clients\n\nUser: *\"Three AI/ML consulting firms with 4-star ratings and Fortune\n500 clients.\"*\n\n```\nGET /v1/search?filter=industry:data_ai_consulting+service_provided:ai-ml-development@high+rating>=4&limit=10\n```\n\nThe \"Fortune 500\" angle isn't structured — surface from briefs and\nlet the user pick, or add `fortune` as a keyword.\n\n### H. Custom LLM agent for customer service\n\nUser: *\"Custom LLM agent for our customer-service workflows.\"*\n\n```\nGET /v1/search?filter=industry:data_ai_consulting+(llm OR agent)+(customer service OR support)\n```\n\n### I. BYO apex list — enrich domains the user already has\n\nUser pastes 8–20 AI consultancy 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.\n\nA 404 here often means the firm is actually a SaaS product company\n(many AI vendors brand as \"AI services\" but operate as a product) —\nnot in the consulting catalog.\n\n## Gotchas\n\n- **Always pin `industry:data_ai_consulting`.** Without it, `ai-ml-development` as a service tag could surface IT firms that list AI as a sub-service.\n- **Defer to `find-software-developer` for general dev that uses AI as a feature.** When the deliverable is a SaaS product or app and AI is one of several features, that's software-dev work; this skill is for engagements where AI/ML/data work IS the deliverable.\n- **Catalog audit notes**: AI/ML-tagged firms have a higher historical rate of mis-classification (some are SaaS products, some are B2C ed-tech). The catalog has been audited but residual leakage is possible. If a `/get` returns a SaaS product, the agent should flag this and skip rather than recommend.\n- **Many sub-niches are keyword-only.** Multi-word sub-niches split into ANDed barewords (`computer vision` → `computer` AND `vision`).\n- **LLM-product comparisons (ChatGPT vs Claude vs Gemini, etc.) are NOT procurement** — refuse those.\n- **AI courses for individuals (Coursera, fast.ai, Andrew Ng courses) are NOT in the catalog** — refuse those.\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- **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 AI/ML consultancies to build a recommendation engine for\nan ecommerce site, ideally with 4-star ratings and Fortune 500 clients.\"*\n\n```\nGET /v1/tags?include_values=1\nGET /v1/check?filter=industry:data_ai_consulting+service_provided:ai-ml-development@high+(recommendation OR recsys)+ecommerce+rating>=4\nGET /v1/explore?filter=industry:data_ai_consulting+service_provided:ai-ml-development@high+(recommendation OR recsys)+ecommerce+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","consultancy","servicegraph","nostrband","agent-skills","ai-agents","b2b-data","claude-code-marketplace","claude-code-plugins","claude-code-skills","claude-plugins","claude-skills"],"capabilities":["skill","source-nostrband","skill-find-ai-consultancy","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-ai-consultancy","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,477 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:02.625Z","embedding":null,"createdAt":"2026-05-06T12:58:10.255Z","updatedAt":"2026-05-18T18:56:02.625Z","lastSeenAt":"2026-05-18T18:56:02.625Z","tsv":"'/.env.local':1163 '/check':403,901,1088 '/explore':404,903,1089 '/get':362,701,908,1382,1906,2367,2455,2520 '/search':361,699,906,1380,2451,2497 '/stats':363 '/tags':402,900,1087 '/v1/auth/request-otp''':1238 '/v1/auth/verify-otp?format=env''':1315 '/v1/check':474,610,1553,1640,2570,2679 '/v1/explore':480,623,1832,2466,2634,2699 '/v1/get':497,665,1866,2203,2724 '/v1/research':688 '/v1/search':486,644,1849,1884,1958,1988,2035,2079,2108,2164,2494,2719 '/v1/search?filter=...''':1142,1174 '/v1/stats':509 '/v1/tags':102,468,594,2674 '/v1/tags?include_values=1':755 '0':1036 '1':444,445,1000,1222,1456,1809,2196,2677 '10':1864,2124,2722 '12':1764,1775,1789,1810,2588 '12k':85 '2':1046,1247,1475,1808,2201 '2.1':369 '20':2190,2468,2473,2480 '200':647 '3':1107,1331,1366,1491,1867,2212,2725 '4':72,1199,1517,1633,2100,2122,2666,2697,2717 '400':2556,2571,2580 '401':1384,2595 '404':2209,2225,2440,2453,2603 '429':2617,2628 '4xx':1284 '5':1377 '50':668 '500':2092,2105,2127,2671 '8':2189 'a-z':1795,1798 'across':874,1536 'actual':2232 'add':1951,2059,2141 'address':681,2510 'agenc':208 'agent':30,222,345,535,1226,1251,1715,1718,2149,2156,2172,2373 'aggreg':2213 'ai':3,25,44,68,79,114,159,170,194,200,235,301,764,783,816,835,1547,1556,1561,1566,1571,1579,1589,1595,1602,1607,1612,1623,1628,1658,1721,1723,1836,1841,1853,1858,1888,1962,1992,1999,2009,2039,2044,2070,2083,2112,2117,2168,2191,2238,2242,2259,2264,2277,2294,2308,2420,2683,2688,2703,2708 'ai-flavor':1546 'ai-ml-develop':78,782,834,1560,1570,1611,1627,1657,1840,1857,2043,2116,2263,2687,2707 'ai-rel':199 'ai/llm':256 'ai/ml':21,57,1652,1813,1820,2096,2653 'ai/ml-tagged':2334 'ai/ml/data':17,184,213,325,2326 'allow':1506 'alreadi':737,992,2185 'also':1298 'alway':110,814,976,2255 'analyt':89,788,840,1585,1620,1668,1679,1684,1750,1920,1932,1968,2032 'and':2398 'andexpr':1413,1415,1416 'andrew':2426 'angl':2128 'anon':462 'anonym':400,418,905,1085 'apex':1782,2179,2501 'apex.lower':1772,1785 'api':49,95,794,845,1073,1703,1710 'api-integr':94,793,844,1709 'api.servicegraph.co':50,754,1141,1173,1237,1314 'api.servicegraph.co/v1/auth/request-otp''':1236 'api.servicegraph.co/v1/auth/verify-otp?format=env''':1313 'api.servicegraph.co/v1/search?filter=...''':1140,1172 'api.servicegraph.co/v1/tags?include_values=1':753 'app':27,1713,2306 'appear':942 'append':1268 'appli':227,329 'applic':152 'application/json':1243,1320 'architectur':1695 'ask':977,1098,1103,1649,2027,2514 'atom':1426,1427 'audit':379,2332,2359 'auth':341,359,552,556,580,588,899,951,1054,1092,1105,1112 'author':967,1136,1168 'automat':122 'avail':1006,1039 'awk':1805 'b':1464,1470,1868 'b2b':334 'b2c':2351 'backend':154,453 'bareword':1434,1448,1518,1544,2399 'bash':1020,1127,1221,1790 'bearer':646,667,911,1137,1169 'becom':1530 'bi':224,1678,1686,1943 'bi/analytics':38 'bind':1458 'bite':1455 'bodi':1178 'brand':877,1538,2240 'breakdown':632,2483 'brief':652,2134,2495 'broaden':2490 'bug':2444 'build':164,220,1654,1823,1918,2018,2656 'bundl':674,2205 'busi':322,1691 'business-intellig':1690 'byo':2178 'c':1465,1472,1908 'ca':1483,1508,1514,1576 'cach':756 'calendar':708 'call':342,433,598,621,683,712,751,1055,1093,1113 'candid':637 'captur':1175,1207,1333,1346,1350 'card':654 'catalog':62,108,131,251,506,1923,2208,2253,2331,2356,2433,2609 'categor':812 'char':1767,2591 'charg':702,726,2465,2613 'chatbot':29,171,1874,1882,1893 'chatgpt':259,2409 'check':471,1014 'churn':1751,1755,2003,2013,2047 'classif':2344 'claud':261,1328,2411 'claude-c':1327 'cli':1329 'client':135,1902,2093,2106,2672 'client-tier':1901 'closest':1935 'cloud':91,790,842,1694,1701 'cloud-servic':90,789,841,1700 'clutch':863,1635 'code':1019,1035,1250,1256,1288,1324,1325,2549,2552 'comma':1476,1502 'command':1194 'comment':1300 'compani':821,868,2236 'comparison':258,2408 'complet':554,1358 'comput':31,889,1597,1726,1728,2065,2074,2085,2197,2400,2402 'confirm':97,762,1047,1332 'consent':1355 'construct':748,800 'consult':4,18,20,45,60,69,115,765,817,1557,1567,1580,1590,1596,1603,1608,1624,1814,1821,1837,1854,1871,1878,1889,1963,1979,1993,2026,2040,2071,2084,2097,2113,2169,2192,2252,2260,2654,2684,2704 'consum':234 'contact':658,2516 'content':204,1241,1318 'content-typ':1240,1317 'context':397,922,934 'continu':2463,2616 'contract':1758 'convers':761,945,1126 'copilot':266 'cost':589 'could':2271 'count':631,854,2479,2488 'cours':236,243,2421,2428 'coursera':2424 'cover':1685,1941 'credenti':375,930 'curl':137,143,422,470,476,482,492,504,515,1134,1166,1232,1278,1309 'cursor':264 'custom':2002,2012,2024,2147,2151,2154,2160,2173 'custom-ml':2023 'customer-servic':2159 'cv':1730 'd':1244,1321,1972 'data':36,59,67,88,113,295,315,457,763,787,815,839,1555,1565,1578,1584,1588,1594,1601,1606,1619,1622,1661,1667,1674,1683,1705,1835,1852,1887,1909,1914,1927,1931,1961,1967,1991,2038,2082,2111,2167,2258,2682,2702 'data-analyt':87,786,838,1583,1618,1666,1682,1930,1966 'data-engin':1673,1913,1926 'data/ml':1697 'dedup':2529 'def':1779 'default':330 'defer':146,693,2283 'deliver':188,218,2300,2330 'deploy':1742,1744,1976,1983 'deriv':2594 'detect':517,986,1001,1206 'dev':155,2291,2318 'develop':22,81,176,198,785,837,1563,1573,1614,1630,1660,1843,1860,2046,2119,2266,2288,2690,2710 'dgst':1802 'differ':150,722 'direct':957,1211 'discov':602 'discoveri':432 'dispatch':388,948,1108,1364 'diy/code':273 'document':1734,1738 'doesn':1153,1289 'domain':2182,2193 'dotenv':963 'doubt':1638 'drift':106 'drill':2484 'drive':46 'drop':1897 'dsl':1402 'e':1995 'e.g':163,833 'echo':1191,1343,1791 'ecommerc':1829,1847,1862,2662,2695,2715 'ed':2353 'ed-tech':2352 'either':1160 'els':491,503,514 'email':677,1225,1231,1245,1246,1322,1323,2505 'empti':2574 'encod':1787 'end':2647,2649,2726 'end-to-end':2646 'endpoint':451,461 'engag':181,2324 'engin':37,214,294,299,314,1662,1671,1675,1818,1826,1910,1915,1928,1945,1955,1971,2659 'enrich':15,55,2181 'enter':394,1124 'enterpris':1881,1894,1898 'env':925,1033,1259 'env.local':385,926,997,1028,1066,1145,1213,1270,1330,1342,1373 'environ':962,1065,1133 'error':1295,2543,2545,2548,2559 'escal':2492 'etc':2414 'even':988,1305 'ever':393 'everi':409,600,950,1111 'evid':830,850 'exact':98,797 'exampl':140,1549,2650 'exchang':1248 'exhaust':2631 'exist':118,1677,2449 'exit':1018,1034,1279 'expand':1198 'expir':1391 'explain':303 'explor':477 'explore/search':620 'export':1129 'extern':324 'f':41,1275,2064 'fall':570 'fast.ai':2425 'featur':162,2297,2313 'fetch':138,733 'fewer':2471 'field':604,806,2627 'file':931,964,1182,1293 'filter':472,611,616,624,645,723,750,801,1401,1410,1428,1641,1833,1850,1885,1959,1989,2036,2080,2109,2165,2557,2565,2572,2575,2680,2700,2720 'find':2,11,43,52,174,196,206,239,2286 'find-ai-consult':1,42 'find-marketing-ag':205 'find-software-develop':173,2285 'find-web-develop':195 'fine':279 'fine-tun':278 'fire':332 'firm':19,64,86,254,310,478,484,495,649,653,670,686,705,735,875,1756,1759,1769,1780,2098,2198,2230,2274,2335,2446,2474,2582,2584,2606 'firm-procur':253 'first':597,1053,1642,2531 'fix':2563 'flag':1276,2215,2375,2460,2611 'flavor':1548,1956 'flow':557,576,956,1201,1360,1400 'follow':1526 'forecast':1752,1754 'format':1258 'fortun':2091,2104,2126,2142,2670 'found':856,1059,2219,2605 'four':584,1452 'four-tier':583 'free':596,613,626,651,672,720,742,871,1533,2537,2542 'free-text':870,1532 'freelanc':312 'fss':1233,1310 'full':673,2204 'funnel':586 'futur':1375 'g':2088 'gave':2053 'gemini':263,2413 'genai':1724 'general':151,2290 'generat':24,1720,1722 'generic':300 'geographi':824 'get':467,473,479,485,494,496,508,593,609,622,643,664,752,1831,1848,1865,1883,1957,1987,2034,2078,2107,2163,2202,2673,2678,2698,2718,2723 'github':1407 'github-search-styl':1406 'goe':1114 'gotcha':2254 'grep':1024,1029,1338 'h':1135,1167,1239,1316,2146 'handl':374,1768 'har':346,373,531,559 'harness-specif':530 'hashlib':1778 'hashlib.sha256':1784 'header':968,2624 'healthcar':1599,2067,2077,2087 'help':1981,2016 'hex':1766,1804,2590 'hex-char':1765 'hexdigest':1774,1788 'high':1447,1574,1631,2120,2691,2711 'higher':2338 'hire':291 'histor':2339 'hit':1639 'honor':2620 'host':372 'hous':289 'http':134 'id':498,666,1757,1760,1770,1781,2199,2447,2521,2583,2585 'ideal':2664 'ident':1431,1440,1444,1449,1522 'idp':1733,1737 'ignor':1304 'implicit':1354,1421 'import':1777 'in-hous':287 'includ':192,2500,2561,2675 'indirect':1996 'individu':311,2423 'industri':66,112,770,813,1554,1564,1577,1587,1593,1600,1605,1621,1834,1851,1886,1960,1990,2037,2081,2110,2166,2257,2681,2701 'info':659,2517 'initi':560 'insid':1148,1500 'inspect':1017 'integr':96,795,846,1704,1706,1711 'intellig':1692 'intent':336,1997 'invalid':2581 'ip':628 'ip-throttl':627 'isn':2129 'jq':1185,1272 'jq-process':1184 'json':2547 'k':2467 'keep':915 'keyword':869,897,1451,1519,1669,1719,1725,1731,1952,2063,2145,2388 'keyword-on':896,2387 'keyword/tag':1646 'kind':606,807 'knowledg':302 'land':1308 'largest':83 'later':1099 'leak':1155 'leakag':2362 'learn':238,245,293 'legal':603,679,880,1541,2507 'let':2136 'like':885 'limit':1863,2123,2619,2721 'line':1301 'linkedin':867 'list':465,772,1477,1503,2180,2276 'liter':938,1121,1499 'll':809 'llama':281 'llm':26,396,887,921,975,1220,1591,1712,1716,1870,1892,2148,2155,2170,2406 'llm-product':2405 'load':352,490,502,513,546 'local':2200 'look':2436 'loop':286 'low':1445 'lowercas':2589 'machin':292 'make':1277,2486 'mani':2237,2382 'map':446,1647 'market':202,207 'match':538,1486,2475 'matter':698 'may':2448 'mcp':337,350,365,405,410,442,458,488,500,511,522,543,566 'mcp.servicegraph.co':353 'mean':2228 'medium':1446 'messag':2550 'meta':879,1540 'mid':1387 'mid-sess':1386 'mirror':1296 'mis':2343 'mis-classif':2342 'missing/expired':2598 'ml':80,246,297,313,784,836,1562,1572,1613,1629,1659,1842,1859,2025,2045,2118,2265,2689,2709 'ml/data':290 'mlop':23,223,888,1604,1740,1743,1973,1978,1994 'mode':2636 'model':219,820,914,1653,1741,1975,1984 'month':650,671,709,740,2528,2629,2642,2734 'multi':2391 'multi-word':2390 'multipl':1543 'must':2519,2586 'mvp':692 'n':1021,1792 'name':100,528,605,680,798,876,881,1326,1537,1542,2508 'need':562,1273 'negat':1492,1498 'never':923,941,1123 'new':1209 'ng':2427 'nich':884,1645,2033,2385,2395 'nlp':33,891,1732,1736 'non':308,1042,1281 'non-us':307 'non-zero':1041,1280 'none':595,612,625 'not-found':2217 'note':2333 'notexpr':1417,1419,1423,1425 'number':1441,1450,1524 'numer':851 'ny':1484,1509,1516 'oauth':368,413 'often':2227 'ok':1067 'one':1403,1480,2220,2310,2577 'onlin':242 'op':826,847,858,1432,1435 'openssl':1801 'oper':607,1529,2245 'option':849 'orexpr':1411,1412 'otp':493,505,516,575,1200,1344,1399,2602 'overlap':725,730 'page':715 'pagin':2540 'paid':689 'param':1261 'paramet':1405 'paren':1474 'parent':1158 'pars':1466,2558 'partner':1911,1916 'past':2188 'path':430,464 'pattern':437,537 'pattern-match':536 'payload':2560 'per':703,707,711,981,2525,2527 'per-user-per-month':2524 'persist':1371 'phone':676,861,2503 'pick':2139 'pin':111,1947,2256 'pipelin':221,1586,1663,1670,1921,1969 'pkce':370 'plain':421,1266 'platform':298 'pollut':1291 'pool':638 'posit':2562 'possibl':2364 'post':687,1235,1312 'predic':805,1429,1430,1481 'predict':1749,1753,2001,2011,2031,2049 'predictive-analyt':2030 'prefer':339,354,408,547 'prefix':533 'presenc':859 'present':569,767,2214 'price':819 'primari':217,2504,2506 'print':1806 'pro':2438 'proceed':1362 'process':1186 'procur':255,272,323,335,2417 'product':257,269,1986,2235,2248,2304,2348,2371,2407 'project':190 'prompt':1227,1252 'provid':780,804,832,1559,1569,1582,1610,1617,1626,1656,1665,1681,1699,1708,1839,1856,1965,2042,2115,2686,2706 'public':449 'pull':738 'python':1776 'pytorch':284 'q':1339 'qs':1025,1030 'qualiti':2089 'queri':718,1260,1404 'question':270 'quota':455,641,695,2522,2630,2732 'quota-spend':640 'rag':28,886,1592,1714,1717,1869,1890 'rag/llm':1877 'rank':662 'rate':852,865,1632,2102,2121,2340,2618,2668,2696,2716 'rather':2379 're':714,732,1097,1396,2534,2539,2567,2593,2600 're-ask':1096 're-der':2592 're-fetch':731 're-pag':713 're-pagin':2538 're-run':1395,2599 're-valid':2566 're-view':2533 'read':924,1008 'recip':1811 'recommend':34,463,892,1745,1747,1817,1825,1844,1861,2381,2658,2692,2712 'recsi':1748,1846,2694,2714 'refus':2418,2434 'reject':1511 'relat':201 'releas':109 'relev':774 'remain':2733 'report':2729 'request':139,952,1074,1193 'requir':412,909,2573,2579 'residu':2361 'resolut':998 'respons':758,1177,2477 'rest':425,436,450,460,574,2639 'retail':2057 'retri':2622,2625 'retry-aft':2621 'return':1262,1383,1783,2368,2546 'reveal':1335 'review':282,853 'revok':1394 'ritual':746 'round':971 'round-trip':970 'rstrip':1773,1786 'rule':696,999,1453 'run':1011,1397,2601 'saa':167,2056,2234,2303,2347,2370 'safe':1302 'sandbox':380 'say':1080 'scaleai.com':1793 'scientist':296,316 'scope':148,249,630 'search':483,1408,1520 'secur':913 'see':520 'separ':1689 'serv':825 'server':338,351,366,415,544 'servic':74,92,326,779,791,803,831,843,1558,1568,1581,1609,1616,1625,1655,1664,1680,1698,1702,1707,1838,1855,1964,2041,2114,2152,2161,2174,2243,2269,2282,2439,2685,2705 'servicegraph':48,349,525,542,565,1022,1026,1031,1061,1072,1138,1170,1263,1340 'session':601,744,982,1057,1076,1376,1388,2728 'session-start':743 'set':828,1161,1164 'sever':2312 'sha256':1771,1803 'shell':387,947,995,1013,1110,1117,1132,1159 'shortlist':12,53,663,685 'shouldn':125 'sibl':144 'signal':823,1904 'simpler':429 'sinc':103 'site':1830,2663 'size':635,822 'skill':117,145,178,226,233,328,2321 'skill-find-ai-consultancy' 'skip':694,1091,2378,2461,2614 'smaller':2489 'social':678 'softwar':175,268,2287,2317 'software-dev':2316 'software-product':267 'somewher':1040 'sourc':1146 'source-nostrband' 'special':2072 'specif':532 'spend':618,642 'split':2396 'stabl':1763 'star':2101,2667 'start':745 'stat':507 'state':818,1482,1507,1513,1515,1575 'status':2551 'stay':1082 'step':1365 'structur':2131 'style':1409 'sub':76,776,883,1644,1937,2281,2384,2394 'sub-nich':882,1643,2383,2393 'sub-servic':2280 'sub-tag':775,1936 'sub-taxonomi':75 'subshel':1150 'substr':540,873,1535,1807 'success':1349 'support':2176 'suppress':2469,2481 'surfac':1215,1900,2132,2272 'switch':2632 'system':35,893,1746 'tab':172 'tag':63,73,99,466,777,827,1676,1693,1929,1938,1949,2270 'tagatevid':1442,1443 'task':274 'taxonomi':77,104,132 'tech':2354 'telco':2058 'tell':2643 'text':872,1267,1534 'thin':1896 'think':129 'three':1490,1876,2095,2652 'threshold':2090 'throttl':629 'tier':360,401,419,553,581,585,587,1086,1903 'tighter':1459 'titl':878,1539 'tmp':1181 'token':391,912,917,936,955,987,1004,1023,1027,1032,1037,1045,1062,1122,1139,1171,1197,1204,1210,1264,1341,1345,1368,1390,2597 'tool':356,411,443,459,523,549,567 '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':855 'tr':1794 'train':285 'transform':305 'trigger':39,1223 'trip':972 'true':2482 'tune':280 'two':721 'tx':1485 'type':1242,1319 'typic':895 'unauthor':1385,2596 'understand':1735,1739 'uniqu':648,669,704 'unless':1100 'url':426,656,675,2502 'us':16,56,165,309,1982,2017 'use':5,142,158,231,367,434,590,633,660,810,946,984,1069,1473,1512,1651,1998,2008,2293 'user':8,124,211,319,960,979,1050,1079,1102,1229,1254,1352,1648,1819,1875,1912,1977,2004,2052,2069,2094,2138,2153,2184,2187,2223,2513,2526,2645,2651 'valid':614,1550,2568 'valu':392,608,771,939,1010,1217,1337,1437,1438,1439,2676 'valueorlist':1433,1436 'vari':534 'vendor':2239 'verifi':796 'vertic':2055,2068 'vet':13 'via':101,1109 'view':706,2532,2535 'vision':32,890,1598,1727,1729,2066,2075,2086,2401,2404 'vs':260,262,265,2410,2412 'want':9,212,2006 'web':197 'web/site':189 'whenev':6 'whether':1002 'whitespac':1420 'within':1479 'without':969,1007,1214,1334,2261 'word':2392 'work':136,185,306,1106,1946,2319,2327 'workflow':2162 'wrapper':1118 'wrong':1287 'x':1234,1311,1494,1497,2731 'x-quota-remaining-month':2730 'year':857 'yes':469,475,481 'z':1797,1800 'zero':1043,1282","prices":[{"id":"e470a1cf-cb1c-45b1-9c51-80450fabec67","listingId":"986efedd-64cd-469a-8e26-5b859f0a395e","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.255Z"}],"sources":[{"listingId":"986efedd-64cd-469a-8e26-5b859f0a395e","source":"github","sourceId":"nostrband/ServiceGraph/find-ai-consultancy","sourceUrl":"https://github.com/nostrband/ServiceGraph/tree/main/skills/find-ai-consultancy","isPrimary":false,"firstSeenAt":"2026-05-06T12:58:10.255Z","lastSeenAt":"2026-05-18T18:56:02.625Z"}],"details":{"listingId":"986efedd-64cd-469a-8e26-5b859f0a395e","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"nostrband","slug":"find-ai-consultancy","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":"ca6043820cca3fba7db3faaca8b7929e66db8b7f","skill_md_path":"skills/find-ai-consultancy/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/nostrband/ServiceGraph/tree/main/skills/find-ai-consultancy"},"layout":"multi","source":"github","category":"ServiceGraph","frontmatter":{"name":"find-ai-consultancy","license":"MIT","description":"Use whenever the user wants to find, shortlist, vet, or enrich US AI/ML/data consulting firms (consultancies) — AI/ML development, MLOps, generative AI / LLM apps (RAG, chatbots, agents), computer vision, NLP, recommendation systems, data engineering, BI/analytics. Triggers on \"find an AI/ML consulting firm to build our recommendation engine\", \"shortlist three RAG/LLM consultancies for an enterprise chatbot\", \"compare three AI/ML consulting firms with strong ratings\", or \"pull contact info for these 8 AI consultancy domains\", even when described indirectly (we want to use AI for X, deploy ML to production). Drives the ServiceGraph API (api.servicegraph.co) — a 100k+ US firm catalog filterable by industry, services, location, size, ratings. Defer to find-software-developer for general app/backend work where AI is just a feature. Skip in-house ML/data hires, LLM/AI-tool comparisons (ChatGPT vs Claude), \"how do I fine-tune X\" DIY questions, AI courses for individuals, non-US firms, individual freelancers."},"skills_sh_url":"https://skills.sh/nostrband/ServiceGraph/find-ai-consultancy"},"updatedAt":"2026-05-18T18:56:02.625Z"}}