tokportal-mcp
Public MCP server for the TokPortal API.
npm · fingerprint 8117400d53f30be8004e2f33 · repository · RSS
What changed
Changed 2026-10-18 10:51 UTC
1 description rewritten, 4 schema or annotation changes with the description left byte-identical, 9 tools added.
+ tool added: tokportal_create_account_comment_action
+ tool added: tokportal_create_account_private_reply
--- pinned/tokportal_create_bundle +++ observed/tokportal_create_bundle { "annotations": { "destructiveHint": true, - "wants_instagram_business": { - "default": false, - "description": "New Instagram accounts only. Adds 5 credits, requests a manager Business setup after creation, and acknowledges restricted commercial music access.", - "type": "boolean" - }, "wants_niche_warming": { "default": false, "deprecated": true,
--- pinned/tokportal_create_bundles_bulk +++ observed/tokportal_create_bundles_bulk { "annotations": { "destructiveHint": true, - "wants_instagram_business": { - "default": false, - "description": "Apply Business setup to every new Instagram account only, adding 5 credits each. Requires Instagram in platforms and acknowledges restricted commercial music access.", - "type": "boolean" - }, "wants_niche_warming": { "default": false, "deprecated": true,
--- pinned/tokportal_create_webhook_endpoint +++ observed/tokportal_create_webhook_endpoint { "annotations": { "destructiveHint": false, + "inbox.comment.action.updated", + "inbox.comment.moderation.updated", + "inbox.message.send.updated", + "inbox.comment.private_reply.updated", + "inbox.comment.automation.updated", "bundle.created", "bundle.published", "bundle.cancelled",
+ tool added: tokportal_get_account_comment_action
+ tool added: tokportal_get_account_comment_dm
+ tool added: tokportal_get_account_comment_moderation
--- pinned/tokportal_get_account_inbox +++ observed/tokportal_get_account_inbox { "annotations": { "destructiveHint": false, - "description": "Read account messages or comments. Read-only inbox for one owned account with active API connection and eligible TokPortal Coverage. Posts/comments work for eligible Instagram and TikTok connections; conversations/messages currently require an eligible Instagram Business setup. First list posts or conversations, then pass the returned opaque reference for comments or messages. To read comment replies, keep the post reference and pass the comment's reference as reply_reference. References and pagination cursors expire after one hour and are bound to the account, connection and resource. Refresh the parent list on inbox_reference_expired_or_invalid. Messages are newest first; reading never marks them as read. Comments may be cached upstream for 10 minutes. Replayed Instagram DM history is limited to the latest 500 conversations and 500 messages per conversation. This endpoint does not send, reply, moderate, create automations or charge credits. The separate /comments routes are paid human commenting tasks. Subscribe to inbox.comment.received and inbox.message.received for metadata notifications, then fetch this scoped endpoint. Public replies use POST /accounts/{id}/inbox/replies with reply_action_reference; this GET remains read-only.", + "description": "Read account messages or comments. Read-only inbox for one owned account with active API connection and eligible TokPortal Coverage. Posts/comments work for eligible Instagram and TikTok connections; conversations/messages require an eligible Instagram professional account (Creator or Business), granted messaging permissions and no current messaging restriction. First list posts or conversations, then pass the returned opaque reference for comments or messages. To read comment replies, keep the post reference and pass the comment's reference as reply_reference. References and pagination cursors expire after one hour and are bound to the account, connection and resource. Refresh the parent list on inbox_reference_expired_or_invalid. Messages are newest first; reading never marks them as read. Comments may be cached upstream for 10 minutes. Replayed Instagram DM history is limited to the latest 500 conversations and 500 messages per conversation. This endpoint does not send, reply, moderate, create automations or charge credits. The separate /comments routes are paid human commenting tasks. Subscribe to inbox.comment.received and inbox.message.received for metadata notifications, then fetch this scoped endpoint. Public replies use POST /accounts/{id}/inbox/replies with reply_action_reference; this GET remains read-only. Instagram DM writes and private replies use the separate messages/private-replies endpoints; messaging metadata reports the current reply window.", "inputSchema": { "additionalProperties": false, "properties": {
+ tool added: tokportal_get_account_message_operation
+ tool added: tokportal_send_account_inbox_message
+ tool added: tokportal_update_account_comment_dm
+ tool added: tokportal_update_account_comment_moderation
--- pinned/tokportal_update_webhook_endpoint +++ observed/tokportal_update_webhook_endpoint { "annotations": { "destructiveHint": false, + "inbox.comment.action.updated", + "inbox.comment.moderation.updated", + "inbox.message.send.updated", + "inbox.comment.private_reply.updated", + "inbox.comment.automation.updated", "bundle.created", "bundle.published", "bundle.cancelled",
Changed 2026-10-16 11:16 UTC
2 descriptions rewritten, 4 schema or annotation changes with the description left byte-identical, 6 tools added.
--- pinned/tokportal_cancel_account_managed_subscription +++ observed/tokportal_cancel_account_managed_subscription { "annotations": { "destructiveHint": true, - "description": "Pause TokPortal Coverage. Immediately blocks new and ongoing TokPortal work for the account. Payments are not refunded. If a paid or included current period remains, reactivation is free until its original end. Otherwise it costs exactly the unpaid 30-day periods at the rate returned by the Coverage status endpoint.", + "description": "Pause TokPortal Coverage. Stops renewal without refunding payments. Account actions and analytics remain available through the paid/included period if no overdue Coverage is unpaid. Afterwards they are blocked until Coverage is restored; after 30 days of unavailability the API connection is removed. Resuming renewal during the current paid period is free. Otherwise reactivation costs exactly the unpaid 30-day periods shown by the Coverage status endpoint.", "inputSchema": { "additionalProperties": false, "properties": {
+ tool added: tokportal_create_account_comment_reply
--- pinned/tokportal_create_bundle +++ observed/tokportal_create_bundle { "annotations": { "destructiveHint": true, + "wants_instagram_business": { + "default": false, + "description": "New Instagram accounts only. Adds 5 credits, requests a manager Business setup after creation, and acknowledges restricted commercial music access.", + "type": "boolean" + }, "wants_niche_warming": { "default": false, "deprecated": true,
--- pinned/tokportal_create_bundles_bulk +++ observed/tokportal_create_bundles_bulk { "annotations": { "destructiveHint": true, + "wants_instagram_business": { + "default": false, + "description": "Apply Business setup to every new Instagram account only, adding 5 credits each. Requires Instagram in platforms and acknowledges restricted commercial music access.", + "type": "boolean" + }, "wants_niche_warming": { "default": false, "deprecated": true,
--- pinned/tokportal_create_webhook_endpoint +++ observed/tokportal_create_webhook_endpoint { "annotations": { "destructiveHint": false, + "account.connection.connected", + "account.connection.disconnected", + "account.connection.removed", + "account.business_setup.requested", + "account.business_setup.updated", + "account.business_setup.completed", + "inbox.comment.received", + "inbox.message.received", + "inbox.comment.reply.updated", "bundle.created", "bundle.published", "bundle.cancelled",
+ tool added: tokportal_get_account_business_setup
+ tool added: tokportal_get_account_comment_reply
+ tool added: tokportal_get_account_connection
+ tool added: tokportal_get_account_inbox
--- pinned/tokportal_reactivate_account_managed_subscription +++ observed/tokportal_reactivate_account_managed_subscription { "annotations": { "destructiveHint": true, - "description": "Reactivate TokPortal Coverage. Reactivates TokPortal Coverage from an explicit GET snapshot, and debits the projected unpaid 30-day periods — read the quote from getAccountManagedSubscription and confirm the amount with the user first. Reactivation is free while the current billing period is already paid or included; Coverage benefits and tasks remain paused until reactivation. At and after current_period_end, the endpoint accepts the effective lapsed state even if recorded_status has not yet been updated by the renewal worker, and charges exactly the projected unpaid periods without adding an extra period. The expected credits, period end, and lock version are checked atomically before any debit or task resume. Scheduled videos receive new future dates while preserving their cadence.", + "description": "Reactivate TokPortal Coverage. Reactivates TokPortal Coverage from an explicit GET snapshot, and debits the projected unpaid 30-day periods — read the quote from getAccountManagedSubscription and confirm the amount with the user first. Reactivation is free while the current billing period is already paid or included. After cancellation, access continues through the current paid period if no overdue Coverage is unpaid. After it expires, account features stay unavailable until Coverage is restored. At and after current_period_end, the endpoint accepts the effective lapsed state even if recorded_status has not yet been updated by the renewal worker, and charges exactly the projected unpaid periods without adding an extra period. The expected credits, period end, and lock version are checked atomically before any debit or task resume. Scheduled videos receive new future dates while preserving their cadence.", "inputSchema": { "additionalProperties": false, "properties": {
+ tool added: tokportal_request_account_business_setup
--- pinned/tokportal_update_webhook_endpoint +++ observed/tokportal_update_webhook_endpoint { "annotations": { "destructiveHint": false, + "account.connection.connected", + "account.connection.disconnected", + "account.connection.removed", + "account.business_setup.requested", + "account.business_setup.updated", + "account.business_setup.completed", + "inbox.comment.received", + "inbox.message.received", + "inbox.comment.reply.updated", "bundle.created", "bundle.published", "bundle.cancelled",
Changed 2026-10-15 11:19 UTC
5 descriptions rewritten, 1 tool added.
--- pinned/tokportal_add_video_slots +++ observed/tokportal_add_video_slots { "annotations": { "destructiveHint": true, - "description": "Add video slots to a bundle. Buys additional video slots on an existing bundle and debits credits immediately (see `video_upload` in getCreditCosts). The slots are non-refundable and there is no cancellation path for this purchase — confirm the exact cost with the user before calling. Configure the new positions with configureBundleVideo, then publish them.", + "description": "Add video slots to a bundle. Buys additional video slots on an existing bundle and debits credits immediately (see `video_upload` in getCreditCosts). The slots are non-refundable and there is no cancellation path for this purchase; confirm the exact cost with the user before calling. Allowed bundle statuses: `pending_setup`, `published`, `published_priority`, `accepted`. An `account_only` or `completed` bundle cannot receive more slots; create a `videos_only` bundle for the saved account instead, subject to account eligibility. Configure the new positions with configureBundleVideo, then publish them.", "inputSchema": { "additionalProperties": false, "properties": {
--- pinned/tokportal_get_analytics_account +++ observed/tokportal_get_analytics_account { "annotations": { "destructiveHint": false, - "description": "Get account analytics drilldown. Analytics v2 drilldown for one account: current metrics, top posts and demographics. This is the current endpoint; getAccountAnalytics is the older compatibility shape of the same data. Call getAnalyticsContract before interpreting these numbers: top-line values are lifetime per-post totals, connected-account values are rolling windows, the two intentionally do not mirror each other, and your access tier may redact metrics — a missing field means unavailable, never zero.", + "description": "Get account analytics drilldown. Analytics v2 drilldown for one account: current metrics, top posts and demographics. Includes optional connected_analytics with account-period insights and post depth only while a Zernio connection has recent active identity proof; absent for disconnected accounts and Starter plans. getAnalyticsAccountInsights returns this block alone. This is the current endpoint; getAccountAnalytics is the older compatibility shape. Call getAnalyticsContract before interpreting numbers: top-line values are lifetime per-post totals, connected-account values are rolling windows, and your access tier may redact metrics. Missing fields mean unavailable, never zero.", "inputSchema": { "additionalProperties": false, "properties": {
+ tool added: tokportal_get_analytics_account_insights
--- pinned/tokportal_get_bundle +++ observed/tokportal_get_bundle { "annotations": { "destructiveHint": false, - "description": "Get a bundle. Full state of one bundle: status, account configuration, video slot counts, warming purchase, cancellation and remake history, and `next_action`. A remade bundle keeps the same id while its `saved_account_id` changes.", + "description": "Get a bundle. Full state of one bundle: status, account configuration, video slot counts, warming purchase, cancellation and remake history, and `next_action`. A remade bundle keeps the same id while its `saved_account_id` changes. Includes all video slots, including bundles with more than 1,000 slots. For unused capacity, count `videos` with status `pending`; `videos_configured_count` includes slots that have since been published or finalized. Counters have the same meaning as listBundles.", "inputSchema": { "additionalProperties": false, "properties": {
--- pinned/tokportal_list_bundle_videos +++ observed/tokportal_list_bundle_videos { "annotations": { "destructiveHint": false, - "description": "List bundle video slots. Lists every video slot of a bundle with its position, configuration, schedule and review status. Positions are 1-based and run up to the bundle's `videos_quantity`. Every video carries `platform_signals`, what the platform did with the live post once it exists: `not_recommended` (TikTok Not For Feed / Not Recommended — online but no distribution), `ai_label` (`creator` | `platform`), `sound` (`ok` | `non_commercial` | `removed` | `muted`) with `sound_reason`, and `checked_at`. All fields are null until the post has been checked (~48 h after posting, again at 7 days); `null` means unknown, never 'no'. The same events arrive as `video.not_recommended`, `video.ai_labeled` and `video.sound_restricted` webhooks.", + "description": "List bundle video slots. Lists every video slot of a bundle with its position, configuration, schedule and review status, including bundles with more than 1,000 slots. Unused slots have status `pending`; configured, scheduled and finalized slots are already allocated. Positions are 1-based and run up to the bundle's `videos_quantity`. Every video carries `platform_signals`, what the platform did with the live post once it exists: `not_recommended` (TikTok Not For Feed / Not Recommended — online but no distribution), `ai_label` (`creator` | `platform`), `sound` (`ok` | `non_commercial` | `removed` | `muted`) with `sound_reason`, and `checked_at`. All fields are null until the post has been checked (~48 h after posting, again at 7 days); `null` means unknown, never 'no'. The same events arrive as `video.not_recommended`, `video.ai_labeled` and `video.sound_restricted` webhooks.", "inputSchema": { "additionalProperties": false, "properties": {
--- pinned/tokportal_list_bundles +++ observed/tokportal_list_bundles { "annotations": { "destructiveHint": false, - "description": "List bundles. Lists your bundles with their lifecycle status and the computed `next_action` (`configure_account`, `configure_videos`, `publish_bundle`, or null). `next_action` is the recommended way to find what a bundle still needs.", + "description": "List bundles. Lists your bundles with their lifecycle status and the computed `next_action` (`configure_account`, `configure_videos`, `publish_bundle`, or null). `next_action` is the recommended way to find what a bundle still needs. Video counters cover all slots and are independent of page/per_page: `videos_quantity` is the recorded slot quantity, `videos_total` counts existing slots, and `videos_configured_count` includes configured, published, accepted, in_review, pending_corrections and finalized slots. Unused slots have status `pending`; with the current status set their count is `videos_total - videos_configured_count`. Configured or finalized slots are not unused capacity. A failed video read returns an error, never zero counters.", "inputSchema": { "additionalProperties": false, "properties": {
Changed 2026-10-05 14:19 UTC
3 descriptions rewritten, 3 schema or annotation changes with the description left byte-identical, 1 tool added.
--- pinned/tokportal_create_webhook_endpoint +++ observed/tokportal_create_webhook_endpoint { "annotations": { "destructiveHint": false, + "video.not_recommended", + "video.ai_labeled", + "video.sound_restricted", + "account.distribution_warning", "warming.session_started", "warming.term_verified", "warming.session_completed",
--- pinned/tokportal_get_bundle_video +++ observed/tokportal_get_bundle_video { "annotations": { "destructiveHint": false, - "description": "Get video slot configuration. Returns one video slot's configuration, schedule, review status and post link. Use it to check whether a slot is still inside its review window before finalizing it.", + "description": "Get video slot configuration. Returns one video slot's configuration, schedule, review status and post link, plus `platform_signals` (TikTok not-recommended flag, AI label, sound status — null until the live post has been checked). Use it to check whether a slot is still inside its review window before finalizing it, or whether the platform is distributing the post at all.", "inputSchema": { "additionalProperties": false, "properties": {
--- pinned/tokportal_get_video_analytics +++ observed/tokportal_get_video_analytics { "annotations": { "destructiveHint": false, - "description": "Get single video analytics. Lifetime metrics for one tracked post. Interpret them with getAnalyticsContract: these are lifetime per-post totals and deliberately do not match the rolling-window figures shown for a connected account.", + "description": "Get single video analytics. Lifetime metrics for one tracked post. Interpret them with getAnalyticsContract: these are lifetime per-post totals and deliberately do not match the rolling-window figures shown for a connected account. Also returns `platform_signals` (not recommended, AI label, sound) and `signal_insights` (followers gained, audience split, impression sources, retention curve — Creator tier and above).", "inputSchema": { "additionalProperties": false, "properties": {
+ tool added: tokportal_list_analytics_signals
--- pinned/tokportal_list_bundle_videos +++ observed/tokportal_list_bundle_videos { "annotations": { "destructiveHint": false, - "description": "List bundle video slots. Lists every video slot of a bundle with its position, configuration, schedule and review status. Positions are 1-based and run up to the bundle's `videos_quantity`.", + "description": "List bundle video slots. Lists every video slot of a bundle with its position, configuration, schedule and review status. Positions are 1-based and run up to the bundle's `videos_quantity`. Every video carries `platform_signals`, what the platform did with the live post once it exists: `not_recommended` (TikTok Not For Feed / Not Recommended — online but no distribution), `ai_label` (`creator` | `platform`), `sound` (`ok` | `non_commercial` | `removed` | `muted`) with `sound_reason`, and `checked_at`. All fields are null until the post has been checked (~48 h after posting, again at 7 days); `null` means unknown, never 'no'. The same events arrive as `video.not_recommended`, `video.ai_labeled` and `video.sound_restricted` webhooks.", "inputSchema": { "additionalProperties": false, "properties": {
--- pinned/tokportal_patch_bundle_video +++ observed/tokportal_patch_bundle_video { "annotations": { "destructiveHint": false, - "description": "End of an EXPLICIT publication window (ISO 8601 date-time). Must be strictly after target_publish_start_date, and must be sent together with it — never alongside target_publish_date, and never on the configuration or CSV endpoints, where the end is derived and this field is refused.", + "description": "Accepted for backward compatibility only. Must be strictly after target_publish_start_date and sent together with it — never alongside target_publish_date, and never on the configuration or CSV endpoints, where this field is refused. It does not choose the window: the end day is always the start day + 1 (2026-09-05), and the response returns the stored window.", "format": "date-time", "type": [ "string", - "description": "Start of an EXPLICIT publication window (ISO 8601 date-time). This is the only endpoint where the window's end is choosable — configuration and CSV import always derive it as start + 1 day. Send it together with target_publish_end_date and never alongside target_publish_date. Since 2026-08-26 it obeys the same minimum lead time as configuration (today+1 with a delivered or existing account, today+3 while the account is still being created, in UTC); an earlier value is rejected with INVALID_DATE carrying min_days_ahead and earliest_allowed.", + "description": "Start of the publication window as an ISO 8601 date-time; only its UTC calendar day is kept. The window is always the same 2-day window as everywhere else: that day at 00:00 UTC and the next day — the end is derived and can never be shortened or extended (any time-of-day or caller-supplied end is normalized away; the response returns the stored window). Prefer target_publish_date (YYYY-MM-DD); never send both. Since 2026-08-26 it obeys the same minimum lead time as configuration (today+1 with a delivered or existing account, today+3 while the account is still being created, in UTC); an earlier value is rejected with INVALID_DATE carrying min_days_ahead and earliest_allowed.", "format": "date-time", "type": [ "string",
--- pinned/tokportal_update_webhook_endpoint +++ observed/tokportal_update_webhook_endpoint { "annotations": { "destructiveHint": false, + "video.not_recommended", + "video.ai_labeled", + "video.sound_restricted", + "account.distribution_warning", "warming.session_started", "warming.term_verified", "warming.session_completed",
Current tools
Show all 108 tool fingerprints
Watch this server yourself
If you run this server, put the proxy in front of it. It pins these exact fingerprints on first connect and stops the session if they move.
npx -y mcp-pin@0.2.3 -- <your tokportal-mcp command>
Or subscribe to this page's RSS feed to be told when it changes.
Badge
The badge states one fact about time and nothing else. It never claims a server is safe.
[](https://mcp-pin.gautamkhosla.com/servers/19639003474802b3.html)