Skip to content

Tools Reference

OpenQuok MCP tools — list channels, schedule and manage posts, configure plugs, and read analytics from AI agent clients.

9 min read

Connect your agent today

Draft from chat, review in your calendar, and publish only what you approve.

Start for $0

Overview

All tools run in the context of the workspace tied to your opo_ token. They call the same backend services as /api/v1/public/* — lower latency, no HTTP loopback.

A typical agent workflow: integrationListschedulePostToolpostsList / postsStatus / postsRescheduleanalyticsPostplugsUpsert. Image and video generation MCP tools from other catalogs are not available yet.

Channel discovery

groupList

List channel groups (customers) for the authenticated workspace. Use a group’s id with integrationList when you only need channels in one group.

Input: none

Output:

{
  "groups": [
    {
      "id": "<customer-group-id>",
      "name": "Client A"
    }
  ]
}

integrationList

List connected social channels for the authenticated workspace.

Input:

FieldTypeRequiredDescription
groupstringNoChannel group id from groupList; when set, only channels in that group are returned

Output:

{
  "integrations": [
    {
      "id": "<integration-id>",
      "name": "My Threads account",
      "identifier": "threads",
      "platform": "threads",
      "picture": "https://example.com/profile.jpg",
      "disabled": false,
      "profile": "https://www.threads.net/@handle",
      "customer": { "id": "<customer-group-id>", "name": "Client A" }
    }
  ]
}

Use returned id values as integration, integrationId, or acting-channel UUIDs in schedulePostTool settings. platform mirrors identifier for compatibility with agents trained on other MCP catalogs.

integrationSchema

Return posting rules, character limits, compose settings schema, and allow-listed provider tools for a platform identifier (no connected channel required).

Input:

FieldTypeDescription
platformstringProvider identifier, e.g. threads, instagram
isPremiumbooleanOptional; when the provider tiers character limits by plan, pass whether the workspace is premium (defaults to false)

Output:

{
  "output": {
    "rules": "…",
    "maxLength": 500,
    "settings": { },
    "tools": []
  }
}

triggerTool

Invoke an allow-listed provider method on a connected channel (same behavior as POST /public/integration-trigger/:id).

Input:

FieldTypeDescription
integrationstringConnected channel UUID (alias for integrationId)
integrationIdstringConnected channel UUID from integrationList
methodNamestringProvider tool method name from integrationSchema
dataobjectOptional payload passed to the provider method
dataSchemaarrayOptional key-value pairs (key, value) — alternative to data

Scheduling

schedulePostTool

Create or schedule posts across one or more connected channels.

Input:

FieldTypeDescription
typedraft | schedule | nowDraft, scheduled, or publish immediately
datestringISO-8601 time when type is schedule
socialPostarrayPer-channel payloads (see below)

Each socialPost entry:

FieldTypeDescription
integrationstringConnected channel UUID (publishing channel)
postsAndCommentsstring[]Main post body; additional strings are same-account reply chains only — not cross-account plugs
settingsobjectProvider compose settings on the publisher (same keys as REST providerSettingsByIntegrationId)
attachmentsstring[]Public image or video URLs — uploaded automatically before scheduling

Output:

{
  "output": [
    {
      "postId": "<post-id>",
      "integration": "<integration-id>"
    }
  ]
}

Example input

{
  "type": "schedule",
  "date": "2026-06-26T14:00:00.000Z",
  "socialPost": [
    {
      "integration": "<integration-id>",
      "postsAndComments": ["Hello from MCP!"],
      "attachments": ["https://example.com/photo.jpg"]
    }
  ]
}

Provider settings on the publisher

Put per-channel compose options in settings on the publishing socialPost entry. Keys match REST providerSettingsByIntegrationId[integrationId] — for example threads.internalEngagementPlug for a same-account delayed engagement reply, or nested threads.crossAccountPlugs for comments from another connected Threads channel.

Setting bucketUse for
threads.internalEngagementPlugSame-account delayed engagement reply after publish
threads.crossAccountPlugsComments from other Threads channels in the workspace
x.crossAccountPlugsReposts from other X channels after publish
linkedin.crossAccountPlugsComments or reshares from other LinkedIn channels

Full field shapes: CLI examples — Threads, CLI examples — X, CLI examples — LinkedIn.

uploadFromUrl

Fetch a public HTTPS image or video URL into workspace media. Returns id and path for schedulePostTool media or compose settings.

Input:

FieldTypeRequiredDescription
urlstringYesPublic https:// URL to fetch and store

Output:

{
  "id": "<media-id>",
  "path": "org/<media-id>.jpg"
}

Post management

postsList

List posts in a date window for the workspace.

Input:

FieldTypeRequiredDescription
startstringNoStart ISO timestamp; default is 30 local calendar days before today
endstringNoEnd ISO timestamp; default is 30 local calendar days after today
integrationIdsstring[]NoFilter to specific connected channel ids
customerGroupIdstringNoFilter to a channel group id from groupList

Output:

{
  "success": true,
  "data": {
    "posts": []
  }
}

postsFindSlot

Suggest a free schedule slot for the workspace or a specific connected channel.

Input:

FieldTypeRequiredDescription
integrationIdstringNoConnected channel id; omit to consider all channels

Output:

{
  "success": true,
  "data": {
    "date": "2026-06-27T14:00:00.000Z"
  }
}

postsStatus

Flip a post row between draft and scheduled at the stored publish time.

Input:

FieldTypeRequiredDescription
postIdstringYesPost row id from postsList or schedulePostTool
statusdraft | schedule | scheduledYesschedule and scheduled both mean scheduled

Output:

{
  "success": true,
  "data": {
    "postGroup": "<post-group-id>",
    "posts": []
  }
}

postsReschedule

Move a post group to a new publish time. Pass any post row id from postsList — the whole group moves together.

Input:

FieldTypeRequiredDescription
postIdstringYesPost row id from postsList or schedulePostTool
scheduledAtstringYesNew publish time (ISO-8601)
actionupdate | scheduleNoupdate (default) moves publishDate only and preserves each row’s state; schedule re-queues publishing and clears releaseId, releaseUrl, and errors
republishbooleanNoRequired true when action is schedule and the group already has published rows

Output:

{
  "success": true,
  "data": {
    "postGroup": "9a0a1b2c-3d4e-4f5a-9b8c-aa11bb22cc33",
    "posts": [
      {
        "id": "5b3c1d2e-9a3f-4e6b-bb12-2c0a5f1a90a1",
        "state": "QUEUE",
        "publishDate": "2026-06-15T14:30:00.000Z",
        "postGroup": "9a0a1b2c-3d4e-4f5a-9b8c-aa11bb22cc33"
      }
    ]
  }
}

postsReviewTodo

Set or update the review-todo note on a post row.

Input:

FieldTypeRequiredDescription
postIdstringYesPost row id
notestring | nullNoKanban review note; pass null to clear
isReviewedbooleanNoMark the review todo as complete
kanbanManualFinishAcknowledgedbooleanNoAcknowledge manual kanban finish for the post group

Output:

{
  "success": true,
  "data": {
    "posts": []
  }
}

postsDelete

Delete a post row by id.

Input:

FieldTypeRequiredDescription
postIdstringYesPost row id to delete

Output:

{
  "success": true,
  "data": {}
}

postsMissing

List provider candidates when a published post is missing release_id (needed before per-post analytics).

Input:

FieldTypeRequiredDescription
postIdstringYesPost row id with release_id missing

Output:

{
  "success": true,
  "data": {
    "items": []
  }
}

postsConnect

Link a post row to a provider release_id for per-post analytics.

Input:

FieldTypeRequiredDescription
postIdstringYesPost row id
releaseIdstringYesProvider release id from postsMissing candidates

Output:

{
  "success": true,
  "data": {}
}

Analytics

analyticsPlatform

Platform-level metrics for a connected channel.

Input:

FieldTypeRequiredDescription
integrationIdstringYesConnected channel id from integrationList
days7 | 30 | 90YesLookback window in days

Output:

{
  "success": true,
  "data": {}
}

analyticsPost

Per-post metrics for a published post row. Returns empty data for drafts.

Input:

FieldTypeRequiredDescription
postIdstringYesPublished post row id
days7 | 30 | 90YesLookback window in days

Output:

{
  "success": true,
  "data": {}
}

Global plugs

Global plugs are channel-level rules that fire when a published post’s likes cross a threshold. Per-post plugs are set on schedulePostTool.settings instead — internal plugs for same-account engagement and cross-account plugs for comments or reposts from other connected channels. See Global plugs and MCP examples for Threads, X, and LinkedIn.

plugsCatalog

List global plug types and field names per provider. No input.

Output: catalog of plug definitions with identifier, methodName, and fields arrays.

plugsList

List saved global plug rules on a connected channel.

Input:

FieldTypeRequiredDescription
integrationIdstringYesConnected channel id from integrationList

Output:

{
  "plugs": []
}

plugsUpsert

Create or update a global plug rule on a connected channel.

Input:

FieldTypeRequiredDescription
integrationIdstringYesConnected channel id
funcstringYesPlug function name from plugsCatalog (e.g. autoPlugPost)
fieldsarrayYesField values as name and valueor pairs matching the catalog
plugIdstringNoExisting plug row id to update instead of creating a duplicate

Output: saved plug row.

plugsActivate

Enable or disable a saved global plug rule.

Input:

FieldTypeRequiredDescription
plugIdstringYesPlug row id from plugsList
activatedbooleanYestrue to enable, false to disable

Output: updated plug row.

plugsDelete

Delete a saved global plug rule.

Input:

FieldTypeRequiredDescription
plugIdstringYesPlug row id from plugsList

Output: deletion confirmation.

Search documentation
Find a docs page
Discord Support