# Niche: Your niche, followed for you

> Read niche briefings, research news, and explore sourced story angles with your assistant.

- name: com.nicheangle/niche
- version: 2.0.0
- connection class: R0 (autonomous)
- trust: 96/100
- quality: 69/100 (needs work)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/com.nicheangle%2Fniche
- tools: https://api.protogrid.dev/v1/servers/com.nicheangle%2Fniche/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "niche": {
      "type": "http",
      "url": "https://api.nicheangle.com/mcp"
    }
  }
}
```


## Trust

- hygiene: 100
- liveness: 100
- freshness: 100
- provenance: 85
- drivers: +repository +dns-namespace +website +reachable +uptime-100% +updated-4d-ago
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 69/100 (needs work)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-03-26; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 86 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 8 of 8 tools declare readOnlyHint or destructiveHint
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: niche_intelligence_query (idempotentHint); niche_list_sessions (idempotentHint); niche_whoami (idempotentHint); …
- pass `tools.token_cost`: about 2,164 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 25 (weight 15)

- warn `stability.changes`: 35 tool changes in 30 days
- fail `stability.rug_pull`: 9 tools kept their name but changed most of their description in 30 days; review before trusting them

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 8, about 2,164 tokens to load them all
- tool set hash: 3c0760050f98e8e1f4b1d3cbb9ed5fcd
- tools last changed: 2026-10-17T02:10:47.397Z
- badge: [![protogrid quality](https://protogrid.dev/badge/com.nicheangle/niche.svg)](https://protogrid.dev/servers/com.nicheangle/niche)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-10-17 `niche_feed_read` changed (title, description, annotations) **meaning changed**
  - before: Read a niche's daily edition: the stories independent sources back up, each with its independent-source count (after syndicated copies are merged), the outlets and URLs, a one-line why-it-matters, new-vs-continuing status, plus what moved, where the sources disagree and what to watch. Editions are built once a day per niche and shared, so this read is instant and free. Pass a niche slug from the public directory (for example financial-advisors, defense-tech) and optionally a date (YYYY-MM-DD) for a past edition. A quiet day returns status=quiet with no stories. Returns 'no_edition' when the niche exists but hasn't been built yet, and 'unknown_niche' otherwise.
  - after: Read the latest or a dated briefing for a niche: stories, reporting dates, source links, why each story matters, and new or continuing status. Use a slug from https://nicheangle.com/n or a custom niche's URL, such as founders or ai-leaders. Assistant access requires Pro. This reads an existing briefing without starting a scan. A quiet briefing has status=quiet; no_edition means no briefing is available; unknown_niche means the slug was not found.
- 2026-10-17 `niche_whoami` changed (description, inputSchema)
  - before: Orient in one read-only call: your plan (Free or Pro), the tools this server serves, and the endpoint. Call it first if you are unsure what is available.
  - after: Orient in one read-only call: your plan (Free or Pro), the tools this server serves, and the endpoint. Assistant access requires Pro. Call it first if you are unsure what is available.
- 2026-10-17 `niche_session_cancel` changed (inputSchema)
- 2026-10-17 `niche_list_sessions` changed (inputSchema)
- 2026-10-17 `niche_angle_propose` changed (inputSchema)
- 2026-10-17 `niche_session_state` changed (description, inputSchema)
  - before: Read the current state of a scan: status, the ranked stories with their sources and independent-source counts, and any angles already proposed. Poll this after niche_signal_scan or niche_intelligence_query until the slate is ready.
  - after: Read the current state of a scan: status, the ranked stories with their sources and source information, and any angles already proposed. Poll this after niche_signal_scan or niche_intelligence_query until the slate is ready.
- 2026-10-17 `niche_intelligence_query` changed (description, inputSchema) **meaning changed**
  - before: Ask an analyst-shaped question over a fresh scan of a niche (Pro): 'the biggest developments this week', 'what is emerging', 'where money is moving'. Returns the sourced slate plus a short grounded synthesis as one answer. Every claim carries its sources.
  - after: Ask an analyst-shaped question over a fresh scan of a niche (Pro): 'the biggest developments this week', 'what is emerging', 'where money is moving'. Returns the sourced slate plus a short synthesis when requested. Returns a session_id; poll niche_session_state until cp1_awaiting_story. For synthesis, continue polling with wait_until=synthesis and wait=30 until it arrives or a shortfall is reported.
- 2026-10-17 `niche_signal_scan` changed (description, inputSchema)
  - before: Scan a niche you describe, right now (Pro). Returns a ranked, sourced slate of the stories people in that field are talking about, each with its independent-source count after syndicated copies are merged, the outlets, and why it matters. For a ready-made briefing use niche_feed_read instead; it is free and instant. Poll niche_session_state with the returned session_id until status is cp1_awaiting_story; the slate is in `stories`.
  - after: Scan a niche you describe, right now (Pro). Returns a ranked, sourced slate of the stories people in that field are talking about, with source links, the outlets, and why it matters. For a ready-made briefing use niche_feed_read instead. Assistant access requires Pro. Poll niche_session_state with the returned session_id until status is cp1_awaiting_story; the slate is in `stories`.
- 2026-10-11 `niche_feed_read` changed (description)
  - before: Read a niche's daily edition: the stories independent sources back up, each with its independent-source count (after syndicated copies are merged), the outlets and URLs, a one-line why-it-matters, new-vs-continuing status, plus what moved, where the discourse splits and what to watch. Editions are built once a day per niche and shared, so this read is instant and free. Pass a niche slug from the public directory (for example financial-advisors, defense-tech) and optionally a date (YYYY-MM-DD) for a past edition. A quiet day returns status=quiet with no stories. Returns 'no_edition' when the niche exists but hasn't been built yet, and 'unknown_niche' otherwise.
  - after: Read a niche's daily edition: the stories independent sources back up, each with its independent-source count (after syndicated copies are merged), the outlets and URLs, a one-line why-it-matters, new-vs-continuing status, plus what moved, where the sources disagree and what to watch. Editions are built once a day per niche and shared, so this read is instant and free. Pass a niche slug from the public directory (for example financial-advisors, defense-tech) and optionally a date (YYYY-MM-DD) for a past edition. A quiet day returns status=quiet with no stories. Returns 'no_edition' when the niche exists but hasn't been built yet, and 'unknown_niche' otherwise.
- 2026-10-10 `niche_attach_image` removed
  - Upload or attach a user-supplied or externally-designed image (bring-your-own asset) to a post: the creator's own visual (a product shot, their actual work, a card designed elsewhere) instead of an AI-generated image (niche_render_image_card photo, paid) or a flat brand card. Free, with no image-generation spend. For a visual-product maker the real piece is the sale. Input modes, in order of preference: (1) `upload_ref`, the FAST path for an agent that built the asset itself and can run a shell: POST the raw file to `/asset/upload` (multipart/form-data, your bearer token) to get back an `upload_ref`, then pass it here. The bytes travel over HTTP and never round-trip through the model as base64, so it's effectively instant for a real graphic. (2) `image_url`, a fetchable https URL (the server fetches + stores it; for an asset that already lives on the web). (3) `image: {mime_type, data_base64}`, inline base64, fine for small images only. (4) `image_chunk`, the no-shell FALLBACK: upload bounded chunks of base64. It still re-types the bytes through the model (slow), so use it only when the agent has no shell to curl with. Split the file's bytes into ~32-48KB pieces, base64 EACH independently, send in order, each with a `sha256` of that piece's raw bytes so the server catches a mis-transcribed chunk and has you resend just that one (this is what makes the slow path reliable). Omit upload_id on the first chunk; the response returns one to pass on the rest. Set `final:true` on the last chunk (optionally with `total_sha256`); that call assembles, validates, and attaches. The cell's output must already exist (use niche_add_output first if needed). Sets it as the post's image; publishes with the caption. A dimension_note warns if the image's aspect won't fit the cell. Undo-able (the prior image is kept in history).

Full history: https://api.protogrid.dev/v1/servers/com.nicheangle%2Fniche/changes

## Remotes

- https://api.nicheangle.com/mcp (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

_none_

## Tools (8)

- `niche_angle_propose`: Angles on one story (Pro): up to a few distinct stances a reader could take, each with a hook, the take, and the sources that support it. Pass the session_id from a scan and a story_id from its slate. Nothing is written for you; the angles are starting points.
- `niche_feed_read`: Read the latest or a dated briefing for a niche: stories, reporting dates, source links, why each story matters, and new or continuing status. Use a slug from https://nicheangle.com/n or a custom niche's URL, such as founders or ai-leaders. Assistant access requires Pro. This reads an existing briefing without starting a scan. A quiet briefing has status=quiet; no_edition means no briefing is available; unknown_niche means the slug was not found.
- `niche_intelligence_query`: Ask an analyst-shaped question over a fresh scan of a niche (Pro): 'the biggest developments this week', 'what is emerging', 'where money is moving'. Returns the sourced slate plus a short synthesis when requested. Returns a session_id; poll niche_session_state until cp1_awaiting_story. For synthesis, continue polling with wait_until=synthesis and wait=30 until it arrives or a shortfall is reported.
- `niche_list_sessions`: List your recent scans: id, the niche you described, status and timestamps. Use it to find a session_id you no longer have.
- `niche_session_cancel`: Cancel a scan that is still running.
- `niche_session_state`: Read the current state of a scan: status, the ranked stories with their sources and source information, and any angles already proposed. Poll this after niche_signal_scan or niche_intelligence_query until the slate is ready.
- `niche_signal_scan`: Scan a niche you describe, right now (Pro). Returns a ranked, sourced slate of the stories people in that field are talking about, with source links, the outlets, and why it matters. For a ready-made briefing use niche_feed_read instead. Assistant access requires Pro. Poll niche_session_state with the returned session_id until status is cp1_awaiting_story; the slate is in `stories`.
- `niche_whoami`: Orient in one read-only call: your plan (Free or Pro), the tools this server serves, and the endpoint. Assistant access requires Pro. Call it first if you are unsure what is available.
