Queber MCP

Run Queber automations through MCP

Connect MCP-capable clients to Queber, authorize scoped access, and let Queber Desktop execute supported automation jobs locally through your browser profiles

MCP clients

Connect an MCP client

MCP clients use Queber's OAuth metadata to discover authorization and token endpoints. You sign in, approve scopes, and keep Queber Desktop online.

How it works

The MCP client never talks directly to your local app.

1

Client sends a tool call

Your MCP client calls the Queber remote MCP endpoint with its access token.

2

Server checks auth and scopes

Queber validates the token, paid-plan access, and required MCP scopes.

3

Desktop executes locally

The server relays the command to your signed-in Queber Desktop app over its secure background connection.

4

Result returns to the client

The client receives structured status, profile, job, or automation output from the desktop app.

Available tools

What an authorized client can do.

Check Desktop status

See whether your desktop relay is connected and which capabilities are available.

Read browser profiles

List profiles, inspect one profile, open it manually, or close local sessions.

Inspect jobs

List jobs page by page, read one job with its result, logs, and progress, and edit, cancel, archive, delete, or retry jobs.

Run supported automation

Create Reddit posts and Reddit post checks that run now or on a schedule.

Access is controlled by OAuth tokens, requested scopes, paid-plan checks, and the live Queber Desktop connection. Revoke a client if you no longer trust it.

Example: Reddit post check

Track Reddit posts after publishing

A post check job opens each link in a background tab of a browser profile and returns what the post page shows: whether the post is live, removed, or gone, its score, upvote ratio, comments, and the views of your own posts. Two tools are enough: queber_job_run and queber_job_get.

Create a check

Call queber_job_run with automationType post_read, the links in platformData.reddit.post_read.links, and an idempotencyKey. Full post links, old.reddit, redd.it, profile posts, and share links all work; the tool returns the job with status pending.

Poll the job

Call queber_job_get with the job id every few seconds until status is completed or failed. Links are checked one after another with a human pause, so a longer list takes longer.

Read the results

resultData.reddit.post_read.items holds one item per link with status ok, removed, not_found, or failed, and summary counts them. A removed post keeps Reddit's removal message in removalMessage; a value Reddit did not show is null, and warnings says why.

Views of your own posts

Reddit shows views only to the post's author, so they come only for posts of the profile that checks, rounded the way Reddit shows them, like 5.2K. Each check of your own post adds one view on Reddit.

The job fails only when no link could be checked; a link that fails gets status failed and the check goes on. A run is charged when it checked at least one post, and your plan sets how many links one run may take.

tools/call queber_job_run
{
  "profileId": "3f1a2b4c-5d6e-4f70-8a91-b2c3d4e5f607",
  "platform": "reddit",
  "automationType": "post_read",
  "platformData": { "reddit": { "post_read": { "links": [
    "https://www.reddit.com/r/SideProject/comments/1abc234/queber_desktop_116_queue_view/",
    "https://old.reddit.com/r/webdev/comments/1abd345/how_do_you_schedule_reddit_posts/",
    "https://redd.it/1abe456"
  ] } } },
  "idempotencyKey": "post-read-2026-08-12-01"
}
→ { "id": "e2d4f6a8-1b3c-4d5e-8f70-9a1b2c3d4e5f", "automationType": "post_read", "status": "pending", … }

tools/call queber_job_get
{ "jobId": "e2d4f6a8-1b3c-4d5e-8f70-9a1b2c3d4e5f" }
→ { "status": "completed", "resultData": { "reddit": { "post_read": {
  "items": [
    { "url": "https://www.reddit.com/r/SideProject/comments/1abc234/", "status": "ok", "readAs": "author",
      "score": 13, "upvoteRatio": 0.93, "comments": 8, "views": 5200, "shares": 4, "reposts": 1,
      "topCountries": [{ "country": "US", "name": "United States", "percent": 41.2 }, …], "authorRank": 2,
      "warnings": [{ "field": "views", "code": "rounded", "message": "Reddit shows views rounded: 5.2K views" }], … },
    { "url": "https://www.reddit.com/r/webdev/comments/1abd345/", "status": "ok", "readAs": "other",
      "score": 1001, "upvoteRatio": 0.96, "comments": 5348, "views": null,
      "warnings": [{ "field": "views", "code": "author_only", "message": "Reddit shows views only to the post author" }], … },
    { "url": "https://www.reddit.com/comments/1abe456/", "status": "removed", "readAs": "author",
      "removalMessage": "Sorry, this post has been removed by the moderators of r/example.", … }
  ],
  "summary": { "total": 3, "read": 3, "removed": 1, "notFound": 0, "failed": 0 }
} } }, … }
Example: Reddit comment

Comment and reply on Reddit

A comment job leaves one comment under a post or as a reply to one of its comments, in a background tab of a browser profile. Three tools are enough: queber_reddit_comment_check, queber_job_run, and queber_job_get.

Check the post

Call queber_reddit_comment_check with profileId and link. It opens the post with that profile, free and outside the queue, and returns blocked (why commenting is not possible, or null), the media the comment box takes, and up to 300 comments in thread. It can take up to 3 minutes when the profile has to start.

Pick where to answer

Pass one comment id from thread as replyToCommentId, or leave it out to comment on the post. Every comment in thread carries its author, so a reply to a given user is a filter on author. A link to a comment in link works the same as its id.

Create the comment

Call queber_job_run with automationType comment, platformData.reddit.comment (link, body, and at most one media from queber_media_import), and an idempotencyKey; the tool returns the job with status pending.

Read the result

Poll the job until it completes. resultUrl is the new comment's page, and resultData.reddit.comment holds its id, the comment it answered, and alreadyPosted when an earlier run had left it and nothing was sent again. A failed job names the reason, such as rate_limited with the minutes Reddit asks to wait.

The check is free. A comment is charged when Reddit shows it; a failed run and a run that finds the same comment already there cost nothing. The same Idempotency-Key never creates a second job.

tools/call queber_reddit_comment_check
{
  "profileId": "3f1a2b4c-5d6e-4f70-8a91-b2c3d4e5f607",
  "link": "https://www.reddit.com/r/SideProject/comments/1abc234/queber_desktop_116_queue_view/"
}
→ { "ok": true, "check": {
  "post": { "postId": "1abc234", "community": "r/SideProject", "comments": 8, … },
  "blocked": null,
  "media": { "images": true, "animatedImages": true, "videos": false, "maxMedia": 1 },
  "thread": { "loaded": 8, "complete": true, "comments": [
    { "id": "ohd7k2m", "author": "quiet_reader", "body": "Does it keep the profile logged in?", … },
    …
  ] }
} }

tools/call queber_job_run
{
  "profileId": "3f1a2b4c-5d6e-4f70-8a91-b2c3d4e5f607",
  "platform": "reddit",
  "automationType": "comment",
  "platformData": { "reddit": { "comment": {
    "link": "https://www.reddit.com/r/SideProject/comments/1abc234/queber_desktop_116_queue_view/",
    "replyToCommentId": "ohd7k2m",
    "body": "Yes, every profile keeps its own session."
  } } },
  "idempotencyKey": "comment-2026-08-12-01"
}
→ { "id": "b7c9d1e3-5f7a-4b9c-8d1e-3f5a7b9c1d2e", "automationType": "comment", "status": "pending", … }

tools/call queber_job_get
{ "jobId": "b7c9d1e3-5f7a-4b9c-8d1e-3f5a7b9c1d2e" }
→ { "status": "completed", "resultUrl": "https://www.reddit.com/r/SideProject/comments/1abc234/comment/ohe2p4q/",
  "resultData": { "reddit": { "comment": {
    "commentId": "ohe2p4q", "parentId": "ohd7k2m",
    "repliedTo": { "commentId": "ohd7k2m", "author": "quiet_reader" }, …
  } } }, … }
Reliability

Retries and connection drops

MCP tools reach the same Queber Desktop app, so the same rules keep a retry from acting twice. queber_app_status shows relayState before a long batch.

Pass idempotencyKey

Tools that create or change something accept an idempotencyKey argument: 1-200 Latin letters, digits, dots, underscores, colons, or dashes. Calling the tool again with the same key returns the first result instead of acting twice. Use a new key for every job; a key with other characters is refused with validation_error.

Read retryAfterSeconds

A failed call returns isError with a JSON body: code, message, retryable when the code tells whether the same call can succeed later, and retryAfterSeconds when the wait is known. After desktop_reconnecting or reddit_rate_limited, wait that long and call the tool again with the same idempotencyKey.

tools/call queber_job_schedule
{
  "profileId": "3f1a2b4c-5d6e-4f70-8a91-b2c3d4e5f607",
  "scheduledAt": "2026-08-13T07:00:00.000Z",
  …,
  "idempotencyKey": "post-2026-08-13-r-webdev-01"
}

isError: true
{
  "code": "desktop_reconnecting",
  "message": "Queber Desktop lost its connection and is reconnecting. Retry the request shortly; you do not need to restart the app.",
  "retryable": true,
  "retryAfterSeconds": 12
}
Need help?

Questions about the MCP integration

If client connection, OAuth authorization, MCP calls or desktop execution does not work as expected, contact Queber support or write to us on Telegram.