Servidor MCP

NicheDB

dev.nichedb/nichedb

Qué hace este MCP

Aggregates scheduled public-data sources into searchable collections, enriched items, profiles, feeds, and future-event listings.

add_source
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.
Esquema de entrada
{'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'}}}
check_domain
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 known USD price for its ending.
Esquema de entrada
{'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)'}}}
claim_profile
Claim a profile as the key owner (needs a key). Proven when the key owner’s email is one the profile lists, or when the person’s site or show page links back to the profile’s nichedb page. An admin may claim on behalf of an email.
Esquema de entrada
{'type': 'object', 'required': ['ref'], 'properties': {'ref': {'type': 'string', 'description': 'Profile id, slug-id or handle'}, 'email': {'type': 'string', 'description': 'Admins only: claim it for this email'}}}
create_feed
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.
Esquema de entrada
{'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'}}}
feed_items
What a feed selects, newest first. Page with before_id.
Esquema de entrada
{'type': 'object', 'required': ['feed'], 'properties': {'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'}, 'feed': {'type': 'string', 'description': 'Feed slug'}, '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 30, max 200'}, 'offset': {'type': 'integer', 'description': 'Distance pagination offset'}, 'radius': {'type': 'number', 'description': 'Default 10; maximum 1000 km', 'exclusiveMinimum': 0}, 'before_id': {'type': 'integer', 'description': 'Keyset cursor; cannot combine with distance sorting'}}}
follow_feed
Follow a feed as the key owner (needs a key). Channels: webpush, email, webhook.
Esquema de entrada
{'type': 'object', 'required': ['feed'], 'properties': {'feed': {'type': 'string', 'description': 'Feed slug'}, 'channels': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Default webpush,email'}, 'webhook_url': {'type': 'string', 'description': 'For the webhook channel'}, 'webhook_secret': {'type': 'string', 'description': 'Shared secret the receiver verifies with'}}}
get_item
One item with its full adapter payload.
Esquema de entrada
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'integer', 'description': 'Item id'}}}
get_profile
One person by id, `<slug>-<id>` or handle: the parsed view and the OpenProfile.md as served.
Esquema de entrada
{'type': 'object', 'required': ['ref'], 'properties': {'ref': {'type': 'string', 'description': 'Profile id, slug-id or handle'}}}
get_tld
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.
Esquema de entrada
{'type': 'object', 'required': ['tld'], 'properties': {'tld': {'type': 'string', 'description': 'The label, with or without the dot; Unicode or xn-- both work'}}}
list_adapters
Every adapter this deployment can run, with the config fields each takes. Use before add_source.
Esquema de entrada
{'type': 'object', 'properties': {}}
list_collections
The collections (niches) with their source, feed and item counts.
Esquema de entrada
{'type': 'object', 'properties': {}}
list_enrichers
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`.
Esquema de entrada
{'type': 'object', 'properties': {}}
list_feeds
Public feeds, most followed first. Optionally one collection.
Esquema de entrada
{'type': 'object', 'properties': {'collection': {'type': 'string', 'description': 'Collection slug'}}}
list_sources
Sources with status, last run and item counts. Optionally one collection.
Esquema de entrada
{'type': 'object', 'properties': {'collection': {'type': 'string', 'description': 'Collection slug, e.g. games'}}}
match_items
Which title, channel or fixture is this name? Give a file name, a release name or a playlist entry ("Top.Gun.Maverick.2022.1080p.mkv", "US: ESPN2 HD"); it is cleaned (year, season and episode, quality tags, playlist decorations) and matched by similarity. A matchup ("NFL: Chiefs vs Bills", "Lakers @ Celtics", "Rangers at Celtic 19:45") is answered by the fixture whose two teams those are, kicking off between 36 hours ago and 7 days ahead unless date narrows it. Each result carries a score in 0..1. Use screen for films and TV, channels for television channels, sports for fixtures.
Esquema de entrada
{'type': 'object', 'required': ['q'], 'properties': {'q': {'type': 'string', 'description': 'The name as written'}, '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'}, 'date': {'type': 'string', 'description': 'A day (YYYY-MM-DD) to look for a fixture on, plus a day either side'}, 'kind': {'type': 'string', 'description': 'Item kind: title, channel, fixture'}, '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'}, 'year': {'type': 'integer', 'description': 'A year to prefer, when known'}, 'limit': {'type': 'integer', 'description': 'Default 5, max 50'}, 'radius': {'type': 'number', 'description': 'Default 10; maximum 1000 km', 'exclusiveMinimum': 0}, 'collection': {'type': 'string', 'description': 'Collection slug: screen, channels or sports'}}}
population
Population and demography, drilled down from the world to the ZIP code. Give a `key` (us, us-ca, us-ca-los-angeles, gb, gb-england-london), a US `zip`, or a place name in `q`; no argument is the world. Answers with the area (population, year, measures: age, income, home value, rent, poverty, education, unemployment, race and Hispanic origin for the US; growth, age structure, births, deaths, fertility, life expectancy, migration, GDP per head and Gini for countries), how many areas of each level it contains, and the largest of its children at `level` (country, state, city or zip). Sources: World Bank, US Census ACS 5-year, GeoNames.
Esquema de entrada
{'type': 'object', 'properties': {'q': {'type': 'string', 'description': 'A place name to look up, e.g. Springfield (optional)'}, 'key': {'type': 'string', 'description': 'Area key, e.g. us, us-ca, us-ca-los-angeles, us-90210, de (optional)'}, 'zip': {'type': 'string', 'description': 'A US ZIP code (optional)'}, 'level': {'type': 'string', 'description': 'Which children to list: country, state, city or zip (optional)'}, 'limit': {'type': 'integer', 'description': 'Children to list, default 20, max 500'}, 'offset': {'type': 'integer', 'description': 'Skip this many children, for paging'}}}
recent_items
Newest items, optionally narrowed to a collection, source or kind.
Esquema de entrada
{'type': 'object', 'properties': {'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 30, max 200'}, 'offset': {'type': 'integer', 'description': 'Distance pagination offset'}, 'radius': {'type': 'number', 'description': 'Default 10; maximum 1000 km', 'exclusiveMinimum': 0}, 'source': {'type': 'string', 'description': 'Source slug'}, 'before_id': {'type': 'integer', 'description': 'Keyset cursor; cannot combine with distance sorting'}, 'collection': {'type': 'string', 'description': 'Collection slug'}}}
run_source
Fetch a source now instead of waiting for its schedule (needs a key; owner or admin).
Esquema de entrada
{'type': 'object', 'required': ['source'], 'properties': {'source': {'type': 'string', 'description': 'Source slug'}}}
search_items
Full-text search over titles, summaries and tags. Use this first when you know a name.
Esquema de entrada
{'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'}}}
search_profiles
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 and the Guest section.
Esquema de entrada
{'type': 'object', 'properties': {'q': {'type': 'string', 'description': 'Text to match against the name, headline and document (optional)'}, 'limit': {'type': 'integer', 'description': 'Default 30, max 200'}, 'since': {'type': 'string', 'description': 'ISO time: only profiles changed after it (optional)'}}}
search_tlds
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.
Esquema de entrada
{'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)'}}}
stats
What this deployment holds: collections, sources, items, items added today, feeds.
Esquema de entrada
{'type': 'object', 'properties': {}}
submit_feed
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.
Esquema de entrada
{'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)'}}}
tld_changes
Top-level domains added to or removed from IANA's root, newest first, with the IANA list version each happened in. Nobody else publishes this diff.
Esquema de entrada
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'description': 'Default 100, max 1000'}, 'since': {'type': 'string', 'description': 'ISO time: only changes after it (optional)'}, 'change': {'type': 'string', 'description': 'added, removed or returned (optional)'}}}
upcoming
Items dated in the future (releases, launches, deadlines), soonest first.
Esquema de entrada
{'type': 'object', 'properties': {'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'}, 'days': {'type': 'integer', 'description': 'Horizon, default 30'}, '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 50'}, 'radius': {'type': 'number', 'description': 'Default 10; maximum 1000 km', 'exclusiveMinimum': 0}, 'collection': {'type': 'string', 'description': 'Collection slug'}}}
update_profile
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`, `identity` (key: value, null removes), `sections` (name: body, `none` removes), `handle`, `public`. What you write wins over every source and survives every re-read.
Esquema de entrada
{'type': 'object', 'required': ['ref'], 'properties': {'ref': {'type': 'string', 'description': 'Profile id, slug-id or handle'}, 'name': {'type': 'string', 'description': 'The name'}, '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, Web, Email, Location, ...; null removes'}, 'markdown': {'type': 'string', 'description': 'A complete OpenProfile.md'}, 'sections': {'type': 'object', 'description': 'Section bodies by name (accounts, topics, broadcast, guest, ...); the word none removes one'}}}
Añadido
check_domain
27 de September de 2026 a las 02:43
Añadido
tld_changes
27 de September de 2026 a las 02:43
Añadido
get_tld
27 de September de 2026 a las 02:43
Añadido
search_tlds
27 de September de 2026 a las 02:43
Añadido
population
27 de September de 2026 a las 02:43
Añadido
run_source
17 de September de 2026 a las 12:39
Añadido
add_source
17 de September de 2026 a las 12:39
Añadido
update_profile
17 de September de 2026 a las 12:39
Añadido
claim_profile
17 de September de 2026 a las 12:39
Añadido
get_profile
17 de September de 2026 a las 12:39
Añadido
search_profiles
17 de September de 2026 a las 12:39
Añadido
submit_feed
17 de September de 2026 a las 12:39
Añadido
follow_feed
17 de September de 2026 a las 12:39
Añadido
create_feed
17 de September de 2026 a las 12:39
Añadido
get_item
17 de September de 2026 a las 12:39
Añadido
match_items
17 de September de 2026 a las 12:39
Añadido
search_items
17 de September de 2026 a las 12:39
Añadido
upcoming
17 de September de 2026 a las 12:39
Añadido
recent_items
17 de September de 2026 a las 12:39
Añadido
feed_items
17 de September de 2026 a las 12:39
Añadido
list_feeds
17 de September de 2026 a las 12:39
Añadido
list_sources
17 de September de 2026 a las 12:39
Añadido
list_enrichers
17 de September de 2026 a las 12:39
Añadido
list_adapters
17 de September de 2026 a las 12:39
Añadido
list_collections
17 de September de 2026 a las 12:39
Añadido
stats
17 de September de 2026 a las 12:39