# NewsJack

> Music-industry news scored for your brand, with a drafted post in your voice.

- name: io.github.chrisschouk/newsjack
- version: 0.2.1
- connection class: R0 (autonomous)
- trust: 97/100
- quality: 89/100 (new)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/io.github.chrisschouk%2Fnewsjack
- tools: https://api.protogrid.dev/v1/servers/io.github.chrisschouk%2Fnewsjack/tools

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

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "newsjack": {
      "type": "http",
      "url": "https://newsjack.cc/api/mcp"
    }
  }
}
```


## Trust

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

## Quality 89/100 (new)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2024-11-05; 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: 100 (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`: 21 of 21 tools declare readOnlyHint or destructiveHint
- pass `tools.directory_hints`: every tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
- pass `tools.token_cost`: about 4,201 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump
- pass `tools.hidden_text`: no hidden text in tool names, descriptions, schemas or annotations

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

- n/a `stability.changes`, `stability.rug_pull`, `stability.new_links`: tool history recorded for 5 of the 7 days needed

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

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

- tools: 21, about 4,201 tokens to load them all
- tool set hash: 9214210c9a88fa7acbba45cfbadedba9
- tools last changed: 2026-11-09T15:37:44.709Z
- badge: [![protogrid quality](https://protogrid.dev/badge/io.github.chrisschouk/newsjack.svg)](https://protogrid.dev/servers/io.github.chrisschouk/newsjack)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-11-09 `export_to_tap` changed (description, inputSchema, annotations) **meaning changed**
  - before: Write a Jack into a Total Audio Promo campaign and return TAP’s acknowledgement.
  - after: Send one Jack to a Total Audio Promo (TAP) campaign, creating a new draft campaign or writing into an existing one, and return TAP’s receipt. TAP is a separate product, so only call this when the person has asked for the Jack in TAP. Provide either content_id (a saved Post; its text, platform and title are used) or content (raw text). Without campaign_id it creates a draft TAP campaign named after title and stores the Jack as its goal. With campaign_id it overwrites that campaign’s existing goal field with the Jack, which cannot be undone from NewsJack. The write goes through the TAP API key configured on the NewsJack server (TAP_API_KEY), not a per-user TAP login, and fails if that key is missing or TAP refuses. Returns structuredContent { receipt: { campaignId, campaignUrl, created, acknowledgedAt } }. Not idempotent: repeating it without campaign_id creates another campaign. Needs the generate:posts scope; no NewsJack allowance is used.
- 2026-11-09 `cancel_scheduled` changed (description, inputSchema) **meaning changed**
  - before: Revert a scheduled post back to draft status and remove it from publishing queue.
  - after: Cancel a scheduled Post: move it from scheduled or ready back to draft and clear its scheduled time, so it leaves the publishing queue. The Post and its text are kept in the library; schedule it again with schedule_post. Idempotent: a Post that is already a draft is reported unchanged. A Post that is publishing, posted or failed cannot be cancelled and returns an error. Find the id with list_scheduled.
- 2026-11-09 `list_scheduled` changed (description, inputSchema) **meaning changed**
  - before: List posts queued for publication ordered by scheduled time.
  - after: List the signed-in account’s Posts from the library, filtered by lifecycle status and ordered by scheduled_for (soonest first, unscheduled last). By default it returns the scheduled queue. Pass status "all" to list every Post (drafts, waiting, posted and failed), which makes it the general Post listing tool. Statuses: draft (saved, no time set), scheduled (time set), ready (the time has passed and the Post is waiting for a person to publish it in the dashboard; nothing posts automatically), publishing, posted and failed. Returns a numbered summary with the first 8 characters of each id and the first 80 characters of text, plus structuredContent { count, posts } with the full Post rows (id, platform, content, status, scheduled_for, title, story_id, published_url). Use the full id with schedule_post, cancel_scheduled or export_to_tap. Read-only; needs the manage:schedule scope.
- 2026-11-09 `enable_global_source` changed (description) **meaning changed**
  - before: Re-enable a previously muted global news source in your feed.
  - after: Unmute a built-in publication previously muted with disable_global_source, so its Stories return to this account’s feed. Pass the same exact name; list_sources shows the muted ones. Custom RSS feeds are resumed with toggle_source instead. Idempotent: unmuting a publication that is not muted changes nothing.
- 2026-11-09 `disable_global_source` changed (description) **meaning changed**
  - before: Mute a default global news source so its stories do not appear in your feed.
  - after: Mute one of NewsJack’s built-in publications so its Stories stop appearing in this account’s feed. Identify it by its exact publication name. For a custom RSS feed the account added itself, use toggle_source with its source_id instead. Reversible with enable_global_source and idempotent.
- 2026-11-09 `toggle_source` changed (description, inputSchema) **meaning changed**
  - before: Activate or temporarily pause polling for a custom news source feed.
  - after: Pause or resume one of the account’s own custom RSS sources, identified by source_id from list_sources. It only works on feeds added with add_source. To mute or unmute one of NewsJack’s built-in publications, use disable_global_source and enable_global_source, which take the publication name instead. Reversible and idempotent: setting the same value twice changes nothing. Pausing keeps the source configured; remove_source deletes it.
- 2026-11-09 `generate_post_dry_run` changed (description) **meaning changed**
  - before: Create a Jack preview without saving a Post. The preview performs the normal paid model work and consumes one generation allowance.
  - after: Create a Jack preview without saving a Post. The preview performs the normal paid model work and consumes one generation allowance, exactly like generate_post. Nothing is written to the library, so there is no Post id: to schedule or export the text afterwards, pass it as content to schedule_post or export_to_tap. Prefer generate_post when the Jack will probably be kept.
- 2026-11-09 `generate_post` changed (description) **meaning changed**
  - before: Create a Jack from an owned Story using the saved voice and output controls, then save it as a draft Post in the library.
  - after: Create a Jack from an owned Story using the saved voice and output controls, then save it as a draft Post in the library. Returns the Jack text and the new Post id, which schedule_post and export_to_tap accept as content_id. Uses one generation from the daily allowance. Use generate_post_dry_run instead only when you want the text without a library entry; it costs the same allowance.
- 2026-11-09 `list_stories` changed (description, inputSchema) **meaning changed**
  - before: Search the authenticated account’s music-industry Stories by relevance, recency, and industry.
  - after: List the signed-in account’s scored news Stories, filtered by minimum relevance and industry and sorted by relevance or recency. Returns a readable summary per Story (ID, title, source, URL, relevance as a percentage, summary) and structuredContent { count, stories } where each Story has id, title, summary, source_name, url, relevance_score (0 to 1), detected_at, urgency, status and metadata. Use it to find what is worth writing about today, then pass a Story id to get_story for the full record or to generate_post to write a Jack from it. Only Stories NewsJack has already scanned into this account are returned; it does not fetch feeds or search the web. Read-only, no allowance used. Needs the read:stories scope; anonymous callers get an authentication error. An empty result means nothing matched, so lower min_relevance or drop category.

Full history: https://api.protogrid.dev/v1/servers/io.github.chrisschouk%2Fnewsjack/changes

## Remotes

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

## Packages

_none_

## Tools (21)

- `add_source`: Add a new RSS or Atom feed URL to automated news monitoring. Feeds are polled every 5 minutes.
- `cancel_scheduled`: Cancel a scheduled Post: move it from scheduled or ready back to draft and clear its scheduled time, so it leaves the publishing queue. The Post and its text are kept in the library; schedule it again with schedule_post. Idempotent: a Post that is already a draft is reported unchanged. A Post that is publishing, posted or failed cannot be cancelled and returns an error. Find the id with list_scheduled.
- `disable_global_source`: Mute one of NewsJack’s built-in publications so its Stories stop appearing in this account’s feed. Identify it by its exact publication name. For a custom RSS feed the account added itself, use toggle_source with its source_id instead. Reversible with enable_global_source and idempotent.
- `enable_global_source`: Unmute a built-in publication previously muted with disable_global_source, so its Stories return to this account’s feed. Pass the same exact name; list_sources shows the muted ones. Custom RSS feeds are resumed with toggle_source instead. Idempotent: unmuting a publication that is not muted changes nothing.
- `export_to_tap`: Send one Jack to a Total Audio Promo (TAP) campaign, creating a new draft campaign or writing into an existing one, and return TAP’s receipt. TAP is a separate product, so only call this when the person has asked for the Jack in TAP. Provide either content_id (a saved Post; its text, platform and title are used) or content (raw text). Without campaign_id it creates a draft TAP campaign named after title and stores the Jack as its goal. With campaign_id it overwrites that campaign’s existing goal field with the Jack, which cannot be undone from NewsJack. The write goes through the TAP API key configured on the NewsJack server (TAP_API_KEY), not a per-user TAP login, and fails if that key is missing or TAP refuses. Returns structuredContent { receipt: { campaignId, campaignUrl, created, acknowledgedAt } }. Not idempotent: repeating it without campaign_id creates another campaign. Needs the generate:posts scope; no NewsJack allowance is used.
- `generate_post`: Create a Jack from an owned Story using the saved voice and output controls, then save it as a draft Post in the library. Returns the Jack text and the new Post id, which schedule_post and export_to_tap accept as content_id. Uses one generation from the daily allowance. Use generate_post_dry_run instead only when you want the text without a library entry; it costs the same allowance.
- `generate_post_dry_run`: Create a Jack preview without saving a Post. The preview performs the normal paid model work and consumes one generation allowance, exactly like generate_post. Nothing is written to the library, so there is no Post id: to schedule or export the text afterwards, pass it as content to schedule_post or export_to_tap. Prefer generate_post when the Jack will probably be kept.
- `get_generation_config`: Retrieve the sampling, length, and additional writing rules applied when NewsJack creates a Jack.
- `get_service_health`: Report the most recent observed health of the NewsJack model chain, including an unknown state when no recent probe exists.
- `get_story`: Retrieve complete details, full summary, publication metadata, and source URL for a specific story by ID. Use list_stories first to obtain valid story IDs.
- `get_usage_metrics`: Retrieve today’s observed Jack and roast usage with the authenticated account’s tier limits.
- `get_voice_profile`: Retrieve the authenticated user brand voice profile including tone guidelines, sample posts, forbidden words, and style formatting toggles. Returns null if default house voice is active.
- `list_scheduled`: List the signed-in account’s Posts from the library, filtered by lifecycle status and ordered by scheduled_for (soonest first, unscheduled last). By default it returns the scheduled queue. Pass status "all" to list every Post (drafts, waiting, posted and failed), which makes it the general Post listing tool. Statuses: draft (saved, no time set), scheduled (time set), ready (the time has passed and the Post is waiting for a person to publish it in the dashboard; nothing posts automatically), publishing, posted and failed. Returns a numbered summary with the first 8 characters of each id and the first 80 characters of text, plus structuredContent { count, posts } with the full Post rows (id, platform, content, status, scheduled_for, title, story_id, published_url). Use the full id with schedule_post, cancel_scheduled or export_to_tap. Read-only; needs the manage:schedule scope.
- `list_sources`: List all news sources monitored for your account, including custom RSS feeds and disabled global source overrides.
- `list_stories`: List the signed-in account’s scored news Stories, filtered by minimum relevance and industry and sorted by relevance or recency. Returns a readable summary per Story (ID, title, source, URL, relevance as a percentage, summary) and structuredContent { count, stories } where each Story has id, title, summary, source_name, url, relevance_score (0 to 1), detected_at, urgency, status and metadata. Use it to find what is worth writing about today, then pass a Story id to get_story for the full record or to generate_post to write a Jack from it. Only Stories NewsJack has already scanned into this account are returned; it does not fetch feeds or search the web. Read-only, no allowance used. Needs the read:stories scope; anonymous callers get an authentication error. An empty result means nothing matched, so lower min_relevance or drop category.
- `remove_source`: Delete a custom news feed by its ID. Use list_sources to find source IDs.
- `roast_post`: Evaluate a draft social post against the live music industry news cycle. Returns critical editorial feedback, quality score (0-100), timeliness verdict, and an improved rewrite. Does NOT publish or modify content.
- `schedule_post`: Schedule a draft post for publishing at a designated future time. Supply content directly or reference existing content_id.
- `set_generation_config`: Update the sampling, length, and additional writing rules used for future Jacks.
- `set_voice_profile`: Save custom brand voice settings (tone, sample posts, avoid words, emoji/hashtag rules) for the authenticated user. Applied to future Jacks.
- `toggle_source`: Pause or resume one of the account’s own custom RSS sources, identified by source_id from list_sources. It only works on feeds added with add_source. To mute or unmute one of NewsJack’s built-in publications, use disable_global_source and enable_global_source, which take the publication name instead. Reversible and idempotent: setting the same value twice changes nothing. Pausing keeps the source configured; remove_source deletes it.
