Skip to main content
Glama
tokportal

tokportal-mcp

Official
by tokportal

tokportal

PyPI Python license

TokPortal — это управляемый API социальной инфраструктуры: настоящие аккаунты TikTok, Instagram и YouTube, созданные, прогретые и управляемые менеджерами аккаунтов в 16+ странах, предоставляемые через REST API и MCP-сервер. Без OAuth на аккаунт, без лимита 25 постов в день, без проверки приложения.

Документация https://developers.tokportal.com · API base https://app.tokportal.com/api/ext · OpenAPI https://developers.tokportal.com/openapi.json · MCP remote https://app.tokportal.com/api/ext/mcp · Получить API-ключ https://app.tokportal.com/developer/api-keys · llms.txt https://developers.tokportal.com/llms.txt


tokportal — это официальный Python SDK для API TokPortal (Python 3.9+, типизированный, только стандартная библиотека). Каждая публичная операция доступна как метод ресурса или через сгенерированную карту request_operation.

Установка

pip install tokportal

Related MCP server: tiktok-mcp

Быстрый старт за 30 секунд

import os
from tokportal import TokPortal

client = TokPortal(api_key=os.environ["TOKPORTAL_API_KEY"])

# 1. Create a bundle: a fresh managed TikTok account in the USA + 1 video slot.
#    Credits are debited now; the account manager is assigned at publish time.
bundle = client.bundles.create({
    "bundle_type": "account_and_videos",
    "platform": "tiktok",
    "country": "USA",
    "title": "US launch",
    "videos_quantity": 1,
})
bundle_id = bundle["data"]["id"]

# 2. Upload the video straight from disk -> public_url
upload = client.uploads.video_direct("./launch.mp4", bundle_id, content_type="video/mp4")

# 3. Configure the account profile and video slot 1, then publish
client.bundles.configure_account(bundle_id, {
    "username": "mybrand.us",
    "visible_name": "My Brand",
    "biography": "Official account",
})
client.bundles.configure_video(bundle_id, 1, {
    "video_type": "video",
    "video_url": upload["data"]["public_url"],
    "description": "Day 1 - launching in the US #launch",
    "target_publish_date": "2026-09-01",
})
client.bundles.publish(bundle_id)

# 4. Later (webhook `account.in_review` / `account.finalized`, or polling):
#    saved_account_id is the real delivered account -> read it back
current = client.bundles.get(bundle_id)["data"]
if current.get("saved_account_id"):
    account = client.accounts.get(current["saved_account_id"])["data"]
    print(account["username"], account["profile_url"])

Имена методов следуют сгенерированной карте ресурсов (bundles, uploads, accounts, analytics, webhooks). Если для операции нет вспомогательного метода, используйте client.request_operation("<operationId>", path=..., query=..., body=...).

Полный пример

import os
from tokportal import TokPortal, TokPortalApiError

client = TokPortal(api_key=os.environ["TOKPORTAL_API_KEY"])

me = client.me()

bundle = client.bundles.create({
    "bundle_type": "account_and_videos",
    "country": "USA",
    "videos_quantity": 5,
})

csv = client.analytics.export_videos(account=["saved-account-id"])
image = client.uploads.image_from_url({
    "url": "https://cdn.example.com/photo.jpg",
    "bundle_id": bundle["data"]["id"],
})

print(me["data"]["email"], bundle["data"], csv, image["data"])

Прямые multipart-загрузки используют те же структурированные ошибки и поддержку идемпотентности:

uploaded = client.uploads.video_direct(
    "./video.mp4",
    bundle["data"]["id"],
    content_type="video/mp4",
    idempotency_key="video-upload-123",
)

Управляйте покрытием TokPortal на основе последней атомарной котировки. Котировка с нулевым кредитом действительна и всё равно требует явного вызова реактивации:

coverage = client.accounts.coverage("saved-account-id")
quote = coverage["data"]["reactivation_quote"]

if quote:
    client.accounts.reactivate_coverage(
        "saved-account-id",
        {
            "expected_credits": quote["credits"],
            "expected_current_period_end": quote["current_period_end"],
            "expected_lock_version": quote["lock_version"],
        },
        idempotency_key="coverage-reactivate-saved-account-id-v4",
    )

client.accounts.pause_coverage(
    "saved-account-id",
    idempotency_key="coverage-pause-saved-account-id-v4",
)

Раскрытие учётных данных и доступ к коду верификации используют один и тот же необратимый двухшаговый поток с политиками. Первый вызов без принятия возвращает HTTP 428 и error.details.policy_version; затем покажите эти условия владельцу аккаунта и повторите с той же версией. Принятый запрос может списать кредиты и навсегда открепить аккаунт. Эти ответы, содержащие секреты, никогда не сохраняются для повторного воспроизведения, поэтому эти вспомогательные методы намеренно не принимают idempotency_key. После неопределённого результата передачи сначала приведите аккаунт в безопасное состояние, прежде чем решать, вызывать ли конечную точку снова без ключа:

Если принятый вызов возвращает HTTP 409 с CREDENTIAL_REVEAL_QUOTE_CHANGED, списания или раскрытия не произошло. Прочитайте текущую политику и expected_credit_cost из error.details, покажите владельцу новые условия, получите новое согласие и повторите с новой версией. Никогда не повторяйте 409 автоматически.

try:
    client.accounts.reveal_credentials("saved-account-id")
except TokPortalApiError as error:
    if error.status_code != 428:
        raise

    policy_version = str(error.details["policy_version"])
    credentials = client.accounts.reveal_credentials(
        "saved-account-id",
        acceptance={
            "acknowledge_support_forfeit": True,
            "policy_version": policy_version,
        },
    )

То же правило отсутствия повторного воспроизведения применяется к webhooks.create, uploads.image, uploads.video и analytics.create_report, так как они возвращают секрет подписи, подписанную возможность загрузки или токен доступа к отчёту. Эти вспомогательные методы не принимают idempotency_key, а request_operation локально отклоняет его для всех шести чувствительных идентификаторов операций.

Обнаруживайте webhooks и управляйте ими без перехода на низкоуровневый HTTP:

catalog = client.webhooks.events()
endpoints = client.webhooks.list(event="bundle.published")
retry = client.webhooks.retry_delivery(endpoints["data"][0]["id"], "delivery-id")

Каждая операция OpenAPI также доступна через сгенерированную карту операций:

same_retry = client.request_operation(
    "retryWebhookDelivery",
    path={"id": endpoints["data"][0]["id"], "delivery_id": "delivery-id"},
)

csv_again = client.request_operation(
    "exportAnalyticsVideos",
    query={"account": ["saved-account-id"]},
)

SDK отправляет заголовок X-TokPortal-Client: tokportal-python/0.1.0 в API-запросах для наблюдаемости и диагностики поддержки.

Проверяйте подписанные доставки webhook с точным исходным телом запроса:

from tokportal import verify_webhook_signature

valid = verify_webhook_signature(
    raw_body,
    request.headers["TokPortal-Signature"],
    os.environ["TOKPORTAL_WEBHOOK_SECRET"],
)
from tokportal import TokPortalApiError

try:
    client.bundles.create({
        "bundle_type": "account_and_videos",
        "country": "USA",
        "videos_quantity": 5,
    })
except TokPortalApiError as error:
    print(error.status_code, error.code, error.details, error.request_id)
    if error.retryable:
        wait_seconds = error.retry_after_seconds or 1
        # Retry with backoff.
        pass
    print(error.rate_limit)

API-ключи имеют формат sk_, за которым следуют 64 шестнадцатеричных символа в нижнем регистре. TokPortal хранит только SHA-256 хеш ключа и показывает исходный ключ один раз при создании.

Источник истины

Этот пакет генерируется из публичной OpenAPI-схемы TokPortal (https://developers.tokportal.com/openapi.json) в приватном монорепозитории TokPortal. Сгенерированные файлы (tokportal/_generated.py) перезаписываются при каждом релизе — не редактируйте их вручную. См. CONTRIBUTING.md о том, какие PR мы принимаем, и SECURITY.md для сообщений об уязвимостях.

Ссылки

MIT © TokPortal

Install Server
A
license - permissive license
B
quality
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    B
    quality
    -
    maintenance
    A comprehensive MCP server that enables AI assistants to search, download, and analyze TikTok content while also performing active tasks like publishing videos and interacting with posts. It provides full automation capabilities for TikTok through browser session management and anti-detection features.
    12
    2
  • F
    license
    B
    quality
    C
    maintenance
    MCP server for TikTok that enables searching videos, users, hashtags, and fetching trending content, user profiles, and video details via official API or public scraping.
    8
  • A
    license
    A
    quality
    B
    maintenance
    MCP server for TikTok that publishes videos to your own TikTok account and retrieves video performance metrics through TikTok's official Content Posting and Display APIs.
    6
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    MCP server for TikTok that lets AI agents connect accounts, post and schedule videos, follow users, manage profiles, and analyze performance—all via QR login with no API keys.
    16
    1
    MIT

View all related MCP servers

Related MCP Connectors

  • Managed LinkedIn MCP server for AI agents: search, connect, message and enrich on accounts you own.

  • MCP server for Wan AI video generation

  • MCP server for ByteDance Seedance AI video generation

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/tokportal/tokportal-python'

If you have feedback or need assistance with the MCP directory API, please join our Discord server