{"serverId":"mcp-registry/dev.nichedb/nichedb","tools":[{"name":"add_source","fixed":{"name":"add_source","description":"Add a source: an adapter with a config, fetched on a schedule (needs a key; admins and Pro). Call list_adapters first for the fields.","inputSchema":{"type":"object","required":["adapter"],"properties":{"name":{"type":"string","description":"Display name"},"config":{"type":"object","description":"Adapter config fields"},"adapter":{"type":"string","description":"Adapter name, e.g. github-releases"},"collection":{"type":"string","description":"Collection slug; defaults to the adapter's"},"cadence_minutes":{"type":"integer","description":"5 to 1440"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":165,"tokensAfter":165},{"name":"check_domain","fixed":{"name":"check_domain","description":"Is a domain name registered? Asks each registry over RDAP. Give `name` as a full name (foo.watches), or a bare word with `tlds` (foo + com,dev,io), or several names comma separated. Each answer is registered (with registrar and expiry), not_registered, or unknown. not_registered means the registry holds no registration; the name may still be reserved or premium, so it is not a promise that it is for sale. unknown (no RDAP server, a timeout, a 429) is never a yes. Each answer carries the cheapest","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"foo.watches, or foo, or a.com,b.dev"},"tlds":{"type":"string","description":"Endings to try a bare word under, comma separated (optional)"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":219,"tokensAfter":219},{"name":"create_feed","fixed":{"name":"create_feed","description":"Save a query as a feed (needs a key). Sources, kinds and tags narrow; q is a text match; upcoming keeps only future-dated items.","inputSchema":{"type":"object","required":["collection","name"],"properties":{"q":{"type":"string","description":"Text match"},"lat":{"type":"number","maximum":90,"minimum":-90,"description":"Query center latitude; requires long"},"bbox":{"type":"string","description":"west,south,east,north; west > east crosses the antimeridian"},"long":{"type":"number","maximum":180,"minimum":-180,"description":"Query center longitude; requires lat"},"name":{"type":"string","description":"Feed name"},"sort":{"enum":["id","published","updated","distance"],"type":"string"},"tags":{"type":"array","items":{"type":"string"},"description":"Tags, any match"},"unit":{"enum":["km","mi"],"type":"string","description":"Default km"},"kinds":{"type":"array","items":{"type":"string"},"description":"Item kinds"},"public":{"type":"boolean","description":"Default true"},"radius":{"type":"number","description":"Default 10; maximum 1000 km","exclusiveMinimum":0},"sources":{"type":"array","items":{"type":"string"},"description":"Source slugs"},"upcoming":{"type":"boolean"},"enrichers":{"type":"array","items":{"type":"string"},"description":"Enrichers to show; omit for the collection defaults"},"collection":{"type":"string","description":"Collection slug"},"description":{"type":"string","description":"Optional"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":408,"tokensAfter":408},{"name":"find_profile_by_linkedin","fixed":{"name":"find_profile_by_linkedin","description":"The public profile a LinkedIn profile or company URL belongs to (linkedin.com/in/… or /company/…), or null. LinkedIn only: profiles are never looked up by email.","inputSchema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"A LinkedIn URL, e.g. https://www.linkedin.com/in/ada"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":104,"tokensAfter":104},{"name":"get_item","fixed":{"name":"get_item","description":"One item with its full adapter payload.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"integer","description":"Item id"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":53,"tokensAfter":53},{"name":"get_profile","fixed":{"name":"get_profile","description":"One person by id, `<slug>-<id>` or handle: the parsed view and the OpenProfile.md as served.","inputSchema":{"type":"object","required":["ref"],"properties":{"ref":{"type":"string","description":"Profile id, slug-id or handle"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":75,"tokensAfter":75},{"name":"get_tld","fixed":{"name":"get_tld","description":"One top-level domain: type, registry, RDAP server, when it entered or left the root, every registrar price (register, renew, transfer, restore, promotions, privacy, restrictions) and its change history.","inputSchema":{"type":"object","required":["tld"],"properties":{"tld":{"type":"string","description":"The label, with or without the dot; Unicode or xn-- both work"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":113,"tokensAfter":113},{"name":"list_adapters","fixed":{"name":"list_adapters","description":"Every adapter this deployment can run, with the config fields each takes. Use before add_source.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":52,"tokensAfter":52},{"name":"list_collections","fixed":{"name":"list_collections","description":"The collections (niches) with their source, feed and item counts.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":44,"tokensAfter":44},{"name":"list_enrichers","fixed":{"name":"list_enrichers","description":"Every enricher (YouTube videos, Wikipedia, repo stats, downloads, company profiles, TL;DRs) and which collections turn it on by default. Items carry their results under `enrichment`.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":76,"tokensAfter":76},{"name":"list_feeds","fixed":{"name":"list_feeds","description":"Public feeds, most followed first. Optionally one collection.","inputSchema":{"type":"object","properties":{"collection":{"type":"string","description":"Collection slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":59,"tokensAfter":59},{"name":"list_sources","fixed":{"name":"list_sources","description":"Sources with status, last run and item counts. Optionally one collection.","inputSchema":{"type":"object","properties":{"collection":{"type":"string","description":"Collection slug, e.g. games"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":66,"tokensAfter":66},{"name":"reputation_lookup","fixed":{"name":"reputation_lookup","description":"Is an IP address or a domain on a blocklist? Give `indicator` (an IPv4/IPv6 address or a domain; a URL is reduced to its host). Answers `listed`, a rough 0-100 `score` with the `reasons` behind it, the nichedb /traffic record (addresses our own servers banned and a person approved), the abuse.ch indicators (ThreatFox, URLhaus, Feodo Tracker; a domain is checked with its parent domains), the SURBL standing of a watched domain, and live DNS blocklists in `dnsbl` (an address: Spamhaus ZEN with SBL/","inputSchema":{"type":"object","required":["indicator"],"properties":{"indicator":{"type":"string","description":"An IP address or a domain, e.g. 203.0.113.9 or evil.example"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":201,"tokensAfter":201},{"name":"run_source","fixed":{"name":"run_source","description":"Fetch a source now instead of waiting for its schedule (needs a key; owner or admin).","inputSchema":{"type":"object","required":["source"],"properties":{"source":{"type":"string","description":"Source slug"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":69,"tokensAfter":69},{"name":"search_items","fixed":{"name":"search_items","description":"Full-text search over titles, summaries and tags. Use this first when you know a name.","inputSchema":{"type":"object","required":["q"],"properties":{"q":{"type":"string","description":"Query"},"lat":{"type":"number","maximum":90,"minimum":-90,"description":"Query center latitude; requires long"},"bbox":{"type":"string","description":"west,south,east,north; west > east crosses the antimeridian"},"kind":{"type":"string","description":"Item kind"},"long":{"type":"number","maximum":180,"minimum":-180,"description":"Query center longitude; requires lat"},"sort":{"enum":["id","published","updated","distance"],"type":"string"},"unit":{"enum":["km","mi"],"type":"string","description":"Default km"},"limit":{"type":"integer","description":"Default 20, max 100"},"radius":{"type":"number","description":"Default 10; maximum 1000 km","exclusiveMinimum":0},"collection":{"type":"string","description":"Collection slug"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":267,"tokensAfter":267},{"name":"search_profiles","fixed":{"name":"search_profiles","description":"People: one entry per person assembled from every app that serves their OpenProfile.md (podcasters from p0dcasters, public profiles from OutreachGraph). Search by name, headline or anything in the document; newest change first. Each answer carries the page, the openprofile.md URL, accounts, topics, Broadcast shows, the Guest section, and the job title, company and seniority the person published (filter on them with title, company, seniority or tags).","inputSchema":{"type":"object","properties":{"q":{"type":"string","description":"Text to match against the name, headline and document (optional)"},"tags":{"type":"array","items":{"type":"string"},"description":"Facet tags every result must carry: title:…, company:…, seniority:…"},"limit":{"type":"integer","description":"Default 30, max 200"},"since":{"type":"string","description":"ISO time: only profiles changed after it (optional)"},"title":{"type":"string","description":"Job title, matched as its tag (`CTO` is title:cto) (optional)"},"company":{"type":"string","description":"Company domain, URL or name (optional)"},"seniority":{"enum":["c-suite","vp","director","manager","senior","entry"],"type":"string","description":"Seniority derived from the title (optional)"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":355,"tokensAfter":355},{"name":"search_tlds","fixed":{"name":"search_tlds","description":"Top-level domains: every label in IANA's root, with type, registry, RDAP server and each registrar's one-year register/renew/transfer price (Porkbun, Dynadot, Cloudflare, OVHcloud). Sorted by renewal by default, because the first year is a promotion. `best` is the cheapest USD price across registrars; with `registrar` it is that registrar's own price in its currency. Answers carry facet counts. `trap: true` keeps only labels that renew at 2x the first year or more.","inputSchema":{"type":"object","properties":{"q":{"type":"string","description":"Text in the label, its Unicode form or the registry name (optional)"},"idn":{"type":"boolean","description":"true: internationalised labels only; false: ASCII only"},"sort":{"type":"string","description":"renew (default), register, transfer, restore, ratio, tld, registrars, type, manager, first_seen"},"trap":{"type":"boolean","description":"Only labels renewing at 2x the first year or more"},"type":{"type":"string","description":"generic, country-code, sponsored, generic-restricted, infrastructure, test; comma separated (optional)"},"limit":{"type":"integer","description":"Default 50, max 500"},"order":{"type":"string","description":"asc or desc"},"offset":{"type":"integer","description":"Default 0"},"status":{"type":"string","description":"delegated (default), removed, or all"},"manager":{"type":"string","description":"Exact registry name, as IANA writes it (optional)"},"max_renew":{"type":"number","description":"Highest renewal price (optional)"},"registrar":{"type":"string","description":"porkbun, dynadot, cloudflare, ovh (optional): only labels it sells, at its prices"},"max_register":{"type":"number","description":"Highest first-year price (optional)"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":491,"tokensAfter":491},{"name":"stats","fixed":{"name":"stats","description":"What this deployment holds: collections, sources, items, items added today, feeds.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":46,"tokensAfter":46},{"name":"submit_feed","fixed":{"name":"submit_feed","description":"Suggest an RSS or Atom feed for the index. No key needed. An admin reviews every suggestion before anything is fetched; approved podcast feeds are handed to rssamplifier, everything else becomes a source here.","inputSchema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"The feed URL, starting with https://"},"note":{"type":"string","description":"Why it belongs here: who publishes it, what it covers (optional)"},"email":{"type":"string","description":"Where to hear back, if you are not sending a key (optional)"},"collection":{"type":"string","description":"Collection slug it belongs in (optional; an admin decides otherwise)"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":199,"tokensAfter":199},{"name":"traffic_list","fixed":{"name":"traffic_list","description":"The nichedb /traffic blocklist: IP addresses our own servers banned for exploit attempts, scanning, brute force or spam, each published only after a reviewer (a person, or riotcoder applying published rules) read the evidence and approved it. Newest approvals first. Optional `days` keeps addresses seen in the last N days, `category` one of exploit, brute-force, scanner, spam, other. Without an API key the newest 100 are returned; with one, `limit` (up to 1000) and `offset` page the whole list.","inputSchema":{"type":"object","properties":{"days":{"type":"number","description":"Only addresses seen in the last N days (optional)"},"limit":{"type":"number","description":"Rows to return, up to 1000 with an API key"},"offset":{"type":"number","description":"Rows to skip, with an API key"},"category":{"type":"string","description":"exploit, brute-force, scanner, spam or other (optional)"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":260,"tokensAfter":260},{"name":"update_profile","fixed":{"name":"update_profile","description":"Edit a profile you own (needs a key). Send `markdown`, a whole OpenProfile.md that replaces what you wrote before, or any of `name`, `headline`, `emoji`, `pronouns`, `web`, `identity` (key: value, null removes), `sections` (name: body, `none` removes), `handle`, `public`. What you write wins over every source and survives every re-read.","inputSchema":{"type":"object","required":["ref"],"properties":{"ref":{"type":"string","description":"Profile id, slug-id or handle"},"web":{"type":"string","description":"Your home page (Website, Homepage and Site are the same key); empty removes"},"name":{"type":"string","description":"The name"},"emoji":{"type":"string","description":"Your mark next to your name: one emoji or an OpenEmoji :shortcode:; empty removes"},"handle":{"type":"string","description":"Your URL: /c/profiles/<handle>"},"public":{"type":"boolean","description":"Listed and pulled by other directories"},"headline":{"type":"string","description":"One line"},"identity":{"type":"object","description":"Identity keys: Kind, Emoji, Pronouns, Web, Email, Location, ...; null removes"},"markdown":{"type":"string","description":"A complete OpenProfile.md"},"pronouns":{"type":"string","description":"As you write them (she/her, they/them, any); empty removes, never inferred"},"sections":{"type":"object","description":"Section bodies by name (accounts, topics, broadcast, guest, ...); the word none removes one"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":408,"tokensAfter":408}],"toolsChanged":21,"tokensSaved":0,"todo":[{"tool":"create_feed","params":["sort","upcoming"]},{"tool":"feed_items","params":["sort"]},{"tool":"match_items","params":["sort"]},{"tool":"recent_items","params":["sort"]},{"tool":"search_items","params":["sort"]},{"tool":"upcoming","params":["sort"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}