{"id":"95678abb-eb53-4348-bc88-56a711b3f922","shortId":"Ukpsa4","kind":"skill","title":"find-pr-agency","tagline":"Use whenever the user wants to find, shortlist, vet, or enrich US public-relations and communications agencies — media relations, crisis comms, investor relations (IR), product-launch PR, tech/startup PR, healthcare PR, B2B PR, public affairs, brand reputation, and internal commu","description":"# find-pr-agency\n\nDrive the **ServiceGraph API** (`https://api.servicegraph.co`) to find,\nshortlist, and enrich US public-relations and communications agencies.\n\n**Always pin `service_provided:public-relations`.** Note: the\ncatalog's nominal `industry:pr_comms` value returns zero firms in\nthe live release — PR/comms firms are tagged with\n`service_provided:public-relations` instead, typically under\nadjacent industries (marketing_agency, other_pro_services). Pin the\nservice tag, not the industry. Sub-types (media relations, crisis,\nIR, public affairs, healthcare PR, tech PR, B2B PR, internal comms,\nbrand reputation) are NOT separate tags — sub-type specialization is\na keyword substring search on firm text.\n\nAny HTTP client works (curl, fetch, requests). Examples below use curl.\n\n## Sibling skills — defer when scope is broader\n\nIf the user wants a **multi-service marketing engagement** (PR plus\ncontent plus paid plus social), defer to `find-marketing-agency` —\nthat skill covers full-service shops where PR is one of several\nservice lines.\n\nThis skill is correct when PR/comms is the primary deliverable —\nlaunches, media relations, crisis, IR, public affairs.\n\n## When NOT to use this skill\n\n- \"Write me a press release / draft these talking points\" → DIY work.\n- In-house comms/PR hires (Head of Comms, PR Manager).\n- PR-software comparisons (Cision, Muck Rack, Prowly).\n- Influencer-marketplace asks (\"find me an influencer for our DTC\n  product\") — that's not PR; PR is earned media.\n- \"Explain how earned media works\" → knowledge question.\n- Non-US firms.\n- Individual freelance PR people / publicists.\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 `public-relations`\nis in the `service_provided` value list — that's the pin this skill\nrelies on. The nominal `pr_comms` industry value is empty in the\ncurrent release; don't pin it.\n\nField kinds you'll use most:\n- **tag_set_with_evidence**: `service_provided` (always include `public-relations`) — op `:` with optional `@evidence`\n- **categorical**: `state`, `pricing_model`, `company_size_signal`, `geography_served` — op `:`\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. **This is how you specialize on sub-type and vertical** (tech, healthcare, IR, crisis, public affairs, B2B, etc.).\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**PR-flavored examples** (validate yours with `/v1/check`):\n\n```\nservice_provided:public-relations tech state:NY\nservice_provided:public-relations healthcare\nservice_provided:public-relations b2b saas\nservice_provided:public-relations crisis\nservice_provided:public-relations investor relations\nservice_provided:public-relations ipo state:NY,CA\nservice_provided:public-relations public affairs state:DC\nservice_provided:public-relations rating>=4 has:clutch\n```\n\nWhen in doubt, hit `/v1/check?filter=...` first.\n\n**Sub-type / vertical → keyword mapping**:\n\n| User asks for | Add as keyword(s) |\n|---|---|\n| Tech / startup PR | `tech`, `startup`, `saas` |\n| Healthcare / pharma PR | `healthcare`, `pharma`, `biotech` |\n| Crisis comms | `crisis` |\n| Investor relations / IR | `investor relations`, `ir`, `ipo` |\n| B2B PR | `b2b` |\n| Public affairs | `public affairs` |\n| Brand reputation | `brand reputation`, `reputation` |\n| Internal communications | `internal communications`, `internal comms` |\n| Earned media / media relations | `earned media`, `media relations` |\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 \"edelman.com\" | tr 'A-Z' 'a-z' \\\n  | openssl dgst -sha256 -hex | awk '{print substr($2,1,12)}'\n```\n\n## Recipes\n\n### A. Tech PR for a Series-B announcement\n\nUser: *\"Tech PR agency in NY for our Series-B announcement.\"*\n\n```\nGET /v1/explore?filter=service_provided:public-relations+tech+state:NY\nGET /v1/search?filter=service_provided:public-relations+tech+state:NY&limit=10\nGET /v1/get/<firm_id>     # ×3\n```\n\n### B. IR firms for an IPO\n\nUser: *\"Three IR firms for our upcoming IPO roadshow.\"*\n\n```\nGET /v1/search?filter=service_provided:public-relations+(investor relations OR ir)+ipo\n```\n\n### C. Crisis comms (urgent)\n\nUser: *\"Crisis comms help — brand reputation issue blowing up online.\"*\n\n```\nGET /v1/search?filter=service_provided:public-relations+crisis&limit=10&order_by=relevance\n```\n\nSurface as urgent: skip `/v1/explore`, jump straight to `/v1/search`,\npresent briefs immediately.\n\n### D. Healthcare / regulatory PR\n\nUser: *\"Healthcare PR agency familiar with FDA regulatory comms.\"*\n\n```\nGET /v1/search?filter=service_provided:public-relations+healthcare+(fda OR regulatory)\n```\n\n### E. Indirect intent — \"we need press\"\n\nUser: *\"We need press for our Series-B — get us into TechCrunch, WSJ,\nand the trade press.\"*\n\nThat's product-launch / tech PR. Translate:\n\n```\nGET /v1/search?filter=service_provided:public-relations+(tech OR startup)+(launch OR series-b)&limit=10\n```\n\nIf thin, drop the launch/series-b keyword — most tech PR firms do\nlaunches as a default.\n\n### F. Public affairs (state government)\n\nUser: *\"Public affairs firms with state-government experience in\nCalifornia.\"*\n\n```\nGET /v1/search?filter=service_provided:public-relations+public affairs+state:CA\n```\n\n### G. BYO apex list — enrich domains\n\nUser pastes 8–20 PR-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.\n\n## Gotchas\n\n- **Always pin `service_provided:public-relations`.** Don't pin `industry:pr_comms` — it's empty in the live catalog. PR firms are tagged with the service tag across adjacent industries (marketing_agency, other_pro_services). Without the service pin, \"tech PR\" / \"crisis\" / \"investor relations\" as keywords leak into general marketing.\n- **Defer to `find-marketing-agency` for full-service marketing engagements.** When PR is one of several service lines (PR + content + paid + social), the marketing-agency skill is the right fire.\n- **Sub-types are keyword-only.** Multi-word sub-types split into ANDed barewords (`investor relations` → `investor` AND `relations`).\n- **\"Write me a press release\" / \"draft talking points\" is do-the-work.** Refuse and offer to find a firm if the user wants to engage one.\n- **Influencer marketing is NOT PR.** Influencer marketplaces (Aspire, Grin, etc.) and influencer outreach are paid-media work; defer to `find-marketing-agency` or refuse for marketplace questions.\n- **PR-software comparisons** (Cision, Muck Rack, Prowly) are NOT procurement.\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 tech PR agencies in NY for a Series-B announcement,\nideally with 4-star ratings and Fortune 500 client experience.\"*\n\n```\nGET /v1/tags?include_values=1\nGET /v1/check?filter=service_provided:public-relations+tech+state:NY+rating>=4\nGET /v1/explore?filter=service_provided:public-relations+tech+state:NY+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","agency","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-pr-agency","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-pr-agency","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 (16,159 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.398Z","embedding":null,"createdAt":"2026-05-06T12:58:11.332Z","updatedAt":"2026-05-18T18:56:03.398Z","lastSeenAt":"2026-05-18T18:56:03.398Z","tsv":"'/.env.local':1102 '/check':363,840,1027 '/explore':364,842,1028 '/get':322,661,847,1321,2146,2211 '/search':321,659,845,1319,2142,2188 '/stats':323 '/tags':362,839,1026 '/v1/auth/request-otp''':1177 '/v1/auth/verify-otp?format=env''':1254 '/v1/check':434,570,1492,1558,2261,2371 '/v1/explore':440,583,1700,1786,2157,2325,2384 '/v1/get':457,625,1724,1935,2402 '/v1/research':648 '/v1/search':446,604,1711,1742,1769,1790,1808,1852,1901,2185,2397 '/v1/search?filter=...''':1081,1113 '/v1/stats':469 '/v1/tags':428,554,2366 '/v1/tags?include_values=1':715 '0':975 '1':404,405,939,1161,1395,1675,1928,2369 '10':1722,1778,1868,2400 '12':1630,1641,1655,1676,2279 '2':985,1186,1414,1674,1933 '2.1':329 '20':1921,2159,2164,2171 '200':607 '3':1046,1270,1305,1430,1725,1944,2403 '4':1138,1456,1551,2357,2382,2395 '400':2247,2262,2271 '401':1323,2286 '404':1941,2131,2144,2294 '429':2308,2319 '4xx':1223 '5':1316 '50':628 '500':2362 '8':1920 'a-z':1661,1664 'across':811,1475,1982 'add':1570 'address':641,2201 'adjac':104,1983 'affair':41,126,225,835,1542,1600,1602,1886,1891,1909 'agenc':4,22,50,67,107,193,1690,1801,1986,2010,2032,2110,2346 'agent':305,495,1165,1190 'aggreg':1945 'allow':1445 'alreadi':697,931 'also':1237 'alway':68,769,915,1954 'and':2053 'andexpr':1352,1354,1355 'announc':1686,1698,2354 'anon':422 'anonym':360,378,844,1024 'apex':1648,1914,2192 'apex.lower':1638,1651 'api':54,1012 'api.servicegraph.co':55,714,1080,1112,1176,1253 'api.servicegraph.co/v1/auth/request-otp''':1175 'api.servicegraph.co/v1/auth/verify-otp?format=env''':1252 'api.servicegraph.co/v1/search?filter=...''':1079,1111 'api.servicegraph.co/v1/tags?include_values=1':713 'appear':881 'append':1207 'application/json':1182,1259 'ask':264,916,1037,1042,1568,2205 'aspir':2094 'atom':1365,1366 'audit':339 'auth':301,319,512,516,540,548,838,890,993,1031,1044,1051 'author':906,1075,1107 'avail':945,978 'awk':1671 'b':1403,1409,1685,1697,1726,1833,1866,2353 'b2b':38,131,836,1512,1596,1598 'backend':413 'bareword':1373,1387,1457,1483,2054 'bash':959,1066,1160,1656 'bearer':606,627,850,1076,1108 'becom':1469 'bind':1397 'biotech':1585 'bite':1394 'blow':1765 'bodi':1117 'brand':42,135,814,1477,1603,1605,1762 'breakdown':592,2174 'brief':612,1792,2186 'broaden':2181 'broader':170 'bug':2135 'bundl':634,1937 'byo':1913 'c':1404,1411,1754 'ca':1422,1447,1453,1535,1911 'cach':716 'calendar':668 'california':1899 'call':302,393,558,581,643,672,711,994,1032,1052 'candid':597 'captur':1114,1146,1272,1285,1289 'card':614 'catalog':77,466,1940,1973,2300 'categor':778 'char':1633,2282 'charg':662,686,2156,2304 'check':431,953 'cision':257,2120 'claud':1267 'claude-c':1266 'cli':1268 'client':155,2363 'clutch':800,1553 'code':958,974,1189,1195,1227,1263,1264,2240,2243 'comm':26,82,134,250,744,1587,1613,1756,1760,1806,1966 'comma':1415,1441 'command':1133 'comment':1239 'comms/pr':246 'commu':46 'communic':21,66,1609,1611 'compani':782,805 'comparison':256,2119 'complet':514,1297 'comput':1929 'confirm':722,986,1271 'consent':1294 'construct':708 'contact':618,2207 'content':183,1180,1257,2026 'content-typ':1179,1256 'context':357,861,873 'continu':2154,2307 'contract':1624 'convers':721,884,1065 'correct':212 'cost':549 'count':591,791,2170,2179 'cover':196 'credenti':335,869 'crisi':25,123,222,833,1519,1586,1588,1755,1759,1776,1996 'curl':157,163,382,430,436,442,452,464,475,1073,1105,1171,1217,1248 'current':751 'd':1183,1260,1794 'data':417 'dc':1544 'dedup':2220 'def':1645 'default':1883 'defer':166,188,653,2005,2105 'deliver':218 'deriv':2285 'detect':477,925,940,1145 'dgst':1668 'differ':682 'direct':896,1150 'discov':562 'discoveri':392 'dispatch':348,887,1047,1303 'diy':241 'do-the-work':2069 'doesn':1092,1228 'domain':1917,1925 'dotenv':902 'doubt':1556 'draft':237,2065 'drill':2175 'drive':51 'drop':1871 'dsl':1341 'dtc':271 'e':1819 'earn':279,283,1614,1618 'echo':1130,1282,1657 'edelman.com':1659 'either':1099 'els':451,463,474 'email':637,1164,1170,1184,1185,1261,1262,2196 'empti':748,1969,2265 'encod':1653 'end':2338,2340,2404 'end-to-end':2337 'endpoint':411,421 'engag':180,2016,2085 'enrich':15,60,1916 'enter':354,1063 'env':864,972,1198 'env.local':345,865,936,967,1005,1084,1152,1209,1269,1281,1312 'environ':901,1004,1072 'error':1234,2234,2236,2239,2250 'escal':2183 'etc':837,2096 'even':927,1244 'ever':353 'everi':369,560,889,1050 'evid':766,777 'exampl':160,1488,2341 'exchang':1187 'exhaust':2322 'exist':2140 'exit':957,973,1218 'expand':1137 'experi':1897,2364 'expir':1330 'explain':281 'explor':437 'explore/search':580 'export':1068 'f':1214,1884 'fall':530 'familiar':1802 'fda':1804,1816 'fetch':158,693 'fewer':2162 'field':564,757,2318 'file':870,903,1121,1232 'filter':432,571,576,584,605,683,710,1340,1349,1367,1559,1701,1712,1743,1770,1809,1853,1902,2248,2256,2263,2266,2372,2385,2398 'find':2,11,48,57,191,265,2008,2077,2108 'find-marketing-ag':190,2007,2107 'find-pr-ag':1,47 'fire':2037 'firm':86,92,151,291,438,444,455,609,613,630,646,665,695,812,1622,1625,1635,1646,1728,1735,1878,1892,1924,1930,1975,2079,2137,2165,2273,2275,2297 'first':557,992,1560,2222 'fix':2254 'flag':1215,1947,2151,2302 'flavor':1487 'flow':517,536,895,1140,1299,1339 'follow':1465 'format':1197 'fortun':2361 'found':793,998,1951,2296 'four':544,1391 'four-tier':543 'free':556,573,586,611,632,680,702,808,1472,2228,2233 'free-text':807,1471 'freelanc':293 'fss':1172,1249 'full':198,633,1936,2013 'full-servic':197,2012 'funnel':546 'futur':1314 'g':1912 'general':2003 'geographi':785 'get':427,433,439,445,454,456,468,553,569,582,603,624,712,1699,1710,1723,1741,1768,1807,1834,1851,1900,1934,2365,2370,2383,2396,2401 'github':1346 'github-search-styl':1345 'goe':1053 'gotcha':1953 'govern':1888,1896 'grep':963,968,1277 'grin':2095 'h':1074,1106,1178,1255 'handl':334,1634 'har':306,333,491,519 'harness-specif':490 'hashlib':1644 'hashlib.sha256':1650 'head':248 'header':907,2315 'healthcar':36,127,831,1506,1580,1583,1795,1799,1815 'help':1761 'hex':1632,1670,2281 'hex-char':1631 'hexdigest':1640,1654 'high':1386 'hire':247 'hit':1557 'honor':2311 'host':332 'hous':245 'http':154 'id':458,626,1623,1626,1636,1647,1931,2138,2212,2274,2276 'ideal':2355 'ident':1370,1379,1383,1388,1461 'ignor':1243 'immedi':1793 'implicit':1293,1360 'import':1643 'in-hous':243 'includ':770,2191,2252,2367 'indirect':1820 'individu':292 'industri':80,105,117,745,1964,1984 'influenc':262,268,2087,2092,2098 'influencer-marketplac':261 'info':619,2208 'initi':520 'insid':1087,1439 'inspect':956 'instead':101 'intent':1821 'intern':45,133,1608,1610,1612 'invalid':2272 'investor':27,1525,1589,1592,1749,1997,2055,2057 'ip':588 'ip-throttl':587 'ipo':1532,1595,1731,1739,1753 'ir':29,124,223,832,1591,1594,1727,1734,1752 'issu':1764 'jq':1124,1211 'jq-process':1123 'json':2238 'jump':1787 'k':2158 'keep':854 'keyword':147,806,1390,1458,1565,1572,1874,2000,2043 'keyword-on':2042 'kind':566,758 'knowledg':286 'land':1247 'later':1038 'launch':32,219,1847,1862,1880 'launch/series-b':1873 'leak':1094,2001 'legal':563,639,817,1480,2198 'limit':1721,1777,1867,2310,2399 'line':208,1240,2024 'linkedin':804 'list':425,732,1416,1442,1915 'liter':877,1060,1438 'live':89,1972 'll':760 'llm':356,860,914,1159 'load':312,450,462,473,506 'local':1932 'look':2127 'low':1384 'lowercas':2280 'make':1216,2177 'manag':252 'map':406,1566 'market':106,179,192,1985,2004,2009,2015,2031,2088,2109 'marketing-ag':2030 'marketplac':263,2093,2114 'match':498,1425,2166 'matter':658 'may':2139 'mcp':297,310,325,365,370,402,418,448,460,471,482,503,526 'mcp.servicegraph.co':313 'media':23,121,220,280,284,1615,1616,1619,1620,2103 'medium':1385 'messag':2241 'meta':816,1479 'mid':1326 'mid-sess':1325 'mirror':1235 'missing/expired':2289 'mode':2327 'model':781,853 'month':610,631,669,700,2219,2320,2333,2412 'muck':258,2121 'multi':177,2046 'multi-servic':176 'multi-word':2045 'multipl':1482 'must':2210,2277 'mvp':652 'n':960,1658 'name':488,565,640,813,818,1265,1476,1481,2199 'need':522,1212,1823,1827 'negat':1431,1437 'never':862,880,1062 'new':1148 'nomin':79,742 'non':289,981,1220 'non-us':288 'non-zero':980,1219 'none':555,572,585 'not-found':1949 'note':75 'notexpr':1356,1358,1362,1364 'number':1380,1389,1463 'numer':788 'ny':1423,1448,1455,1500,1534,1692,1709,1720,2348,2380,2393 'oauth':328,373 'offer':2075 'ok':1006 'one':204,1342,1419,1952,2020,2086,2268 'onlin':1767 'op':774,787,795,1371,1374 'openssl':1667 'oper':567,1468 'option':776 'order':1779 'orexpr':1350,1351 'otp':453,465,476,535,1139,1283,1338,2293 'outreach':2099 'overlap':685,690 'page':675 'pagin':2231 'paid':185,649,2027,2102 'paid-media':2101 'param':1200 'paramet':1344 'paren':1413 'parent':1097 'pars':1405,2249 'past':1919 'path':390,424 'pattern':397,497 'pattern-match':496 'payload':2251 'peopl':295 'per':663,667,671,920,2216,2218 'per-user-per-month':2215 'persist':1310 'pharma':1581,1584 'phone':636,798,2194 'pin':69,111,736,755,1955,1963,1993 'pkce':330 'plain':381,1205 'plus':182,184,186 'point':240,2067 'pollut':1230 'pool':598 'posit':2253 'post':647,1174,1251 'pr':3,33,35,37,39,49,81,128,130,132,181,202,251,254,276,277,294,743,1486,1576,1582,1597,1680,1689,1797,1800,1849,1877,1923,1965,1974,1995,2018,2025,2091,2117,2345 'pr-firm':1922 'pr-flavor':1485 'pr-softwar':253,2116 'pr/comms':91,214 'predic':1368,1369,1420 'prefer':299,314,368,507 'prefix':493 'presenc':796 'present':529,1791,1946 'press':235,1824,1828,1842,2063 'price':780 'primari':217,2195,2197 'print':1672 'pro':109,1988,2129 'proceed':1301 'process':1125 'procur':2126 'product':31,272,1846 'product-launch':30,1845 'prompt':1166,1191 'provid':71,97,730,768,1494,1502,1508,1515,1521,1528,1537,1546,1703,1714,1745,1772,1811,1855,1904,1957,2374,2387 'prowli':260,2123 'public':18,40,63,73,99,125,224,409,724,772,834,1496,1504,1510,1517,1523,1530,1539,1541,1548,1599,1601,1705,1716,1747,1774,1813,1857,1885,1890,1906,1908,1959,2376,2389 'public-rel':17,62,72,98,723,771,1495,1503,1509,1516,1522,1529,1538,1547,1704,1715,1746,1773,1812,1856,1905,1958,2375,2388 'publicist':296 'pull':698 'python':1642 'q':1278 'qs':964,969 'queri':678,1199,1343 'question':287,2115 'quota':415,601,655,2213,2321,2410 'quota-spend':600 'rack':259,2122 'rank':622 'rate':789,802,1550,2309,2359,2381,2394 're':674,692,1036,1335,2225,2230,2258,2284,2291 're-ask':1035 're-der':2283 're-fetch':691 're-pag':673 're-pagin':2229 're-run':1334,2290 're-valid':2257 're-view':2224 'read':863,947 'recip':1677 'recommend':423 'refus':2073,2112 'regulatori':1796,1805,1818 'reject':1450 'relat':19,24,28,64,74,100,122,221,725,773,1497,1505,1511,1518,1524,1526,1531,1540,1549,1590,1593,1617,1621,1706,1717,1748,1750,1775,1814,1858,1907,1960,1998,2056,2059,2377,2390 'releas':90,236,752,2064 'relev':1781 'reli':739 'remain':2411 'report':2407 'reput':43,136,1604,1606,1607,1763 'request':159,891,1013,1132 'requir':372,848,2264,2270 'resolut':937 'respons':718,1116,2168 'rest':385,396,410,420,534,2330 'retri':2313,2316 'retry-aft':2312 'return':84,1201,1322,1649,2237 'reveal':1274 'review':790 'revok':1333 'right':2036 'ritual':706 'roadshow':1740 'round':910 'round-trip':909 'rstrip':1639,1652 'rule':656,938,1392 'run':950,1336,2292 'saa':1513,1579 'safe':1241 'sandbox':340 'say':1019 'scope':168,590 'search':149,443,1347,1459 'secur':852 'see':480 'separ':139 'seri':1684,1696,1832,1865,2352 'series-b':1683,1695,1831,1864,2351 'serv':786 'server':298,311,326,375,504 'servic':70,96,110,113,178,199,207,729,767,1493,1501,1507,1514,1520,1527,1536,1545,1702,1713,1744,1771,1810,1854,1903,1956,1980,1989,1992,2014,2023,2130,2373,2386 'servicegraph':53,309,485,502,525,961,965,970,1000,1011,1077,1109,1202,1279 'session':561,704,921,996,1015,1315,1327,2406 'session-start':703 'set':764,1100,1103 'sever':206,2022 'sha256':1637,1669 'shell':347,886,934,952,1049,1056,1071,1098 'shop':200 'shortlist':12,58,623,645 'sibl':164 'signal':784 'simpler':389 'size':595,783 'skill':165,195,210,231,738,2033 'skill-find-pr-agency' 'skip':654,1030,1785,2152,2305 'smaller':2180 'social':187,638,2028 'softwar':255,2118 'somewher':979 'sourc':1085 'source-nostrband' 'special':144,823 'specif':492 'spend':578,602 'split':2051 'stabl':1629 'star':2358 'start':705 'startup':1575,1578,1861 'stat':467 'state':779,1421,1446,1452,1454,1499,1533,1543,1708,1719,1887,1895,1910,2379,2392 'state-govern':1894 'status':2242 'stay':1021 'step':1304 'straight':1788 'style':1348 'sub':119,142,826,1562,2039,2049 'sub-typ':118,141,825,1561,2038,2048 'subshel':1089 'substr':148,500,810,1474,1673 'success':1288 'suppress':2160,2172 'surfac':1154,1782 'switch':2323 'tag':94,114,140,426,763,1977,1981 'tagatevid':1381,1382 'talk':239,2066 'tech':129,830,1498,1574,1577,1679,1688,1707,1718,1848,1859,1876,1994,2344,2378,2391 'tech/startup':34 'techcrunch':1837 'tell':2334 'text':152,809,1206,1473 'thin':1870 'three':1429,1733,2343 'throttl':589 'tier':320,361,379,513,541,545,547,1025 'tighter':1398 'titl':815,1478 'tmp':1120 'token':351,851,856,875,894,926,943,962,966,971,976,984,1001,1061,1078,1110,1136,1143,1149,1203,1280,1284,1307,1329,2288 'tool':316,371,403,419,483,509,527 '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':792 'tr':1660 'trade':1841 'translat':1850 'trigger':1162 'trip':911 'true':2173 'two':681 'tx':1424 'type':120,143,827,1181,1258,1563,2040,2050 'typic':102 'unauthor':1324,2287 'uniqu':608,629,664 'unless':1039 'upcom':1738 'urgent':1757,1784 'url':386,616,635,2193 'us':16,61,290,1835 'use':5,162,229,327,394,550,593,620,761,885,923,1008,1412,1451 'user':8,173,899,918,989,1018,1041,1168,1193,1291,1567,1687,1732,1758,1798,1825,1889,1918,2082,2204,2217,2336,2342 'valid':574,1489,2259 'valu':83,352,568,731,746,878,949,1156,1276,1376,1377,1378,2368 'valueorlist':1372,1375 'vari':494 'vertic':829,1564 'vet':13 'via':1048 'view':666,2223,2226 'want':9,174,2083 'whenev':6 'whether':941 'whitespac':1359 'within':1418 'without':908,946,1153,1273,1990 'word':2047 'work':156,242,285,1045,2072,2104 'wrapper':1057 'write':232,2060 'wrong':1226 'wsj':1838 'x':1173,1250,1433,1436,2409 'x-quota-remaining-month':2408 'year':794 'yes':429,435,441 'z':1663,1666 'zero':85,982,1221","prices":[{"id":"33bd3c82-1d6c-48f4-a452-dad737850913","listingId":"95678abb-eb53-4348-bc88-56a711b3f922","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.332Z"}],"sources":[{"listingId":"95678abb-eb53-4348-bc88-56a711b3f922","source":"github","sourceId":"nostrband/ServiceGraph/find-pr-agency","sourceUrl":"https://github.com/nostrband/ServiceGraph/tree/main/skills/find-pr-agency","isPrimary":false,"firstSeenAt":"2026-05-06T12:58:11.332Z","lastSeenAt":"2026-05-18T18:56:03.398Z"}],"details":{"listingId":"95678abb-eb53-4348-bc88-56a711b3f922","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"nostrband","slug":"find-pr-agency","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":"5ece81cf0b5831d8049df1d5b678acaadd954060","skill_md_path":"skills/find-pr-agency/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/nostrband/ServiceGraph/tree/main/skills/find-pr-agency"},"layout":"multi","source":"github","category":"ServiceGraph","frontmatter":{"name":"find-pr-agency","license":"MIT","description":"Use whenever the user wants to find, shortlist, vet, or enrich US public-relations and communications agencies — media relations, crisis comms, investor relations (IR), product-launch PR, tech/startup PR, healthcare PR, B2B PR, public affairs, brand reputation, and internal communications. Triggers on \"find me a tech PR agency in NY\", \"shortlist three IR firms for our IPO\", \"we need crisis comms help for a brand reputation issue\", or \"pull contact info for these 10 PR firm domains\", even when described indirectly (we need press, get us into TechCrunch, manage our brand reputation). Drives the ServiceGraph API (api.servicegraph.co) — a 100k+ US firm catalog filterable by industry, services, location, size, ratings. Defer to find-marketing-agency when scope is broader marketing beyond PR/comms. Skip in-house PR/comms hires, \"write me a press release\" DIY asks, PR-software comparisons (Cision, Muck Rack), influencer-marketplace questions, non-US firms, individual freelance PR people."},"skills_sh_url":"https://skills.sh/nostrband/ServiceGraph/find-pr-agency"},"updatedAt":"2026-05-18T18:56:03.398Z"}}