emit MCP

RSS MCP programável — qualquer fonte para e-mail, Slack ou webhook. Pague por envio, sem taxa por assinante.

Documentação

US$ 1,60 por 1.000 e-mails

US$ 0 por assinante

Recarga mínima de US$ 10 · sem cartão para começar

3 chamadas para conectar o pipeline

Pare de verificar. Comece a assinar.

Cada pipeline abaixo é real e pode ser construído nos próximos cinco minutos — uma chamada de API ou alguns cliques. Cada um termina em uma URL de feed RSS, um e-mail, uma mensagem no Slack ou um POST JSON para o seu próprio código.

blog→email

Publique uma vez. Nós cuidamos do envio.

Cada nova publicação vira um e-mail limpo e legível para sua lista, a partir do seu próprio domínio. Cerca de mil envios por US$ 1,60.

Iniciar este pipeline →

page→slack

Pare de atualizar. Receba notificações.

Monitore qualquer URL — páginas de preços, concorrentes, avisos. Sua equipe fica sabendo de mudanças no Slack, mesmo que a página nunca tenha tido um feed.

Iniciar este pipeline →

changelog→webhook

Lançamentos direto no seu pipeline.

Novas versões das suas dependências disparam um webhook — abra uma issue, inicie uma CI, avise o canal. JSON limpo, sem precisar escrever um poller.

Iniciar este pipeline →

Um pipeline de envio. Não um CMS.

O emit MCP faz as quatro tarefas chatas entre "você publicou um post" e "alguém abriu o e-mail", e nada mais.

$

Sem taxa por assinante

10.000 leitores que você envia e-mail duas vezes por mês não deveriam custar o mesmo que um disparo diário. Você é cobrado por e-mail enviado — ponto final.

1 crédito · 1 e-mail · pré-pago

@

Seu domínio, entregabilidade real

Envie a partir de um domínio verificado via Resend ou Amazon SES com DKIM, tratamento de bounce e reclamações, cabeçalhos list-unsubscribe e opt-out em um clique já incluídos.

posts@seudominio.dev · SPF · DMARC

{ }

Tudo é uma API

Uma especificação OpenAPI 3.1 tipada, chaves bearer, gravações idempotentes e webhooks assinados para eventos importantes. Nenhum painel que você seja forçado a usar — conecte e esqueça.

API REST compacta · cliente com < 200 linhas de código

Três chamadas para um 200 OK ao vivo.

01 Crie uma conta POST /v1/accounts

# returns an emit_live_… key, shown once
curl -X POST api.rssemit.com/v1/accounts \
  -d '{"name":"My Blog",
       "email":"me@blog.dev"}'

02 Conecte um feed POST /v1/feeds

# polled every 5m · conditional GET
curl -X POST api.rssemit.com/v1/feeds \
  -H "Authorization: Bearer $KEY" \
  -d '{"url":"…/rss.xml",
       "from_email":"posts@blog.dev"}'

03 Recarregue e vá POST /v1/billing/topup

# $20 ≈ 12,500 emails. autopilot.
curl -X POST api.rssemit.com/v1/billing/topup \
  -H "Authorization: Bearer $KEY" \
  -d '{"amount_usd":20}'
# one-time: verify your email + sending
# domain (DNS), then new posts mail
# themselves

Construído para que seu agente de codificação configure tudo sozinho.

Enviamos uma especificação OpenAPI tipada, um servidor MCP de uso único e uma skill do Claude Code que cuidam da verificação de domínio, registros DNS, importação de assinantes e da primeira transmissão — em uma única conversa.

Claude Code skill Codex CLI Cursor MCP server

Cole no Claude Code, Cursor, Codex ou em qualquer agente com acesso à API — ele pergunta qual caso de uso você quer primeiro e só configura o que for necessário (configurações de Slack/Discord pulam as etapas de domínio e financiamento por completo).

~/blog · claude code

● Lendo CLAUDE.md, feed encontrado em /rss.xml.

● Verificando domínio blog.dev…

emit.create_account → emit_live_••• emitido

emit.verify_domain → 3 registros DNS adicionados a vercel.app

emit.connect_feed → posts@blog.dev · polling a cada 5 min

emit.import_subscribers → 1.284 de buttondown.csv

● Concluído. Seu próximo post será enviado para 1.284 assinantes. Créditos para 3,9 mil e-mails em arquivo.

>

Um endpoint. Qualquer linguagem.

Sem SDKs para perseguir entre versões. Autenticação bearer, JSON na entrada, JSON na saída.

# Send a one-off broadcast to all confirmed subscribers
curl -X POST https://api.rssemit.com/v1/broadcasts \
  -H "Authorization: Bearer $EMIT_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "subject":   "Shipping Emit v1.4",
        "body_html": "<h1>We shipped.</h1>",
        "feed_id":   "8Hk2q9f1-…"
      }'

# → { "id": "8Hk2q9f1…", "status": "queued", "recipient_count": 4218 }
// node 20 · zero deps
const r = await fetch("https://api.rssemit.com/v1/broadcasts", {
  method: "POST",
  headers: {
    "Authorization": \`Bearer ${process.env.EMIT_KEY}\`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    subject:   "Shipping Emit v1.4",
    body_html: "<h1>We shipped.</h1>",
    feed_id:   "8Hk2q9f1-…",
  }),
});

const { id, recipient_count } = await r.json();
console.log(\`queued ${recipient_count} to ${id}\`);
# python 3.11 · stdlib only
import os, json, urllib.request as u

req = u.Request(
    "https://api.rssemit.com/v1/broadcasts",
    method="POST",
    headers={
        "Authorization": f"Bearer {os.environ['EMIT_KEY']}",
        "Content-Type": "application/json",
    },
    data=json.dumps({
        "subject":   "Shipping Emit v1.4",
        "body_html": "<h1>We shipped.</h1>",
        "feed_id":   "8Hk2q9f1-…",
    }).encode(),
)

res = json.loads(u.urlopen(req).read())
print(f"queued {res['recipient_count']} to {res['id']}")
// go 1.22
body, _ := json.Marshal(map[string]any{
    "subject":   "Shipping Emit v1.4",
    "body_html": "<h1>We shipped.</h1>",
    "feed_id":   "8Hk2q9f1-…",
})

req, _ := http.NewRequest("POST",
    "https://api.rssemit.com/v1/broadcasts",
    bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer " + os.Getenv("EMIT_KEY"))
req.Header.Set("Content-Type", "application/json")

res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
# ruby 3.3
require "net/http"; require "json"

uri = URI("https://api.rssemit.com/v1/broadcasts")
req = Net::HTTP::Post.new(uri, {
  "Authorization" => "Bearer #{ENV['EMIT_KEY']}",
  "Content-Type"  => "application/json",
})
req.body = {
  subject:   "Shipping Emit v1.4",
  body_html: "<h1>We shipped.</h1>",
  feed_id:   "8Hk2q9f1-…",
}.to_json

res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }
puts JSON.parse(res.body)["id"]

US$ 1,60 por 1.000 créditos — um e-mail custa um. Criar feeds é grátis; você paga apenas quando o trabalho roda. Preços completos →

Um e-mail legível, não um artefato de marketing.

O template padrão é texto puro primeiro, compatível com HTML, seguro para modo escuro e respeita a tipografia do seu post. Substitua-o por feed com seu próprio HTML bruto via o template_html do feed.

preview posts@blog.devreader@hey.com

html · 41 kb

blog.dev · edição nº 042 · 26 de maio

Como o conditional GET mantém o polling barato

Monitoramos 14.000 feeds RSS a cada cinco minutos. Aqui está o truque do ETag que reduz 92% dessas requisições a um 304 — e por que isso importa para a sua conta.

A resposta ingênua é "armazenar em cache o corpo do feed e comparar". Isso funciona até você estar atingindo 14 mil publicadores por ciclo, sua conta de egress deixar de fazer sentido e metade desses publicadores estiver rodando instâncias de WordPress que te odeiam pessoalmente.

Continuar lendo →

você está recebendo isto porque se inscreveu em blog.dev · cancelar inscrição

<!-- raw HTML, rendered with Jinja. Set
     per feed via template_html. Variables:
     title, body, url, unsubscribe_url -->

<h1>{{ title }}</h1>

<div>{{ body }}</div>

<a href="{{ url }}">
  Continue reading →
</a>

<hr>
<p>
  <a href="{{ unsubscribe_url }}">
    Unsubscribe
  </a>
</p>

Perguntas que você faria antes de pagar.

Perguntas sobre preços — créditos, plano gratuito, bounces — são respondidas na página de preços. Se a sua não estiver em nenhum dos dois lugares, will@heltonlabs.com — um humano lê.

Posso receber um feed como JSON em vez de e-mail?

Sim — isso é uma transmissão JSON. Aponte qualquer URL de feed, inclusive uma que você não possui, para seu endpoint e cada novo item chega como application/json com um cabeçalho X-Emit-Event: sink.item; o corpo é {"event","sink_id","name","item"}. Defina o agendamento para diário ou semanal e o emit MCP agrupa tudo em um único POST sink.digest com um array items. Sem poller, sem parsing de XML, sem cron — veja RSS para webhook.

Como o feed RSS é monitorado?

A cada cinco minutos por padrão, com conditional GET (If-None-Match + If-Modified-Since). Você pode alternar para o modo on_publish e fazer POST para /v1/feeds/{id}/ping a partir de um webhook para entrega instantânea.

Meu agente de codificação pode configurar tudo?

Esse é o objetivo do design. O emit MCP envia uma especificação OpenAPI 3.1 em arquivo único, um servidor MCP e uma skill do Claude Code, para que add a newsletter to my blog using emit no Claude Code ou Codex possa fazer registros DNS, verificação de domínio, importação de assinantes e a primeira transmissão sem que você saia do terminal.

De quais domínios vocês enviam?

Dos seus. Você verifica um domínio (geramos os registros DKIM, SPF e DMARC), e cada envio vai from: posts@yourdomain.dev. Nenhum <@rssemit.com> jamais aparece nas caixas de entrada dos seus assinantes.

Onde meus dados ficam armazenados?

Postgres em us-east-1. Nunca vendemos dados de assinantes — não há nada nisso para nós, e isso destruiria a única coisa que vendemos.