campaign-preflight-mcp
キャンペーンプリフライト
Campaign Preflight は、アウトバウンドキャンペーン向けの読み取り専用リンターです。設定、連絡先データ、パーソナライゼーション、抑制、スケジュール、送信者に関する問題を、配信前に検出します。
機能概要
どのアウトバウンドチームも、ミスを含んだキャンペーンを配信した経験があります。解約したはずの人にメールが届いた。見込み客が返信したのに、シーケンスがフォローアップを続けた。マージフィールドがマージされず、200人に「こんにちは {{first_name}}」と送られた。
それが送信後に判明するのです。
Campaign Preflight は、キャンペーンの設定、リード、コピー、スケジュール、送信者、抑制の露出に対して76の決定的チェックを実行し、各指摘に証拠を添えた準備完了判定を返します。プロバイダーへの書き込みは一切行わず、何かを有効化することもできません。
やらないことを、後回しにせず最初に明記します:
配信到達性を保証しません。 設定とデータをチェックするのであって、受信トレイへの到達状況をチェックするのではありません。配信スコアをでっち上げることもありません。
法的アドバイスを提供しません。 地域、ドメイン、オプトアウトのチェックは、キャンペーンをお客様自身が設定したポリシーと比較するものであり、GDPR、CAN-SPAM、CASL ではありません。
メールボックスを検証しません。 アドレスチェックは構文のみです。DNS も SMTP もありません。
プロバイダーの保護機能を置き換えません。 それらは有効にしておいてください。
結果は特定時点のスナップショットです。 09:00 に合格したキャンペーンも、09:05 に編集されれば変わります。
詳細は docs/limitations.md にあります。
Related MCP server: checkyourself
「チェック済みで問題なし」≠「チェックできなかった」
この2つを区別できないチェッカーは、チェッカーがないより悪いものです。権限エラーを緑信号に変えてしまうからです。
Campaign Preflight は、この区別を構造的に行います。すべてのプロバイダー読み取りは、データと、それが存在するかしないかの理由を返し、すべてのルールは必要なデータを宣言します。そのデータが利用できない場合、エンジンはルールを実行する前に UNKNOWN に短絡させます。ルールはこれを回避できません。
状況 | 結果 |
抑制リストを読み取り、一致なし |
|
抑制リストが提供されていない |
|
抑制エンドポイントが 403 を返した |
|
キャンペーン内のリードがゼロ |
|
リードエンドポイントに到達できない |
|
判定は2つではなく4つあります:READY、READY_WITH_WARNINGS、NOT_READY、INCOMPLETE。
要件
Python 3.9 以降。 それがすべてです。
このパッケージには実行時依存関係がありません — 標準ライブラリ以外は何もインポートしません。httpx はオプションの追加で、ライブの Instantly プロバイダーにのみ必要で、遅延インポートの背後にあります。
3.9 という下限は意図的で、予想よりも意図的に低く設定されています。これは、ユーザーのマシンでプラグインが遭遇しうる最も古いインタープリターであり、依存関係がないため、それ以上に引き上げるものはありません。CI は 3.9 から 3.13 まで、さらに何もインストールしないベアインタープリタージョブを、Linux、macOS、Windows で実行します。
この組み合わせにより、プラグインはインストール手順なしで実行できます。既存の 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-preflightCLI として
pipx install campaign-preflightまたは、チェックアウトから直接、何もインストールせずに:
PYTHONPATH=src python3 -m campaign_preflight.cli demoMCP サーバーとして
claude mcp add campaign-preflight -- campaign-preflight-mcp読み取り専用ツールが6つ。アクティブ化、編集、インポート、送信ができるものはありません。Claude Code と Claude Desktop のセットアップ:docs/mcp.md。
クイックスタート
campaign-preflight demoAPI キー不要。ネットワーク不要。設定不要。
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.最後の指摘に注目してください。1つの送信者が1日の上限を報告していないため、合計容量を合計できません。ほとんどのツールは、報告している送信者を合計して数値と呼ぶでしょう。これは「不明」と述べ、そのために信頼度を HIGH から MEDIUM に下げます。
その区別が全体のアイデアです。
自分のキャンペーンをチェックする
プラグインがインストールされたら、平易な言葉で説明します:
送信する前にこのキャンペーンをチェックして。
これが私のリードリストです — 何か問題ありますか? (貼り付けまたはアップロード)
200人に3通のメールシーケンスを送ります。1日80通、平日の9時から17時(東部時間)です。大丈夫ですか?
3つの入力方法があり、どれもアカウントは不要です:
あなたが持っているもの | 何が起こるか |
ファイル(アップロード、またはディスク上) | 直接チェックされます。 |
貼り付けたリストまたはコピー | スクラッチファイルに書き込まれ、チェックされ、その後クリーンアップされます。 |
説明のみ | キャンペーンファイルはあなたの言葉から構築され、表示され、その後チェックされます。 |
わからないことは空白のままにされ、推測されません — 空白のフィールドは「チェックできませんでした」として返され、それが正直な答えです。
ファイルから、コマンドラインで
campaign-preflight check \
--campaign examples/clean_campaign/campaign.yaml \
--leads examples/clean_campaign/leads.csv \
--suppressions examples/clean_campaign/suppressions.csv3つの実例がリポジトリに同梱されており、各判定に1つずつあります:
例 | 判定 | 終了コード |
|
| |
|
| |
|
|
CI で
campaign-preflight check --campaign campaign.yaml --leads leads.csv --fail-on blocker終了コードが判定を伝えるため、これはそのままパイプラインに組み込めます。docs/ci.md を参照してください。
内部構造
リポジトリのルートがプラグインです。ツリーの2番目のコピーはありません。
.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スキル
スキル | 使用目的 |
| 提供された実際のキャンペーン(ファイル、貼り付け、説明)をチェックする。 |
| バンドルされたサンプルデータに対してチェッカーが実行されるのを見る。 |
| どのルールが存在するか、各ルールが何をテストするか、再調整または無効化する方法。 |
境界は意図的です:各説明は自身の状況を指定し、隣接するスキルを指すため、ニアミスは回復可能な場所に着地します。
チェック内容
7カテゴリにわたる76のルール。完全なカタログ:docs/rules.md。
カテゴリ | ルール数 | 例 |
キャンペーン | 10 | 返信で停止が無効、1日のボリュームがしきい値を超える、送信ウィンドウなし、送信日が残らない日付 |
連絡先 | 15 | 不正なアドレス、重複(完全一致と大文字小文字を無視)、ロール用インボックス、プレースホルダー値、制御文字と双方向文字、スプレッドシートの数式インジェクション |
抑制 | 8 | 抑制リスト上の連絡先とドメイン、既存顧客、内部アドレス、競合他社、制限地域 — そして抑制チェックがそもそも実行できたかどうか |
パーソナライゼーション | 13 | 未レンダリングのマージトークン、間違った人宛ての挨拶、彼らの会社ではない会社、彼ら自身の証拠で裏付けられていない主張、古いリサーチ、ターゲットのページからスクレイピングされたプロンプトインジェクションのテキスト |
コピー | 13 | 最初のステップの件名が空、壊れたリンク、 |
スケジュール | 9 | 無効なタイムゾーン、週末送信、アクティブ日数ゼロ、開始前に終了するウィンドウ、キャンペーン内の DST 移行 |
送信者 | 8 | 健全性しきい値を下回るメールボックス、エラー状態、容量を超えるボリューム — そしてプロバイダーが言わない場合の正直な |
これらのいずれかについてツールに尋ねてください:
campaign-preflight rules list --category suppression
campaign-preflight rules explain senders.aggregate_capacity意図的にチェックしないもの
スパムワードルールはありません。「無料」や「今すぐ行動」は何かの証拠ではなく、そのようなリストを出荷するとツールを無視するように訓練されるでしょう。判断が入るルール — コピーの長さ、リンク数、生成アーティファクト — は heuristic とマークされ、すべてのレポートでそのようにラベル付けされ、デフォルトではブロッカーになりません。
設定
Campaign Preflight は、適切なデフォルトで設定ファイルなしで動作します。しきい値が異なる場合、または独自のドメインと地域リストに依存するチェックを有効にする場合に、設定ファイルを追加します。
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: falsecampaign-preflight validate-config preflight.yaml
campaign-preflight check --campaign c.yaml --leads l.csv --config preflight.yaml検証は意図的に厳格です:未知のルール ID や未知のオプションは警告ではなくハードエラーです。安全チェックを静かに無効化するタイプミスは、設定がないことより悪いです。
完全なリファレンス:docs/configuration.md。
読み取り専用が重要な理由
Campaign Preflight には、書き込むコードパスがありません。「選択しなかった」のではなく — 呼び出すものがないのです。
Instantly プロバイダーは、すべてのリクエストを明示的な許可リストに対して
(method, path)をチェックするトランスポート経由でルーティングし、リクエストがプロセスを離れる前に例外を発生させます。チェックはクライアントとプロバイダーの下にあり、将来PATCHを追加するコード変更は、キャンペーンを静かに編集する代わりに大きな音を立てて失敗します。インポート時に2つのガードが実行されます:許可リストは
PUT、PATCH、DELETE、HEAD、OPTIONSを含むことができず、POSTは正確に1つのパス(/leads/list、これは Instantly の文書化されたフィルタリング読み取りの形状)にのみ許可されます。MCP サーバーは、登録されたツールに変更動詞が名前に含まれているか、読み取り専用を宣言していない場合、起動を拒否します。
tests/contract/test_instantly_transport.pyは、完全なメソッド × パスマトリックスと、文書化されたすべての変更エンドポイントをテストします。そこでの失敗はテスト失敗ではなく、セキュリティインシデントです。
これにより、エージェントにライブキャンペーンを渡しても安全です。分析は得られますが、権限は一切ありません。
決して行わないこと
キャンペーンのアクティブ化、一時停止、再開、スケジュール設定
リードの作成、更新、移動、結合、削除
抑制リストへの追加、または抑制リストからの削除
メールの送信、返信、転送
送信プラットフォーム内のあらゆる変更
これらへのコードパスは存在せず、トランスポート許可リストとMCP起動時アサーションという2つの独立したガードが、万一追加された場合にはフェイルクローズします。
終了コード
コード | 意味 |
|
|
|
|
|
|
|
|
| 設定または入力エラー |
| プロバイダーまたは認証エラー |
| 予期しない内部エラー |
--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これから4つのことが導かれ、それぞれにテストがあります。
ブロッカーは常に
NOT_READYを生成します。 数値がそれを上書きすることはできません。UNKNOWNは減点しません。 プロバイダーの障害が悪いキャンペーンのように見えてはなりません — 代わりに信頼度を下げます。NOT_APPLICABLEは何にも影響しません。すべての減点は明細化されています。
--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 pytestuv 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パッケージ自体には実行時依存関係はありません。devグループはテストスイート、リンター、およびテストオラクルとしてのみ使用される2つのライブラリ — オプションのInstantlyプロバイダー用の httpx と、バンドルされたYAMLパーサーを差分テストするための PyYAML — のために存在します。
理由を知るまで間違いに見える規約は、CLAUDE.md に文書化されています。
ロードマップ
同じ読み取り専用インターフェースの背後にある追加プロバイダー (Smartlead、HubSpot Sequences、Apollo)
ドメインレピュテーションとDNSレコードチェック (SPF、DKIM、DMARCアライメント)
PRアノテーション付きでCLIをラップするGitHub Action
ベースライン比較: 2つのレポートを差分し、前回の実行以降の変更点を表示
セグメントごとのしきい値。1つの設定で複数のモーションをカバー可能
コントリビューション
ルールは小さく、純粋で、独立してテスト可能です — 新しいルールは通常、クラス、docstring、そしていくつかのテストで構成されます。CONTRIBUTING.md と CODE_OF_CONDUCT.md を参照してください。
セキュリティ
脆弱性は非公開で報告してください: SECURITY.md。データが欠落しているときに PASS を返したルールは、セキュリティ問題として扱われます。
ライセンス
MIT。LICENSE を参照してください。
Available Tools
6 toolsexplain_preflight_ruleBRead-onlyIdempotent
READ-ONLY. Explain one rule: what it checks, what data it needs, and its configurable options.
| Name | Required | Description | Default |
|---|---|---|---|
| rule_id | Yes | e.g. campaign.daily_volume |
TDQS
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.
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.
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.
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.
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.
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_rulesARead-onlyIdempotent
READ-ONLY. List the preflight rule catalogue, optionally filtered by category: campaign, contacts, suppression, personalization, copy, schedule, or senders.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No |
TDQS
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.
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.
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.
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.
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.
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_demoARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| max_samples | No | Affected records shown per finding. |
TDQS
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.
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.
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.
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.
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.
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_filesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| leads_path | Yes | Absolute or relative path to an existing file. | |
| config_path | No | Absolute or relative path to an existing file. | |
| max_samples | No | Affected records shown per finding. | |
| senders_path | No | Absolute or relative path to an existing file. | |
| campaign_path | Yes | Absolute or relative path to an existing file. | |
| evidence_path | No | Absolute or relative path to an existing file. | |
| output_format | No | Shape of the returned report. | |
| suppressions_path | No | Absolute or relative path to an existing file. |
TDQS
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.
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.
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.
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.
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.
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_campaignARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lead_limit | No | ||
| campaign_id | Yes | Instantly campaign UUID. | |
| config_path | No | Absolute or relative path to an existing file. | |
| max_samples | No | Affected records shown per finding. |
TDQS
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.
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.
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.
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.
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.
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_configARead-onlyIdempotent
READ-ONLY. Validate a rules configuration file without running any checks. Reports unknown rule ids, unknown options, and out-of-range values.
| Name | Required | Description | Default |
|---|---|---|---|
| config_path | Yes | Absolute or relative path to an existing file. |
TDQS
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.
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.
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.
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.
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.
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.
6 tool updates
v0.1.0- First observed
explain_preflight_rule - First observed
list_preflight_rules - First observed
preflight_demo - First observed
preflight_files - First observed
preflight_instantly_campaign - First observed
validate_preflight_config
TDQS
Scored across 6 tools
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.
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.
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.
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
Related MCP Connectors
Read audiences, groups, mailings and campaign results without sending email or changing contacts.
Render markdown into email-safe HTML, lint drafts for deliverability problems, and preview emails.
MailBeast.ai is a cold email outreach platform. This server lets AI assistants create and launch campaigns with multi-step A/B sequences, manage leads and sending mailboxes (health, warmup, limits), read and answer replies from a unified inbox, and pull campaign analytics. OAuth 2.1 sign-in with read-only or read-and-write access; an API key header is also supported. Website: https://mailbeast.ai
Evidence-readiness MCP server: validate, audit, and score briefs, memos, and evidence packs.
Related MCP Servers
- AlicenseBqualityDmaintenanceA Model Context Protocol server that provides read-only access to Mailchimp's Marketing API for comprehensive email marketing data retrieval.3885 npm12MIT
- AlicenseAqualityAmaintenanceLocal-first production-readiness MCP server for AI-built apps. It runs read-only checks, produces an evidence-based readiness score, and guides fixes before launch.1111 npm7Apache 2.0
- FlicenseNot gradedqualityCmaintenanceRead-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-
- AlicenseAqualityAmaintenanceA 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.610 npm2Apache 2.0