API, MCP e agentes
Documentação para programadores
Um agente pode enviar uma escolha, receber uma pergunta de esclarecimento e obter uma recomendação fundamentada. Não exige conta nem chaves dos fornecedores.
Ligação MCP
https://dilem.si/api/v1/mcpTransporte HTTP remoto, sem OAuth. O token da aplicação é passado às ferramentas, não à configuração do servidor. Prevê 110 segundos para uma decisão.
Escolhe o teu cliente. Junta o exemplo à configuração existente sem a substituir. Recarrega as ferramentas MCP e verifica se start_session, get_usage e decide estão disponíveis.
Claude Code
claude mcp add --transport http dilem https://dilem.si/api/v1/mcpCodex
~/.codex/config.toml[mcp_servers.dilem]
url = "https://dilem.si/api/v1/mcp"
tool_timeout_sec = 110Cursor
.cursor/mcp.json{
"mcpServers": {
"dilem": {
"url": "https://dilem.si/api/v1/mcp"
}
}
}OpenCode
opencode.json{
"mcp": {
"dilem": {
"type": "remote",
"url": "https://dilem.si/api/v1/mcp",
"enabled": true,
"oauth": false
}
}
}Hermes Agent
hermes mcp add dilem --url https://dilem.si/api/v1/mcpMistral Vibe
~/.vibe/config.toml[[mcp_servers]]
name = "dilem"
transport = "streamable-http"
url = "https://dilem.si/api/v1/mcp"
tool_timeout_sec = 110
[mcp_servers.auth]
type = "static"
headers = {}OpenClaw
~/.openclaw/openclaw.json{
"mcp": {
"servers": {
"dilem": {
"url": "https://dilem.si/api/v1/mcp",
"transport": "streamable-http",
"enabled": true,
"connectionTimeoutMs": 10000,
"requestTimeoutMs": 110000
}
}
}
}Pi
~/.pi/agent/mcp.json{
"mcpServers": {
"dilem": {
"url": "https://dilem.si/api/v1/mcp",
"timeout": 110
}
}
}Referência MCP
start_session
EscritaCriar ou renovar a identidade privada do cliente.
sessionstring | nullopcional · Predefinição null
Resposta: Session
POST /api/v1/session
Entrada
Cabeçalhos
AuthorizationToken de sessão enviado como Bearer <session>.
Não é necessário corpo do pedido.
Resposta
200 application/json
{
"session": "OPAQUE_SESSION_KEEP_PRIVATE",
"expires_in": 7776000
}sessionToken privado do cliente, a conservar para chamadas posteriores.
expires_inPrazo de validade da sessão, em segundos.
Valor:
7776000
Erros e recuperação
403 · 408 · 409 · 413 · 422 · 429 · 503 application/json
{
"type": "error",
"code": "case_completed"
}typeTipo de resposta devolvida.
Valor:
"error"codeCódigo a consultar para tratar a recusa ou falha.
messageExplicação legível da recusa ou falha.
retryableIndica se pode ser considerada outra tentativa.
resets_atData e hora da próxima renovação dos créditos.
Data e hora ISO 8601
get_usage
LeituraLer créditos, renovação e estado opcional do caso.
sessionstringobrigatóriocase_idstring | nullopcional · Predefinição null
Resposta: Usage
GET /api/v1/usage
Entrada
Cabeçalhos
AuthorizationToken de sessão enviado como Bearer <session>.
X-Dilem-Case-IDMantém este identificador em todas as interações do mesmo dilema.
Formato técnico
^[a-zA-Z0-9_-]{1,80}$
Não é necessário corpo do pedido.
Resposta
200 application/json
{
"day": "2026-01-01",
"resets_at": "2026-01-02T00:00:00Z",
"collective": {
"completed": 42
},
"dilemmas": {
"used": 1,
"limit": 20,
"remaining": 19
},
"case": {
"id": "my-unique-dilemma-id",
"admitted": true,
"completed": false
},
"voice": {
"seconds_used": 0,
"seconds_reserved": 0,
"seconds_remaining": 1200,
"seconds_limit": 1200,
"max_seconds": 60
},
"budget": {
"daily_usd": 5,
"available": true
}
}dayDia UTC dos contadores.
Data ISO 8601
resets_atData e hora da próxima renovação dos créditos.
Data e hora ISO 8601
collectiveContador coletivo de dilemas concluídos.
Campos
completedNúmero de dilemas concluídos no contador coletivo.
dilemmasCréditos de dilemas usados, disponíveis e permitidos.
Campos
usedCréditos já utilizados.
Mínimo: 0
limitLimite de créditos da política ativa.
Mínimo: 0
remainingCréditos ainda disponíveis.
Mínimo: 0
caseEstado do dilema identificado pelo Case-ID enviado.
Campos
idCase-ID solicitado, ou null se não foi fornecido.
admittedIndica se o dilema já foi admitido na quota.
completedIndica se uma primeira recomendação concluiu o dilema.
voiceDurações e limites do ditado, em segundos.
Campos
seconds_usedSegundos de ditado já consumidos.
seconds_reservedSegundos temporariamente reservados por uma captura em curso.
seconds_remainingSegundos de ditado ainda disponíveis.
seconds_limitLimite total de ditado, em segundos.
max_secondsDuração máxima de uma captura, em segundos.
budgetOrçamento financeiro partilhado e disponibilidade do serviço.
Campos
daily_usdLimite financeiro diário do serviço, em dólares dos EUA.
availableIndica se o orçamento ainda permite cálculos.
Erros e recuperação
403 · 408 · 409 · 413 · 422 · 429 · 503 application/json
{
"type": "error",
"code": "case_completed"
}typeTipo de resposta devolvida.
Valor:
"error"codeCódigo a consultar para tratar a recusa ou falha.
messageExplicação legível da recusa ou falha.
retryableIndica se pode ser considerada outra tentativa.
resets_atData e hora da próxima renovação dos créditos.
Data e hora ISO 8601
decide
Cálculo IAEnviar um turno: pergunta, recomendação ou erro.
sessionstringobrigatóriocase_idstringobrigatóriotextstringobrigatóriolanguage"fr" | "en" | "it" | "de" | "es" | "pt"opcional · Predefinição "fr"refinementsstring[] | nullopcional · Predefinição nullforce_decisionbooleanopcional · Predefinição falseclarification_countintegeropcional · Predefinição 0clarification_version2opcional · Predefinição 2
Resposta: DecisionResponse
POST /api/v1/decide
Entrada
Cabeçalhos
AuthorizationToken de sessão enviado como Bearer <session>.
X-Dilem-Case-IDMantém este identificador em todas as interações do mesmo dilema.
Formato técnico
^[a-zA-Z0-9_-]{1,80}$
Corpo application/json
{
"text": "Train or bus for my commute?",
"language": "en",
"refinements": [],
"clarification_version": 2
}textEscolha inicial mantida em cada turno.
De 1 a 6 000 caracteres
languageIdioma da interface. As respostas seguem as palavras do utilizador.
Valores permitidos:
"fr","en","it","de","es","pt"refinementsPerguntas e respostas reais, por ordem cronológica.
Até 40 elementos · Até 6 000 caracteres por elemento · Predefinição:
[]force_decisionApenas quando o utilizador pede uma recomendação sem mais perguntas.
Predefinição:
falseclarification_countNúmero de respostas a esclarecimentos.
De 0 a 20 · Predefinição:
0clarification_versionVersão do contrato, sempre 2.
Predefinição:
2· Valor:2
{
"session": "<session from start_session>",
"case_id": "my-unique-dilemma-id",
"text": "Train or car for a weekend trip?",
"language": "en"
}Resposta
200 application/json
Pergunta de esclarecimento Clarification
Uma pergunta ou um aviso segundo purpose. insufficient_evidence indica que não há base para uma classificação fundamentada; não repitas sem informação nova do utilizador.
{
"type": "clarification",
"question": "How far is your commute?",
"choices": [],
"format": "number",
"unit": "km",
"summary": "Train or bus"
}typeTipo de resposta devolvida.
Valor:
"clarification"questionPergunta a transmitir ao utilizador antes de continuar.
choicesRespostas propostas, quando incluídas na pergunta.
Até 6 elementos
formatFormato de resposta esperado pela pergunta.
Valores permitidos:
"single","multiple","text","number"unitUnidade de uma resposta numérica, ou null.
summarySíntese do dilema.
purposeFinalidade da pergunta ou do aviso de âmbito.
Valores permitidos:
"decision_scope","scope_notice","insufficient_evidence"metricsMétricas técnicas do processamento.
Recomendação Result
Recomendação, opções, razões e fontes. Os pesos são preferências relativas, não probabilidades de sucesso. result_id pode estar ausente.
{
"type": "result",
"summary": "Train or bus for my commute?",
"options": [
{
"id": "train",
"label": "Take the train",
"description": "Use the direct rail connection.",
"probability": 0.7
},
{
"id": "bus",
"label": "Take the bus",
"description": "Use the bus stop near home.",
"probability": 0.3
}
],
"selected": "train",
"sources": [],
"result_id": "0123456789abcdef0123456789abcdef"
}typeTipo de resposta devolvida.
Valor:
"result"summarySíntese do dilema.
contextContexto utilizado para a recomendação.
assumptionsPressupostos utilizados para comparar as opções.
criteriaCritérios utilizados para comparar as opções.
optionsOpções comparadas e informações associadas.
De 2 a 8 elementos
selectedIdentificador da opção recomendada.
sourcesFontes devolvidas com a recomendação.
cautionPrecaução específica, ou null.
timingsDurações das etapas do processamento.
modelsInformações sobre os modelos desta interação.
metricsMétricas técnicas do processamento.
result_idIdentificador do resultado pertencente a este cliente.
Erro Error
Recusa ou erro da execução. Verifica type mesmo após HTTP 200; MCP também indica isError.
{
"type": "error",
"code": "case_completed"
}typeTipo de resposta devolvida.
Valor:
"error"codeCódigo a consultar para tratar a recusa ou falha.
messageExplicação legível da recusa ou falha.
retryableIndica se pode ser considerada outra tentativa.
resets_atData e hora da próxima renovação dos créditos.
Data e hora ISO 8601
Erros e recuperação
403 · 408 · 409 · 413 · 422 · 429 · 503 application/json
{
"type": "error",
"code": "case_completed"
}typeTipo de resposta devolvida.
Valor:
"error"codeCódigo a consultar para tratar a recusa ou falha.
messageExplicação legível da recusa ou falha.
retryableIndica se pode ser considerada outra tentativa.
resets_atData e hora da próxima renovação dos créditos.
Data e hora ISO 8601
export_result_card
LeituraCriar um cartão do resultado recebido, sem IA nem armazenamento de imagem.
sessionstringobrigatórioresultCardResultobrigatóriolanguage"fr" | "en" | "it" | "de" | "es" | "pt"opcional · Predefinição "fr"theme"light" | "dark"opcional · Predefinição "light"
Resposta: image/png
POST /api/v1/result-card
Entrada
Cabeçalhos
AuthorizationToken de sessão enviado como Bearer <session>.
Corpo application/json
{
"result": {
"summary": "Train or bus for my commute?",
"selected": "train",
"options": [
{
"id": "train",
"label": "Take the train",
"description": "Use the direct rail connection.",
"probability": 0.7
},
{
"id": "bus",
"label": "Take the bus",
"description": "Use the bus stop near home.",
"probability": 0.3
}
]
},
"language": "en",
"theme": "light"
}resultResultado já recebido a fornecer para gerar o PNG.
Campos
summarySíntese do dilema.
De 1 a 6 000 caracteres
selectedIdentificador da opção recomendada.
Até 32 caracteres
optionsOpções comparadas e informações associadas.
De 2 a 8 elementos
Campos
idIdentificador único desta opção no resultado.
Formato técnico
^[a-z][a-z0-9_]{0,31}$labelDesignação da opção no cartão.
De 1 a 120 caracteres
descriptionDescrição breve apresentada com a opção.
Até 240 caracteres · Predefinição:
""probabilityPeso de preferência, não probabilidade de sucesso.
De 0 a 1
languageIdioma de apresentação.
Valores permitidos:
"fr","en","it","de","es","pt"· Predefinição:"fr"themeTema visual do cartão PNG.
Valores permitidos:
"light","dark"· Predefinição:"light"
Resposta
200 image/png
Ficheiro PNG privado em anexo. O nome é devolvido em Content-Disposition.
Erros e recuperação
403 · 408 · 409 · 413 · 422 · 429 · 503 · 415 application/json
{
"type": "error",
"code": "case_completed"
}typeTipo de resposta devolvida.
Valor:
"error"codeCódigo a consultar para tratar a recusa ou falha.
messageExplicação legível da recusa ou falha.
retryableIndica se pode ser considerada outra tentativa.
resets_atData e hora da próxima renovação dos créditos.
Data e hora ISO 8601
get_result_feedback
LeituraLer o voto do cliente proprietário.
sessionstringobrigatórioresult_idstringobrigatório
Resposta: Feedback
GET /api/v1/feedback/{result_id}
Entrada
Cabeçalhos
AuthorizationToken de sessão enviado como Bearer <session>.
Parâmetros do caminho
result_idIdentificador do resultado pertencente a este cliente.
Formato técnico
^[0-9a-f]{32}$
Não é necessário corpo do pedido.
Resposta
200 application/json
{
"result_id": "0123456789abcdef0123456789abcdef",
"helpful": false,
"reason": "missing_constraint"
}result_idIdentificador do resultado pertencente a este cliente.
Formato técnico
^[0-9a-f]{32}$helpfulAvaliação registada, ou null se não houve voto.
reasonMotivo da avaliação negativa, ou null.
Valores permitidos:
null,"misunderstood","missing_constraint","too_many_questions","too_vague"
Erros e recuperação
403 · 408 · 409 · 413 · 422 · 429 · 503 · 404 application/json
{
"type": "error",
"code": "case_completed"
}typeTipo de resposta devolvida.
Valor:
"error"codeCódigo a consultar para tratar a recusa ou falha.
messageExplicação legível da recusa ou falha.
retryableIndica se pode ser considerada outra tentativa.
resets_atData e hora da próxima renovação dos créditos.
Data e hora ISO 8601
set_result_feedback
EscritaRegistar o voto explícito do utilizador, sem deduzir satisfação.
sessionstringobrigatórioresult_idstringobrigatóriohelpfulbooleanobrigatórioreason"misunderstood" | "missing_constraint" | "too_many_questions" | "too_vague" | nullopcional · Predefinição null
Resposta: Feedback
POST /api/v1/feedback
Entrada
Cabeçalhos
AuthorizationToken de sessão enviado como Bearer <session>.
Corpo application/json
{
"result_id": "0123456789abcdef0123456789abcdef",
"helpful": false,
"reason": "missing_constraint"
}result_idIdentificador do resultado pertencente a este cliente.
Formato técnico
^[0-9a-f]{32}$helpfulAvaliação explícita do utilizador sobre a resposta.
reasonMotivo da avaliação negativa, ou null.
Valores permitidos:
null,"misunderstood","missing_constraint","too_many_questions","too_vague"
Resposta
200 application/json
{
"result_id": "0123456789abcdef0123456789abcdef",
"helpful": false,
"reason": "missing_constraint"
}result_idIdentificador do resultado pertencente a este cliente.
Formato técnico
^[0-9a-f]{32}$helpfulAvaliação registada, ou null se não houve voto.
reasonMotivo da avaliação negativa, ou null.
Valores permitidos:
null,"misunderstood","missing_constraint","too_many_questions","too_vague"
Erros e recuperação
403 · 408 · 409 · 413 · 422 · 429 · 503 · 415 · 404 application/json
{
"type": "error",
"code": "case_completed"
}typeTipo de resposta devolvida.
Valor:
"error"codeCódigo a consultar para tratar a recusa ou falha.
messageExplicação legível da recusa ou falha.
retryableIndica se pode ser considerada outra tentativa.
resets_atData e hora da próxima renovação dos créditos.
Data e hora ISO 8601
send_user_feedback
EscritaEnviar uma mensagem ou denúncia expressamente autorizada.
sessionstringobrigatóriorequest_idstringobrigatóriomessagestringobrigatóriolanguage"fr" | "en" | "it" | "de" | "es" | "pt"opcional · Predefinição "fr"kind"general" | "response"opcional · Predefinição "general"emailstringopcional · Predefinição ""responseobject | nullopcional · Predefinição null
Resposta: FeedbackAck
POST /api/v1/user-feedback
Entrada
Cabeçalhos
AuthorizationToken de sessão enviado como Bearer <session>.
Corpo application/json
{
"request_id": "0123456789abcdef0123456789abcdef",
"kind": "general",
"message": "Please explain how the recommendation uses my constraints.",
"email": "",
"language": "en",
"source": "agent",
"version": "unknown",
"screen": "other",
"response": null
}request_idIdentificador a conservar para evitar envios duplicados.
Formato técnico
^[0-9a-f]{32}$kindMensagem livre ou denúncia de uma resposta.
Valores permitidos:
"general","response"messageComentário fornecido expressamente pelo utilizador.
De 5 a 4 000 caracteres
emailEndereço de contacto, ou cadeia vazia.
Até 254 caracteres
languageIdioma de apresentação.
Valores permitidos:
"fr","en","it","de","es","pt"sourcePonto de entrada de origem da mensagem.
Valores permitidos:
"agent","menu","help","response"versionSHA da aplicação, ou unknown.
Formato técnico
^[0-9a-f]{40}$|^unknown$screenEcrã a partir do qual a mensagem é enviada.
Valores permitidos:
"home","clarification","result","other"responseResposta exata anexada à denúncia, caso contrário null.
Campos
nullnullResposta anexada
ReportedResponsekindTipo de resposta anexada à denúncia.
Valores permitidos:
"clarification","recommendation"textTexto exato da resposta anexada.
De 1 a 12 000 caracteres
referenceReferência da resposta em causa.
Formato técnico
^[A-Za-z0-9._:-]{1,80}$
Resposta
200 application/json
{
"ok": true
}okConfirma o registo da mensagem.
Valor:
true
Erros e recuperação
403 · 408 · 409 · 413 · 422 · 429 · 503 · 415 application/json
{
"type": "error",
"code": "case_completed"
}typeTipo de resposta devolvida.
Valor:
"error"codeCódigo a consultar para tratar a recusa ou falha.
messageExplicação legível da recusa ou falha.
retryableIndica se pode ser considerada outra tentativa.
resets_atData e hora da próxima renovação dos créditos.
Data e hora ISO 8601
Início rápido
Requer curl e Python 3. Cria a identidade uma vez, guarda o token em privado e recupera-o nas visitas seguintes.
Cria uma sessão e guarda o valor session. Usa-o em Authorization: Bearer *** nas chamadas seguintes. É válido durante 90 dias; renova-o com a mesma chamada e o mesmo token.
DILEM_SESSION=$(curl --fail-with-body --silent --show-error --max-time 15 \
https://dilem.si/api/v1/session \
-H 'Content-Type: application/json' -d '{}' | \
python3 -c 'import json, sys; print(json.load(sys.stdin)["session"])')curl --fail-with-body --max-time 15 https://dilem.si/api/v1/usage \
-H "Authorization: Bearer ${DILEM_SESSION:?}" \
-H 'X-Dilem-Case-ID: my-unique-dilemma-id'Escolhe um Case-ID para o teu dilema e mantém-no ao longo da conversa. Recebes uma pergunta ou uma recomendação. Para responder, acrescenta a pergunta e a tua resposta a refinements e aumenta clarification_count em 1.
curl --fail-with-body --max-time 110 --output result.json https://dilem.si/api/v1/decide \
-H "Authorization: Bearer ${DILEM_SESSION:?}" \
-H 'X-Dilem-Case-ID: my-unique-dilemma-id' \
-H 'Content-Type: application/json' \
-d '{"text":"Train or car for a weekend trip?","language":"en","refinements":[],"clarification_count":0,"clarification_version":2}'Sessão e autenticação
Sem token, start_session cria uma identidade. Com session renova a mesma identidade por 90 dias. Um token inválido ou expirado é recusado, nunca substituído silenciosamente. REST e MCP partilham o token; não leem cookies do navegador.
Um Case-ID único por dilema até ao resultado: de 1 a 80 caracteres entre a-z, A-Z, 0-9, _ e -. Identifica o caso, mas não torna o cálculo idempotente.
Ciclo de um dilema
- Envia a escolha inicial com um novo Case-ID.
- Com clarification, lê purpose: insufficient_evidence é um aviso a apresentar, não uma pergunta nem um convite a inventar uma classificação. Caso contrário, faz a pergunta e espera a resposta real; acrescenta pergunta + resposta a refinements e incrementa clarification_count.
- Com result, conserva o JSON: o caso terminou. Usa outro Case-ID para um novo cálculo.
- Com error, lê code e retryable. Não repitas automaticamente um cálculo de resultado ambíguo.
O agente transmite-te as perguntas e espera pelas tuas respostas, sem inventar a informação em falta. Podes pedir-lhe uma recomendação sem mais perguntas.
Parâmetros de decisão
textobrigatórioEscolha inicial mantida em cada turno.
string · 1–6000languageobrigatórioIdioma da interface. As respostas seguem as palavras do utilizador.
fr | en | it | de | es | ptrefinementsopcionalPerguntas e respostas reais, por ordem cronológica.
array · ≤40 × 6000clarification_countopcionalNúmero de respostas a esclarecimentos.
integer · 0–20clarification_versionopcionalVersão do contrato, sempre 2.
2force_decisionopcionalApenas quando o utilizador pede uma recomendação sem mais perguntas.
boolean
Texto + precisões: 24 000 caracteres no total. Corpo HTTP: 300 000 bytes em 10 segundos; uma carga do fornecedor demasiado grande pode ser recusada antes do consumo.
Respostas
Pergunta de esclarecimento type: clarification
Uma pergunta ou um aviso segundo purpose. insufficient_evidence indica que não há base para uma classificação fundamentada; não repitas sem informação nova do utilizador.
type, question, choices, format, unit, summary, purpose, metrics
Recomendação type: result
Recomendação, opções, razões e fontes. Os pesos são preferências relativas, não probabilidades de sucesso. result_id pode estar ausente.
type, summary, context, assumptions, criteria, options, selected, sources, caution, timings, models, metrics, result_id
Erro type: error
Recusa ou erro da execução. Verifica type mesmo após HTTP 200; MCP também indica isError.
type, code, message, retryable, resets_at
{
"type": "clarification",
"question": "How far is your commute?",
"choices": [],
"format": "number",
"unit": "km",
"summary": "Train or bus"
}Resultados e comentários
Exportar o resultado como PNG
Passa o resultado recebido em result, com language e theme (light ou dark). PNG privado, nome em Content-Disposition, Cache-Control: no-store. Sem crédito nem publicação. MCP devolve uma imagem nativa e metadados do ficheiro.
python3 -c 'import json, sys; print(json.dumps({"result": json.load(sys.stdin), "language": "fr", "theme": "light"}))' < result.json > card-input.jsoncurl --fail-with-body --max-time 15 https://dilem.si/api/v1/result-card \
-H "Authorization: Bearer ${DILEM_SESSION:?}" \
-H "Content-Type: application/json" \
--data-binary @card-input.json --output dilem.pngLer ou registar um voto
result_id pertence a esta identidade. helpful é booleano; reason é opcional apenas para um voto negativo: misunderstood, missing_constraint, too_many_questions ou too_vague. Resultados ausentes, expirados ou alheios devolvem o mesmo 404.
GET /api/v1/feedback/{result_id}{"result_id": "<result_id from your result>", "helpful": false, "reason": "missing_constraint"}curl --fail-with-body --max-time 15 https://dilem.si/api/v1/feedback \
-H "Authorization: Bearer ${DILEM_SESSION:?}" \
-H "Content-Type: application/json" \
--data-binary @feedback-input.jsonEnviar uma mensagem ou denunciar uma resposta
request_id: 32 caracteres hexadecimais minúsculos. message: pelo menos 5 caracteres sem espaços, máximo 4 000. kind=general para mensagens; kind=response para denúncias com a resposta exata anexa. Email facultativo. Mantém ID e conteúdo; sem repetição automática após falha ambígua.
{
"request_id": "<32 lowercase hex characters>",
"kind": "general",
"message": "<user-authorized message>",
"email": "",
"language": "fr",
"source": "agent",
"version": "unknown",
"screen": "other",
"response": null
}curl --fail-with-body --max-time 15 https://dilem.si/api/v1/user-feedback \
-H "Authorization: Bearer ${DILEM_SESSION:?}" \
-H "Content-Type: application/json" \
--data-binary @user-feedback-input.jsonCréditos
Um crédito cobre o dilema até à primeira recomendação, incluindo esclarecimentos. Qualquer novo cálculo após essa recomendação usa outro crédito.
Usa get_usage por MCP ou GET /api/v1/usage por REST para consultar os créditos restantes e a sua renovação.
Os limites vêm da política ativa, não de valores fixos neste guia. PNG e comentários não consomem créditos de dilema, mas mantêm limites técnicos e antiabuso.
Erros e recuperação
403: sessão ausente, inválida ou expirada, origem recusada ou cookies proibidos. 408/413/422: tempo, tamanho ou entrada inválida. 409: caso concluído. 429: quota, orçamento ou capacidade. 503: serviço indisponível. Verifica também type: a execução pode falhar após a admissão. Não repitas automaticamente um cálculo após uma falha ambígua; Case-ID não é uma chave de idempotência.
Uma desconexão pode deixar trabalho consumido. A leitura do uso não reconstrói uma resposta perdida.
Agentes no navegador
Num navegador compatível, o WebMCP permite ao agente usar a página aberta com o teu histórico e os teus créditos. Caso contrário, usa MCP remoto ou a API. O acesso remoto aceita texto; o ditado continua disponível na aplicação.
Lê primeiro get_dilemma. submit_dilemma envia uma escolha ou resposta; recommend_dilemma pede uma recomendação sem mais perguntas. As ações usam o caso visível, não o token remoto.
WebMCP acrescenta exportação local com pré-visualização, votos e denúncias, além de list_saved_dilemmas e get_saved_dilemma para o histórico deste navegador. O URL da imagem expira ao fechar a pré-visualização. Histórico e cookies não são partilhados com MCP remoto.
Referência técnica
Os esquemas OpenAPI descrevem pedidos e respostas completos. O guia Markdown é o ponto de entrada para agentes; catálogo e Server Card expõem a descoberta MCP.
O serviço conserva as conversas de texto durante 30 dias. O histórico do navegador fica no teu dispositivo e não é partilhado com o agente remoto.
Privacidade e fornecedores