O ChatGPT consegue publicar pelo Shager? Sim: conecte com login ou use um de outros três caminhos

Os conectores MCP do ChatGPT entram com OAuth, e o Shager aceita: adicione o Shager no modo desenvolvedor, entre e aprove. E ainda Codex, a API e um script.

Consegue. Os conectores MCP personalizados do ChatGPT se autenticam com OAuth, e o servidor MCP do Shager aceita login via OAuth. Adicione https://app.shager.ai/api/mcp como conector no modo desenvolvedor, entre no Shager e aprove, sem chave para copiar. Você também pode colocar os modelos da OpenAI para trabalhar no Shager pelo Codex, pela API da OpenAI ou usando o ChatGPT para escrever e um script curto para fazer a entrega.

Este artigo mostra como adicionar o conector e traz código funcionando para cada um dos outros caminhos.

Como adicionar o Shager como conector do ChatGPT?

O guia da OpenAI sobre autenticação para apps no ChatGPT descreve o modelo suportado: servidores que precisam de autenticação implementam um fluxo OAuth 2.1 de acordo com a especificação de autorização do MCP, com preferência por Client ID Metadata Documents e com suporte também a registro dinâmico de clientes. Os servidores também podem funcionar sem autenticação. O mesmo guia afirma que o ChatGPT não consegue enviar chaves de API personalizadas.

O servidor do Shager em https://app.shager.ai/api/mcp segue essa especificação, com Client ID Metadata Documents e também registro dinâmico de clientes. Para conectar:

  1. No ChatGPT, abra Settings, depois Apps & Connectors, ative o Developer mode e clique em Create.
  2. Dê o nome Shager, informe https://app.shager.ai/api/mcp e escolha OAuth.
  3. Clique em Connect. O Shager abre: entre, escolha a organização e aprove.

O modo desenvolvedor está disponível nos planos pagos do ChatGPT. A conexão pode ler e criar rascunhos. Agendar e publicar é uma caixa de seleção separada na tela de aprovação, desmarcada a menos que você a marque, e você pode desconectar a qualquer momento em https://app.shager.ai/dashboard/agents.

Por que não colocar um proxy sem autenticação na frente de uma chave de API?

Tem gente que sugere isso, e é uma péssima ideia, ainda mais agora que você não precisa disso. Um proxy que aceita requisições sem autenticação e injeta a sua chave do Shager transforma o acesso de publicação da sua agência num endpoint público. Qualquer pessoa que encontrar a URL pode criar rascunhos nos workspaces dos clientes e, com uma chave publish, agendá-los. Não faça isso.

Diagrama: um agente de IA (Claude, Codex ou Cursor) se conecta ao Shager pelo servidor MCP ou pela API REST, e o Shager distribui para Facebook, Instagram, YouTube, X, LinkedIn e TikTok.
O Shager cuida das conexões, das verificações, do escalonamento e da medição de cliques. Facebook e Instagram aguardam a aprovação da Meta; até lá, só contas de teste podem se conectar. No TikTok, os posts são publicados como privados ("só eu") até o TikTok aprovar o app.

Caminho 1: Codex, o agente de programação da OpenAI

Se o que você quer é "um modelo da OpenAI operando o Shager", o Codex já faz isso de forma limpa. Ele aceita bearer tokens vindos de uma variável de ambiente para servidores MCP com HTTP streamable, então a configuração são poucas linhas em ~/.codex/config.toml:

[mcp_servers.shager]
url = "https://app.shager.ai/api/mcp"
bearer_token_env_var = "SHAGER_API_KEY"

A documentação de MCP da OpenAI observa que o app desktop do ChatGPT, o Codex CLI e a extensão para IDE compartilham esse arquivo de configuração. O passo a passo completo, incluindo uma lista de ferramentas permitidas, está em como conectar o Shager ao Codex.

Caminho 2: a Responses API da OpenAI com uma ferramenta MCP remota

Se você está construindo seu próprio agente sobre a API da OpenAI, a Responses API consegue chamar servidores MCP remotos por conta própria. O guia de conectores e MCP documenta uma ferramenta mcp com server_url, um campo authorization para o token de acesso, allowed_tools e require_approval. A documentação também observa que a API não guarda o valor de authorization, então você o envia em toda requisição.

import os
from openai import OpenAI

client = OpenAI()

response = client.responses.create(
    model=os.environ["OPENAI_MODEL"],
    input=(
        "In the Shager workspace 'Cedar Clinics', list the channels, then create a "
        "DRAFT post to all active channels announcing Saturday walk-in hours. "
        "Use a different caption per channel that names the clinic's town. "
        "cta_url https://cedarclinics.example/walk-in, campaign 'walk-in-sat'. "
        "Do not pass schedule_at."
    ),
    tools=[{
        "type": "mcp",
        "server_label": "shager",
        "server_url": "https://app.shager.ai/api/mcp",
        "authorization": os.environ["SHAGER_API_KEY"],
        "allowed_tools": [
            "whoami", "list_workspaces", "list_channels",
            "list_groups", "create_post", "get_post",
        ],
        "require_approval": {
            "never": {"tool_names": ["whoami", "list_workspaces", "list_channels", "list_groups", "get_post"]}
        },
    }],
)

print(response.output_text)

Três observações de quem já rodou esse tipo de configuração.

Primeiro, teste a autenticação com whoami antes de qualquer outra coisa. A documentação da OpenAI apresenta authorization como um campo de token de acesso OAuth; a chave do Shager é um bearer token, então a primeira chamada já mostra se o cabeçalho chega do jeito que o Shager espera. Se vier um 401 na saída da ferramenta, use o Caminho 3.

Segundo, create_post ficou de fora da lista never de propósito, então a API devolve um pedido de aprovação antes de executá-lo. Seu código inspeciona os argumentos e responde com uma resposta de aprovação. É um ponto de controle barato, humano ou por regra, antes de o rascunho ser escrito.

Terceiro, não dê publish a essa chave. Assim, mesmo uma chamada aprovada só consegue criar rascunhos.

Caminho 3: o ChatGPT escreve, seu script entrega

Este é o padrão mais comum entre agências que vivem no ChatGPT. O modelo faz aquilo em que é bom, que é escrever quarenta variações de uma legenda. Um script de vinte linhas faz a entrega pela API REST do Shager em https://app.shager.ai/api/v1, descrita por completo no documento OpenAPI.

Peça ao ChatGPT uma saída estruturada que você possa colar num arquivo:

For each account below, write a caption for our Saturday walk-in hours post.
Vary the opening line and mention the town. Keep facts identical.
Return only JSON: [{"channel_id": "...", "caption": "..."}]
Accounts: <paste the id and name list from list_channels>

Depois, envie como rascunho:

import json, os, requests

API = "https://app.shager.ai/api/v1"
H = {"Authorization": f"Bearer {os.environ['SHAGER_API_KEY']}"}
WS = os.environ["SHAGER_WORKSPACE_ID"]

captions = json.load(open("captions.json"))

r = requests.post(f"{API}/workspaces/{WS}/posts", headers=H, json={
    "caption": captions[0]["caption"],
    "channel_ids": [c["channel_id"] for c in captions],
    "per_channel": captions,
    "cta_url": "https://cedarclinics.example/walk-in",
    "campaign": "walk-in-sat",
    "first_comment": "Hours and directions: https://cedarclinics.example/walk-in",
}, timeout=60)

body = r.json()
if not r.ok:
    raise SystemExit(f"{body['error']['code']}: {body['error']['message']}")
print("draft", body["data"]["id"], body["data"]["status"])

O array per_channel aceita objetos com channel_id e caption (além de first_comment e format, opcionais), então o JSON do ChatGPT entra direto. O cta_url ganha um link curto e uma UTM separados para cada conta, com utm_content indicando a conta, e é isso que permite atribuir os resultados depois.

Uma requisição curl que cria um post com a API REST do Shager: legenda, grupo de contas, link rastreável e horário de publicação.
As mesmas operações do servidor MCP, documentadas em OpenAPI.

Qual caminho combina com qual equipe?

Situação Caminho
Você quer hoje um agente com ferramentas num terminal ou numa IDE Codex com bearer_token_env_var
Você está construindo seu próprio produto ou agente sobre modelos da OpenAI Responses API com a ferramenta mcp, ou REST simples
Sua equipe escreve no ChatGPT e não vai sair de lá ChatGPT para as legendas, script para a entrega
Você quer o Shager dentro do próprio app do ChatGPT Um conector personalizado no modo desenvolvedor, com login via OAuth

O que o login oferece?

Você adiciona https://app.shager.ai/api/mcp como servidor MCP personalizado no ChatGPT e entra com a sua conta do Shager, do jeito que o guia da OpenAI para conectar a partir do ChatGPT descreve para servidores com autenticação. Cada pessoa se conecta com a própria conta, em vez de compartilhar uma chave. O registro de auditoria funciona do mesmo jeito, e as ferramentas também, que correspondem uma a uma às operações REST.

Perguntas frequentes

Existe algum jeito de usar uma chave de API nas configurações de conector do ChatGPT?

Não, segundo o guia de autenticação da OpenAI para apps no ChatGPT, que lista os modos com OAuth e sem autenticação e diz que o ChatGPT não consegue enviar chaves de API personalizadas. Você não precisa de uma: escolha OAuth e entre com a sua conta. Trate qualquer gambiarra que exponha sua chave atrás de um endpoint aberto como um problema de segurança, e não como solução.

O Shager funciona no ChatGPT no celular?

Depende de onde o ChatGPT permite servidores MCP personalizados, o que é uma decisão da OpenAI e já mudou durante a implantação. Consulte a documentação atual da OpenAI em vez de confiar no que ela fazia antes.

Preciso de um plano pago do Shager para testar algum desses caminhos?

Não. O acesso por API e MCP está incluído em todos os planos e, durante o período de lançamento, o Shager é gratuito, sem cartão; antes de começarmos a cobrar, vamos avisar com antecedência. A página de preços mostra os limites de contas de cada plano.

Próximo passo

Se você vai pelo caminho do código, o jeito mais rápido de se situar é o guia rápido da API REST, que vai de uma chave nova a um rascunho rastreável para várias contas em seis chamadas.

Experimente nas suas próprias contas.

Grátis durante o lançamento, sem cartão. Conecte, escreva uma vez, e o Shager publica e mede.