Meta Marketing API MCP Server
Interaja com dados de publicidade do Facebook e Instagram usando a Meta Marketing API.
Documentação
Meta Ads MCP Server
Um servidor MCP do Cloudflare Workers para configuração de contas do Meta Ads, gerenciamento de campanhas, conjuntos de anúncios, criativos, públicos, relatórios e fluxos de trabalho em lote.
Este repositório é construído sobre xmcp e expõe um endpoint MCP HTTP Streamable, além de rotas de OAuth da Meta voltadas para o navegador.
Código Aberto / Auto-hospedado
Este repositório é destinado a ser implantado na sua própria conta Cloudflare com as credenciais do seu próprio aplicativo Meta.
Ele não inclui:
- um plano de controle hospedado
- um aplicativo Meta compartilhado
- um painel de usuário final integrado
- um emissor de JWT para seus usuários e espaços de trabalho
Você fornece:
- sua implantação do Cloudflare Worker
- seu aplicativo de desenvolvedor Meta
- seu emissor de JWT ou provedor de autenticação
- sua própria interface ou backend que inicia o fluxo OAuth
O Que Ele Faz
- Executa como um Cloudflare Worker
- Usa chamadas diretas à Meta Graph API
fetchem vez do SDK da Meta - Armazena conexões de usuários Meta por espaço de trabalho no D1
- Armazena estado OAuth de curta duração no KV
- Criptografa tokens de acesso Meta armazenados
- Protege solicitações MCP com JWTs emitidos pelo seu aplicativo
Endpoints
GET /healthGET /appPOST /mcpGET /oauth/meta/startGET /oauth/meta/callback
Modelo de Autenticação
Este servidor é multi-tenant. Toda solicitação MCP deve incluir um JWT bearer emitido pelo seu aplicativo.
Se você está disponibilizando este projeto como código aberto, a implicação importante é que os consumidores devem integrá-lo ao seu próprio sistema de autenticação. O servidor não sabe como identificar um usuário ou espaço de trabalho sem esse JWT.
Claims JWT obrigatórios:
subouuserIdworkspaceId- opcional
roles
Exemplo de payload:
{
"sub": "user_123",
"workspaceId": "workspace_abc",
"roles": ["admin"]
}
Por que /oauth/meta/start não é um link público genérico:
- o servidor precisa saber a qual espaço de trabalho a conta Meta deve ser vinculada
- esse contexto de espaço de trabalho vem do JWT
- sem ele, o servidor não pode vincular com segurança o token Meta resultante
Superfície de Ferramentas
Famílias de ferramentas implementadas:
- Conta e configuração
- Gerenciamento de campanhas
- Gerenciamento de conjuntos de anúncios
- Criativos e anúncios
- Público e segmentação
- Relatórios e insights
- Auxiliares de lote
O servidor atualmente registra 39 ferramentas.
Estrutura do Projeto
src/toolsdefinições de ferramentas agrupadas por domíniosrc/libauxiliares de autenticação, armazenamento, OAuth, runtime e cliente Metasrc/serviceslógica de serviço Meta específica de domíniosrc/middleware.tsroteamento OAuth e autenticação JWT do MCPcloudflare-entry.mjsentrada wrapper do Worker para interceptação de rotas específicas do Cloudflareschema.sqlesquema D1testtestes unitários e de estilo de contrato
Desenvolvimento Local
Instale as dependências:
pnpm install
Execute o desenvolvimento local:
pnpm dev
Scripts úteis:
pnpm build
pnpm test
pnpm deploy
Bindings do Cloudflare
Bindings obrigatórios:
- Banco de dados D1 vinculado como
META_DB - Namespace KV vinculado como
META_OAUTH_STATE
Segredos obrigatórios:
JWT_SECRETouJWT_JWKS_URLMETA_APP_IDMETA_APP_SECRETMETA_TOKEN_ENCRYPTION_KEYAPP_UI_PASSWORDpara a página de administração integrada em/app
Configuração opcional:
JWT_ISSUERJWT_AUDIENCEAPP_SESSION_SECRETAPP_UI_WORKSPACE_IDAPP_UI_USER_IDMETA_REDIRECT_URIMETA_GRAPH_VERSIONMETA_OAUTH_SCOPESMETA_OAUTH_ALLOWED_RETURN_ORIGINS
Padrões:
META_GRAPH_VERSION=v25.0META_OAUTH_SCOPES=ads_management,business_managementAPP_UI_WORKSPACE_ID=workspace_adminAPP_UI_USER_ID=app_admin
Interface de Administração Integrada
O Worker agora inclui uma pequena interface de navegador em /app.
O que ela faz:
- solicita uma senha de administrador
- inicia o fluxo OAuth Meta existente sem exigir que você gere manualmente um JWT bearer
- mostra se uma conta Meta está conectada para o espaço de trabalho de administrador
- carrega contas de anúncios acessíveis usando a mesma lógica de serviço de
get_ad_accounts
Configuração necessária:
- Defina
APP_UI_PASSWORDno Worker. - Certifique-se de que
META_REDIRECT_URIcorresponda ao seu host público, por exemplo:
https://meta-mcp.gestalt.xyz/oauth/meta/callback
- Abra:
https://meta-mcp.gestalt.xyz/app
Configuração do Aplicativo Meta
No seu aplicativo Meta:
- Adicione o produto Marketing API.
- Adicione uma plataforma Website.
- Defina a URL da plataforma Website para a origem do seu Worker.
- Defina
App Domainspara o domínio do seu Worker. - Defina a URL de callback para:
https://<your-worker-host>/oauth/meta/callback
Se o seu aplicativo usa Facebook Login ou Facebook Login for Business, adicione também essa URL de callback exata às configurações de URI de redirecionamento específicas do produto.
Para um Worker implantado em workers.dev, esses campos geralmente precisam corresponder exatamente ao host do Worker.
Banco de Dados
Aplique o esquema D1:
pnpm wrangler d1 execute META_DB --remote --file schema.sql -y
Tabelas:
meta_connectionsmeta_ad_accounts_cache
Implantação
Implante o Worker:
pnpm deploy
Após a implantação:
- anote a URL pública do Worker
- defina
META_REDIRECT_URIparahttps://<your-worker-host>/oauth/meta/callback - atualize o mesmo callback nas configurações do aplicativo Meta
Se você planeja usar um frontend ou painel separado em outra origem, permita essa origem para redirecionamentos de navegador pós-OAuth:
META_OAUTH_ALLOWED_RETURN_ORIGINS=https://your-ui.example.com,http://localhost:3000
Use a origem real do seu frontend em produção.
Fluxo de Teste Manual
1. Gere um JWT de curta duração
Use o mesmo segredo JWT que seu aplicativo usa para o Worker.
export JWT_SECRET="YOUR_JWT_SECRET"
TOKEN=$(node --input-type=module <<'NODE'
import { SignJWT } from 'jose';
const secret = new TextEncoder().encode(process.env.JWT_SECRET);
const token = await new SignJWT({ workspaceId: 'workspace_test', roles: ['admin'] })
.setProtectedHeader({ alg: 'HS256' })
.setSubject('user_test')
.setIssuedAt()
.setExpirationTime('10m')
.sign(secret);
console.log(token);
NODE
)
2. Inicie o OAuth da Meta
curl -i \
-H "Authorization: Bearer $TOKEN" \
"https://<your-worker-host>/oauth/meta/start?workspace_id=workspace_test"
Copie o cabeçalho Location para o seu navegador e conclua o fluxo de login da Meta.
Página de sucesso esperada:
Meta account connected.
3. Inicialize o MCP
curl -s https://<your-worker-host>/mcp \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"jsonrpc":"2.0","id":"init-1","method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"manual-test","version":"1.0.0"}}}'
4. Liste as Ferramentas
curl -s https://<your-worker-host>/mcp \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"jsonrpc":"2.0","id":"tools-1","method":"tools/list","params":{}}'
5. Chame uma Ferramenta Real
Após o OAuth ser concluído com sucesso, isso deve retornar as contas de anúncios acessíveis para esse espaço de trabalho:
curl -s https://<your-worker-host>/mcp \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"jsonrpc":"2.0","id":"call-1","method":"tools/call","params":{"name":"get_ad_accounts","arguments":{}}}'
Se você receber um erro de conexão/reconexão, o fluxo OAuth e a chamada MCP usaram valores diferentes de workspaceId.
Observações
- Domínios
workers.devdo Cloudflare podem exigir cuidado extra nas configurações do aplicativo Meta. - O ponto de entrada do Worker intercepta explicitamente as rotas OAuth antes de delegar ao Worker XMCP gerado.
- O caminho de build do Cloudflare Worker não é idêntico ao
xmcp devlocal, então sempre verifique as rotas implantadas após alterações relacionadas ao OAuth.