{"name":"ai.betterpost/server","slug":"betterpost-server","title":"BetterPost","description":"Finds timely sources across news, social, and the web and writes posts worth publishing.","url":"https://mcp.market/server/betterpost-server","rating":null,"grade":"B","score":80,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":18,"stars":0,"forks":0,"downloads_week":null,"last_push_at":"2026-08-12T03:27:03.000Z","license":"MIT"},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-04T11:25:35.135Z","last_ok_at":"2026-11-04T11:25:35.135Z","latency_ms":172},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/betterpost/betterpost-plugin","website":"https://betterpost.ai","version":"2.0.0","remotes":[{"type":"streamable-http","url":"https://betterpost.ai/mcp"}],"packages":[],"tools":[{"name":"betterpost_add_source","description":"Adds a source to a project and fetches it immediately (bounded by a few seconds), returning `storiesAdded` so the next generate_content can use it; if it is still fetching it returns `fetched:false` with a note. Doubles as manual source import: paste any URL (RSS/Atom feed, article, or a page, profile, or post on a supported platform) and leave `type` as autodetect, or create a recurring keyword search by setting `value` to the search terms and `type` to a search kind (see `type`).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"value":{"type":"string"},"name":{"type":"string"},"type":{"default":"autodetect","description":"Source kind (one of the enum values; defaults to 'autodetect'). 'autodetect' infers the kind from `value` (a URL): RSS/Atom feeds, web pages, news, Reddit subreddits, X and Bluesky posts/users, LinkedIn company pages, Instagram profiles, YouTube videos, and Hacker News items — leave it as 'autodetect' for any URL. For a recurring keyword search that re-runs over time, set `value` to the search terms and pick a search kind: 'web-search', 'reddit-search', 'youtube-search', 'x' (X/Twitter search), or 'bluesky' (Bluesky search).","type":"string","enum":["autodetect","web-search","reddit-search","youtube-search","x","bluesky"]}},"required":["projectId","value"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_add_story","description":"Manually imports a story you read about from its URL (pinned relevance, flagged is_manual) so generation can draw on it.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"url":{"type":"string","format":"uri"},"title":{"type":"string"},"summary":{"type":"string"}},"required":["projectId","url"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_create_project","description":"Create a content project. Slow, one-shot: infers config (criteria, industry, tone), discovers sources, and gathers/ranks an initial set of timely stories. Best called after the inferred audience, description, and tone have been confirmed with the user, since the config shapes everything downstream.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"title":{"type":"string","minLength":1},"audience":{"type":"string","minLength":1},"description":{"type":"string"},"tone":{"type":"string"}},"required":["title","audience"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_delete_content","description":"Delete a piece of content and its hosted images.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"contentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["contentId"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_delete_project","description":"Permanently deletes a project and everything in it — its sources, stories, and content. Cannot be undone.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["projectId"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_derive_content","description":"Transform an existing piece into another format (e.g. newsletter → tweet). No fetching; reuses the source stories and topic.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fromContentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["blog","newsletter","linkedin","x","bluesky"]},"tieIn":{"type":"string"}},"required":["fromContentId","type"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_expand_coverage","description":"Broadens a project's coverage: expands the relevance criteria (when needed), finds more sources across news, the web, and the relevant social platforms, and fetches them inline. Applies on a `topic_unavailable`, `no_stories`, or low-coverage signal. May return `warming: true` with `retryAfterMs` (~60s), meaning the newly gathered stories are still landing. An out-of-scope `focus` requires `confirmedByUser: true`; without it, it returns a `confirmation_required` error. No credits are charged.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"focus":{"description":"The topic to get more on (e.g. \"League of Legends\"). Omit to broaden the whole project.","type":"string"},"addAsCriteria":{"description":"Also append an in-scope `focus` as a standing relevance criterion (out-of-scope, confirmed foci are added automatically).","type":"boolean"},"confirmedByUser":{"description":"Set true once the user has agreed to widen the project to an out-of-scope `focus`.","type":"boolean"}},"required":["projectId"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_generate_content","description":"Generate a new piece of content for a project from its timely, relevant stories. Fast in steady state. Charges credits on success only. If you pass a `topic` the project has no stories about, this returns a `topic_unavailable` error (no charge) carrying an `inScope` flag and next steps — it never silently writes an off-topic piece.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["blog","newsletter","linkedin","x","bluesky"],"description":"Output format. 'x' and 'bluesky' are generated as a single post or, more often, a short numbered thread of connected posts (multiple tweets) when there is enough to say — this is the default for those channels. 'blog', 'newsletter', and 'linkedin' are one piece."},"topic":{"description":"Steer the piece to a specific topic. Generation only writes from stories actually about it. If none exist yet, it returns topic_unavailable (no charge) with an inScope flag: inScope:true means the topic fits the project and betterpost_expand_coverage can gather it, while inScope:false means it is outside the project scope so expanding to it requires the user's confirmation.","type":"string"},"reuse":{"description":"Reuse the most recent topic.","type":"boolean"},"tieIn":{"description":"A product/service to weave in.","type":"string"},"wordLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["projectId","type"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_get_content","description":"Fetch one piece of content in full.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"contentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["contentId"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_get_project","description":"Returns one project with its relevance `criteria` (each with an id, so a criterion can be targeted for removal via betterpost_update_project).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["projectId"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_get_settings","description":"Returns a project's per-content-type settings (wordLimit and additionalInstructions for each channel).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["projectId"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_get_usage","description":"Your credit balance, freeze state, and recent spend.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_hide_story","description":"Hides a story so generation ignores it. Reversible with unhide_story.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"storyId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["storyId"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_humanize","description":"Rewrite existing text into BetterPost's readable, human voice. Preserves the meaning, facts, links, and format; returns the rewritten text plus short notes on what changed. Pass `projectId` to write in that project's tone and instructions, `type` to apply a channel's style, or `tone` to set the voice directly.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":30000,"description":"The text to humanize (max 30,000 characters)."},"projectId":{"description":"Use this project's tone and writing instructions.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"description":"Apply this channel's style rules to the rewrite.","type":"string","enum":["blog","newsletter","linkedin","x","bluesky"]},"tone":{"description":"Tone override; wins over the project tone.","type":"string"}},"required":["text"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_list_content","description":"List a project's content (summaries + shareable `publicUrl` links).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["projectId"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_list_projects","description":"Returns your projects, each with its relevance `criteria` (with ids) that define what counts as on-topic.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_list_sources","description":"Returns one slimmed page of a project's sources plus project-wide `total` and `counts` (ok/failing/disabled/pending, and byType). Page with `limit` (default 50) and `offset`, following the returned `nextOffset` until it is null.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"limit":{"description":"Max sources to return (default 50).","type":"integer","exclusiveMinimum":0,"maximum":200},"offset":{"description":"Number of sources to skip; use the returned nextOffset to page.","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["projectId"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_list_stories","description":"Returns a project's gathered stories, each with `title`, `url`, `summary`, `relevancy`, `publicationDate`, and `isManual`/`isHidden` flags. Pass includeHidden to include hidden ones.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"includeHidden":{"type":"boolean"}},"required":["projectId"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_remove_source","description":"Removes a source from a project. Its already-gathered stories stay; the source is no longer fetched.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"sourceId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["sourceId"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_suggest_topics","description":"Clusters a project's current stories into a few candidate angles — each with a label, how many stories back it, and example headlines — and warms the project (gathers and ranks fresh stories) in the process. Returns topics you can offer the user before generate_content.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["blog","newsletter","linkedin","x","bluesky"]},"count":{"type":"integer","minimum":1,"maximum":5}},"required":["projectId"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_unhide_story","description":"Unhides a previously hidden story so generation can use it again.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"storyId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["storyId"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_update_project","description":"Updates a project's title, audience, description, tone, freshness window, timezone, or relevance criteria, and returns the updated project with its criteria. Changing title/audience/description re-derives the relevance criteria (replace-all), which broadens or narrows what counts as on-topic. To edit criteria incrementally instead, pass `patch.addCriteria` (texts to append) and/or `patch.removeCriteria` (criterion ids from get_project/list_projects). Dates default to US Eastern unless a `timezone` (an IANA name like \"America/New_York\") is set.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"patch":{"description":"Partial update: EVERY field is optional — include only the fields you want to change and omit the rest (an omitted field is left untouched; there are no required patch fields). Passing an empty object or omitting `patch` entirely is a no-op. Fields: title, audience, description, tone, maxStoryAgeDays, additionalInstructions, timezone, addCriteria, removeCriteria.","type":"object","properties":{"title":{"type":"string"},"audience":{"type":"string"},"description":{"type":"string"},"tone":{"type":"string"},"maxStoryAgeDays":{"description":"Freshness window in days (default 14, allowed 1–30; 7–14 is optimal). Generation only uses stories newer than this. Widen it toward 30 for slow or evergreen niches where timely stories are sparse and generate_content returns no_stories; narrow it for fast-moving topics.","type":"integer","minimum":1,"maximum":30},"additionalInstructions":{"anyOf":[{"type":"string"},{"type":"null"}]},"timezone":{"type":"string"},"addCriteria":{"description":"Relevance-criterion texts to APPEND (incremental, never replace-all).","type":"array","items":{"type":"string"}},"removeCriteria":{"description":"Criterion ids (from get_project/list_projects) to remove.","type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}}}},"required":["projectId"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"betterpost_update_settings","description":"Patches one content type's wordLimit and/or additionalInstructions (free-form writing guidance for that type; pass an empty string to clear it). Project-wide preferences (title/audience/tone, project-wide additionalInstructions) live on betterpost_update_project.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["blog","newsletter","linkedin","x","bluesky"]},"wordLimit":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"additionalInstructions":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["projectId","type"],"$schema":"http://json-schema.org/draft-07/schema#"}}],"scan":{"score":80,"grade":"B","scanned_at":"2026-09-26T05:15:48.797Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-26T05:15:48.758Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 845ms"]},"poisoning":{"score":15,"max":15,"notes":["23 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 6 write-action tools with no auth"]},"maintenance":{"score":12,"max":15,"notes":["last push 45 days ago"]},"identity":{"score":10,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year","website matches verified namespace"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://betterpost.ai/mcp","reachable":true,"authRequired":false,"latencyMs":845,"serverInfo":{"name":"betterpost","version":"0.1.0"}}],"packages":[],"repo":{"found":true,"owner":"betterpost","repo":"betterpost-plugin","archived":false,"pushedAt":"2026-08-12T03:27:03Z","stars":0,"forks":0,"openIssues":1,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/219135276?v=4","ownerCreatedAt":"2025-07-03T12:19:12Z","license":"MIT"},"icon":{"url":"https://betterpost.ai/favicon.svg","source":"site"},"presence":{"stars":0,"forks":0,"downloadsWeek":null,"license":"MIT","lastPushAt":"2026-08-12T03:27:03.000Z","score":18}}}},"grade_history":[],"reviews":[]}