{
  "data": {
    "tool": {
      "category": "data",
      "endpoint": "https://nichedb.dev/mcp",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/nichedb.json",
      "kind": "mcp",
      "listed": "indexed",
      "liveUrl": "https://www.anchorterminal.com/api/v1/live/nichedb.json",
      "markdownUrl": "https://www.anchorterminal.com/tools/nichedb.md",
      "mcpTools": {
        "check": {
          "checker": "anchor-check/1.0",
          "totalTokens": 4447,
          "counts": {
            "error": 0,
            "note": 1,
            "warn": 34
          },
          "findings": [
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "create_feed",
              "message": "2 parameters without a description: sort, upcoming",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "feed_items",
              "message": "1 parameter without a description: sort",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "match_items",
              "message": "1 parameter without a description: sort",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "recent_items",
              "message": "1 parameter without a description: sort",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "search_items",
              "message": "1 parameter without a description: sort",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC11",
              "severity": "warn",
              "tool": "upcoming",
              "message": "1 parameter without a description: sort",
              "fix": "Describe each one: format, units, an example, and what happens when it's left out."
            },
            {
              "rule": "TC13",
              "severity": "warn",
              "tool": "add_source",
              "message": "config (object with no properties)",
              "fix": "Declare the properties (or additionalProperties with a schema) and the array's items."
            },
            {
              "rule": "TC13",
              "severity": "warn",
              "tool": "update_profile",
              "message": "identity (object with no properties), sections (object with no properties)",
              "fix": "Declare the properties (or additionalProperties with a schema) and the array's items."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "add_source",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "check_domain",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"check\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "claim_profile",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "create_feed",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "feed_items",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "follow_feed",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "get_item",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"get\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "get_profile",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"get\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "get_tld",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"get\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "list_adapters",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "list_collections",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "list_enrichers",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "list_feeds",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "list_sources",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"list\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "match_items",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "population",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "recent_items",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "run_source",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "search_items",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"search\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "search_profiles",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"search\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "search_tlds",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Its name starts with \"search\"; if it only reads, set readOnlyHint: true so harnesses can run it without asking."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "stats",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "submit_feed",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "tld_changes",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "upcoming",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC16",
              "severity": "warn",
              "tool": "update_profile",
              "message": "no readOnlyHint or destructiveHint",
              "fix": "Set readOnlyHint: true if it only reads; otherwise set destructiveHint and idempotentHint."
            },
            {
              "rule": "TC24",
              "severity": "note",
              "message": "26 of 26 tools have no outputSchema",
              "fix": "Declare outputSchema for tools that return structured data, and return structuredContent that matches it."
            }
          ]
        },
        "checkedAt": "2026-10-04T22:24:55Z",
        "count": 26,
        "note": "answered without the initialize handshake",
        "schemaTokens": 4447,
        "status": "ok",
        "tools": [
          {
            "name": "stats",
            "description": "What this deployment holds: collections, sources, items, items added today, feeds.",
            "inputSchema": {
              "properties": {},
              "type": "object"
            }
          },
          {
            "name": "list_collections",
            "description": "The collections (niches) with their source, feed and item counts.",
            "inputSchema": {
              "properties": {},
              "type": "object"
            }
          },
          {
            "name": "list_adapters",
            "description": "Every adapter this deployment can run, with the config fields each takes. Use before add_source.",
            "inputSchema": {
              "properties": {},
              "type": "object"
            }
          },
          {
            "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": {
              "properties": {},
              "type": "object"
            }
          },
          {
            "name": "list_sources",
            "description": "Sources with status, last run and item counts. Optionally one collection.",
            "inputSchema": {
              "properties": {
                "collection": {
                  "description": "Collection slug, e.g. games",
                  "type": "string"
                }
              },
              "type": "object"
            }
          },
          {
            "name": "list_feeds",
            "description": "Public feeds, most followed first. Optionally one collection.",
            "inputSchema": {
              "properties": {
                "collection": {
                  "description": "Collection slug",
                  "type": "string"
                }
              },
              "type": "object"
            }
          },
          {
            "name": "feed_items",
            "description": "What a feed selects, newest first. Page with before_id.",
            "inputSchema": {
              "properties": {
                "bbox": {
                  "description": "west,south,east,north; west \u003e east crosses the antimeridian",
                  "type": "string"
                },
                "before_id": {
                  "description": "Keyset cursor; cannot combine with distance sorting",
                  "type": "integer"
                },
                "feed": {
                  "description": "Feed slug",
                  "type": "string"
                },
                "lat": {
                  "description": "Query center latitude; requires long",
                  "maximum": 90,
                  "minimum": -90,
                  "type": "number"
                },
                "limit": {
                  "description": "Default 30, max 200",
                  "type": "integer"
                },
                "long": {
                  "description": "Query center longitude; requires lat",
                  "maximum": 180,
                  "minimum": -180,
                  "type": "number"
                },
                "offset": {
                  "description": "Distance pagination offset",
                  "type": "integer"
                },
                "radius": {
                  "description": "Default 10; maximum 1000 km",
                  "exclusiveMinimum": 0,
                  "type": "number"
                },
                "sort": {
                  "enum": [
                    "id",
                    "published",
                    "updated",
                    "distance"
                  ],
                  "type": "string"
                },
                "unit": {
                  "description": "Default km",
                  "enum": [
                    "km",
                    "mi"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "feed"
              ],
              "type": "object"
            }
          },
          {
            "name": "recent_items",
            "description": "Newest items, optionally narrowed to a collection, source or kind.",
            "inputSchema": {
              "properties": {
                "bbox": {
                  "description": "west,south,east,north; west \u003e east crosses the antimeridian",
                  "type": "string"
                },
                "before_id": {
                  "description": "Keyset cursor; cannot combine with distance sorting",
                  "type": "integer"
                },
                "collection": {
                  "description": "Collection slug",
                  "type": "string"
                },
                "kind": {
                  "description": "Item kind",
                  "type": "string"
                },
                "lat": {
                  "description": "Query center latitude; requires long",
                  "maximum": 90,
                  "minimum": -90,
                  "type": "number"
                },
                "limit": {
                  "description": "Default 30, max 200",
                  "type": "integer"
                },
                "long": {
                  "description": "Query center longitude; requires lat",
                  "maximum": 180,
                  "minimum": -180,
                  "type": "number"
                },
                "offset": {
                  "description": "Distance pagination offset",
                  "type": "integer"
                },
                "radius": {
                  "description": "Default 10; maximum 1000 km",
                  "exclusiveMinimum": 0,
                  "type": "number"
                },
                "sort": {
                  "enum": [
                    "id",
                    "published",
                    "updated",
                    "distance"
                  ],
                  "type": "string"
                },
                "source": {
                  "description": "Source slug",
                  "type": "string"
                },
                "unit": {
                  "description": "Default km",
                  "enum": [
                    "km",
                    "mi"
                  ],
                  "type": "string"
                }
              },
              "type": "object"
            }
          },
          {
            "name": "upcoming",
            "description": "Items dated in the future (releases, launches, deadlines), soonest first.",
            "inputSchema": {
              "properties": {
                "bbox": {
                  "description": "west,south,east,north; west \u003e east crosses the antimeridian",
                  "type": "string"
                },
                "collection": {
                  "description": "Collection slug",
                  "type": "string"
                },
                "days": {
                  "description": "Horizon, default 30",
                  "type": "integer"
                },
                "lat": {
                  "description": "Query center latitude; requires long",
                  "maximum": 90,
                  "minimum": -90,
                  "type": "number"
                },
                "limit": {
                  "description": "Default 50",
                  "type": "integer"
                },
                "long": {
                  "description": "Query center longitude; requires lat",
                  "maximum": 180,
                  "minimum": -180,
                  "type": "number"
                },
                "radius": {
                  "description": "Default 10; maximum 1000 km",
                  "exclusiveMinimum": 0,
                  "type": "number"
                },
                "sort": {
                  "enum": [
                    "id",
                    "published",
                    "updated",
                    "distance"
                  ],
                  "type": "string"
                },
                "unit": {
                  "description": "Default km",
                  "enum": [
                    "km",
                    "mi"
                  ],
                  "type": "string"
                }
              },
              "type": "object"
            }
          },
          {
            "name": "search_items",
            "description": "Full-text search over titles, summaries and tags. Use this first when you know a name.",
            "inputSchema": {
              "properties": {
                "bbox": {
                  "description": "west,south,east,north; west \u003e east crosses the antimeridian",
                  "type": "string"
                },
                "collection": {
                  "description": "Collection slug",
                  "type": "string"
                },
                "kind": {
                  "description": "Item kind",
                  "type": "string"
                },
                "lat": {
                  "description": "Query center latitude; requires long",
                  "maximum": 90,
                  "minimum": -90,
                  "type": "number"
                },
                "limit": {
                  "description": "Default 20, max 100",
                  "type": "integer"
                },
                "long": {
                  "description": "Query center longitude; requires lat",
                  "maximum": 180,
                  "minimum": -180,
                  "type": "number"
                },
                "q": {
                  "description": "Query",
                  "type": "string"
                },
                "radius": {
                  "description": "Default 10; maximum 1000 km",
                  "exclusiveMinimum": 0,
                  "type": "number"
                },
                "sort": {
                  "enum": [
                    "id",
                    "published",
                    "updated",
                    "distance"
                  ],
                  "type": "string"
                },
                "unit": {
                  "description": "Default km",
                  "enum": [
                    "km",
                    "mi"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "q"
              ],
              "type": "object"
            }
          },
          {
            "name": "match_items",
            "description": "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.",
            "inputSchema": {
              "properties": {
                "bbox": {
                  "description": "west,south,east,north; west \u003e east crosses the antimeridian",
                  "type": "string"
                },
                "collection": {
                  "description": "Collection slug: screen, channels or sports",
                  "type": "string"
                },
                "date": {
                  "description": "A day (YYYY-MM-DD) to look for a fixture on, plus a day either side",
                  "type": "string"
                },
                "kind": {
                  "description": "Item kind: title, channel, fixture",
                  "type": "string"
                },
                "lat": {
                  "description": "Query center latitude; requires long",
                  "maximum": 90,
                  "minimum": -90,
                  "type": "number"
                },
                "limit": {
                  "description": "Default 5, max 50",
                  "type": "integer"
                },
                "long": {
                  "description": "Query center longitude; requires lat",
                  "maximum": 180,
                  "minimum": -180,
                  "type": "number"
                },
                "q": {
                  "description": "The name as written",
                  "type": "string"
                },
                "radius": {
                  "description": "Default 10; maximum 1000 km",
                  "exclusiveMinimum": 0,
                  "type": "number"
                },
                "sort": {
                  "enum": [
                    "id",
                    "published",
                    "updated",
                    "distance"
                  ],
                  "type": "string"
                },
                "unit": {
                  "description": "Default km",
                  "enum": [
                    "km",
                    "mi"
                  ],
                  "type": "string"
                },
                "year": {
                  "description": "A year to prefer, when known",
                  "type": "integer"
                }
              },
              "required": [
                "q"
              ],
              "type": "object"
            }
          },
          {
            "name": "get_item",
            "description": "One item with its full adapter payload.",
            "inputSchema": {
              "properties": {
                "id": {
                  "description": "Item id",
                  "type": "integer"
                }
              },
              "required": [
                "id"
              ],
              "type": "object"
            }
          },
          {
            "name": "population",
            "description": "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.",
            "inputSchema": {
              "properties": {
                "key": {
                  "description": "Area key, e.g. us, us-ca, us-ca-los-angeles, us-90210, de (optional)",
                  "type": "string"
                },
                "level": {
                  "description": "Which children to list: country, state, city or zip (optional)",
                  "type": "string"
                },
                "limit": {
                  "description": "Children to list, default 20, max 500",
                  "type": "integer"
                },
                "offset": {
                  "description": "Skip this many children, for paging",
                  "type": "integer"
                },
                "q": {
                  "description": "A place name to look up, e.g. Springfield (optional)",
                  "type": "string"
                },
                "zip": {
                  "description": "A US ZIP code (optional)",
                  "type": "string"
                }
              },
              "type": "object"
            }
          },
          {
            "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": {
              "properties": {
                "bbox": {
                  "description": "west,south,east,north; west \u003e east crosses the antimeridian",
                  "type": "string"
                },
                "collection": {
                  "description": "Collection slug",
                  "type": "string"
                },
                "description": {
                  "description": "Optional",
                  "type": "string"
                },
                "enrichers": {
                  "description": "Enrichers to show; omit for the collection defaults",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "kinds": {
                  "description": "Item kinds",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "lat": {
                  "description": "Query center latitude; requires long",
                  "maximum": 90,
                  "minimum": -90,
                  "type": "number"
                },
                "long": {
                  "description": "Query center longitude; requires lat",
                  "maximum": 180,
                  "minimum": -180,
                  "type": "number"
                },
                "name": {
                  "description": "Feed name",
                  "type": "string"
                },
                "public": {
                  "description": "Default true",
                  "type": "boolean"
                },
                "q": {
                  "description": "Text match",
                  "type": "string"
                },
                "radius": {
                  "description": "Default 10; maximum 1000 km",
                  "exclusiveMinimum": 0,
                  "type": "number"
                },
                "sort": {
                  "enum": [
                    "id",
                    "published",
                    "updated",
                    "distance"
                  ],
                  "type": "string"
                },
                "sources": {
                  "description": "Source slugs",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "tags": {
                  "description": "Tags, any match",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "unit": {
                  "description": "Default km",
                  "enum": [
                    "km",
                    "mi"
                  ],
                  "type": "string"
                },
                "upcoming": {
                  "type": "boolean"
                }
              },
              "required": [
                "collection",
                "name"
              ],
              "type": "object"
            }
          },
          {
            "name": "follow_feed",
            "description": "Follow a feed as the key owner (needs a key). Channels: webpush, email, webhook.",
            "inputSchema": {
              "properties": {
                "channels": {
                  "description": "Default webpush,email",
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "feed": {
                  "description": "Feed slug",
                  "type": "string"
                },
                "webhook_secret": {
                  "description": "Shared secret the receiver verifies with",
                  "type": "string"
                },
                "webhook_url": {
                  "description": "For the webhook channel",
                  "type": "string"
                }
              },
              "required": [
                "feed"
              ],
              "type": "object"
            }
          },
          {
            "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": {
              "properties": {
                "collection": {
                  "description": "Collection slug it belongs in (optional; an admin decides otherwise)",
                  "type": "string"
                },
                "email": {
                  "description": "Where to hear back, if you are not sending a key (optional)",
                  "type": "string"
                },
                "note": {
                  "description": "Why it belongs here: who publishes it, what it covers (optional)",
                  "type": "string"
                },
                "url": {
                  "description": "The feed URL, starting with https://",
                  "type": "string"
                }
              },
              "required": [
                "url"
              ],
              "type": "object"
            }
          },
          {
            "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 and the Guest section.",
            "inputSchema": {
              "properties": {
                "limit": {
                  "description": "Default 30, max 200",
                  "type": "integer"
                },
                "q": {
                  "description": "Text to match against the name, headline and document (optional)",
                  "type": "string"
                },
                "since": {
                  "description": "ISO time: only profiles changed after it (optional)",
                  "type": "string"
                }
              },
              "type": "object"
            }
          },
          {
            "name": "get_profile",
            "description": "One person by id, `\u003cslug\u003e-\u003cid\u003e` or handle: the parsed view and the OpenProfile.md as served.",
            "inputSchema": {
              "properties": {
                "ref": {
                  "description": "Profile id, slug-id or handle",
                  "type": "string"
                }
              },
              "required": [
                "ref"
              ],
              "type": "object"
            }
          },
          {
            "name": "claim_profile",
            "description": "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.",
            "inputSchema": {
              "properties": {
                "email": {
                  "description": "Admins only: claim it for this email",
                  "type": "string"
                },
                "ref": {
                  "description": "Profile id, slug-id or handle",
                  "type": "string"
                }
              },
              "required": [
                "ref"
              ],
              "type": "object"
            }
          },
          {
            "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`, `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": {
              "properties": {
                "handle": {
                  "description": "Your URL: /c/profiles/\u003chandle\u003e",
                  "type": "string"
                },
                "headline": {
                  "description": "One line",
                  "type": "string"
                },
                "identity": {
                  "description": "Identity keys: Kind, Web, Email, Location, ...; null removes",
                  "type": "object"
                },
                "markdown": {
                  "description": "A complete OpenProfile.md",
                  "type": "string"
                },
                "name": {
                  "description": "The name",
                  "type": "string"
                },
                "public": {
                  "description": "Listed and pulled by other directories",
                  "type": "boolean"
                },
                "ref": {
                  "description": "Profile id, slug-id or handle",
                  "type": "string"
                },
                "sections": {
                  "description": "Section bodies by name (accounts, topics, broadcast, guest, ...); the word none removes one",
                  "type": "object"
                }
              },
              "required": [
                "ref"
              ],
              "type": "object"
            }
          },
          {
            "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": {
              "properties": {
                "adapter": {
                  "description": "Adapter name, e.g. github-releases",
                  "type": "string"
                },
                "cadence_minutes": {
                  "description": "5 to 1440",
                  "type": "integer"
                },
                "collection": {
                  "description": "Collection slug; defaults to the adapter's",
                  "type": "string"
                },
                "config": {
                  "description": "Adapter config fields",
                  "type": "object"
                },
                "name": {
                  "description": "Display name",
                  "type": "string"
                }
              },
              "required": [
                "adapter"
              ],
              "type": "object"
            }
          },
          {
            "name": "run_source",
            "description": "Fetch a source now instead of waiting for its schedule (needs a key; owner or admin).",
            "inputSchema": {
              "properties": {
                "source": {
                  "description": "Source slug",
                  "type": "string"
                }
              },
              "required": [
                "source"
              ],
              "type": "object"
            }
          },
          {
            "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": {
              "properties": {
                "idn": {
                  "description": "true: internationalised labels only; false: ASCII only",
                  "type": "boolean"
                },
                "limit": {
                  "description": "Default 50, max 500",
                  "type": "integer"
                },
                "manager": {
                  "description": "Exact registry name, as IANA writes it (optional)",
                  "type": "string"
                },
                "max_register": {
                  "description": "Highest first-year price (optional)",
                  "type": "number"
                },
                "max_renew": {
                  "description": "Highest renewal price (optional)",
                  "type": "number"
                },
                "offset": {
                  "description": "Default 0",
                  "type": "integer"
                },
                "order": {
                  "description": "asc or desc",
                  "type": "string"
                },
                "q": {
                  "description": "Text in the label, its Unicode form or the registry name (optional)",
                  "type": "string"
                },
                "registrar": {
                  "description": "porkbun, dynadot, cloudflare, ovh (optional): only labels it sells, at its prices",
                  "type": "string"
                },
                "sort": {
                  "description": "renew (default), register, transfer, restore, ratio, tld, registrars, type, manager, first_seen",
                  "type": "string"
                },
                "status": {
                  "description": "delegated (default), removed, or all",
                  "type": "string"
                },
                "trap": {
                  "description": "Only labels renewing at 2x the first year or more",
                  "type": "boolean"
                },
                "type": {
                  "description": "generic, country-code, sponsored, generic-restricted, infrastructure, test; comma separated (optional)",
                  "type": "string"
                }
              },
              "type": "object"
            }
          },
          {
            "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": {
              "properties": {
                "tld": {
                  "description": "The label, with or without the dot; Unicode or xn-- both work",
                  "type": "string"
                }
              },
              "required": [
                "tld"
              ],
              "type": "object"
            }
          },
          {
            "name": "tld_changes",
            "description": "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.",
            "inputSchema": {
              "properties": {
                "change": {
                  "description": "added, removed or returned (optional)",
                  "type": "string"
                },
                "limit": {
                  "description": "Default 100, max 1000",
                  "type": "integer"
                },
                "since": {
                  "description": "ISO time: only changes after it (optional)",
                  "type": "string"
                }
              },
              "type": "object"
            }
          },
          {
            "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 known USD price for its ending.",
            "inputSchema": {
              "properties": {
                "name": {
                  "description": "foo.watches, or foo, or a.com,b.dev",
                  "type": "string"
                },
                "tlds": {
                  "description": "Endings to try a bare word under, comma separated (optional)",
                  "type": "string"
                }
              },
              "required": [
                "name"
              ],
              "type": "object"
            }
          }
        ]
      },
      "name": "NicheDB",
      "note": "Indexed from the official MCP registry: facts and our own checks, not reviewed, so no score, grade or rank.",
      "packages": [
        {
          "registryType": "npm",
          "identifier": "@profullstack/nichedb",
          "version": "0.1.0",
          "transport": "stdio"
        }
      ],
      "pageJsonUrl": "https://www.anchorterminal.com/tools/nichedb.json",
      "popularity": {
        "githubStars": 1,
        "npmWeekly": 1806
      },
      "registryName": "dev.nichedb/nichedb",
      "remotes": [
        {
          "type": "streamable-http",
          "url": "https://nichedb.dev/mcp"
        }
      ],
      "repository": "https://github.com/profullstack/niche-db",
      "reviewed": false,
      "slug": "nichedb",
      "source": "the official MCP registry",
      "sourceUrl": "https://registry.modelcontextprotocol.io/v0.1/servers?search=dev.nichedb/nichedb",
      "summary": "Sources in, feeds out: an open, ever-growing database of real-time public data, enriched.",
      "updatedAt": "2026-09-05T21:18:08Z",
      "url": "https://www.anchorterminal.com/tools/nichedb",
      "vendor": "nichedb.dev",
      "vendorUrl": "https://nichedb.dev",
      "version": "0.1.0",
      "websiteUrl": "https://nichedb.dev",
      "where": "both",
      "why": [
        "vendor",
        "popular"
      ]
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/tools/nichedb",
    "json": "https://www.anchorterminal.com/tools/nichedb.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/tools/nichedb.md",
    "slim": "https://www.anchorterminal.com/tools/nichedb.min.md"
  },
  "markdown": "# NicheDB\n\n\u003e Indexed, not reviewed: facts from the official MCP registry and our own checks. No score, grade or rank, and not in the rankings until the panel reviews it. How the index works: https://www.anchorterminal.com/indexed/\n\n- Kind: MCP server, by nichedb.dev (https://nichedb.dev)\n- Category: Databases \u0026 files (https://www.anchorterminal.com/categories/data.md)\n- Listed because: It's published in the registry under nichedb.dev, a namespace the registry only gives to whoever proves they control that domain. It's in real use: 1,806 npm downloads a week, 1 GitHub stars.\n- What the official MCP registry says: Sources in, feeds out: an open, ever-growing database of real-time public data, enriched.\n\n## Facts\n\n- MCP registry: `dev.nichedb/nichedb` 0.1.0\n- Endpoint: https://nichedb.dev/mcp (streamable HTTP)\n- Package: npm `@profullstack/nichedb` (stdio)\n- Source: https://github.com/profullstack/niche-db\n- Website: https://nichedb.dev\n- npm downloads a week: 1,806\n- GitHub stars: 1\n- Registry entry updated: 2026-09-05\n\n## Tools\n\n- Tools it lists (26, about 4,447 tokens of context, `tools/list` without credentials, checked 2026-10-04 22:24 UTC):\n  - `stats`: What this deployment holds: collections, sources, items, items added today, feeds.\n  - `list_collections`: The collections (niches) with their source, feed and item counts.\n  - `list_adapters`: Every adapter this deployment can run, with the config fields each takes. Use before add_source.\n  - `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…\n  - `list_sources`: Sources with status, last run and item counts. Optionally one collection.\n  - `list_feeds`: Public feeds, most followed first. Optionally one collection.\n  - `feed_items`: What a feed selects, newest first. Page with before_id.\n  - `recent_items`: Newest items, optionally narrowed to a collection, source or kind.\n  - `upcoming`: Items dated in the future (releases, launches, deadlines), soonest first.\n  - `search_items`: Full-text search over titles, summaries and tags. Use this first when you know a name.\n  - `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…\n  - `get_item`: One item with its full adapter payload.\n  - `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…\n  - `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.\n  - `follow_feed`: Follow a feed as the key owner (needs a key). Channels: webpush, email, webhook.\n  - `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…\n  - `search_profiles`: People: one entry per person assembled from every app that serves their OpenProfile.md (podcasters from p0dcasters, public profiles from OutreachGraph). Search…\n  - `get_profile`: One person by id, `\u003cslug\u003e-\u003cid\u003e` or handle: the parsed view and the OpenProfile.md as served.\n  - `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…\n  - `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`…\n  - `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.\n  - `run_source`: Fetch a source now instead of waiting for its schedule (needs a key; owner or admin).\n  - `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,…\n  - `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,…\n  - `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.\n  - `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…\n- How its tools read to an agent (0 errors, 34 warnings, 1 note, about 4,447 tokens; rules at https://www.anchorterminal.com/check.md; not part of the score):\n  - warn TC11 create_feed: 2 parameters without a description: sort, upcoming\n  - warn TC11 feed_items: 1 parameter without a description: sort\n  - warn TC11 match_items: 1 parameter without a description: sort\n  - warn TC11 recent_items: 1 parameter without a description: sort\n  - warn TC11 search_items: 1 parameter without a description: sort\n  - warn TC11 upcoming: 1 parameter without a description: sort\n  - warn TC13 add_source: config (object with no properties)\n  - warn TC13 update_profile: identity (object with no properties), sections (object with no properties)\n  - warn TC16 add_source: no readOnlyHint or destructiveHint\n  - warn TC16 check_domain: no readOnlyHint or destructiveHint\n  - warn TC16 claim_profile: no readOnlyHint or destructiveHint\n  - warn TC16 create_feed: no readOnlyHint or destructiveHint\n  - warn TC16 feed_items: no readOnlyHint or destructiveHint\n  - warn TC16 follow_feed: no readOnlyHint or destructiveHint\n  - warn TC16 get_item: no readOnlyHint or destructiveHint\n  - warn TC16 get_profile: no readOnlyHint or destructiveHint\n  - warn TC16 get_tld: no readOnlyHint or destructiveHint\n  - warn TC16 list_adapters: no readOnlyHint or destructiveHint\n  - warn TC16 list_collections: no readOnlyHint or destructiveHint\n  - warn TC16 list_enrichers: no readOnlyHint or destructiveHint\n  - warn TC16 list_feeds: no readOnlyHint or destructiveHint\n  - warn TC16 list_sources: no readOnlyHint or destructiveHint\n  - warn TC16 match_items: no readOnlyHint or destructiveHint\n  - warn TC16 population: no readOnlyHint or destructiveHint\n\n- JSON: https://www.anchorterminal.com/api/v1/tools/nichedb.json\n- Being indexed says nothing about quality, and nobody can pay for it. Ask for a review: https://www.anchorterminal.com/builders/#claiming\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-05",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.3",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Terminal",
        "url": "https://www.anchorterminal.com/tools/"
      },
      {
        "name": "Indexed",
        "url": "https://www.anchorterminal.com/indexed/"
      },
      {
        "name": "NicheDB",
        "url": ""
      }
    ],
    "description": "NicheDB, an MCP server by nichedb.dev, listed from the official MCP registry. Indexed, not reviewed: facts and our own checks, no score or ranking. Sources in, feeds out: an open, ever-growing database of real-time public data, enriched.",
    "facts": [
      "not reviewed",
      "not ranked",
      "facts only"
    ],
    "h1": "NicheDB",
    "image": "https://www.anchorterminal.com/assets/og/indexed.png",
    "path": "/tools/nichedb",
    "published": "",
    "section": "indexed",
    "title": "NicheDB: MCP server, indexed from the official MCP registry",
    "toc": null,
    "updated": "2026-10-05",
    "url": "https://www.anchorterminal.com/tools/nichedb"
  },
  "tokens": {
    "markdown": 1800,
    "slim": 1730
  },
  "version": 1
}
