Tools Reference
OpenQuok MCP tools — list channels, schedule and manage posts, configure plugs, and read analytics from AI agent clients.
Connect your agent today
Draft from chat, review in your calendar, and publish only what you approve.
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: integrationList → schedulePostTool → postsList / postsStatus / postsReschedule → analyticsPost → plugsUpsert. 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:
| Field | Type | Required | Description |
|---|---|---|---|
| group | string | No | Channel 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:
| Field | Type | Description |
|---|---|---|
| platform | string | Provider identifier, e.g. threads, instagram |
| isPremium | boolean | Optional; 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:
| Field | Type | Description |
|---|---|---|
| integration | string | Connected channel UUID (alias for integrationId) |
| integrationId | string | Connected channel UUID from integrationList |
| methodName | string | Provider tool method name from integrationSchema |
| data | object | Optional payload passed to the provider method |
| dataSchema | array | Optional key-value pairs (key, value) — alternative to data |
Scheduling
schedulePostTool
Create or schedule posts across one or more connected channels.
Input:
| Field | Type | Description |
|---|---|---|
| type | draft | schedule | now | Draft, scheduled, or publish immediately |
| date | string | ISO-8601 time when type is schedule |
| socialPost | array | Per-channel payloads (see below) |
Each socialPost entry:
| Field | Type | Description |
|---|---|---|
| integration | string | Connected channel UUID (publishing channel) |
| postsAndComments | string[] | Main post body; additional strings are same-account reply chains only — not cross-account plugs |
| settings | object | Provider compose settings on the publisher (same keys as REST providerSettingsByIntegrationId) |
| attachments | string[] | Public image or video URLs — uploaded automatically before scheduling |
Output:
{
"output": [
{
"postId": "<post-id>",
"integration": "<integration-id>"
}
]
} Tip
On threads and x, the first postsAndComments string is the main thread; remaining strings map to same-account reply chains. Cross-account comments or reposts belong in settings — threads.crossAccountPlugs, x.crossAccountPlugs, or linkedin.crossAccountPlugs — with acting channel UUIDs from integrationList. See MCP examples — Threads and CLI examples — Threads.
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 bucket | Use for |
|---|---|
| threads.internalEngagementPlug | Same-account delayed engagement reply after publish |
| threads.crossAccountPlugs | Comments from other Threads channels in the workspace |
| x.crossAccountPlugs | Reposts from other X channels after publish |
| linkedin.crossAccountPlugs | Comments 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:
| Field | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | Public https:// URL to fetch and store |
Output:
{
"id": "<media-id>",
"path": "org/<media-id>.jpg"
} Tip
Alternatively, pass public URLs on schedulePostTool.attachments — OpenQuok uploads them automatically. Use uploadFromUrl when you need the id / path pair for provider settings that reference media by id.
Post management
postsList
List posts in a date window for the workspace.
Input:
| Field | Type | Required | Description |
|---|---|---|---|
| start | string | No | Start ISO timestamp; default is 30 local calendar days before today |
| end | string | No | End ISO timestamp; default is 30 local calendar days after today |
| integrationIds | string[] | No | Filter to specific connected channel ids |
| customerGroupId | string | No | Filter 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:
| Field | Type | Required | Description |
|---|---|---|---|
| integrationId | string | No | Connected 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:
| Field | Type | Required | Description |
|---|---|---|---|
| postId | string | Yes | Post row id from postsList or schedulePostTool |
| status | draft | schedule | scheduled | Yes | schedule 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:
| Field | Type | Required | Description |
|---|---|---|---|
| postId | string | Yes | Post row id from postsList or schedulePostTool |
| scheduledAt | string | Yes | New publish time (ISO-8601) |
| action | update | schedule | No | update (default) moves publishDate only and preserves each row’s state; schedule re-queues publishing and clears releaseId, releaseUrl, and errors |
| republish | boolean | No | Required 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"
}
]
}
} Tip
postsStatus flips draft ↔ scheduled without changing the stored publish time. Use postsReschedule when the slot itself should move.
postsReviewTodo
Set or update the review-todo note on a post row.
Input:
| Field | Type | Required | Description |
|---|---|---|---|
| postId | string | Yes | Post row id |
| note | string | null | No | Kanban review note; pass null to clear |
| isReviewed | boolean | No | Mark the review todo as complete |
| kanbanManualFinishAcknowledged | boolean | No | Acknowledge manual kanban finish for the post group |
Output:
{
"success": true,
"data": {
"posts": []
}
} postsDelete
Delete a post row by id.
Input:
| Field | Type | Required | Description |
|---|---|---|---|
| postId | string | Yes | Post 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:
| Field | Type | Required | Description |
|---|---|---|---|
| postId | string | Yes | Post 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:
| Field | Type | Required | Description |
|---|---|---|---|
| postId | string | Yes | Post row id |
| releaseId | string | Yes | Provider release id from postsMissing candidates |
Output:
{
"success": true,
"data": {}
} Analytics
analyticsPlatform
Platform-level metrics for a connected channel.
Input:
| Field | Type | Required | Description |
|---|---|---|---|
| integrationId | string | Yes | Connected channel id from integrationList |
| days | 7 | 30 | 90 | Yes | Lookback window in days |
Output:
{
"success": true,
"data": {}
} analyticsPost
Per-post metrics for a published post row. Returns empty data for drafts.
Input:
| Field | Type | Required | Description |
|---|---|---|---|
| postId | string | Yes | Published post row id |
| days | 7 | 30 | 90 | Yes | Lookback 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:
| Field | Type | Required | Description |
|---|---|---|---|
| integrationId | string | Yes | Connected channel id from integrationList |
Output:
{
"plugs": []
} plugsUpsert
Create or update a global plug rule on a connected channel.
Input:
| Field | Type | Required | Description |
|---|---|---|---|
| integrationId | string | Yes | Connected channel id |
| func | string | Yes | Plug function name from plugsCatalog (e.g. autoPlugPost) |
| fields | array | Yes | Field values as name and valueor pairs matching the catalog |
| plugId | string | No | Existing plug row id to update instead of creating a duplicate |
Output: saved plug row.
plugsActivate
Enable or disable a saved global plug rule.
Input:
| Field | Type | Required | Description |
|---|---|---|---|
| plugId | string | Yes | Plug row id from plugsList |
| activated | boolean | Yes | true to enable, false to disable |
Output: updated plug row.
plugsDelete
Delete a saved global plug rule.
Input:
| Field | Type | Required | Description |
|---|---|---|---|
| plugId | string | Yes | Plug row id from plugsList |
Output: deletion confirmation.