Rule 34
Pesquise posts do rule34.xxx por tag através da API do próprio site. Requer uma chave de API do rule34.xxx.
Documentação
mcp-rule34
rule34.xxx é um grande image board cujos posts são indexados inteiramente por tags, e ele publica uma API para lê-los. Um post carrega seu identificador, o endereço de sua página e de seu arquivo, suas dimensões, a pontuação que seus visualizadores lhe deram, sua classificação e a lista completa de tags sob as quais foi arquivado. O site contém dezenas de milhões de posts e responde a uma busca por tag com o número de correspondências.
Este servidor conecta um cliente de chat a esse índice. Você pode buscar os posts por tags, combinando tags obrigatórias, alternativas e exclusões, ler o registro de um post pelo seu identificador e consultar como o site escreve uma tag antes de pesquisar nela. Ele precisa de uma conta e de uma chave de API, que o site emite por pessoa.
Instalação
Claude Code
claude mcp add rule34 --env RULE34_USER_ID=your-id --env RULE34_API_KEY=your-key -- npx -y mcp-rule34
Claude Desktop, Cursor e qualquer cliente que use o formato de configuração padrão
{
"mcpServers": {
"rule34": {
"command": "npx",
"args": ["-y", "mcp-rule34"],
"env": {
"RULE34_USER_ID": "your-id",
"RULE34_API_KEY": "your-key"
}
}
}
}
Node 24 ou posterior é necessário. As duas credenciais são obrigatórias; todo o resto em Configuração é opcional.
Com Docker
{
"mcpServers": {
"rule34": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"RULE34_USER_ID",
"-e",
"RULE34_API_KEY",
"ghcr.io/smeet666/mcp-rule34:2.0.2"
]
}
}
}
-i mantém o stdin aberto, que é por onde o protocolo trafega, e -t é omitido
porque um TTY reescreve o fluxo. O contêiner precisa de HTTPS de saída para
api.rule34.xxx e rule34.xxx, e das duas credenciais do seu ambiente:
sem volume, sem porta.
Pacote, sem npm
Baixe mcp-rule34-2.0.2.mcpb de
o lançamento mais recente e
abra-o. Um cliente que suporta pacotes MCP o instala por conta própria, sem npm
para executar. As credenciais ainda são definidas na configuração do cliente.
O que você pode perguntar
- "Como o site escreve essa tag?"
- "Encontre posts com essas duas tags, ordenados por pontuação."
- "Mesma busca, excluindo monocromático."
- "Leia o registro do post 1234567."
- "Quantos posts essa busca corresponde?"
O caminho comum vai de uma consulta de tag a uma busca: find_tags fornece a
grafia que o site usa, e search_posts a utiliza.
Ferramentas
| Ferramenta | O que ela faz |
|---|---|
find_tags | Descobre como o site escreve uma tag e quantos posts a carregam. |
search_posts | Busca os posts por tags, com alternativas e exclusões. |
get_post | Lê o registro de um post pelo seu identificador ou endereço. |
Consulte uma tag antes de pesquisar nela. O site indexa apenas por tag, e uma tag que ele não possui não corresponde a nada, o que aparece como um resultado vazio em vez de um erro de grafia.
find_tags
Descobre como o site escreve uma tag.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
query | string, até 60 caracteres | sim | O texto a consultar. |
Em retorno: query como foi enviado, e tags, cada um com a grafia que o site
usa e o número de posts que a carregam.
search_posts
Busca os posts por tags.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
tags | array de 1 a 10 nomes de tag | sim | Tags que um post deve carregar. |
any_of | array de 1 a 10 nomes de tag | não | Tags que um post deve carregar pelo menos uma. |
exclude | array de 1 a 10 nomes de tag | não | Tags que um post não deve carregar nenhuma. |
media_type | image, animated, video ou any, padrão any | não | Imagens estáticas, GIFs ou MP4. |
rating | questionable ou explicit | não | Ambos são pesquisados quando isso é omitido. |
sort | score, id, updated ou random, padrão score | não | A ordem pela qual o site ordena. |
limit | inteiro, 1 a 100, padrão 20 | não | Posts a servir. |
page | inteiro, 1 a 200, padrão 1 | não | Qual página de posts. |
media_type é lido das próprias tags do site, então a classificação é tão boa quanto
a marcação. As duas classificações acima são as únicas que o site possui: qualquer outro
valor responde zero posts e nenhum erro, o que devolveria uma ausência que o site
nunca teve.
Em retorno: tags, any_of e exclude como o site as escreve; query,
a busca como foi enviada na própria linguagem do site; total, os posts que a
busca inteira corresponde conforme contado pelo site; e os próprios posts, cada um com
seu id, post_url, file_url, preview_url, sample_url, width,
height, score, rating e tags. A pontuação é a do próprio site e é
atualizada uma vez por dia.
get_post
Lê o registro de um post.
| Argumento | Tipo | Obrigatório | O que faz |
|---|---|---|---|
id | inteiro, 1 ou mais | um de dois | O identificador do post. |
url | uma URL de post do rule34.xxx | um de dois | O endereço da página do post. |
Em retorno: o post que uma linha de busca carrega, com sua lista completa de tags.
Configuração
As duas credenciais são obrigatórias. Todo o resto é opcional, e tudo isso vai
no bloco env da configuração do seu cliente.
| Variável | Padrão | O que faz |
|---|---|---|
RULE34_USER_ID | nenhum, obrigatório | Seu ID de conta numérico. |
RULE34_API_KEY | nenhum, obrigatório | Sua chave de API, que é pessoal. |
RULE34_USER_AGENT | a identidade do projeto | Nomeia seu aplicativo para o site, com um endereço onde uma pessoa pode ser contatada. |
RULE34_MIN_INTERVAL_MS | 1000 | Intervalo entre duas requisições, de 1000 a 60000. |
RULE34_TIMEOUT_MS | 20000 | Prazo para uma requisição, de 1000 a 120000. |
RULE34_MAX_RETRIES | 3 | Tentativas após uma falha transitória, de 0 a 10. |
RULE34_CACHE_TTL_MS | 300000 | Quanto tempo uma resposta permanece na memória, de 0 a 86400000. |
RULE34_CACHE_MAX_ENTRIES | 300 | Respostas mantidas na memória de uma vez, de 0 a 10000. |
RULE34_LOG_LEVEL | error | silent, error, info ou debug, escrito em stderr. |
De onde vêm as credenciais. Entre, abra
Opções da conta e encontre
a linha chamada Credenciais de acesso à API. Ela mostra &api_key=…&user_id=…, e
esses dois valores são o que vai na configuração acima. Se a chave estiver vazia,
marque Gerar nova chave? e salve.
O site emite uma chave por pessoa e pede que aplicativos que servem seu conteúdo não exibam publicidade e não o coloquem atrás de um paywall. Este servidor não envia chave própria, e cada usuário traz a sua. Iniciado sem credenciais, ele executa, publica suas ferramentas e responde a cada chamada nomeando as duas variáveis a definir: ele não envia nenhuma requisição que sabe que o site recusará.
Um valor fora do intervalo cai no padrão, e o motivo é escrito em stderr.
Erros
Cada falha carrega um de seis códigos, uma mensagem e, onde ajuda, uma dica nomeando o próximo passo.
| Código | O que aconteceu | O que fazer |
|---|---|---|
not_found | O site respondeu e não contém nada naquele endereço. | Verifique o identificador com search_posts. |
invalid_input | Os argumentos foram recusados antes de qualquer requisição sair. | Leia a mensagem, que nomeia o argumento. Uma credencial ausente é relatada aqui. |
rate_limited | O site pediu que este cliente diminuísse o ritmo. | Aguarde o número de segundos que a dica nomeia e chame novamente com os mesmos argumentos. O post ainda está lá. |
parse_failure | A resposta chegou em um formato que este cliente não consegue ler. | Relate em o rastreador de problemas. |
network_error | A requisição não foi concluída. | Tente novamente em breve. |
timeout | A requisição passou do prazo. | Aumente RULE34_TIMEOUT_MS, ou peça menos posts. |
Como biblioteca
A camada que lê o site é publicada separadamente, com seu ritmo, seu cache e seus erros, e sem nenhum protocolo anexado.
import { Rule34Client } from "mcp-rule34/client";
const client = new Rule34Client({ credentials: { userId: "…", apiKey: "…" } });
const { data, cached } = await client.searchPosts({ tags: ["example"], limit: 5 });
console.log(data.total, cached);
Cada leitura responde { data, cached } e lança um erro carregando um dos seis
códigos. O piso de um segundo entre duas requisições também vale aqui.
Ritmo e atribuição
Requisições saem uma de cada vez com pelo menos um segundo entre elas, e esse piso
vale independentemente de como o servidor está configurado. O User-Agent sempre termina com a
identidade do projeto e um endereço onde uma pessoa pode ser contatada.
Leituras vão para a API que o site documenta, e as credenciais que ele emite são o que seus termos pedem que a leitura automatizada use. Cada resultado carrega o endereço da página do post. Nada é baixado: um endereço de arquivo viaja através de uma resposta como uma string.
Este servidor MCP é um projeto não oficial, sem afiliação ao rule34.xxx.
Privacidade
Este servidor não coleta nada sobre você e não envia nada ao seu autor. Ele roda
na sua máquina, contata api.rule34.xxx e rule34.xxx e nada mais,
mantém suas respostas na memória enquanto executa e não escreve nada no disco. Suas
credenciais são lidas do ambiente e enviadas apenas a esse site.
PRIVACY.md declara o que uma requisição carrega e quais configurações alteram
qualquer parte disso.
Desenvolvimento
npm install
npm run build:fixtures
npm test
npm run check
Testes rodam contra fixtures geradas e não fazem nenhuma requisição de rede. A suíte ao vivo,
npm run test:live, faz uma requisição por rota e roda todas as noites contra o
próprio site.
Contribuindo
Bugs, perguntas e ideias pertencem a o rastreador de problemas. Pull requests são bem-vindos; abrir um problema primeiro ajuda a concordar sobre a forma da mudança. Veja CONTRIBUTING.md.
Licença
MIT, veja LICENSE. Os posts e as tags pertencem ao rule34.xxx e às pessoas que os enviaram.
mcp-rule34 (français)
rule34.xxx é um grande imageboard cujas publicações são indexadas inteiramente por etiquetas, e ele publica uma API para lê-las. Uma publicação carrega seu identificador, o endereço de sua página e de seu arquivo, suas dimensões, a nota que seus visitantes lhe deram, sua classificação, e a lista completa das etiquetas sob as quais está arquivada. O site contém dezenas de milhões de publicações e responde a uma pesquisa por etiquetas informando o número que encontrou.
Este servidor conecta um cliente de conversa a esse índice. Pode-se pesquisar as publicações por etiquetas, combinando as etiquetas exigidas, as alternativas e as exclusões, ler a ficha de uma publicação por seu identificador, e verificar como o site soletra uma etiqueta antes de pesquisar sobre ela. Ele exige uma conta e uma chave de API, que o site entrega por pessoa.
Instalação
Claude Code
claude mcp add rule34 --env RULE34_USER_ID=votre-id --env RULE34_API_KEY=votre-cle -- npx -y mcp-rule34
Claude Desktop, Cursor, e qualquer cliente no formato de configuração padrão
{
"mcpServers": {
"rule34": {
"command": "npx",
"args": ["-y", "mcp-rule34"],
"env": {
"RULE34_USER_ID": "votre-id",
"RULE34_API_KEY": "votre-cle"
}
}
}
}
Node 24 ou mais recente é necessário. As duas credenciais são obrigatórias; todo o resto, em Configuração, é opcional.
Com Docker
{
"mcpServers": {
"rule34": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"RULE34_USER_ID",
"-e",
"RULE34_API_KEY",
"ghcr.io/smeet666/mcp-rule34:2.0.2"
]
}
}
}
-i mantém a entrada padrão aberta, que é o canal do protocolo, e -t é
omitido porque um TTY reescreve o fluxo. O contêiner precisa de acesso HTTPS
de saída para api.rule34.xxx e rule34.xxx, e das duas credenciais obtidas do
seu ambiente: nenhum volume, nenhuma porta.
Bundle, sem npm
Baixe mcp-rule34-2.0.2.mcpb de
a última publicação
e abra-o. Um cliente que gerencia bundles MCP o instala sozinho, sem npm para
executar. As credenciais são sempre definidas na configuração do cliente.
O que se pode pedir
- « Como o site soletra essa etiqueta? »
- « Encontre as publicações que carregam essas duas etiquetas, ordenadas por nota. »
- « A mesma pesquisa, sem monocromático. »
- « Leia-me a ficha da publicação 1234567. »
- « Quantas publicações essa pesquisa encontra? »
O caminho comum vai de uma pesquisa de etiqueta a uma pesquisa de
publicações: find_tags fornece a grafia que o site usa, e
search_posts a retoma.
As ferramentas
| Ferramenta | O que ela faz |
|---|---|
find_tags | Encontra a grafia de uma etiqueta, e quantas publicações a carregam. |
search_posts | Pesquisa as publicações por etiquetas, com alternativas e exclusões. |
get_post | Lê a ficha de uma publicação por seu identificador ou seu endereço. |
Verifique uma etiqueta antes de pesquisar sobre ela. O site indexa por etiqueta apenas, e uma etiqueta que ele não conhece não corresponde a nada, o que se lê como um resultado vazio em vez de um erro de grafia.
find_tags
Encontra a grafia de uma etiqueta.
| Argumento | Tipo | Obrigatório | O que ele faz |
|---|---|---|---|
query | string, até 60 caracteres | sim | O texto a verificar. |
Em retorno: query tal como enviado, e tags, cada uma com a grafia
que o site usa e o número de publicações que a carregam.
search_posts
Pesquisa as publicações por etiquetas.
| Argumento | Tipo | Obrigatório | O que ele faz |
|---|---|---|---|
tags | array de 1 a 10 nomes de etiquetas | sim | Etiquetas que uma publicação deve carregar. |
any_of | array de 1 a 10 nomes de etiquetas | não | Etiquetas das quais uma publicação deve carregar ao menos uma. |
exclude | array de 1 a 10 nomes de etiquetas | não | Etiquetas que uma publicação não deve carregar. |
media_type | image, animated, video ou any, padrão any | não | Imagens fixas, GIF ou MP4. |
rating | questionable ou explicit | não | Ambos são pesquisados quando é omitido. |
sort | score, id, updated ou random, padrão score | não | A ordem de classificação do site. |
limit | inteiro, 1 a 100, padrão 20 | não | Publicações a servir. |
page | inteiro, 1 a 200, padrão 1 | não | Qual página de publicações. |
media_type se lê nas etiquetas do próprio site, portanto a classificação
vale o que vale a etiquetagem. As duas classificações acima são as únicas que
o site conhece: qualquer outro valor retorna zero publicações e nenhum erro, o que
entregaria uma ausência que o site nunca teve.
Em retorno: tags, any_of e exclude tal como o site as
soletra; query, a pesquisa tal como foi enviada na língua
do site; total, as publicações que toda a pesquisa encontra, tal como o site as
conta; e as próprias publicações, cada uma com seu id,
post_url, file_url, preview_url, sample_url, width, height, score,
rating e tags. A nota é a do site e é atualizada uma vez
por dia.
get_post
Lê a ficha de uma publicação.
| Argumento | Tipo | Obrigatório | O que ele faz |
|---|---|---|---|
id | inteiro, 1 ou mais | um dos dois | O identificador da publicação. |
url | um endereço de página rule34.xxx | um dos dois | O endereço da página. |
Em retorno: a publicação que uma linha de pesquisa carrega, com sua lista completa de etiquetas.
Configuração
As duas credenciais são obrigatórias. Todo o resto é opcional, e tudo se
define no bloco env da configuração do cliente.
| Variável | Padrão | O que ela faz |
|---|---|---|
RULE34_USER_ID | nenhum, obrigatório | O identificador numérico da sua conta. |
RULE34_API_KEY | nenhum, obrigatório | Sua chave de API, que é pessoal. |
RULE34_USER_AGENT | a identidade do projeto | Nomeia seu aplicativo junto ao site, com um endereço para contatar uma pessoa. |
RULE34_MIN_INTERVAL_MS | 1000 | Intervalo entre duas requisições, de 1000 a 60000. |
RULE34_TIMEOUT_MS | 20000 | Tempo limite de uma requisição, de 1000 a 120000. |
RULE34_MAX_RETRIES | 3 | Tentativas após uma falha passageira, de 0 a 10. |
RULE34_CACHE_TTL_MS | 300000 | Duração durante a qual uma resposta permanece em memória, de 0 a 86400000. |
RULE34_CACHE_MAX_ENTRIES | 300 | Respostas mantidas em memória por vez, de 0 a 10000. |
RULE34_LOG_LEVEL | error | silent, error, info ou debug, escrito na saída de erro. |
De onde vêm as credenciais. Conecte-se, abra
Account options, e
encontre a linha API Access Credentials. Ela exibe &api_key=…&user_id=…,
e esses dois valores são o que vai na configuração acima. Se a chave estiver
vazia, marque Generate New Key? e salve.
O site entrega uma chave por pessoa, e pede que os aplicativos que servem seu conteúdo não exibam nenhuma publicidade e não o coloquem atrás de nenhum pagamento. Este servidor não embute nenhuma chave, e cada um traz a sua. Iniciado sem credenciais, ele roda, publica suas ferramentas, e responde a cada chamada nomeando as duas variáveis a definir: ele não envia nenhuma requisição que sabe que o site recusará.
Um valor fora de sua faixa cai no padrão, e o motivo é escrito na saída de erro.
Erros
Cada falha carrega um dos seis códigos, uma mensagem, e quando isso ajuda uma indicação do próximo gesto.
| Código | O que aconteceu | O que fazer |
|---|---|---|
not_found | O site respondeu, e não tem nada nesse endereço. | Verifique o identificador com search_posts. |
invalid_input | Os argumentos foram recusados antes de qualquer requisição. | Leia a mensagem, que nomeia o argumento. Um identificador ausente é sinalizado aqui. |
rate_limited | O site pede que este cliente desacelere. | Aguarde os segundos indicados e chame novamente com os mesmos argumentos. A publicação ainda está lá. |
parse_failure | A resposta chegou em uma forma ilegível aqui. | Sinalize em o rastreamento de incidentes. |
network_error | A requisição não foi concluída. | Tente novamente em breve. |
timeout | A requisição excedeu seu tempo limite. | Aumente RULE34_TIMEOUT_MS, ou peça menos publicações. |
Como biblioteca
A camada que lê o site é publicada sozinha, com seu ritmo, seu cache e seus erros, sem protocolo anexado.
import { Rule34Client } from "mcp-rule34/client";
const client = new Rule34Client({ credentials: { userId: "…", apiKey: "…" } });
const { data, cached } = await client.searchPosts({ tags: ["example"], limit: 5 });
console.log(data.total, cached);
Cada leitura responde { data, cached }, e levanta um erro carregando um dos seis
códigos. O piso de um segundo entre duas requisições também vale aqui.
Ritmo e atribuição
As requisições partem uma a uma com pelo menos um segundo entre elas, e esse
piso vale independentemente da configuração. O User-Agent termina
sempre pela identidade do projeto e um endereço para contatar uma pessoa.
As leituras passam pela API que o site documenta, e as credenciais que ele entrega são o que suas condições pedem para empregar em uma leitura automatizada. Cada resultado carrega o endereço da página da publicação. Nada é baixado: um endereço de arquivo atravessa uma resposta como uma string de caracteres.
Este MCP é um projeto não oficial, sem afiliação com rule34.xxx.
Privacidade
Este servidor não coleta nada sobre você e não envia nada ao seu autor. Ele roda na
sua máquina, apenas acessa api.rule34.xxx e rule34.xxx, mantém suas respostas
em memória enquanto está em execução e não grava nada no disco. Suas credenciais
são lidas do ambiente e enviadas apenas a esse site. PRIVACY.md
explica o que uma requisição envia e quais configurações alteram isso.
Desenvolvimento
npm install
npm run build:fixtures
npm test
npm run check
Os testes são executados em fixtures geradas e não emitem nenhuma requisição.
A suíte ao vivo, npm run test:live, emite uma requisição por rota e roda
todas as noites contra o próprio site.
Contribuindo
Bugs, perguntas e ideias têm seu lugar em o rastreador de problemas. Propostas de alteração são bem-vindas; abrir um ticket primeiro ajuda a alinhar a forma da mudança. Veja CONTRIBUTING.md.
Licença
MIT, veja LICENSE. As publicações e as tags pertencem à rule34.xxx e às pessoas que as enviaram.