Skip to content

CRM

by mcp-dir · remote · no sign-in to list tools · v0.1.0 · published by GitHub user mcp-dir

Your own CRM, fully customizable and agent-driven. Start with contacts, companies and a sales pipeli

Deletes · 4Final · 1Changes · 18

36 tools: 4 can delete or cancel things, 1 do something that can't be undone, 18 change things and 13 only read.

Scanned Oct 21, 2026

6 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http crm https://api.mcp.ai/p_crm

Findings

Matches of fixed checks, with the text they matched.

4 warn2 info
  • The server marks "crm_delete_records" not destructive (destructiveHint: false), and its own name, description or input give the class "destructive".

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "crm_delete_records" says "delete": a word for removing or ending something.

    What this check looks for
  • The server marks "crm_delete_object" not destructive (destructiveHint: false), and its own name, description or input give the class "destructive".

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "crm_delete_object" says "delete": a word for removing or ending something.

    What this check looks for
  • The server marks "crm_remove_field" not destructive (destructiveHint: false), and its own name, description or input give the class "destructive".

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "crm_remove_field" says "remove": a word for removing or ending something.

    What this check looks for
  • The server marks "crm_delete_file" not destructive (destructiveHint: false), and its own name, description or input give the class "destructive".

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "crm_delete_file" says "delete": a word for removing or ending something.

    What this check looks for
  • The description mentions "credentials".

    Matched text

    description: "...nticated:true and empty pending[]. When credentials are missing, returns connect_url for th..."

    What this check looks for
  • The description mentions "credential".

    Matched text

    description: "...ating the tool list. If the MCP needs a credential/login, invoke returns a connect link; i..."

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

36 tools

Deletes or cancels 4Claude Code: deny
  • crm_delete_fileRemove um ou mais arquivos (apaga do storage e libera o espaço contabilizado).1 finding

    Why it is in this group

    • The name "crm_delete_file" says "delete": a word for removing or ending something.
    • The server marks it not destructive (destructiveHint: false), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "crm_delete_file" not destructive (destructiveHint: false), and its own name, description or input give the class "destructive".

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "crm_delete_file" says "delete": a word for removing or ending something.

      What this check looks for
    Description, as the server wrote it
    Remove um ou mais arquivos (apaga do storage e libera o espaço contabilizado).

    Annotations the server declares

    • title: crm_delete_file
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • crm_delete_objectRemove um objeto CUSTOM (objetos de sistema não podem ser removidos).1 finding

    Why it is in this group

    • The name "crm_delete_object" says "delete": a word for removing or ending something.
    • The server marks it not destructive (destructiveHint: false), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "crm_delete_object" not destructive (destructiveHint: false), and its own name, description or input give the class "destructive".

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "crm_delete_object" says "delete": a word for removing or ending something.

      What this check looks for
    Description, as the server wrote it
    Remove um objeto CUSTOM (objetos de sistema não podem ser removidos). Se houver registros, passe delete_records:true para apagar tudo junto.

    Annotations the server declares

    • title: crm_delete_object
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • crm_delete_recordsRemove um ou mais registros de um objeto por id.1 finding

    Why it is in this group

    • The name "crm_delete_records" says "delete": a word for removing or ending something.
    • The server marks it not destructive (destructiveHint: false), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "crm_delete_records" not destructive (destructiveHint: false), and its own name, description or input give the class "destructive".

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "crm_delete_records" says "delete": a word for removing or ending something.

      What this check looks for
    Description, as the server wrote it
    Remove um ou mais registros de um objeto por id.

    Annotations the server declares

    • title: crm_delete_records
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • crm_remove_fieldRemove um campo CUSTOM (soft-delete: some do schema, mas os valores já gravados ficam preservados).1 finding

    Why it is in this group

    • The name "crm_remove_field" says "remove": a word for removing or ending something.
    • The server marks it not destructive (destructiveHint: false), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "crm_remove_field" not destructive (destructiveHint: false), and its own name, description or input give the class "destructive".

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "crm_remove_field" says "remove": a word for removing or ending something.

      What this check looks for
    Description, as the server wrote it
    Remove um campo CUSTOM (soft-delete: some do schema, mas os valores já gravados ficam preservados). Campos de sistema não podem ser removidos.

    Annotations the server declares

    • title: crm_remove_field
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
Can't be undone 1Claude Code: ask
  • crm_publish_fileTorna um arquivo PÚBLICO e devolve uma URL estável (`https://api.mcp.ai/f/<token>`) pra embutir num site (ex.: thumbnail).No findings

    Why it is in this group

    • The name "crm_publish_file" says "publish": a word for a change that another call does not undo.
    Description, as the server wrote it
    Torna um arquivo PÚBLICO e devolve uma URL estável (`https://api.mcp.ai/f/<token>`) pra embutir num site (ex.: thumbnail). O objeto continua privado no storage, o token é a chave (revogável com crm_unpublish_file). Egress da visualização pública é contabilizado. Bulk support: accepts file_ids for batched execution.

    Annotations the server declares

    • title: crm_publish_file
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
Changes things 18Claude Code: ask
  • authenticateMCP.AI for IDE agents (Cursor, etc.): log in in the browser, copy the access token.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    MCP.AI for IDE agents (Cursor, etc.): log in in the browser, copy the access token. Best: add it to this server's config as a header `Authorization: Bearer <token>` for a permanent, non-expiring connection. Or paste it here for a session-only login: call with { token: "<jwt>" } after the user pastes, or with no args to get the link.

    Annotations the server declares

    • title: Authenticate
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • crm_add_fieldAdiciona um CAMPO custom a um objeto (sem migração; registros antigos ficam sem a key).No findings

    Why it is in this group

    • The name "crm_add_field" says "add": a word for a change.
    Description, as the server wrote it
    Adiciona um CAMPO custom a um objeto (sem migração; registros antigos ficam sem a key). Tipos: string text integer float boolean date datetime singleselect multiselect email phone url currency relation user_ref json group.

    Annotations the server declares

    • title: crm_add_field
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • crm_confirm_uploadConfirma o upload depois do PUT na upload_url (o storage valida o tamanho real).No findings

    Why it is in this group

    • The name "crm_confirm_upload" says "upload": a word for a change.
    Description, as the server wrote it
    Confirma o upload depois do PUT na upload_url (o storage valida o tamanho real). Marca o arquivo como pronto e contabiliza no uso. Bulk support: accepts file_ids for batched execution.

    Annotations the server declares

    • title: crm_confirm_upload
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • crm_create_recordsCria um registro (ou vários) de um objeto.No findings

    Why it is in this group

    • The name "crm_create_records" says "create": a word for a change.
    Description, as the server wrote it
    Cria um registro (ou vários) de um objeto. Passe `object` (ex.: 'contact', 'deal') e `data` (objeto JSON com os campos por key). Para vários, use `records` (array JSON de {data}).

    Annotations the server declares

    • title: crm_create_records
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • crm_define_objectCria um OBJETO custom no CRM (além de contact/company/deal) e ganha CRUD/API automático.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Cria um OBJETO custom no CRM (além de contact/company/deal) e ganha CRUD/API automático. Passe `key` (api name, a-z/0-9/_), `label` e opcionalmente `fields` (array JSON de definições de campo).

    Annotations the server declares

    • title: crm_define_object
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • crm_download_fileGera uma URL presigned de download (GET) pra um arquivo.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Gera uma URL presigned de download (GET) pra um arquivo. A URL expira em alguns minutos. Bulk support: accepts file_ids for batched execution.

    Annotations the server declares

    • title: crm_download_file
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • crm_move_stageMove um registro de um objeto kanban (ex.: deal) para outra etapa do funil.No findings

    Why it is in this group

    • The name "crm_move_stage" says "move": a word for a change.
    Description, as the server wrote it
    Move um registro de um objeto kanban (ex.: deal) para outra etapa do funil. Valida a etapa contra as opções do campo de stage. Bulk support: accepts ids for batched execution.

    Annotations the server declares

    • title: crm_move_stage
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • crm_unpublish_fileRevoga o link público de um arquivo (o token para de funcionar na hora).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Revoga o link público de um arquivo (o token para de funcionar na hora). Bulk support: accepts file_ids for batched execution.

    Annotations the server declares

    • title: crm_unpublish_file
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • crm_update_fieldEdita um campo: rótulo, obrigatório, visível, posição, opções, indexação.No findings

    Why it is in this group

    • The name "crm_update_field" says "update": a word for a change.
    Description, as the server wrote it
    Edita um campo: rótulo, obrigatório, visível, posição, opções, indexação. Mudança de TIPO só é permitida se for um alargamento seguro (ex.: integer→float); mudança com perda é bloqueada (crie um campo novo e migre).

    Annotations the server declares

    • title: crm_update_field
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • crm_update_objectEdita um objeto: rótulo, campo de exibição, módulo ou config de kanban (a key é imutável).No findings

    Why it is in this group

    • The name "crm_update_object" says "update": a word for a change.
    Description, as the server wrote it
    Edita um objeto: rótulo, campo de exibição, módulo ou config de kanban (a key é imutável). Vale para objetos de sistema e custom.

    Annotations the server declares

    • title: crm_update_object
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • crm_update_recordsAtualiza um registro (merge parcial) por id.No findings

    Why it is in this group

    • The name "crm_update_records" says "update": a word for a change.
    Description, as the server wrote it
    Atualiza um registro (merge parcial) por id. Passe `object`, `id` e `data` (só os campos a mudar; null apaga o campo). Para vários, use `updates` (array JSON de {id, data}). Bulk support: accepts ids for batched execution.

    Annotations the server declares

    • title: crm_update_records
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • crm_upload_fileInicia o upload de um arquivo (até 200 MB) e devolve uma URL presigned (`upload_url`) pra fazer o PUT direto no storage, mais o `file_id`.No findings

    Why it is in this group

    • The name "crm_upload_file" says "upload": a word for a change.
    Description, as the server wrote it
    Inicia o upload de um arquivo (até 200 MB) e devolve uma URL presigned (`upload_url`) pra fazer o PUT direto no storage, mais o `file_id`. Depois do PUT, chame crm_confirm_upload. Opcional: anexe a um registro com `object`+`record_id`. Bulk support: accepts record_ids for batched execution.

    Annotations the server declares

    • title: crm_upload_file
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • crm_upload_from_urlSobe um arquivo A PARTIR DE UMA URL (a plataforma baixa e armazena, até 200 MB) — o jeito do AGENTE subir via API sem segurar os bytes.No findings

    Why it is in this group

    • The name "crm_upload_from_url" says "upload": a word for a change.
    Description, as the server wrote it
    Sobe um arquivo A PARTIR DE UMA URL (a plataforma baixa e armazena, até 200 MB) — o jeito do AGENTE subir via API sem segurar os bytes. Devolve o arquivo já pronto. Opcional: anexe a um registro com object+record_id. Bulk support: accepts record_ids for batched execution.

    Annotations the server declares

    • title: crm_upload_from_url
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • crm_usageUso de storage deste CRM: bytes do banco + bytes de arquivos, total em GB, nº de arquivos e egress acumulado.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Uso de storage deste CRM: bytes do banco + bytes de arquivos, total em GB, nº de arquivos e egress acumulado. É a base do que é cobrado (storage GB-mês + egress).

    Annotations the server declares

    • title: crm_usage
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • marketplaceThe official mcp.ai marketplace — the in-platform catalog of every MCP/tool, AND the way to run them.1 finding

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.

    Findings

    • Info

      The description mentions "credential".

      Matched text

      description: "...ating the tool list. If the MCP needs a credential/login, invoke returns a connect link; i..."

      What this check looks for
    Description, as the server wrote it
    The official mcp.ai marketplace — the in-platform catalog of every MCP/tool, AND the way to run them. Covers capability requests like "find an MCP that does X", "consulta um CPF", "is there a tool for Y". Core flow: action=search discovers MCPs by intent → describe returns one MCP's full profile (every tool with its id + params, pricing, auth) so you pick the right tool_id → invoke RUNS that tool. KEY: invoke works even when the MCP is NOT installed — it runs the tool pontualmente (one-off), without adding the MCP to the toolkit and without bloating the tool list. If the MCP needs a credential/login, invoke returns a connect link; if it is paid and the wallet is empty, invoke returns a checkout/top-up link (the user opens it, then you retry). Use install only to make an MCP PERMANENT in the active toolkit (its tools then show up natively in future sessions); prefer invoke for a single/occasional use. list_tools lists what is callable right now. subscribe/cancel handle per-MCP billing; report_bug sends feedback; request_mcp asks us to build a NEW MCP when nothing fits. Search/describe flag installed_in_toolkit vs installed_in_workspace. Writes (install/uninstall/subscribe/cancel and the one-off install behind invoke) require workspace owner/admin. It also carries the mcp.ai PROMPT LIBRARY, which is about ready-made prompt TEXT rather than MCPs: search_prompts finds one, get_prompt returns its full text with {{variables}} filled, and publish_prompt saves a prompt and returns a shareable mcp.ai/p/<slug> link that opens without login.

    Annotations the server declares

    • title: Marketplace
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • report_bugReport a bug, missing feature, or send feedback.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Report a bug, missing feature, or send feedback. Include the conversation array with recent messages for reproduction.

    Annotations the server declares

    • title: Report Bug
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
Only reads 13Claude Code: allow
  • connectReturns connection status and URLs.1 finding

    Why it is in this group

    • The description's first verb is "return": a word for reading.

    Findings

    • Info

      The description mentions "credentials".

      Matched text

      description: "...nticated:true and empty pending[]. When credentials are missing, returns connect_url for th..."

      What this check looks for
    Description, as the server wrote it
    Returns connection status and URLs. When all providers are connected, returns authenticated:true and empty pending[]. When credentials are missing, returns connect_url for the toolkit and per-install URLs.

    Annotations the server declares

    • title: Connection Status
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • crm_describeDescreve o schema do CRM: todos os objetos (contact, company, deal e quaisquer custom) com seus campos (key, tipo, obrigatório, opções, relações) e o kanban.No findings

    Why it is in this group

    • The name "crm_describe" says "describe": a word for reading.
    Description, as the server wrote it
    Descreve o schema do CRM: todos os objetos (contact, company, deal e quaisquer custom) com seus campos (key, tipo, obrigatório, opções, relações) e o kanban. CHAME ISTO PRIMEIRO para saber quais objetos/campos existem antes de criar/ler registros.

    Annotations the server declares

    • title: crm_describe
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • crm_get_fileMetadados de um arquivo (nome, tamanho, content_type, status, anexo).No findings

    Why it is in this group

    • The name "crm_get_file" says "get": a word for reading.
    Description, as the server wrote it
    Metadados de um arquivo (nome, tamanho, content_type, status, anexo). Bulk support: accepts file_ids for batched execution.

    Annotations the server declares

    • title: crm_get_file
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • crm_get_objectDetalha UM objeto: seu rótulo, kanban e todos os campos (key, tipo, obrigatório, opções, relação).No findings

    Why it is in this group

    • The name "crm_get_object" says "get": a word for reading.
    Description, as the server wrote it
    Detalha UM objeto: seu rótulo, kanban e todos os campos (key, tipo, obrigatório, opções, relação). Versão focada do crm_describe.

    Annotations the server declares

    • title: crm_get_object
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • crm_get_recordsBusca um ou mais registros de um objeto por id.No findings

    Why it is in this group

    • The name "crm_get_records" says "get": a word for reading.
    Description, as the server wrote it
    Busca um ou mais registros de um objeto por id.

    Annotations the server declares

    • title: crm_get_records
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • crm_list_accountsLista os CRMs conectados neste install.No findings

    Why it is in this group

    • The name "crm_list_accounts" says "list": a word for reading.
    Description, as the server wrote it
    Lista os CRMs conectados neste install. Retorna cada um com id, rótulo e is_default (true quando só há um, não precisa passar `account` nas outras tools).

    Annotations the server declares

    • title: crm_list_accounts
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • crm_list_filesLista os arquivos do CRM (id, nome, tamanho, status).No findings

    Why it is in this group

    • The name "crm_list_files" says "list": a word for reading.
    Description, as the server wrote it
    Lista os arquivos do CRM (id, nome, tamanho, status). Opcionalmente filtra os anexados a um objeto/registro. Bulk support: accepts record_ids for batched execution.

    Annotations the server declares

    • title: crm_list_files
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • crm_list_objectsLista os objetos do CRM (key, rótulo, módulo, kanban).No findings

    Why it is in this group

    • The name "crm_list_objects" says "list": a word for reading.
    Description, as the server wrote it
    Lista os objetos do CRM (key, rótulo, módulo, kanban). Versão enxuta do crm_describe, sem os campos.

    Annotations the server declares

    • title: crm_list_objects
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • crm_list_recordsLista registros de um objeto, com filtro/ordenação/paginação.No findings

    Why it is in this group

    • The name "crm_list_records" says "list": a word for reading.
    Description, as the server wrote it
    Lista registros de um objeto, com filtro/ordenação/paginação. `filter` é um objeto JSON: {campo: valor} ou {campo: {op: valor}} (ops: eq ne gt gte lt lte in nin contains exists).

    Annotations the server declares

    • title: crm_list_records
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • show_versionShow the current MCP platform and adapter versions.No findings

    Why it is in this group

    • The name "show_version" says "show": a word for reading.
    Description, as the server wrote it
    Show the current MCP platform and adapter versions.

    Annotations the server declares

    • title: Show Version
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • toolkit_infoReturns the current toolkit state: installed MCPs, their connection status, the accounts connected to each one, and how many catalog tools each exposes.No findings

    Why it is in this group

    • The description's first verb is "return": a word for reading.
    Description, as the server wrote it
    Returns the current toolkit state: installed MCPs, their connection status, the accounts connected to each one, and how many catalog tools each exposes.

    Annotations the server declares

    • title: Toolkit Info
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 0.1.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http crm https://api.mcp.ai/p_crm

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__crm__crm_describe",
      "mcp__crm__crm_list_objects",
      "mcp__crm__crm_list_records",
      "mcp__crm__crm_get_records",
      "mcp__crm__crm_search",
      "mcp__crm__crm_get_object",
      "mcp__crm__crm_related_records",
      "mcp__crm__crm_list_files",
      "mcp__crm__crm_get_file",
      "mcp__crm__crm_list_accounts",
      "mcp__crm__show_version",
      "mcp__crm__connect",
      "mcp__crm__toolkit_info"
    ],
    "ask": [
      "mcp__crm__crm_create_records",
      "mcp__crm__crm_update_records",
      "mcp__crm__crm_define_object",
      "mcp__crm__crm_add_field",
      "mcp__crm__crm_update_object",
      "mcp__crm__crm_update_field",
      "mcp__crm__crm_link_record",
      "mcp__crm__crm_unlink_record",
      "mcp__crm__crm_move_stage",
      "mcp__crm__crm_upload_file",
      "mcp__crm__crm_confirm_upload",
      "mcp__crm__crm_upload_from_url",
      "mcp__crm__crm_download_file",
      "mcp__crm__crm_publish_file",
      "mcp__crm__crm_unpublish_file",
      "mcp__crm__crm_usage",
      "mcp__crm__report_bug",
      "mcp__crm__marketplace",
      "mcp__crm__authenticate"
    ],
    "deny": [
      "mcp__crm__crm_delete_records",
      "mcp__crm__crm_delete_object",
      "mcp__crm__crm_remove_field",
      "mcp__crm__crm_delete_file"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as crm. Review it before you use it.