Skip to main content
Glama
campaign-preflight-mcp

campaign-preflight-mcp

by katekruger

Preflight de campañas

Campaign Preflight es un linter de solo lectura para campañas salientes. Detecta problemas de configuración, datos de contacto, personalización, supresión, programación y remitentes antes del lanzamiento.

CI Security Python 3.9+ Dependencies: none License: MIT


Qué hace

Todos los equipos de salientes han enviado una campaña con un error. Alguien que se dio de baja recibió el correo de todos modos. Una secuencia siguió haciendo seguimiento después de que el prospecto respondiera. Un campo de combinación nunca se combinó y doscientas personas recibieron "Hola {{first_name}}".

Te enteras después de que se envía.

Campaign Preflight ejecuta 76 comprobaciones deterministas sobre la configuración de una campaña, los leads, el texto, el calendario, los remitentes y la exposición a supresión, y devuelve una decisión de preparación con evidencia para cada hallazgo. Nunca escribe en tu proveedor y no puede activar nada.

Lo que no hace, de entrada y no al final:

  • No garantiza la entregabilidad. Comprueba configuración y datos, no la colocación en la bandeja de entrada, y nunca inventa una puntuación de entregabilidad.

  • No ofrece asesoramiento legal. Las comprobaciones de región, dominio y exclusión comparan una campaña con tu propia política configurada — no con GDPR, CAN-SPAM o CASL.

  • No verifica buzones. Las comprobaciones de direcciones son solo de sintaxis. Sin DNS, sin SMTP.

  • No reemplaza las salvaguardas de tu proveedor. Mantenlas activadas.

  • Los resultados son una instantánea en un momento dado. Una campaña que pasó a las 09:00 puede editarse a las 09:05.

Más detalle en docs/limitations.md.


Related MCP server: checkyourself

"Lo comprobamos y está bien" ≠ "no pudimos comprobarlo"

Un comprobador que no puede distinguir entre ambos es peor que ningún comprobador, porque convierte un error de permisos en una luz verde.

Campaign Preflight hace que la distinción sea estructural. Cada lectura del proveedor devuelve datos más la razón por la que existen o no, y cada regla declara los datos que necesita. Si esos datos no están disponibles, el motor cortocircuita la regla a UNKNOWN antes de que pueda ejecutarse. Las reglas no pueden optar por no participar.

Situación

Resultado

Lista de supresión leída, nadie coincide

PASS

No se proporcionó lista de supresión

UNKNOWN → la ejecución es INCOMPLETE

El endpoint de supresión devolvió 403

UNKNOWN → la ejecución es INCOMPLETE

Cero leads en la campaña

FAIL

Endpoint de leads inalcanzable

UNKNOWN

Hay cuatro veredictos, no dos: READY, READY_WITH_WARNINGS, NOT_READY e INCOMPLETE.


Requisitos

Python 3.9 o más reciente. Esa es toda la lista.

El paquete no tiene dependencias de ejecución — no importa nada fuera de la biblioteca estándar. httpx es un extra opcional necesario solo para el proveedor en vivo de Instantly, detrás de una importación diferida.

El mínimo de 3.9 es deliberado, y deliberadamente más bajo de lo que podrías esperar. Es el intérprete más antiguo que el plugin puede encontrar en la máquina de un usuario, y como no hay dependencias, nada lo obliga a ser más alto. CI ejecuta 3.9 a 3.13 más un trabajo de intérprete desnudo que no instala nada en absoluto, en Linux, macOS y Windows.

Esa combinación es lo que permite que el plugin se ejecute sin paso de instalación: usa el python3 que ya esté allí.


Instalación

Como plugin de Claude (marketplace)

/plugin marketplace add katekruger/campaignpreflightplugin
/plugin install campaign-preflight

El repositorio es su propio marketplace: .claude-plugin/marketplace.json se encuentra en la raíz junto al manifiesto del plugin.

Como plugin de Claude (checkout local)

git clone https://github.com/katekruger/campaignpreflightplugin
/plugin marketplace add ./campaignpreflightplugin
/plugin install campaign-preflight

Como CLI

pipx install campaign-preflight

O directamente desde un checkout, sin instalar nada en absoluto:

PYTHONPATH=src python3 -m campaign_preflight.cli demo

Como servidor MCP

claude mcp add campaign-preflight -- campaign-preflight-mcp

Seis herramientas de solo lectura. Nada que pueda activar, editar, importar o enviar. Configuración para Claude Code y Claude Desktop: docs/mcp.md.


Inicio rápido

campaign-preflight demo

Sin clave API. Sin red. Sin configuración.

CAMPAIGN PREFLIGHT
Campaign: Enterprise Q3 Outbound
Provider: demo
Readiness: NOT READY
Score: 0/100
Confidence: MEDIUM

BLOCKERS

[campaign.stop_on_reply]
Stop-on-reply is disabled: repliers will keep receiving follow-ups.
  Remediation: Enable stop-on-reply on the campaign.

[personalization.prompt_injection]
1 contact(s) have prompt-injection text in their personalization.
  Affected: s***********a@caldera.example.com
  Remediation: Remove the affected personalization and review the enrichment source it came from.

[suppression.contact_listed]
1 contact(s) appear on the active suppression list.
  Affected: m**********s@stonebridge.example.com
  Remediation: Remove these contacts from the campaign before activation.

WARNINGS

[contacts.missing_first_name]
2 of 20 contacts (10.0%) are missing a first name.
  Affected: i**o@summitforge.example.com, r******s@clearwater.example.com
  Remediation: Backfill the missing first names, or use a fallback in your copy.

UNKNOWN

[senders.aggregate_capacity]
Sender capacity is unavailable: 1 of 3 senders report no daily limit.
  Affected: r***n@example.com

------------------------------------------------------------------------------
Summary:
8 blockers, 17 failures, 21 warnings, 1 unknown, 32 passed
20 leads and 3 sender(s) checked in 0.0s
Confidence is MEDIUM: 1 check(s) could not run.
Point-in-time snapshot. Campaign state may change after this check ran.

Observa el último hallazgo. Un remitente no informa un límite diario, por lo que la capacidad total no se puede sumar. La mayoría de las herramientas sumarían los remitentes que sí informan uno y lo llamarían un número. Esta dice que no lo sabe — y reduce la confianza de HIGH a MEDIUM por eso.

Esa distinción es toda la idea.

Comprobando tu propia campaña

Una vez instalado el plugin, descríbelo en lenguaje natural:

Comprueba esta campaña antes de que la envíe.

Aquí está mi lista de leads — ¿algo mal con ella? (pegar o subir)

Voy a enviar una secuencia de 3 correos a 200 personas, 80 al día, de lunes a viernes de 9 a 5 hora del Este. ¿Está bien?

Hay tres formas de entrar, y ninguna necesita una cuenta:

Tienes

Qué sucede

Un archivo (subido o en disco)

Se comprueba directamente.

Una lista pegada o algo de texto

Se escribe en un archivo temporal, se comprueba y luego se limpia.

Solo una descripción

El archivo de campaña se construye a partir de lo que dices, se te muestra y luego se comprueba.

Cualquier cosa que no sepas se deja en blanco en lugar de adivinarse — un campo en blanco vuelve como "no se pudo comprobar", que es la respuesta honesta.

Desde archivos, en la línea de comandos

campaign-preflight check \
  --campaign examples/clean_campaign/campaign.yaml \
  --leads examples/clean_campaign/leads.csv \
  --suppressions examples/clean_campaign/suppressions.csv

Tres ejemplos trabajados se incluyen con el repositorio, uno por veredicto:

Ejemplo

Veredicto

Salida

examples/clean_campaign

READY, 100/100

0

examples/risky_campaign

NOT_READY, 13 bloqueadores

2

examples/incomplete_campaign

INCOMPLETE — nada está mal, simplemente no se puede verificar

3

En CI

campaign-preflight check --campaign campaign.yaml --leads leads.csv --fail-on blocker

Los códigos de salida llevan el veredicto, por lo que esto se integra directamente en un pipeline. Ver docs/ci.md.


Qué hay dentro

La raíz del repositorio es el plugin. No hay una segunda copia del árbol.

.claude-plugin/     plugin manifest and marketplace manifest
skills/             the three skills, one directory each
bin/                launchers the MCP server and CLI run through
src/                the Python package: rules, engine, providers, reporters
tests/              unit, integration, contract
docs/               rules catalogue, configuration, MCP, CI, limitations, architecture
examples/           three worked campaigns, one per verdict
scripts/            generators and the plugin packager

Habilidades

Habilidad

Úsala para

preflight-campaign

Comprobar una campaña real que proporciones — un archivo, un pegado o una descripción.

preflight-demo

Ver el comprobador ejecutarse con datos de muestra incluidos.

preflight-rules

Qué reglas existen, qué prueba cada una y cómo reajustarlas o desactivarlas.

Los límites son deliberados: cada descripción nombra su propia situación y apunta a su vecina, para que un casi-acierto aterrice en un lugar recuperable.


Qué comprueba

76 reglas en siete categorías. Catálogo completo: docs/rules.md.

Categoría

Reglas

Ejemplos

Campaña

10

Detener al responder desactivado, volumen diario por encima del umbral, sin ventana de envío, fechas que no dejan días de envío

Contactos

15

Direcciones mal formadas, duplicados (exactos y con plegado de mayúsculas), buzones de rol, valores de marcador de posición, caracteres de control y bidireccionales, inyección de fórmulas en hojas de cálculo

Supresión

8

Contactos y dominios en tu lista de supresión, clientes existentes, direcciones internas, competidores, regiones restringidas — y si la comprobación de supresión pudo ejecutarse siquiera

Personalización

13

Tokens de combinación sin renderizar, un saludo dirigido a la persona equivocada, una empresa que no es la suya, afirmaciones no respaldadas por su propia evidencia, investigación desactualizada, texto de inyección de prompts extraído de la página de un objetivo

Texto

13

Asunto vacío en el primer paso, enlaces rotos, marcadores TODO, falta de lenguaje de exclusión, un seguimiento idéntico al primer correo

Programación

9

Zona horaria inválida, envío en fin de semana, cero días activos, una ventana que termina antes de empezar, transiciones de horario de verano dentro de la campaña

Remitentes

8

Buzones por debajo de tu umbral de salud, estados de error, volumen que excede la capacidad — y UNKNOWN honestos cuando el proveedor no lo dice

Pregunta a la herramienta sobre cualquiera de ellos:

campaign-preflight rules list --category suppression
campaign-preflight rules explain senders.aggregate_capacity

Lo que deliberadamente no comprueba

No hay regla de palabras spam. "Gratis" y "actúa ahora" no son evidencia de nada, y publicar esa lista te entrenaría para ignorar la herramienta. Las reglas que sí son juicios — longitud del texto, número de enlaces, artefactos de generación — están marcadas como heuristic, etiquetadas como tales en cada informe, y nunca son bloqueadores por defecto.


Configuración

Campaign Preflight se ejecuta con valores predeterminados sensatos y sin archivo de configuración. Añade uno cuando tus umbrales difieran, o para activar las comprobaciones que dependen de tus propias listas de dominio y región.

version: 1

settings:
  target_timezone: America/New_York
  required_variables: [first_name, company_name]
  internal_domains: [ourcompany.example.com]
  customer_domains: [bigcustomer.example.com]
  allow_weekend_sending: false

rules:
  campaign.daily_volume:
    warning_above: 100
    blocker_above: 250
  senders.health_below_threshold:
    minimum_score: 80
  contacts.missing_job_title:
    enabled: false
campaign-preflight validate-config preflight.yaml
campaign-preflight check --campaign c.yaml --leads l.csv --config preflight.yaml

La validación es estricta a propósito: un id de regla desconocido o una opción desconocida es un error grave, no una advertencia. Un error tipográfico que desactiva silenciosamente una comprobación de seguridad es peor que no tener configuración.

Referencia completa: docs/configuration.md.


Por qué importa el solo lectura

Campaign Preflight no tiene ninguna ruta de código que escriba. No es "elegimos no hacerlo" — no hay nada que llamar.

  • El proveedor de Instantly enruta cada solicitud a través de un transporte que comprueba (method, path) contra una lista de permitidos explícita y lanza una excepción antes de que la solicitud salga del proceso. La comprobación está por debajo del cliente y por debajo del proveedor, por lo que un cambio futuro de código que añada un PATCH falla ruidosamente en lugar de editar silenciosamente tu campaña.

  • Dos guardas se ejecutan en el momento de la importación: la lista de permitidos no puede contener PUT, PATCH, DELETE, HEAD u OPTIONS, y POST está permitido solo para una ruta exacta (/leads/list, que es la forma documentada de Instantly para una lectura filtrada).

  • El servidor MCP se niega a iniciarse si alguna herramienta registrada tiene un verbo mutador en su nombre o no se declara de solo lectura.

  • tests/contract/test_instantly_transport.py ejercita la matriz completa de método × ruta más cada endpoint mutador documentado. Un fallo allí es un incidente de seguridad, no un fallo de prueba.

Esto es lo que hace seguro entregar una campaña en vivo a un agente. Obtiene el análisis y ninguna de la autoridad.

Lo que nunca hará

  • Activar, pausar, reanudar o programar una campaña

  • Crear, actualizar, mover, fusionar o eliminar un lead

  • Añadir o eliminar de una lista de supresión

  • Enviar, responder o reenviar un correo electrónico

  • Modificar cualquier cosa en tu plataforma de envío

No existe ninguna ruta de código hacia ninguna de estas acciones, y dos salvaguardas independientes — la lista blanca de transporte y la aserción de arranque de MCP — fallan de forma segura si alguna vez se añade una.


Exit codes

Code

Meaning

0

READY

1

READY_WITH_WARNINGS

2

NOT_READY

3

INCOMPLETE — una comprobación crítica no pudo ejecutarse

4

Error de configuración o de entrada

5

Error de proveedor o de autenticación

6

Error interno inesperado

--fail-on none|warning|high|blocker eleva el umbral a partir del cual un veredicto se convierte en una salida distinta de cero. Nunca cambia el veredicto en sí. INCOMPLETE no se silencia mediante un umbral de gravedad: una comprobación que no pudo ejecutarse es un problema distinto de un hallazgo de baja gravedad.


La puntuación se publica, no se oculta

score = 100 - sum(weight[status][severity] for every FAIL and WARN)

readiness:
  NOT_READY            any BLOCKER FAIL, or any HIGH FAIL
  INCOMPLETE           else if any critical rule is UNKNOWN
  READY_WITH_WARNINGS  else if any FAIL or WARN
  READY                otherwise

De ello se derivan cuatro cosas, y cada una tiene una prueba:

  1. Un bloqueador siempre produce NOT_READY. El número no puede anularlo.

  2. UNKNOWN no descuenta nada. Una caída del proveedor no debe parecer una mala campaña: en su lugar, reduce la confianza.

  3. NOT_APPLICABLE no afecta a nada.

  4. Cada deducción se detalla. --verbose imprime la aritmética para que puedas comprobarla a mano.

Los pesos y la lista de reglas críticas son configurables: docs/configuration.md.


Arquitectura

flowchart LR
    CLI[CLI] --> Engine
    MCP[MCP server] --> Engine
    Engine -->|gather| Provider{Provider}
    Provider --> CSV[CSV / files]
    Provider --> Instantly[Instantly v2]
    Instantly --> Guard[ReadOnlyTransport]
    Guard -->|allowlist| API[(Instantly API)]
    Provider -->|data + why| Context[Frozen context]
    Context --> Rules[76 rules]
    Rules --> Score[Scoring]
    Score --> Out[Terminal / JSON / Markdown]
    style Guard fill:#4a1f1f,stroke:#c04040,color:#fff

El contexto es un modelo Pydantic congelado, por lo que «una regla nunca muta su entrada» se aplica mediante el sistema de tipos en lugar de mediante revisión. El comportamiento específico del proveedor vive completamente detrás de la interfaz del proveedor.

Diseño completo y modelo de amenazas: docs/architecture.md.


Privacidad

  • Redactado por defecto. Las partes locales del buzón se enmascaran (m**********s@stonebridge.example.com); los dominios se conservan, porque un dominio es lo que hace que un hallazgo de supresión sea accionable.

  • Los secretos se eliminan incondicionalmente. --no-redact desactiva el enmascaramiento de PII, nunca el de credenciales. Un proveedor que devuelva tu clave de API en un cuerpo de error no puede hacer que llegue a un informe; hay una prueba exactamente para eso.

  • Nada sale de tu máquina por defecto. El evaluador opcional de afirmaciones LLM está desactivado a menos que lo configures, y validate-config te advierte cuando una configuración lo activa.

  • Los archivos de informe se escriben con 0600, en un archivo temporal y luego se renombran.

  • Las muestras están limitadas. Una campaña de 100,000 leads no puede emitir 100,000 líneas.


Rendimiento

Carga de trabajo

Tiempo

Demo (20 prospectos)

0.02 s

10,000 prospectos

0.28 s

100,000 prospectos

3.0 s, ~300 MB pico

Las filas se transmiten en flujo, no se tragan de golpe. La paginación, los reintentos, la concurrencia del remitente y el tamaño de salida están todos limitados.


Desarrollo

git clone https://github.com/katekruger/campaignpreflightplugin
cd campaignpreflightplugin
uv sync --all-extras
uv run pytest
uv run ruff format .                                  # format
uv run ruff check .                                   # lint
uv run mypy                                           # typecheck, strict
claude plugin validate . --strict                     # manifests
uv run python scripts/generate_rules_doc.py --check   # docs/rules.md is current
./scripts/bump-version.sh --check                     # version fields agree
uv run python scripts/build_plugin.py                 # dist/campaign-preflight.plugin

El paquete en sí no tiene dependencias de ejecución; el grupo de desarrollo existe para la suite de pruebas, los linters y dos bibliotecas utilizadas solo como oráculos de prueba: httpx para el proveedor opcional de Instantly y PyYAML para probar diferencialmente el analizador YAML incluido.

Las convenciones que parecen errores hasta que sabes por qué están escritas en CLAUDE.md.


Hoja de ruta

  • Proveedores adicionales detrás de la misma interfaz de solo lectura (Smartlead, HubSpot Sequences, Apollo)

  • Comprobaciones de reputación de dominio y registros DNS (alineación SPF, DKIM, DMARC)

  • Una GitHub Action que envuelve la CLI con anotaciones de PR

  • Comparación de línea base: comparar dos informes y mostrar qué cambió desde la última ejecución

  • Umbrales por segmento, para que una configuración pueda cubrir varios movimientos


Contribuciones

Las reglas son pequeñas, puras y comprobables de forma independiente: una nueva suele ser una clase, un docstring y un puñado de pruebas. Consulta CONTRIBUTING.md y CODE_OF_CONDUCT.md.

Seguridad

Informa de vulnerabilidades de forma privada: SECURITY.md. Una regla que devolvió PASS cuando faltaban los datos cuenta como un problema de seguridad.

Licencia

MIT. Consulta LICENSE.

Available Tools

6 tools
explain_preflight_ruleB
Read-onlyIdempotent

READ-ONLY. Explain one rule: what it checks, what data it needs, and its configurable options.

NameRequiredDescriptionDefault
rule_idYese.g. campaign.daily_volume

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered by structured data. The description's 'READ-ONLY' prefix reinforces but does not add to this. It adds minimal behavioral context beyond confirming the rule-explanation output, and does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with zero waste. The 'READ-ONLY' prefix overlaps with annotations but is harmless. Appropriately sized for a simple single-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity tool (1 parameter, no output schema, no nesting), the description is reasonably complete — it states what the returned explanation covers. It partially compensates for the missing output schema by describing the explanation's contents, though it doesn't address error behavior for an invalid rule_id. Adequate given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% — rule_id is documented with an example ('campaign.daily_volume'). The description adds no parameter-level meaning beyond implying that rule_id selects the rule to explain, which the schema already conveys. Baseline 3 is appropriate since the schema carries the parameter burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Explain') and resource ('one rule'), and clarifies what the explanation covers (checks, data needs, configurable options). It implicitly distinguishes from siblings like list_preflight_rules and validate_preflight_config, though it does not name them explicitly. A clear, well-scoped purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus its siblings. The description does not state that this should be used when detailed information about a single rule is needed as opposed to list_preflight_rules for enumeration or validate_preflight_config for config checking. No exclusions or alternative routing provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_preflight_rulesA
Read-onlyIdempotent

READ-ONLY. List the preflight rule catalogue, optionally filtered by category: campaign, contacts, suppression, personalization, copy, schedule, or senders.

NameRequiredDescriptionDefault
categoryNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description's opening 'READ-ONLY' merely reinforces that. It adds no deeper behavioral detail beyond the filter (which is more parameter-related). No mention of pagination, output format, or rate limits, but for a simple read-only list tool, the annotations carry the transparency burden sufficiently.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that front-loads the read-only nature and the core action ('List'), followed by the only parameter detail. Every word earns its place; there is no redundancy or filler. Ideal conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one optional enum parameter, no output schema, and no nested objects, the description covers the purpose, the filter, and its optionality. It does not mention return format or relationships to sibling tools, but those are not critical for a simple listing operation. The description is sufficiently complete for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage and only one optional enum parameter. The description explicitly lists all valid category values (campaign, contacts, suppression, personalization, copy, schedule, senders) and clarifies the parameter is optional ('optionally filtered'). This fully compensates for the schema's lack of descriptions, giving the agent complete knowledge of the parameter without opening the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and resource ('preflight rule catalogue'), and mentions optional filtering. The purpose is clear and not a tautology. It does not explicitly distinguish from siblings like preflight_demo or preflight_files, but the name and description make the function obvious enough that an agent could differentiate it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives context on the optional 'category' filter and lists valid categories, implying when filtering might be useful. However, it provides no explicit guidance on when to use this tool versus alternatives, nor any when-not-to-use statements. The presence of sibling tools like 'validate_preflight_config' suggests related actions, but no comparison is made.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

preflight_demoA
Read-onlyIdempotent

READ-ONLY. Run the bundled synthetic demo campaign and return its readiness report. Uses synthetic data shipped with the package: no network calls and no credentials. Useful for showing what a report looks like.

NameRequiredDescriptionDefault
max_samplesNoAffected records shown per finding.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint=true, destructiveHint=false, and idempotentHint=true, so the description's 'READ-ONLY' is redundant. However, it adds value by stating no network calls and no credentials, and that it uses synthetic data shipped with the package—behavioral details not present in annotations. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short sentences, each earning its place: the first states the action and safety profile, the second gives key behavioral context, and the third explains practical utility. It is front-loaded with READ-ONLY and has no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple demo tool with one optional parameter and no required inputs, the description fully covers what the agent needs: what it does, that it's safe (read-only, no network/credentials), and when it's useful (showing a report). No output schema exists, but the description doesn't need to detail report structure for a demo. Complete for its purpose.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%—the parameter max_samples is described as 'Affected records shown per finding.' The tool description does not mention the parameter at all, but since the schema fully covers it, the baseline of 3 applies. No additional semantic value added beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool runs a bundled synthetic demo campaign and returns a readiness report. The word 'demo' and 'synthetic' distinguish it from siblings like preflight_files or preflight_instantly_campaign, which likely operate on real data. This is a specific verb+resource with clear differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly notes it's 'useful for showing what a report looks like,' providing a direct use case. It also hints at no network calls and no credentials, implying it's safe for testing. However, it doesn't explicitly state when to prefer this over siblings, so it lacks explicit exclusions or alternative comparisons.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

preflight_filesA
Read-onlyIdempotent

READ-ONLY. Check a campaign described by local files and return its readiness report. Reads only the paths given here; no directory is scanned or walked. Optional inputs that are omitted are reported as unavailable capabilities, so a run without suppressions_path says the suppression checks did not run rather than implying the list is clean.

NameRequiredDescriptionDefault
leads_pathYesAbsolute or relative path to an existing file.
config_pathNoAbsolute or relative path to an existing file.
max_samplesNoAffected records shown per finding.
senders_pathNoAbsolute or relative path to an existing file.
campaign_pathYesAbsolute or relative path to an existing file.
evidence_pathNoAbsolute or relative path to an existing file.
output_formatNoShape of the returned report.
suppressions_pathNoAbsolute or relative path to an existing file.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly and idempotent annotations, the description adds critical behavioral context: it explicitly states that no directory scanning occurs and that omitted optional inputs are reported as 'unavailable capabilities' rather than clean results. This clarifies how the tool handles missing parameters, which is a significant behavioral nuance beyond the annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no filler. The first sentence states purpose, the second clarifies input scope, and the third explains behavior on omission. It is front-loaded with the core action and each sentence earns its place by contributing distinct, necessary information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 8 parameters, no output schema, and no explicit enumeration of the checks performed, the description provides sufficient context: it defines the tool's domain (local files), its safety profile, and handling of missing inputs. The output_format parameter handles return shape, and sibling tools list_preflight_rules/explain_preflight_rule can cover rule details. It is complete enough for an agent to use correctly, though slightly more detail on what 'readiness' entails would elevate it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides descriptions for all 8 parameters (100% coverage), so the baseline is 3. The description adds meaning by explaining the collective effect of omitting optional parameters (e.g., suppressions_path yields 'suppression checks did not run'), which is a parameter-level semantic not present in the schema. This justifies a 4 over the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Check a campaign described by local files and return its readiness report') with a clear resource (local files). It distinguishes itself from siblings by emphasizing 'local files' and the scoping rule 'Reads only the paths given here', which sets it apart from tools like preflight_demo or preflight_instantly_campaign that likely handle other sources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for file-based campaigns and clarifies that only explicit paths are read, but it does not explicitly contrast with sibling tools or state when to choose this over preflight_instantly_campaign or preflight_demo. The guidance is implied rather than directive, so it misses the 'when/when-not' bar for a higher score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

preflight_instantly_campaignA
Read-onlyIdempotent

READ-ONLY. Inspect a live Instantly campaign and return its readiness report. Reads the campaign, its leads, its sending accounts, and the workspace block list. Every request is checked against a read-only allowlist before it leaves the process, so no write, activation, or lead-mutation call is reachable. The API key is read from the INSTANTLY_API_KEY environment variable and is never accepted as a tool argument.

NameRequiredDescriptionDefault
lead_limitNo
campaign_idYesInstantly campaign UUID.
config_pathNoAbsolute or relative path to an existing file.
max_samplesNoAffected records shown per finding.

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, but the description adds valuable context: every request is checked against a read-only allowlist, and the API key is sourced from INSTANTLY_API_KEY rather than a tool argument. This discloses operational safeguards and security details beyond the annotations, enhancing the agent's understanding of constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise at three sentences, with purpose front-loaded ('READ-ONLY. Inspect...'). However, there is slight redundancy: 'READ-ONLY' is repeated in the allowlist explanation. Despite this, the structure is efficient and each sentence adds relevant information—purpose, scope, and security mechanism.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no output schema, the description should explain what the readiness report contains, but it only says 'readiness report' without detailing its format or contents. It does mention the data sources (leads, accounts, block list) but not the report's structure. Given the absence of output schema, this is a notable gap. The description covers the operational context well (read-only, API key), but the return value remains underspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 75% (campaign_id, config_path, max_samples have descriptions; lead_limit has only min/max). The tool description does not elaborate on any parameter semantics. Per the rubric, with high schema coverage, a baseline of 3 is appropriate. The lack of compensation for the undocumented lead_limit is a minor gap, but overall the schema carries most of the parameter information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action and target: 'Inspect a live Instantly campaign and return its readiness report.' This is a specific verb-resource combination and explicitly distinguishes it from sibling tools (preflight_demo, preflight_files, list_preflight_rules, etc.) by the 'live Instantly campaign' scope. The mention of reading leads, sending accounts, and block list further clarifies the exact domain.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the scenario (inspecting a live campaign) and the read-only nature, but does not explicitly compare with alternatives or state when not to use it. It provides clear context for when this tool is appropriate (live campaign inspection) without listing excluded cases or directing to other preflight tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_preflight_configA
Read-onlyIdempotent

READ-ONLY. Validate a rules configuration file without running any checks. Reports unknown rule ids, unknown options, and out-of-range values.

NameRequiredDescriptionDefault
config_pathYesAbsolute or relative path to an existing file.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), and the leading 'READ-ONLY' merely restates readOnlyHint. The added value is the description of what validation reports (unknown rule ids, unknown options, out-of-range values), which is useful but modest. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with no filler. The critical READ-ONLY safety flag is front-loaded, and the second sentence efficiently enumerates what the validation surfaces (unknown rule ids, options, out-of-range values). Slightly redundant with annotations but well-structured and brief.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter, read-only validation tool, this is nearly complete: purpose, scope, safety, and output dimensions are all covered. No output schema exists, but the description names the three classes of findings an agent can expect, which is sufficient for a config-validator of this simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%; the schema already documents config_path as an absolute or relative path to an existing file. The description adds only the contextual hint that the path points to a configuration file, which aligns with but does not materially extend the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Describes a specific verb (validate) applied to a specific resource (rules configuration file). It distinguishes itself from sibling tools like preflight_demo, preflight_files, and preflight_instantly_campaign by explicitly stating it does not run checks, and from list_preflight_rules/explain_preflight_rule by focusing on config validation rather than rule discovery. An agent can pick it apart from siblings without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a clear context: validate a configuration file before executing checks. The phrase 'without running any checks' implicitly marks off the preflight_* siblings that do execute campaigns, giving a when-not signal. It does not name alternatives explicitly or give exclusion conditions, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv0.1.0
    • First observedexplain_preflight_rule
    • First observedlist_preflight_rules
    • First observedpreflight_demo
    • First observedpreflight_files
    • First observedpreflight_instantly_campaign
    • First observedvalidate_preflight_config

TDQS

A3.9/5.0

Scored across 6 tools

Disambiguation5/5

Each tool serves a clearly distinct purpose: three preflight runners for different input sources (demo, files, live), two for rule management (list and explain), and one for config validation. There is no overlap in their operations, and the descriptions make it obvious which to select.

Naming Consistency4/5

Names use a consistent 'preflight_' prefix across all tools, but the pattern is not fully uniform: the first three are verbs implied by the domain (e.g., 'preflight_demo' runs a demo), while the last three explicitly start with verbs ('list_', 'explain_', 'validate_'). This is a minor deviation that agents can easily adapt to.

Tool Count5/5

With six tools, the server is well-scoped and avoids unnecessary bloat. Each tool covers a distinct aspect of the preflight workflow—execution sources, rule catalog, and configuration—so the count feels appropriately sized for the domain.

Completeness4/5

The surface covers the core lifecycle: running preflights on demo, files, or a live Instantly campaign; inspecting and understanding rules; and validating config files. A minor gap is the lack of a tool to run preflight on a manually specified set of parameters or a generic input, but the provided sources handle common use cases adequately.

Maintenance

ActivityStale
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    A Model Context Protocol server that provides read-only access to Mailchimp's Marketing API for comprehensive email marketing data retrieval.
    38
    85 npm
    12
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Read-only MCP server that performs deterministic local preflights of agent-payment boundary documents and x402 v2 PaymentRequired JSON, and prepares unsubmitted public quote-request drafts without network calls or fund movement.
    1
    -
  • A
    license
    A
    quality
    A
    maintenance
    A read-only MCP server that reports BI pipeline readiness, blockers, and the next allowed action for governed Power BI workflows. It never writes files, executes warehouse work, or grants human approvals.
    6
    10 npm
    2
    Apache 2.0