Skip to main content
Glama
campaign-preflight-mcp

campaign-preflight-mcp

by katekruger

活动预检

活动预检(Campaign Preflight)是一个用于外发活动的只读检查器。它能在活动启动前发现配置、联系人数据、个性化、抑制、日程和发件人方面的问题。

CI Security Python 3.9+ Dependencies: none License: MIT


它的作用

每个外呼团队都曾发送过带有错误的活动。有人退订了却还是收到了邮件。一个序列在潜在客户回复后仍继续跟进。合并字段从未合并,两百人收到了“Hi {{first_name}}”。

你是在发送之后才发现问题的。

活动预检会对活动的配置、线索、文案、日程、发件人和抑制暴露运行 76 项确定性检查,并返回带有每项发现证据的就绪决策。它从不写入你的提供商,也无法激活任何内容。

它不做什么,先说明而不是埋在后面:

  • 它不保证送达率。 它检查配置和数据,而不是收件箱位置,也从不虚构送达率评分。

  • 它不提供法律建议。 地区、域名和退订检查是将活动与你自己配置的策略进行比较——而不是 GDPR、CAN-SPAM 或 CASL。

  • 它不验证邮箱。 地址检查仅限语法。没有 DNS,没有 SMTP。

  • 它不替代你提供商的保护措施。 请保持这些措施开启。

  • 结果是时间点快照。 在 09:00 通过的活动可能在 09:05 被编辑。

更多细节见 docs/limitations.md。


Related MCP server: checkyourself

“我们检查过,没问题” ≠ “我们无法检查”

一个无法区分这两者的检查器比没有检查器更糟糕,因为它会把权限错误变成绿灯。

活动预检在结构上做出了这种区分。每次提供商读取都返回数据以及数据存在或不存在的理由,每条规则都声明它所需的数据。如果该数据不可用,引擎会在规则运行之前将其短路为 UNKNOWN。规则不能选择退出。

情况

结果

抑制列表已读取,无匹配项

PASS

未提供抑制列表

UNKNOWN → 运行结果为 INCOMPLETE

抑制端点返回 403

UNKNOWN → 运行结果为 INCOMPLETE

活动中零线索

FAIL

线索端点不可达

UNKNOWN

有四种判定,而不是两种:READY、READY_WITH_WARNINGS、NOT_READY 和 INCOMPLETE。


要求

Python 3.9 或更高版本。 这就是全部列表。

该包没有运行时依赖——它不导入标准库之外的任何内容。httpx 是一个可选额外项,仅在实时 Instantly 提供商需要时使用,且位于惰性导入之后。

3.9 的下限是刻意选择的,并且故意比你预期的要低。它是插件在用户机器上可能遇到的最旧的解释器,而且由于没有依赖,没有任何因素会迫使它更高。CI 在 Linux、macOS 和 Windows 上运行 3.9 到 3.13,外加一个不安装任何内容的裸解释器作业。

正是这种组合让插件无需安装步骤即可运行:它使用已经存在的任何 python3。


安装

作为 Claude 插件(市场)

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

该仓库本身就是市场:.claude-plugin/marketplace.json 位于根目录,与插件清单并列。

作为 Claude 插件(本地检出)

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

作为 CLI

pipx install campaign-preflight

或者直接从检出运行,无需安装任何内容:

PYTHONPATH=src python3 -m campaign_preflight.cli demo

作为 MCP 服务器

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

六个只读工具。没有任何可以激活、编辑、导入或发送的内容。Claude Code 和 Claude Desktop 的设置:docs/mcp.md。


快速开始

campaign-preflight demo

无需 API 密钥。无需网络。无需配置。

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.

注意最后一项发现。一个发件人未报告每日限制,因此无法汇总总容量。大多数工具会汇总确实报告了限制的发件人,并将其称为一个数字。这个工具说它不知道——并因此将置信度从 HIGH 降至 MEDIUM。

这种区别就是整个理念。

检查你自己的活动

插件安装后,用自然语言描述它:

在我发送之前检查这个活动。

这是我的线索列表——有什么问题吗? (粘贴或上传)

我要向 200 人发送一个 3 封邮件的序列,每天 80 封,工作日东部时间 9-5。这样可以吗?

有三种进入方式,都不需要账户:

你拥有

会发生什么

一个文件(上传或磁盘上)

直接检查。

粘贴的列表或一些文案

写入临时文件,检查,然后清理。

仅描述

根据你所说的构建活动文件,显示给你,然后检查。

任何你不知道的内容都会留空而不是猜测——空白字段会返回“无法检查”,这是诚实的答案。

从文件,在命令行

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

仓库附带三个可运行的示例,每个判定一个:

示例

判定

退出码

examples/clean_campaign

READY, 100/100

0

examples/risky_campaign

NOT_READY, 13 个阻止项

2

examples/incomplete_campaign

INCOMPLETE — 没有错误,只是无法验证

3

在 CI 中

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

退出码携带判定,因此可以直接放入流水线。参见 docs/ci.md。


内部结构

仓库根目录就是插件。没有树的第二份副本。

.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

技能

技能

用途

preflight-campaign

检查你提供的真实活动——文件、粘贴或描述。

preflight-demo

观察检查器对捆绑的示例数据运行。

preflight-rules

存在哪些规则,每条规则测试什么,以及如何重新调整或禁用它们。

边界是刻意设计的:每个描述都指明自己的情况并指向相邻技能,因此近似匹配会落在可恢复的位置。


它检查什么

七个类别共 76 条规则。完整目录:docs/rules.md。

类别

规则数

示例

活动

10

回复后停止已禁用,每日量超过阈值,无发送窗口,日期导致没有发送日

联系人

15

格式错误的地址,重复项(精确和大小写折叠),角色收件箱,占位值,控制字符和双向字符,电子表格公式注入

抑制

8

抑制列表上的联系人和域名,现有客户,内部地址,竞争对手,受限地区——以及抑制检查是否能够运行

个性化

13

未渲染的合并令牌,问候语指向错误的人,不是他们的公司,他们自己的证据不支持的主张,过时的研究,从目标页面抓取的提示注入文本

文案

13

第一步主题为空,链接损坏,TODO 标记,缺少退订语言,跟进邮件与第一封完全相同

日程

9

无效时区,周末发送,零活动天数,结束早于开始的窗口,活动内的 DST 转换

发件人

8

邮箱低于健康阈值,错误状态,量超过容量——以及提供商不愿说明时的诚实 UNKNOWN

向工具询问其中任何一项:

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

它刻意不检查什么

没有垃圾词规则。“免费”和“立即行动”不是任何证据,发布这样的列表会训练你忽略工具。属于判断性判断的规则——文案长度、链接数量、生成痕迹——被标记为 heuristic,在每份报告中都如此标注,并且默认情况下永远不会成为阻止项。


配置

活动预检使用合理的默认值运行,无需配置文件。当你的阈值不同时,或要启用依赖于你自己的域名和地区列表的检查时,添加一个。

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

验证是刻意严格的:未知规则 ID 或未知选项是硬错误,而不是警告。一个静默禁用安全检查的拼写错误比没有配置更糟糕。

完整参考:docs/configuration.md。


为什么只读很重要

活动预检没有写入的代码路径。不是“我们选择不”——而是没有可调用的内容。

  • Instantly 提供商通过一个传输层路由每个请求,该传输层根据显式允许列表检查 (method, path),并在请求离开进程之前抛出异常。检查位于客户端和提供商之下,因此未来添加 PATCH 的代码更改会大声失败,而不是静默编辑你的活动。

  • 导入时运行两个守卫:允许列表不能包含 PUT、PATCH、DELETE、HEAD 或 OPTIONS,并且 POST 仅允许一个路径(/leads/list,这是 Instantly 文档化的过滤读取形状)。

  • 如果任何注册工具的名称中包含变更动词或未声明为只读,MCP 服务器拒绝启动。

  • tests/contract/test_instantly_transport.py 测试完整的方法 × 路径矩阵以及每个文档化的变更端点。那里的失败是安全事件,而不是测试失败。

这就是为什么可以安全地将实时活动交给代理。它获得分析,但没有权威。

它永远不会做什么

  • 激活、暂停、恢复或安排营销活动

  • 创建、更新、移动、合并或删除线索

  • 添加到屏蔽列表或从中移除

  • 发送、回复或转发电子邮件

  • 修改发送平台中的任何内容

这些操作没有任何代码路径,而且两道独立的防护——传输白名单和 MCP 启动断言——一旦有人添加此类路径,就会以失败关闭(fail closed)方式兜底。


退出码

代码

含义

0

READY

1

READY_WITH_WARNINGS

2

NOT_READY

3

INCOMPLETE — 某项关键检查无法运行

4

配置或输入错误

5

提供商或身份验证错误

6

意外的内部错误

--fail-on none|warning|high|blocker 会提高判定结果变为非零退出码的门槛。它绝不会改变判定结果本身。INCOMPLETE 不会被严重性阈值静默——一项无法运行的检查与低严重性发现是不同的问题。


评分是公开的,而非隐藏的

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

由此产生四点结论,每一点都有对应的测试:

  1. 阻断项必然产生 NOT_READY。 分数无法覆盖它。

  2. UNKNOWN 不扣分。 提供商故障不能看起来像糟糕的营销活动——它降低的是置信度。

  3. NOT_APPLICABLE 不影响任何结果。

  4. 每项扣分都逐条列出。 --verbose 会打印计算过程,方便你手动核对。

权重和关键规则列表均可配置:docs/configuration.md。


架构

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

上下文是一个冻结的 Pydantic 模型,因此"规则绝不修改其输入"是由类型系统强制执行的,而非依赖代码审查。提供商特定行为完全封装在提供商接口之后。

完整设计与威胁模型:docs/architecture.md。


隐私

  • 默认脱敏。 邮箱本地部分会被遮蔽 (m**********s@stonebridge.example.com);域名保留,因为域名才是让屏蔽发现可操作的关键。

  • 凭据无条件清除。 --no-redact 仅禁用 PII 遮蔽,绝不会禁用凭据遮蔽。如果提供商在错误响应中回显你的 API 密钥,它也无法进入报告——对此有专门的测试。

  • 默认情况下,数据不会离开你的机器。 可选的 LLM 声明评估器默认关闭,除非你显式配置;validate-config 会在配置将其启用时发出警告。

  • 报告文件以 0600 权限写入,先写入临时文件再重命名。

  • 样本数量有上限。 一个包含 100,000 条线索的营销活动不可能输出 100,000 行。


性能

工作负载

时间

演示(20 条线索)

0.02 s

10,000 条线索

0.28 s

100,000 条线索

3.0 s,峰值约 300 MB

行数据是流式处理的,而非一次性加载。分页、重试、发送方并发和输出大小均有限制。


开发

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

该包本身没有运行时依赖;开发组依赖仅用于测试套件、linter 以及两个仅作为测试参照使用的库——httpx(用于可选的 Instantly 提供商)和 PyYAML(用于对内置 YAML 解析器进行差分测试)。

那些在了解原因之前看起来像错误的约定,都已记录在 CLAUDE.md 中。


路线图

  • 在同一只读接口下增加更多提供商(Smartlead、HubSpot Sequences、Apollo)

  • 域名信誉和 DNS 记录检查(SPF、DKIM、DMARC 对齐)

  • 封装 CLI 并支持 PR 注释的 GitHub Action

  • 基线对比:对两份报告做差异比较,显示自上次运行以来的变化

  • 按细分市场设置阈值,使一份配置可覆盖多种业务场景


贡献

规则是小型、纯函数且可独立测试的——一条新规则通常就是一个类、一段文档字符串和若干测试。参见 CONTRIBUTING.md 和 CODE_OF_CONDUCT.md。

安全

请私下报告漏洞:SECURITY.md。一条在数据缺失时返回 PASS 的规则也属于安全问题。

许可证

MIT。参见 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