tokportal-mcp
Officialtokportal
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 tokportalRelated 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 для сообщений об уязвимостях.
Ссылки
Документация: https://developers.tokportal.com
Руководство по SDK и CLI: https://developers.tokportal.com/sdks-cli
MCP-сервер: https://developers.tokportal.com/mcp ·
tokportal-mcpСправочник API (OpenAPI): https://developers.tokportal.com/openapi.json
Другие пакеты:
@tokportal/node·@tokportal/cli·tokportal(PyPI) ·github.com/tokportal/tokportal-go
MIT © TokPortal
Maintenance
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
- AlicenseBquality-maintenanceA 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.122
- FlicenseBqualityCmaintenanceMCP 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
- AlicenseAqualityBmaintenanceMCP 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.6MIT
- AlicenseBqualityBmaintenanceMCP 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.161MIT
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
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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