{"name":"tech.viewprinter/viewprinter","slug":"viewprinter","title":"ViewPrinter","description":"Schedule social posts to TikTok, Instagram, Facebook, YouTube and X; manage accounts and media","url":"https://mcp.market/server/viewprinter","rating":null,"grade":"C","score":60,"certified":false,"status":"active","category":"media","tags":["media"],"presence":{"score":8,"stars":null,"forks":null,"downloads_week":null,"last_push_at":null,"license":null},"uptime":{"percent":100,"checks":6,"ok":6,"last_checked_at":"2026-09-21T00:50:32.285Z","last_ok_at":"2026-09-21T00:50:32.285Z","latency_ms":358},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":null,"website":"https://viewprinter.tech","version":"1.0.0","remotes":[{"type":"streamable-http","url":"https://viewprinter.tech/api/mcp"}],"packages":[],"tools":[{"name":"accounts_connect","description":"Connect a social account. Opens the platform in the person's browser so they can sign in and approve access — that part cannot happen here, because it needs their session and their consent. Call it again after they finish and it reports the connected account.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"platform":{"type":"string","enum":["tiktok","instagram","facebook","youtube","x"],"description":"Which platform to connect."}},"required":["platform"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"accounts_list","description":"List every social account you can post to, across all your workspaces. Each account includes the workspace it belongs to and any groups it is in. Use the returned ids to name post destinations explicitly, or a group name to name several at once.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"accounts_performance","description":"How each connected account is performing: followers, posts, total likes and following, each with how far it has moved over the period. Ordered by followers, largest first. Numbers are as of the last sweep rather than live — every account carries the time it was measured, and an account nobody has measured yet has no metrics at all rather than zeroes.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"period":{"description":"The window every change is measured over. Defaults to 24h. A change is the difference against the last observation before the window opened, so it is null when there was none.","type":"string","enum":["24h","7d"]}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"groups_create","description":"Name a set of accounts. Afterwards posts_schedule can take the name instead of every id. The name is how it is addressed, so it has to be unique in the workspace and is matched without regard to case. All the accounts must be in one workspace.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","description":"What to call it. Unique per workspace."},"description":{"description":"What it is for, so it can be chosen without reading it.","type":"string"},"account_ids":{"type":"array","items":{"type":"string"},"description":"The accounts to put in it, from accounts_list."}},"required":["name","account_ids"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"groups_delete","description":"Remove a group. The accounts in it are not touched and stay connected — only the name and its membership go. Posts already scheduled through it are unaffected, because a post records the accounts rather than the group.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","description":"The group to remove, from groups_list."}},"required":["name"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"groups_list","description":"Your named sets of accounts. Each group lists its members with the state of each, and how many of them need reconnecting — a post naming a group is refused outright if any member cannot publish, so check here before composing one. Use a group name with posts_schedule instead of listing account ids.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"groups_update","description":"Rename a group, re-describe it, or change who is in it. account_ids is the full membership afterwards, not a list to add: whatever is sent replaces what was there. Omit it to leave the members alone.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","description":"The group to change, from groups_list."},"new_name":{"description":"Rename it to this.","type":"string"},"description":{"type":"string"},"account_ids":{"description":"Replaces the membership entirely. Omit to leave it.","type":"array","items":{"type":"string"}}},"required":["name"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"media_confirm","description":"Record a file that finished uploading. Its size and type are read back from storage rather than taken on trust. Safe to call again if the first response was lost.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"The id media_upload returned."},"kind":{"type":"string","enum":["image","video","audio"]},"description":{"description":"What the file shows, if you already know. Kept as the file is recorded; use media_update to change it later. Confirming again never overwrites one already written.","type":"string"}},"required":["id","kind"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"media_delete","description":"Remove a file and its stored bytes. This cannot be undone, and any post still using it will lose it.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"media_list","description":"Every file uploaded in your workspaces, newest first. Use these ids when attaching media to a post.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"media_update","description":"Say what a file shows, in your own words. On a base image this is who is on camera — \"a woman in her early twenties, blonde hair in a loose bun\" — and a campaign reads it so the same person appears in every render instead of changing between them. Send null to clear it. Nothing else about a file can be changed here; what it is was read from the file itself.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The words, or null to remove the ones already there."}},"required":["id","description"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"media_upload","description":"Reserve an id and get a short-lived URL to PUT the file to. The bytes go straight to storage, not through this API. Call media_confirm with the same id once the PUT succeeds — nothing is recorded until then.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"kind":{"type":"string","enum":["image","video","audio"],"description":"What the file is."},"mime_type":{"type":"string","description":"The exact Content-Type the PUT will send, e.g. video/mp4."}},"required":["kind","mime_type"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"platforms_list","description":"What each platform accepts. Called with nothing, it lists every platform with the media kinds and counts it takes and its caption limit — enough to decide where a post can go. Name platforms to add their recommended sizes and durations, their options with what each one does, and the quirks that decide how a post is treated. Read this before scheduling rather than discovering the rules by being rejected.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"platforms":{"description":"Which platforms to describe in full. Omit for a short answer covering all of them. Naming only the platforms you are posting to keeps the reply small — full detail for all of them is several times the size.","type":"array","items":{"type":"string"}}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"posts_cancel","description":"Stop a post before it goes out. Destinations that have not started are cancelled; any already being published cannot be recalled and are returned in still_going. Safe to call again.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"post_id":{"type":"string","description":"From posts_list."}},"required":["post_id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"posts_list","description":"Posts in your workspaces, newest first, each with the state of every destination it was sent to. Call it to check whether something published, and before changing or cancelling anything — posts_update and posts_cancel both take a post_id from here.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"posts_performance","description":"How published posts are performing, one row per destination: views, likes, comments, shares and saves, each with how far it has moved over the period. Best first, so the default answers \"what did well\" in one call rather than by listing everything. Sort by change instead to find what is moving now. Numbers are as of the last sweep, and every row carries the time it was measured — a delivery nobody has measured yet has no metrics at all rather than zeroes, and sorts last.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"period":{"description":"The window a change is measured over. Defaults to 24h.","type":"string","enum":["24h","7d"]},"sort_by":{"description":"Which counter to rank by. Defaults to views.","type":"string","enum":["views","likes","comments","shares","saves"]},"by":{"description":"Rank by the running total, or by how much it moved over the period. Defaults to the total. A post with no observation in the window has no change and sorts last either way.","type":"string","enum":["value","change"]},"limit":{"description":"How many to return. Defaults to 10. Ask for more only when you need them — every row carries its post and account.","type":"integer","minimum":1,"maximum":50}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"posts_schedule","description":"Create a post and queue it for every account named. Pass draft true to hold it here instead, sending nothing until posts_update promotes it. Name accounts with ids from accounts_list, or name a group from groups_list and get all of its members — the two combine, and a group is expanded now, so adding an account to it later does not add it to this post. Accounts must all be in one workspace. Attach media by id from media_list; a post is either a video or a set of images, never both. Omit scheduled_at to send as soon as possible. Nothing publishes yet: this records the intent. Publishing has to be enabled on the account; where it is not, this saves nothing at all and says so. Do not tell anyone their post is saved or scheduled until this has returned successfully.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"content":{"description":"The caption.","type":"string"},"account_ids":{"description":"Which accounts to post to, from accounts_list. Optional when groups is given; naming neither is refused.","type":"array","items":{"type":"string"}},"groups":{"description":"Group names from groups_list, expanded to their members and combined with account_ids. Matched without regard to case.","type":"array","items":{"type":"string"}},"media_ids":{"description":"Files to attach, in order. Order is the slideshow order.","type":"array","items":{"type":"string"}},"scheduled_at":{"description":"ISO 8601. Omit to send as soon as possible.","type":"string"},"platform_options":{"description":"Per-platform settings, keyed by platform. Only the keys shown are accepted — an unknown key is refused rather than ignored. The names, types and accepted values are here; call platforms_list for what each one does, its default, and which kind of post it applies to.","type":"object","properties":{"tiktok":{"type":"object","properties":{"privacyLevel":{"type":"string","enum":["PUBLIC_TO_EVERYONE","MUTUAL_FOLLOW_FRIENDS","FOLLOWER_OF_CREATOR","SELF_ONLY"]},"disableComment":{"type":"boolean"},"disableDuet":{"type":"boolean"},"disableStitch":{"type":"boolean"},"videoCoverTimestampMs":{"type":"integer","minimum":0,"maximum":9007199254740991},"autoAddMusic":{"type":"boolean"},"photoCoverIndex":{"type":"integer","minimum":0,"maximum":9007199254740991},"title":{"type":"string","maxLength":90},"brandContentToggle":{"type":"boolean"},"brandOrganicToggle":{"type":"boolean"},"isAigc":{"type":"boolean"},"draft":{"type":"boolean"}},"additionalProperties":false},"instagram":{"type":"object","properties":{"story":{"type":"boolean"},"shareToFeed":{"type":"boolean"},"coverUrl":{"type":"string","format":"uri"},"thumbOffset":{"type":"integer","minimum":0,"maximum":9007199254740991},"isAiGenerated":{"type":"boolean"}},"additionalProperties":false},"facebook":{"type":"object","properties":{},"additionalProperties":false},"youtube":{"type":"object","properties":{"title":{"type":"string"},"privacy":{"type":"string","enum":["public","unlisted","private"]},"categoryId":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"containsSyntheticMedia":{"type":"boolean"},"madeForKids":{"type":"boolean"}},"additionalProperties":false},"x":{"type":"object","properties":{},"additionalProperties":false}}},"draft":{"description":"Hold the post here instead of sending it. Nothing is queued and nothing reaches any platform; use posts_update with draft false to send it. Unrelated to the per-platform draft option, which uploads to the platform for the creator to finish.","type":"boolean"},"idempotency_key":{"description":"Reuse on retry to avoid posting twice; returns the original post.","type":"string"}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"posts_update","description":"Change a post that has not gone out yet: its caption, its time, its destinations, or whether it is a draft. Editing is always allowed; sending a draft needs publishing enabled on the account, and where it is not the draft is left exactly as it was. This is what sends a draft — pass draft false, and it is queued using scheduled_at (or immediately if that is empty). Destinations can be named as account ids, group names from groups_list, or both — a group is expanded now, so it is a shorthand for its members rather than a live link to it. Changing the time re-aims delivery, so there is no separate publish step. This is also how a failed destination is sent again: set scheduled_at, and every destination that failed is queued again while the ones that already published are left alone — fix what made them fail first, usually by reconnecting the account. The caption and the destinations can only be changed while nothing has published yet; after that the time is still editable, and changing the words means a new post.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"post_id":{"type":"string","description":"The post to change, from posts_list."},"content":{"description":"Replaces the caption.","type":"string"},"scheduled_at":{"description":"ISO 8601. Replaces the time. A time in the past sends as soon as possible.","type":"string"},"account_ids":{"description":"Replaces the destination list entirely — send every account you want, not just the new ones. All must be in the post's workspace.","type":"array","items":{"type":"string"}},"groups":{"description":"Group names, expanded to their members and combined with account_ids. Together they replace the destination list, so naming only a group drops any account outside it.","type":"array","items":{"type":"string"}},"draft":{"description":"False promotes a draft and sends it. True returns a scheduled post to draft, cancelling its delivery.","type":"boolean"}},"required":["post_id"],"$schema":"https://json-schema.org/draft/2020-12/schema"}}],"scan":{"score":60,"grade":"C","scanned_at":"2026-09-20T20:11:05.948Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-20T20:11:05.866Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 738ms"]},"poisoning":{"score":15,"max":15,"notes":["18 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 10 write-action tools with no auth"]},"maintenance":{"score":3,"max":15,"notes":["no repository listed"]},"identity":{"score":4,"max":10,"notes":["verified namespace with website, no repo"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"},{"id":"maint.no-repo","severity":"low","component":"maintenance","title":"No source repository listed"}],"inputs":{"probes":[{"url":"https://viewprinter.tech/api/mcp","reachable":true,"authRequired":false,"latencyMs":738,"serverInfo":{"name":"viewprinter","version":"1.0.0"}}],"packages":[],"repo":{"found":false},"icon":{"url":"https://viewprinter.tech/icons/apple-touch-icon.png","source":"site","width":180,"height":180},"presence":{"stars":null,"forks":null,"downloadsWeek":null,"license":null,"lastPushAt":null,"score":8}}}},"grade_history":[],"reviews":[]}