{
  "markdown": "# WebDiet\n\n### WebDiet para Claude, Cursor e agentes de IA\n\nGestão de pacientes, planos alimentares, prescrições, prontuário e antropometria para nutricionistas.\n\n- 📊 **56 ferramentas**\n- ✏️ **Leitura e escrita**\n- 💬 **Funciona com qualquer cliente MCP**: Claude Desktop, Cursor, VS Code, Cline, Continue\n- 🔑 **Login via magic-link (sem senha)**\n\n[English version](README.en.md) · [Documentação completa](docs/) · [Skill pra agentes](skills/)\n\n---\n\n## Instalar em 1 clique\n\n### Claude (Web e Desktop)\n\nA Anthropic unificou a instalação de MCPs em `claude.ai/customize/connectors`. **O mesmo link serve pra Claude Web e Claude Desktop** (basta estar logado):\n\n[➕ Abrir no Claude e conectar](https://claude.ai/customize/connectors?modal=add-custom-connector&mcpName=WebDiet&mcpServerUrl=https%3A%2F%2Fapi.mcp.ai%2Fp_webdiet)\n\n**Manual** (se o deeplink não abrir): [claude.ai/customize/connectors](https://claude.ai/customize/connectors) → **+** → **Adicionar conector personalizado** → cole **Nome** `WebDiet` e **URL** `https://api.mcp.ai/p_webdiet`.\n\n### Cursor\n\n[➕ Instalar WebDiet no Cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=webdiet&config=eyJ1cmwiOiJodHRwczovL2FwaS5tY3AuYWkvcF93ZWJkaWV0In0=)\n\n### VS Code (Copilot Chat)\n\n[➕ Instalar WebDiet no VS Code](vscode:mcp/install?name=webdiet&config=%7B%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fapi.mcp.ai%2Fp_webdiet%22%7D)\n\n### ChatGPT, Manus, OpenClaw e mais 40+ clientes\n\nFunciona em qualquer cliente MCP que suporte **MCP over HTTP**. A URL do servidor é sempre:\n\n```\nhttps://api.mcp.ai/p_webdiet\n```\n\nDetalhes por cliente: [INSTALL.md](INSTALL.md).\n\n---\n\n## Exemplos de uso\n\n```\nListe meus pacientes e a próxima consulta de cada um\nCrie uma prescrição alimentar de 1800 kcal pra paciente Maria\nBusque alimentos com alta proteína no banco TACO\n```\n\n---\n\n## 56 ferramentas disponíveis\n\n| Tool | Descrição |\n|---|---|\n| `webdiet_list_accounts` | List all WebDiet accounts linked to this install. Returns each account's id, email, label, and an \"is_default\" flag (true when only one is linked — no need to pass `account` in other tools). When the user wants to add another WebDiet account, return `add_account_url` (no payload) como link clicável — abre o form de login no dashboard. |\n| `webdiet_patient_list` | Read patients in WebDiet. Actions: list (search by keyword — returns id, nome, link, with pagination), get (full profile with address, phone, links to panel sections). Both actions return a permanent \"link\" identifier and direct URLs when available (antropometria, prescriptions, etc.). IMPORTANT: Patient list search may be paginated — for writes, pass the numeric id from webdiet_patient get/list, the portal \"link\" number, or a unique phone/name keyword; the adapter falls back to dadosPaciente.php when the id is not on the first list page. [Flattened action: list] Bulk support: accepts patient_ids for batched execution. |\n| `webdiet_patient_get` | Read patients in WebDiet. Actions: list (search by keyword — returns id, nome, link, with pagination), get (full profile with address, phone, links to panel sections). Both actions return a permanent \"link\" identifier and direct URLs when available (antropometria, prescriptions, etc.). IMPORTANT: Patient list search may be paginated — for writes, pass the numeric id from webdiet_patient get/list, the portal \"link\" number, or a unique phone/name keyword; the adapter falls back to dadosPaciente.php when the id is not on the first list page. [Flattened action: get] Bulk support: accepts patient_ids for batched execution. |\n| `webdiet_patient_write_create` | Create or update patients in WebDiet. Actions: create (nome + nascimento required — returns patient_id), update (partial fields). IMPORTANT: nascimento (birth date DD/MM/YYYY) is REQUIRED for create — WebDiet uses it to calculate age in prescriptions. Without it, metodoPlanning.php crashes with a Fatal Error. For destructive removal use webdiet_patient_delete. [Flattened action: create] Bulk support: accepts patient_ids for batched execution. |\n| `webdiet_patient_write_update` | Create or update patients in WebDiet. Actions: create (nome + nascimento required — returns patient_id), update (partial fields). IMPORTANT: nascimento (birth date DD/MM/YYYY) is REQUIRED for create — WebDiet uses it to calculate age in prescriptions. Without it, metodoPlanning.php crashes with a Fatal Error. For destructive removal use webdiet_patient_delete. [Flattened action: update] Bulk support: accepts patient_ids for batched execution. |\n| `webdiet_patient_delete` | Permanently delete a WebDiet patient (uses removerPaciente — resolves id/link from a fresh list first). Irreversible. Bulk support: accepts patient_ids for batched execution. |\n| `webdiet_get_consultations` | Load food diary entries, meal reactions, attachments, or orientations for a patient. Use tipo to select: diario (food diary), reacoes (meal reactions), anexos (attachments), orientacoes (guidelines/orientations sent to patient). Bulk support: accepts patient_ids for batched execution. |\n| `webdiet_prontuario` | Get the clinical record (prontuario) for a WebDiet patient. Returns decoded text with sections: Identificacao, Triagem, Anamnese alimentar, etc. Bulk support: accepts patient_ids for batched execution. |\n| `webdiet_prontuario_write` | Save the clinical record (prontuario) for a WebDiet patient. Pass texto as a JSON array of HTML strings, one per section. Bulk support: accepts patient_ids for batched execution. |\n| `webdiet_anamnese` | List all anamnesis records for a WebDiet patient WITH the full Q/A content. Each item carries: - id, titulo, data - texto → plain-text Q/A (readable, line-broken — best for AI consumption / RAG) - texto_html → original HTML (<b>...</b><br>...) preserved for rich rendering - interpretacao / interpretacao_html → nutritionist's notes when present WebDiet stores the answers as URL-encoded HTML (<b>question</b><br>answer<br><br>); this tool decodes both representations so the agent can read e.g. food frequency, complaints, goals, allergies for the patient. For pre-consultation questionnaire responses NOT yet linked to a patient, use webdiet_preconsulta action=list_responses. Bulk support: accepts patient_ids for batched execution. |\n| `webdiet_anamnese_write_save` | Create / update anamnesis records in WebDiet. Actions: save (create or update — anamnese_id empty = new), save_interpretation (save AI/nutritionist interpretation), duplicate (copy existing record). For destructive removal use webdiet_anamnese_delete. [Flattened action: save] Bulk support: accepts patient_ids, anamnese_ids for batched execution. |\n| `webdiet_anamnese_write_save_interpretation` | Create / update anamnesis records in WebDiet. Actions: save (create or update — anamnese_id empty = new), save_interpretation (save AI/nutritionist interpretation), duplicate (copy existing record). For destructive removal use webdiet_anamnese_delete. [Flattened action: save_interpretation] Bulk support: accepts patient_ids, anamnese_ids for batched execution. |\n| `webdiet_anamnese_write_duplicate` | Create / update anamnesis records in WebDiet. Actions: save (create or update — anamnese_id empty = new), save_interpretation (save AI/nutritionist interpretation), duplicate (copy existing record). For destructive removal use webdiet_anamnese_delete. [Flattened action: duplicate] Bulk support: accepts patient_ids, anamnese_ids for batched execution. |\n| `webdiet_anamnese_delete` | Permanently delete an anamnesis record in WebDiet. Irreversible. Bulk support: accepts patient_ids, anamnese_ids for batched execution. |\n| `webdiet_preconsulta_list_templates` | Read pre-consultation questionnaires (Pré-consulta) in WebDiet. Actions: - list_templates → list all questionnaire templates the nutritionist publishes. Each item returns nome, descricao, perguntas[] (decoded), modelo, codigo, \"link\" (the public short URL https://nutr.se/<short> to share with patients) and \"preview_url\" (panel preview). USE THIS when the user asks for \"o link do questionário de pré-consulta\" / \"link do formulário\". - list_responses → list patient submissions to ANY template. Each response has id, id_code, template_nome, origem (anamnese | questionario), respondedor {nome, telefone, nascimento}, data, texto (decoded plain Q/A), texto_html (original HTML), pdf_url. Use filtros tipo (template name) and nome (responder name) to narrow. - get_response → fetch one response by id (or id_code/codigo). For LINKING a response to an existing patient (vincular), use webdiet_preconsulta_write action=link_to_patient. [Flattened action: list_templates] Bulk support: accepts response_ids for batched execution. |\n| `webdiet_preconsulta_list_responses` | Read pre-consultation questionnaires (Pré-consulta) in WebDiet. Actions: - list_templates → list all questionnaire templates the nutritionist publishes. Each item returns nome, descricao, perguntas[] (decoded), modelo, codigo, \"link\" (the public short URL https://nutr.se/<short> to share with patients) and \"preview_url\" (panel preview). USE THIS when the user asks for \"o link do questionário de pré-consulta\" / \"link do formulário\". - list_responses → list patient submissions to ANY template. Each response has id, id_code, template_nome, origem (anamnese | questionario), respondedor {nome, telefone, nascimento}, data, texto (decoded plain Q/A), texto_html (original HTML), pdf_url. Use filtros tipo (template name) and nome (responder name) to narrow. - get_response → fetch one response by id (or id_code/codigo). For LINKING a response to an existing patient (vincular), use webdiet_preconsulta_write action=link_to_patient. [Flattened action: list_responses] Bulk support: accepts response_ids for batched execution. |\n| `webdiet_preconsulta_get_response` | Read pre-consultation questionnaires (Pré-consulta) in WebDiet. Actions: - list_templates → list all questionnaire templates the nutritionist publishes. Each item returns nome, descricao, perguntas[] (decoded), modelo, codigo, \"link\" (the public short URL https://nutr.se/<short> to share with patients) and \"preview_url\" (panel preview). USE THIS when the user asks for \"o link do questionário de pré-consulta\" / \"link do formulário\". - list_responses → list patient submissions to ANY template. Each response has id, id_code, template_nome, origem (anamnese | questionario), respondedor {nome, telefone, nascimento}, data, texto (decoded plain Q/A), texto_html (original HTML), pdf_url. Use filtros tipo (template name) and nome (responder name) to narrow. - get_response → fetch one response by id (or id_code/codigo). For LINKING a response to an existing patient (vincular), use webdiet_preconsulta_write action=link_to_patient. [Flattened action: get_response] Bulk support: accepts response_ids for batched execution. |\n| `webdiet_preconsulta_write_link_to_patient` | Vincular (link) a pre-consultation response to an existing patient in WebDiet. Action: link_to_patient — imports the response content into the patient's chart. WebDiet routes automatically based on the response's \"origem\": • origem=anamnese → response becomes a new anamnese (importarPreanamnese.php) • origem=questionario → response becomes a new diagnostico (criarDiagnosticoPre.php) This is the API-equivalent of the panel's \"Vincular ao paciente\" button on the Respostas dos questionários page. After linking, the response remains in the responses list — use webdiet_preconsulta_delete to remove it if desired. Tip: when the response's respondedor.nome differs from the patient's nome (e.g. \"DALILA JULIAO MARTINS\" vs \"Dalila CG\"), match by telefone or nascimento via webdiet_patient list before linking. [Flattened action: link_to_patient] Bulk support: accepts patient_ids, response_ids for batched execution. |\n| `webdiet_preconsulta_delete` | Permanently delete a pre-consultation response in WebDiet. Templates are NOT affected. Irreversible. Bulk support: accepts response_ids for batched execution. |\n| `webdiet_antropometria_list` | Read anthropometry (body measurement) records for a WebDiet patient. Actions: list (all records with id, date, type, direct URL), get (full measurements from a specific record including weight, height, skinfolds, circumferences, bioimpedance, BMI, body fat %, classifications + direct URL). Each record includes a \"url\" field with the direct link to the record in WebDiet (e.g. https://pt.webdiet.com.br/painel/v4/antropometria.php?id=...). Use this to analyze patient body composition evolution over time. For creating/saving records, use webdiet_create_antropometria + webdiet_save_antropometria. [Flattened action: list] Bulk support: accepts patient_ids, antropometria_ids for batched execution. |\n| `webdiet_antropometria_get` | Read anthropometry (body measurement) records for a WebDiet patient. Actions: list (all records with id, date, type, direct URL), get (full measurements from a specific record including weight, height, skinfolds, circumferences, bioimpedance, BMI, body fat %, classifications + direct URL). Each record includes a \"url\" field with the direct link to the record in WebDiet (e.g. https://pt.webdiet.com.br/painel/v4/antropometria.php?id=...). Use this to analyze patient body composition evolution over time. For creating/saving records, use webdiet_create_antropometria + webdiet_save_antropometria. [Flattened action: get] Bulk support: accepts patient_ids, antropometria_ids for batched execution. |\n| `webdiet_create_antropometria` | Create a new body measurement record for a patient. Returns the record ID needed for webdiet_save_antropometria. Types: adulto (adult), infantil (child), gestacional (pregnancy). Bulk support: accepts patient_ids for batched execution. |\n| `webdiet_save_antropometria` | Save body measurements (anthropometry) for a patient. Call webdiet_create_antropometria first to get the antropometria_id. All numeric values are strings. Provide raw measurements — calculated fields (IMC, GC%, density, fat mass, lean mass, classifications) are computed automatically server-side using the chosen formula. Sections: basic (peso/altura), skinfolds (10 dobras in mm), circumferences (20 fields in cm, bilateral pairs for limbs), bone diameters (3 fields in cm), bioimpedance (9 fields from scale). Formulas for body fat %: pollock3 (default), pollock7, guedes, petroski, durnin, faulkner, nenhuma. Density conversion: brozek (default) or siri. Side for CMB: esquerdo (default) or direito. Bulk support: accepts patient_ids, antropometria_ids for batched execution. |\n| `webdiet_get_planner` | Load the nutritionist's calendar/agenda for a date: appointments, overdue tasks, birthdays, events. Defaults to today. |\n| `webdiet_prescription_list` | Read meal plan prescriptions in WebDiet. Actions: list (all recent prescriptions — each includes \"url\" with the full direct link), get_detail (full meals/foods from a prescription URL). Always show the \"url\" field to the user when they ask for a prescription link. [Flattened action: list] |\n| `webdiet_prescription_get_detail` | Read meal plan prescriptions in WebDiet. Actions: list (all recent prescriptions — each includes \"url\" with the full direct link), get_detail (full meals/foods from a prescription URL). Always show the \"url\" field to the user when they ask for a prescription link. [Flattened action: get_detail] |\n| `webdiet_prescription_write_create` | Create, save or publish meal plan prescriptions in WebDiet. Actions: create (new prescription for patient), save (meals/foods JSON to existing prescription), publish (release prescription to patient — makes it visible on the patient portal/app). IMPORTANT: After creating and saving foods, you MUST call publish to make the prescription visible to the patient. ═══ MÉTODO DE PRESCRIÇÃO — escolha no create ═══ WebDiet tem 3 métodos: • \"Convencional\" (UI: \"Por alimentos\", URL: metodoPlanning.php) — DEFAULT e RECOMENDADO. Alimento-por-alimento. Para cálculo de macros automático (proteínas/lipídios/carboidratos/calorias) na tabela \"Alimentos prescritos\" detalhada, cada alimento DEVE incluir o campo \"id\" com o WebDiet food-DB ID numérico. Sem id, o alimento AINDA é salvo no método Convencional e aparece no card expandido da refeição com nome + medida caseira, mas sem macros. NÃO vai para a seção qualitativa — o save retorna um warning explicando. • \"Equivalentes\" (UI: \"Por equivalentes\", URL: metodoWebdiet.php) — avançado. Prescrição por grupos de equivalentes. Requer IDs do banco. • \"Qualitativo\" (UI: \"Qualitativa\", URL: metodoQualitativo.php) — texto livre por refeição. A página do Qualitativo usa estrutura de dados diferente (refs com objetos cardapio) que este adapter ainda não gera corretamente via save. Para prescrições qualitativas, recomendado: criar via UI ou usar metodo=\"Convencional\" sem food IDs (os alimentos aparecem como texto na refeição sem macros, efeito semelhante). ═══ prescricao_json (para o save) ═══ JSON array de refeições. Cada refeição: {nome, horario, alimentos:[...]}. Cada alimento: {nome, quantidade, medida_caseira, peso_gramas, id?}. AUTO-RESOLVE: se \"id\" não for enviado, o adapter procura automaticamente o melhor match no banco WebDiet (mesmo catálogo do webdiet_food_search) pelo campo \"nome\" e preenche o id antes de salvar — com isso os macros são calculados mesmo sem pré-chamar webdiet_food_search. O save retorna auto_resolved_foods {resolved, not_found, unresolved[]} indicando quais nomes não tiveram correspondência. Para controle fino (variante específica do banco, gramagem da medida caseira etc.), ainda é recomendado chamar webdiet_food_search e enviar o \"id\" explicitamente. Para evitar duplicação na UI (\"2 2 fatias (50g)\"), use quantidade numérica em \"quantidade\" e medida_caseira SEM repetir esse número e SEM sufixo \"(Xg)\" — ex.: quantidade=\"2\", medida_caseira=\"fatias\", peso_gramas=\"50\". O MCP também normaliza automaticamente se você enviar texto completo. Exemplo sem ids (o adapter resolve automaticamente; nomes pouco específicos podem não encontrar match): [{\"nome\":\"Café da Manhã\",\"horario\":\"07:00\",\"alimentos\":[{\"nome\":\"Pão integral\",\"quantidade\":\"2\",\"medida_caseira\":\"fatias\",\"peso_gramas\":\"60\"}]}] Exemplo com ids (pula o auto-resolve — ideal quando você já escolheu a variante exata): [{\"nome\":\"Almoço\",\"horario\":\"12:00\",\"alimentos\":[{\"id\":\"9153\",\"nome\":\"Arroz branco cozido\",\"quantidade\":\"4\",\"medida_caseira\":\"4 colheres de sopa (100g)\",\"peso_gramas\":\"100\"},{\"id\":\"9168\",\"nome\":\"Feijão carioca cozido\",\"quantidade\":\"2\",\"medida_caseira\":\"2 colheres (50g)\",\"peso_gramas\":\"50\"}]}] O save retorna {ok, metodo, warnings[], raw, auto_resolved_foods}. warnings avisa sobre alimentos sem id e alimentos não encontrados no banco. [Flattened action: create] Bulk support: accepts patient_ids, prescription_ids for batched execution. |\n| `webdiet_prescription_write_save` | Create, save or publish meal plan prescriptions in WebDiet. Actions: create (new prescription for patient), save (meals/foods JSON to existing prescription), publish (release prescription to patient — makes it visible on the patient portal/app). IMPORTANT: After creating and saving foods, you MUST call publish to make the prescription visible to the patient. ═══ MÉTODO DE PRESCRIÇÃO — escolha no create ═══ WebDiet tem 3 métodos: • \"Convencional\" (UI: \"Por alimentos\", URL: metodoPlanning.php) — DEFAULT e RECOMENDADO. Alimento-por-alimento. Para cálculo de macros automático (proteínas/lipídios/carboidratos/calorias) na tabela \"Alimentos prescritos\" detalhada, cada alimento DEVE incluir o campo \"id\" com o WebDiet food-DB ID numérico. Sem id, o alimento AINDA é salvo no método Convencional e aparece no card expandido da refeição com nome + medida caseira, mas sem macros. NÃO vai para a seção qualitativa — o save retorna um warning explicando. • \"Equivalentes\" (UI: \"Por equivalentes\", URL: metodoWebdiet.php) — avançado. Prescrição por grupos de equivalentes. Requer IDs do banco. • \"Qualitativo\" (UI: \"Qualitativa\", URL: metodoQualitativo.php) — texto livre por refeição. A página do Qualitativo usa estrutura de dados diferente (refs com objetos cardapio) que este adapter ainda não gera corretamente via save. Para prescrições qualitativas, recomendado: criar via UI ou usar metodo=\"Convencional\" sem food IDs (os alimentos aparecem como texto na refeição sem macros, efeito semelhante). ═══ prescricao_json (para o save) ═══ JSON array de refeições. Cada refeição: {nome, horario, alimentos:[...]}. Cada alimento: {nome, quantidade, medida_caseira, peso_gramas, id?}. AUTO-RESOLVE: se \"id\" não for enviado, o adapter procura automaticamente o melhor match no banco WebDiet (mesmo catálogo do webdiet_food_search) pelo campo \"nome\" e preenche o id antes de salvar — com isso os macros são calculados mesmo sem pré-chamar webdiet_food_search. O save retorna auto_resolved_foods {resolved, not_found, unresolved[]} indicando quais nomes não tiveram correspondência. Para controle fino (variante específica do banco, gramagem da medida caseira etc.), ainda é recomendado chamar webdiet_food_search e enviar o \"id\" explicitamente. Para evitar duplicação na UI (\"2 2 fatias (50g)\"), use quantidade numérica em \"quantidade\" e medida_caseira SEM repetir esse número e SEM sufixo \"(Xg)\" — ex.: quantidade=\"2\", medida_caseira=\"fatias\", peso_gramas=\"50\". O MCP também normaliza automaticamente se você enviar texto completo. Exemplo sem ids (o adapter resolve automaticamente; nomes pouco específicos podem não encontrar match): [{\"nome\":\"Café da Manhã\",\"horario\":\"07:00\",\"alimentos\":[{\"nome\":\"Pão integral\",\"quantidade\":\"2\",\"medida_caseira\":\"fatias\",\"peso_gramas\":\"60\"}]}] Exemplo com ids (pula o auto-resolve — ideal quando você já escolheu a variante exata): [{\"nome\":\"Almoço\",\"horario\":\"12:00\",\"alimentos\":[{\"id\":\"9153\",\"nome\":\"Arroz branco cozido\",\"quantidade\":\"4\",\"medida_caseira\":\"4 colheres de sopa (100g)\",\"peso_gramas\":\"100\"},{\"id\":\"9168\",\"nome\":\"Feijão carioca cozido\",\"quantidade\":\"2\",\"medida_caseira\":\"2 colheres (50g)\",\"peso_gramas\":\"50\"}]}] O save retorna {ok, metodo, warnings[], raw, auto_resolved_foods}. warnings avisa sobre alimentos sem id e alimentos não encontrados no banco. [Flattened action: save] Bulk support: accepts patient_ids, prescription_ids for batched execution. |\n| `webdiet_prescription_write_publish` | Create, save or publish meal plan prescriptions in WebDiet. Actions: create (new prescription for patient), save (meals/foods JSON to existing prescription), publish (release prescription to patient — makes it visible on the patient portal/app). IMPORTANT: After creating and saving foods, you MUST call publish to make the prescription visible to the patient. ═══ MÉTODO DE PRESCRIÇÃO — escolha no create ═══ WebDiet tem 3 métodos: • \"Convencional\" (UI: \"Por alimentos\", URL: metodoPlanning.php) — DEFAULT e RECOMENDADO. Alimento-por-alimento. Para cálculo de macros automático (proteínas/lipídios/carboidratos/calorias) na tabela \"Alimentos prescritos\" detalhada, cada alimento DEVE incluir o campo \"id\" com o WebDiet food-DB ID numérico. Sem id, o alimento AINDA é salvo no método Convencional e aparece no card expandido da refeição com nome + medida caseira, mas sem macros. NÃO vai para a seção qualitativa — o save retorna um warning explicando. • \"Equivalentes\" (UI: \"Por equivalentes\", URL: metodoWebdiet.php) — avançado. Prescrição por grupos de equivalentes. Requer IDs do banco. • \"Qualitativo\" (UI: \"Qualitativa\", URL: metodoQualitativo.php) — texto livre por refeição. A página do Qualitativo usa estrutura de dados diferente (refs com objetos cardapio) que este adapter ainda não gera corretamente via save. Para prescrições qualitativas, recomendado: criar via UI ou usar metodo=\"Convencional\" sem food IDs (os alimentos aparecem como texto na refeição sem macros, efeito semelhante). ═══ prescricao_json (para o save) ═══ JSON array de refeições. Cada refeição: {nome, horario, alimentos:[...]}. Cada alimento: {nome, quantidade, medida_caseira, peso_gramas, id?}. AUTO-RESOLVE: se \"id\" não for enviado, o adapter procura automaticamente o melhor match no banco WebDiet (mesmo catálogo do webdiet_food_search) pelo campo \"nome\" e preenche o id antes de salvar — com isso os macros são calculados mesmo sem pré-chamar webdiet_food_search. O save retorna auto_resolved_foods {resolved, not_found, unresolved[]} indicando quais nomes não tiveram correspondência. Para controle fino (variante específica do banco, gramagem da medida caseira etc.), ainda é recomendado chamar webdiet_food_search e enviar o \"id\" explicitamente. Para evitar duplicação na UI (\"2 2 fatias (50g)\"), use quantidade numérica em \"quantidade\" e medida_caseira SEM repetir esse número e SEM sufixo \"(Xg)\" — ex.: quantidade=\"2\", medida_caseira=\"fatias\", peso_gramas=\"50\". O MCP também normaliza automaticamente se você enviar texto completo. Exemplo sem ids (o adapter resolve automaticamente; nomes pouco específicos podem não encontrar match): [{\"nome\":\"Café da Manhã\",\"horario\":\"07:00\",\"alimentos\":[{\"nome\":\"Pão integral\",\"quantidade\":\"2\",\"medida_caseira\":\"fatias\",\"peso_gramas\":\"60\"}]}] Exemplo com ids (pula o auto-resolve — ideal quando você já escolheu a variante exata): [{\"nome\":\"Almoço\",\"horario\":\"12:00\",\"alimentos\":[{\"id\":\"9153\",\"nome\":\"Arroz branco cozido\",\"quantidade\":\"4\",\"medida_caseira\":\"4 colheres de sopa (100g)\",\"peso_gramas\":\"100\"},{\"id\":\"9168\",\"nome\":\"Feijão carioca cozido\",\"quantidade\":\"2\",\"medida_caseira\":\"2 colheres (50g)\",\"peso_gramas\":\"50\"}]}] O save retorna {ok, metodo, warnings[], raw, auto_resolved_foods}. warnings avisa sobre alimentos sem id e alimentos não encontrados no banco. [Flattened action: publish] Bulk support: accepts patient_ids, prescription_ids for batched execution. |\n| `webdiet_food_search` | Search WebDiet food database for numeric food ids (needed for full macros in Convencional / metodoPlanning prescriptions). Uses the same data source as the panel (carregarAlimentosAvulsos.php): the full catalog is cached per MCP session and filtered client-side (min 3 characters in keyword, same as the planning UI). Returns id, nome, grupo, origem, macros (kcal, proteinas, lipidios, carboidratos, fibras), and medidas_caseiras with gram weights. |\n| `webdiet_orientacoes_list` | Read \"Listas e Orientações\" (guidelines/orientation lists) in WebDiet. Actions: list (orientation records for a patient), list_banco (orientation bank / favorites — saved templates available to send to any patient). The orientation bank contains nutritionist's saved/favorite orientations (e.g. \"Chás diuréticos\", \"Refeições livres\") that can be sent to any patient. Use list_banco to see available names, then pass those exact names to webdiet_orientacoes_write action=send. [Flattened action: list] Bulk support: accepts patient_ids for batched execution. |\n| `webdiet_orientacoes_list_banco` | Read \"Listas e Orientações\" (guidelines/orientation lists) in WebDiet. Actions: list (orientation records for a patient), list_banco (orientation bank / favorites — saved templates available to send to any patient). The orientation bank contains nutritionist's saved/favorite orientations (e.g. \"Chás diuréticos\", \"Refeições livres\") that can be sent to any patient. Use list_banco to see available names, then pass those exact names to webdiet_orientacoes_write action=send. [Flattened action: list_banco] Bulk support: accepts patient_ids for batched execution. |\n| `webdiet_orientacoes_write_save` | Create / update / send \"Listas e Orientações\" in WebDiet. Actions: save (create/update an orientation for a patient), send (send orientation(s) from the bank to a patient by exact name). save: non-ASCII emojis in \"texto\" are encoded as HTML numeric entities so they render on the patient portal (avoids \"?\" placeholders). If \"titulo\" is set, an <h1> with the title is prepended to \"texto\" for the patient view (portal does not show titulo alone). [Flattened action: save] Bulk support: accepts patient_ids, orientacao_ids for batched execution. |\n| `webdiet_orientacoes_write_send` | Create / update / send \"Listas e Orientações\" in WebDiet. Actions: save (create/update an orientation for a patient), send (send orientation(s) from the bank to a patient by exact name). save: non-ASCII emojis in \"texto\" are encoded as HTML numeric entities so they render on the patient portal (avoids \"?\" placeholders). If \"titulo\" is set, an <h1> with the title is prepended to \"texto\" for the patient view (portal does not show titulo alone). [Flattened action: send] Bulk support: accepts patient_ids, orientacao_ids for batched execution. |\n| `webdiet_manipulados_list` | Read \"Prescrição de manipulados\" (compounded/magistral pharmacy formulas) in WebDiet. Actions: - list_banco → search the WebDiet formula bank (~249 pre-built templates: ~120 disponíveis + ~129 de extensões pagas). Filtros: keyword (busca livre na indicação clínica = nome da fórmula), categoria (suplementos | cosmeceuticos | dermatologicos | extensoes), incluir_bloqueados (default false — esconde fórmulas de extensões pagas). Cada item retornado contém: nome (= a indicação clínica), categoria, texto_html (fórmula completa com componentes, doses e modo de usar), bloqueado. - list → list manipulados already prescribed to a patient (id, nome, data, liberado, pdf_url + pdf_global_url). - get → fetch full HTML content (componentes + doses) of a specific manipulado already prescribed to a patient. For write operations (save / send / publish / duplicate) use webdiet_manipulados_write. For destructive delete use webdiet_manipulados_delete. [Flattened action: list] Bulk support: accepts patient_ids, manipulado_ids for batched execution. |\n| `webdiet_manipulados_list_banco` | Read \"Prescrição de manipulados\" (compounded/magistral pharmacy formulas) in WebDiet. Actions: - list_banco → search the WebDiet formula bank (~249 pre-built templates: ~120 disponíveis + ~129 de extensões pagas). Filtros: keyword (busca livre na indicação clínica = nome da fórmula), categoria (suplementos | cosmeceuticos | dermatologicos | extensoes), incluir_bloqueados (default false — esconde fórmulas de extensões pagas). Cada item retornado contém: nome (= a indicação clínica), categoria, texto_html (fórmula completa com componentes, doses e modo de usar), bloqueado. - list → list manipulados already prescribed to a patient (id, nome, data, liberado, pdf_url + pdf_global_url). - get → fetch full HTML content (componentes + doses) of a specific manipulado already prescribed to a patient. For write operations (save / send / publish / duplicate) use webdiet_manipulados_write. For destructive delete use webdiet_manipulados_delete. [Flattened action: list_banco] Bulk support: accepts patient_ids, manipulado_ids for batched execution. |\n| `webdiet_manipulados_get` | Read \"Prescrição de manipulados\" (compounded/magistral pharmacy formulas) in WebDiet. Actions: - list_banco → search the WebDiet formula bank (~249 pre-built templates: ~120 disponíveis + ~129 de extensões pagas). Filtros: keyword (busca livre na indicação clínica = nome da fórmula), categoria (suplementos | cosmeceuticos | dermatologicos | extensoes), incluir_bloqueados (default false — esconde fórmulas de extensões pagas). Cada item retornado contém: nome (= a indicação clínica), categoria, texto_html (fórmula completa com componentes, doses e modo de usar), bloqueado. - list → list manipulados already prescribed to a patient (id, nome, data, liberado, pdf_url + pdf_global_url). - get → fetch full HTML content (componentes + doses) of a specific manipulado already prescribed to a patient. For write operations (save / send / publish / duplicate) use webdiet_manipulados_write. For destructive delete use webdiet_manipulados_delete. [Flattened action: get] Bulk support: accepts patient_ids, manipulado_ids for batched execution. |\n| `webdiet_manipulados_write_save` | Create / send / publish / duplicate manipulados in WebDiet. Actions: - save → create or update a manipulado for a patient. texto = raw HTML (tinyMCE content), nome = formula name. Omit manipulado_id to create; pass it to update an existing one. Returns id and pdf_url. - send → SHORTCUT prescribir + publicar: copia uma ou mais fórmulas do banco (por nome exato vindo de webdiet_manipulados list_banco) para o paciente como manipulados novos. Já fica liberado=true (visível no app/portal do paciente) imediatamente. Skips fórmulas bloqueadas com mensagem de erro. - publish → toggle liberar/disponibilizar status (makes the formula visible/invisible on the patient portal/app). Server toggles and returns the NEW state. - duplicate → duplicate an existing manipulado (creates a copy \"(cópia)\"). For destructive delete use webdiet_manipulados_delete. [Flattened action: save] Bulk support: accepts patient_ids, manipulado_ids for batched execution. |\n| `webdiet_manipulados_write_send` | Create / send / publish / duplicate manipulados in WebDiet. Actions: - save → create or update a manipulado for a patient. texto = raw HTML (tinyMCE content), nome = formula name. Omit manipulado_id to create; pass it to update an existing one. Returns id and pdf_url. - send → SHORTCUT prescribir + publicar: copia uma ou mais fórmulas do banco (por nome exato vindo de webdiet_manipulados list_banco) para o paciente como manipulados novos. Já fica liberado=true (visível no app/portal do paciente) imediatamente. Skips fórmulas bloqueadas com mensagem de erro. - publish → toggle liberar/disponibilizar status (makes the formula visible/invisible on the patient portal/app). Server toggles and returns the NEW state. - duplicate → duplicate an existing manipulado (creates a copy \"(cópia)\"). For destructive delete use webdiet_manipulados_delete. [Flattened action: send] Bulk support: accepts patient_ids, manipulado_ids for batched execution. |\n| `webdiet_manipulados_write_publish` | Create / send / publish / duplicate manipulados in WebDiet. Actions: - save → create or update a manipulado for a patient. texto = raw HTML (tinyMCE content), nome = formula name. Omit manipulado_id to create; pass it to update an existing one. Returns id and pdf_url. - send → SHORTCUT prescribir + publicar: copia uma ou mais fórmulas do banco (por nome exato vindo de webdiet_manipulados list_banco) para o paciente como manipulados novos. Já fica liberado=true (visível no app/portal do paciente) imediatamente. Skips fórmulas bloqueadas com mensagem de erro. - publish → toggle liberar/disponibilizar status (makes the formula visible/invisible on the patient portal/app). Server toggles and returns the NEW state. - duplicate → duplicate an existing manipulado (creates a copy \"(cópia)\"). For destructive delete use webdiet_manipulados_delete. [Flattened action: publish] Bulk support: accepts patient_ids, manipulado_ids for batched execution. |\n| `webdiet_manipulados_write_duplicate` | Create / send / publish / duplicate manipulados in WebDiet. Actions: - save → create or update a manipulado for a patient. texto = raw HTML (tinyMCE content), nome = formula name. Omit manipulado_id to create; pass it to update an existing one. Returns id and pdf_url. - send → SHORTCUT prescribir + publicar: copia uma ou mais fórmulas do banco (por nome exato vindo de webdiet_manipulados list_banco) para o paciente como manipulados novos. Já fica liberado=true (visível no app/portal do paciente) imediatamente. Skips fórmulas bloqueadas com mensagem de erro. - publish → toggle liberar/disponibilizar status (makes the formula visible/invisible on the patient portal/app). Server toggles and returns the NEW state. - duplicate → duplicate an existing manipulado (creates a copy \"(cópia)\"). For destructive delete use webdiet_manipulados_delete. [Flattened action: duplicate] Bulk support: accepts patient_ids, manipulado_ids for batched execution. |\n| `webdiet_manipulados_delete` | Permanently delete a manipulado for a patient. Irreversible. Bulk support: accepts patient_ids, manipulado_ids for batched execution. |\n| `webdiet_calculo_energetico_list` | Read energy expenditure calculations (Cálculo Energético) in WebDiet. Actions: list (all calculations for a patient), get (load saved data). Results: TMB (basal metabolic rate), GET (total energy expenditure) in Kcal/dia and Kcal/kg. [Flattened action: list] Bulk support: accepts patient_ids, calculo_ids for batched execution. |\n| `webdiet_calculo_energetico_get` | Read energy expenditure calculations (Cálculo Energético) in WebDiet. Actions: list (all calculations for a patient), get (load saved data). Results: TMB (basal metabolic rate), GET (total energy expenditure) in Kcal/dia and Kcal/kg. [Flattened action: get] Bulk support: accepts patient_ids, calculo_ids for batched execution. |\n| `webdiet_calculo_energetico_write_create` | Create / update energy expenditure calculations in WebDiet. Actions: create (new calculation), save (update existing calculation). Supports 24+ formulas: Harris-Benedict 1919/1984, FAO/WHO 2004, EER/IOM 2005, EER 2023, Katch-McArdle 1996, Cunningham 1980, Mifflin-St Jeor 1990, and more. Activity factors: 1.0 (none), 1.2 (sedentary), 1.375 (light), 1.55 (moderate), 1.725 (intense), 1.9 (very intense). Injury factors: 1.0 (none) up to 2.0 (burns 70-90%). [Flattened action: create] Bulk support: accepts patient_ids, calculo_ids for batched execution. |\n| `webdiet_calculo_energetico_write_save` | Create / update energy expenditure calculations in WebDiet. Actions: create (new calculation), save (update existing calculation). Supports 24+ formulas: Harris-Benedict 1919/1984, FAO/WHO 2004, EER/IOM 2005, EER 2023, Katch-McArdle 1996, Cunningham 1980, Mifflin-St Jeor 1990, and more. Activity factors: 1.0 (none), 1.2 (sedentary), 1.375 (light), 1.55 (moderate), 1.725 (intense), 1.9 (very intense). Injury factors: 1.0 (none) up to 2.0 (burns 70-90%). [Flattened action: save] Bulk support: accepts patient_ids, calculo_ids for batched execution. |\n| `webdiet_calculo_energetico_delete` | Permanently delete an energy expenditure calculation. Irreversible. Bulk support: accepts calculo_ids for batched execution. |\n| `webdiet_list_anexos` | Load educational slides or cloud file attachments. Use laminasAnexos for educational slides/laminas (~238 items with PDFs about nutrition topics), cloudAnexos for uploaded cloud files. For guidelines/orientations specifically, use webdiet_orientacoes action=list_banco. Bulk support: accepts patient_ids for batched execution. |\n| `webdiet_get_upload_command` | Returns a ready-to-run curl command that uploads a file directly to the server without reading it into context. RECOMMENDED for large files (images, PDFs, lab results). The flow: 1. Call this tool with the file_path the user provided 2. Execute the returned curl command in your code execution sandbox (or tell the user to run it) 3. The command returns a JSON with a \"code\" (e.g. \"file-a1b2c3d4\") 4. Call webdiet_upload_anexo with upload_code=that_code to attach it to the patient This avoids loading large file contents into the conversation context. |\n| `webdiet_upload_anexo` | Upload a file (PDF, image, etc.) to a patient's attachments in WebDiet. Three ways to provide the file (use ONE): 1. upload_code — from webdiet_get_upload_command curl (RECOMMENDED for large files) 2. file_url — direct URL to download the file (e.g. https://example.com/report.pdf) 3. file_base64 — base64-encoded file content (small files only) Supported tipos: anexo (patient attachment — default), cloud (WebDiet Cloud storage), prontuario (clinical record), antropometria (body measurement report), exame (lab exam), perfil (patient photo), evolucao (photo evolution). Bulk support: accepts patient_ids for batched execution. |\n| `webdiet_list_message_templates` | Load patient welcome message templates. Returns the active layout and all available template layouts. |\n| `webdiet_financeiro_list` | Read financial records (payments, receipts) in WebDiet. Actions: list (all records in date range — defaults to last 30 days), categories (get available categories for income/expense). Each record includes: id, nome, tipo (entrada=income, saida=expense), categoria, valor, data, observacao, recibo status, and recibo_url when receipt was generated. Use inicio/fim in YYYYMMDDHHmm format to filter by date range (e.g. \"202604010000\" to \"202604302359\" for April 2026). [Flattened action: list] |\n| `webdiet_financeiro_categories` | Read financial records (payments, receipts) in WebDiet. Actions: list (all records in date range — defaults to last 30 days), categories (get available categories for income/expense). Each record includes: id, nome, tipo (entrada=income, saida=expense), categoria, valor, data, observacao, recibo status, and recibo_url when receipt was generated. Use inicio/fim in YYYYMMDDHHmm format to filter by date range (e.g. \"202604010000\" to \"202604302359\" for April 2026). [Flattened action: categories] |\n| `webdiet_financeiro_write` | Create financial records in WebDiet. tipo: \"entrada\" for income (e.g. consultation payment received), \"saida\" for expense. Default income categories: Consulta, Retorno. Default expense categories: Internet, Aluguel. Use nova_cat to create a custom category. valor format: use comma for decimals (e.g. \"300,00\" or \"150,50\"). forma: payment method (e.g. Pix, Dinheiro, Cartão de crédito, Transferência). parcelas: number of installments (default 1). For installments, dataCobranca is the first billing date. For destructive delete use webdiet_financeiro_delete. Bulk support: accepts patient_ids for batched execution. |\n| `webdiet_financeiro_delete` | Permanently delete a financial record. Irreversible. Bulk support: accepts financeiro_ids for batched execution. |\n| `webdiet_recibo` | Generate or update a receipt (recibo) for a financial record in WebDiet. Pass the financeiro_id from webdiet_financeiro list. dados_recibo is a JSON array with 6 fields: [patient_name, cpf, address, city, nutritionist_name, crn_number]. After generating, the recibo_url in the financial record will point to the PDF receipt. Returns the receipt PDF URL that can be shared with the patient. Bulk support: accepts financeiro_ids for batched execution. |\n\nDetalhe de cada tool: [docs/ferramentas.md](docs/ferramentas.md)\n\n---\n\n## Preços\n\nGrátis.\n\n---\n\n## Privacidade & LGPD\n\n- **Sub-processadores**: o LLM host que você escolher (Claude, ChatGPT, Cursor, agente próprio). Lista completa em [docs/privacidade-lgpd.md](docs/privacidade-lgpd.md).\n- Os dados retornados pelas tools são enviados ao **LLM host que você escolher**, sub-processador fora do nosso controle. Recomendamos planos com opt-out de treinamento.\n\n---\n\n## Perguntas frequentes\n\n**O servidor é open source?**\nO servidor é proprietário (hosted). Este repositório é o wrapper público com manifestos, docs e skills — tudo MIT.\n\n**Posso usar com agente próprio (não Claude/Cursor)?**\nSim — qualquer cliente que suporte MCP over HTTP. URL: `https://api.mcp.ai/p_webdiet`.\n\n\n---\n\n## Suporte\n\n- 📧 [webdiet@mcp.ai](mailto:webdiet@mcp.ai)\n- 🐛 [GitHub Issues](https://github.com/mcp-dir/webdiet-mcp/issues)\n- 📄 [docs/](docs/)\n\n---\n\n## Licença\n\nMIT — veja [LICENSE](LICENSE). O servidor MCP em `api.mcp.ai/p_webdiet` é proprietário (hosted); este repositório (manifestos, docs, skills) é MIT.\n",
  "bytes": 43180,
  "sha": "3b4cf47d2772a3567bd1d3f63d044e69213c66636f7f084b37f5ab6f52e8bfd0",
  "repo_slug": "mcp-dir/webdiet-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_mcp_dir_webdiet_mcp_0f97727a/readme"
}