Skip to main content
Glama

Funnel Calibrator

판매 퍼널이 실제로 하는 일에 맞춰 광고 결정을 재보정하는 MCP 서버입니다 — 추정된 일이 아니라.

⚠️ 상태: 작업 진행 중. 스캐폴딩과 설계는 커밋되었으며, MCP 서버 구현은 2026년 8월 24일에 공개됩니다. 방어 발표: 2026년 8월 25일.

KSE AI Agentic Lab — 개인 실험 과제 (7주차, MCP 통합).


이 프로젝트가 해결하는 문제

이 프로젝트는 Meta 광고를 통해 여성 의류를 판매하는 우크라이나의 착불 결제(COD) 이커머스 사업을 기반으로 합니다. 여기의 퍼널은 다섯 단계로 구성됩니다.

Meta ads ──► Lead ──► Call-centre approval ──► Shipment ──► Buyout at post office ──► Profit

결제가 배송 시점 이루어지므로, 광고 캠페인의 결과는 돈을 지출할 당시에는 알 수 없습니다. 그 결과는 고객이 택배를 수령하거나 수령하지 않는 시점, 즉 2~4주 후에야 드러납니다. 이 공백을 극복하기 위해 사업은 포트폴리오 공통 상수 두 가지 — 승인율 65%와 수령률 52.5% — 를 사용하며, 이를 모든 제품마다 손익분기가 유지되는 최대 비용 per RM(Stop CPL) 과 최적화 목표(Goal CPL) 를 계산합니다.

이 상수들은 개별 상품에 적용되는 포트폴리오 평균이며, 개별 상품은 이 평균에서 크게 벗어납니다. 실제 기업에서 측정된 사례: 한 공급사의 제품은 가정된 52.5% 대신 37%의 수령률을 보였고, 어느 제품의 승인율은 가정된 65% 대신 53%로 측정되었습니다. 또 수령률은 가격대와 강한 상관관계를 가지는데, 690–790₴ 구간에서 약 93%, 1290 ₴이상 구간에서는 약 55%로 나타났습니다.

어떤 제품의 실측 비율이 가정보다 나쁘면, 그 제품의 실제 손익분기 CPL은 사업이 운전하는 기준보다 낮아집니다 — 그래서 광고 목표가 실제 손익분기점보다 위에 세팅될 수 있는 일이 생깁니다. 광고 대시 최적의 트래픽은 정상으로 보이지만, 실행 결과는 모든 리드가 손실을 부담하며 손해는 몇 주 후 월간 손실이 결산되는 시점에만 드러납니다.

즉 이 시스템은 열린 루프 제어(open-loop control) 시스템입니다. 측정은 다시 decision 되돌아오지 않습니다. Funnel Calibrator가 이 루프를 닫아줍니다.

Related MCP server: oficio

하는 일

서버는 과거 주문 데이터로 각 제품의 자체 퍼널 지표를 측정하고, 그 제품의 실제 손익 CPL 경계치을 다시 계산하며, 제안된 광고 결정을 교정된 수치에 견주어 감사합니다 — 맹신해야 하는 판결 대신에 구조화된 근거를 반환합니다.

이를 일반적인 경우보다 어렵게 만드는 문제는 두 가지며, 두 가지 모두의 도구 계약서에 명시되어 있습니다:

  • 중도절단(Censoring) 미해결 주문. 최근 주문은 아직 확정이 아닙니다 — 배송 중인 택배자는 수령도 반품도 아닙니다. 단순하게 모두 셀 경우 측정 지표가 감소됩니다. 이 서버는 설정가능한 성숙 기간보다 어린 코호트를 제외하며, 그는 얼마나 많은 주문을 남겨 두었는지 보고합니다.

  • 작은 표본 크기. 상품별, 한계별, 사이즈별·색상별로 하면 관측값은 금세 작아집니다. 모든 측정값에는 표본 크기와 신뢰도 플래그가 갖추어져 있으며, 서버는 설정할 수 있는 임계값 아래에서는 결론을 산정하지 않는 대신, 신뢰하기 어려운 확실한 소음을 쓰지 않습니다.

아키텍처

┌─────────────────────────────────────────────────────────────┐
│  Agent  (Claude Agent SDK)                                  │
│                                                             │
│    ├── MCP ──► Obsidian Local REST API      [existing]      │
│    │           decision journal: reads the day's objective  │
│    │           and prior conclusions, writes calibrated      │
│    │           verdicts back as a durable record            │
│    │                                                         │
│    └── MCP ──► Funnel Calibrator            [custom]        │
│                measure → recalibrate → recommend → audit    │
│                        │                                     │
│                        ▼                                     │
│                 local snapshot dataset                       │
│                 (anonymised order cohorts + unit economics)  │
└─────────────────────────────────────────────────────────────┘

커스텀 서버는 별도 프로세스로 실행되어 stdio 규격으로 통신하며, 에이전트와 독립적으로 시작이 가능합니다.

에이전트 흐름

  1. 오늘의 광고 목표와 어제의 결론을 Obsidian 볼트에서 읽습니다.

  2. 스냅샷에서 각 상품의 관측된 퍼널 지표들을 측정합니다(중도절단 및 표본 크기 인지).

  3. 그 상품의 실제 Stop/Goal` CPL과 score 상위해서 추정된 베이스라인과의 deviation(drift)을 재계산합니다.

  4. 상품이 낮은 성과를 내는 원인이 무엇인지를 진단합니다 — 원인마다 해결책이 다릅니다 — 그리고 다음 조치를 권고합니다.

  5. 오늘 제안된 결정들을 보정된 지표와 대비해 감사합니다.

  6. 재계산된 판정을 근거 체인 포함하여 볼트에 기록합니다.

각 단계는 전 단계의 결과물을 이어받습니다: 볼트 내용은 무엇을 측정할지를 좌우하고, 측정값은 보정된 한계치를 결정하며, 그 한계치가 제안된 결정의 유지 또는 반전을 좌우합니다.

커스텀 도구

Tool

Responsibility

measure_sku_funnel

한 상품의 관측된 승인 / 수령 / 반품률을 측정하며, 파밀집단 censoring과 표본 크기 gate를 포함합니다. 주 데이터 소스 도구.

recalibrate_cpl_bounds

관측된 비율로 실제 Stop/값 목표

Goal/CPL을 재산출합니다. 가정된 베이스라인 대비 드리프트를 보고합니다.

recommend_next_action

실패 모드를 구분 — 약한 오퍼, 경매 경쟁 심화, 트래픽 품질, 크리에이티브 피로, 구조적 이익 손실 — 그에 맞는 다음 액션을 돌려줍니다.

audit_ad_verdict

보정된 한계를 제안된 결정에 적용하고, 수치 근거 체인과 함께 supported/contradicted/insufficient_data를 반환합니다.

입출력 스키마 전체, 오류 조건, 부수적인 영향 및 작업 예제: docs/tool-contracts.md.

왜 이 네 가지인지, 왜 MCP 경계에 두는지, 이 설계가 포기시키는 것: docs/design-rationale.md.

데이터 소스

로컬 팰레이트저 기반의 익명 처리된 스냅샷 데이터셋으로서, 비즈니스 CRM(고객관계관리) 즉 scripts/export_snapshot.py 가져옵니다. 실행 시점에 인증 또는 네트워크 액세스가 필요하지 않기 때문에 데모의 경우 확정적으로 재연 가능합니다.

고객 이름, 전화번호, 주소, 거래의 운송장 번호 등 개인 식별 정보는 export 과정 모두, 교정에 필요한 항목 — 제품 코드, 주문 상태, 타임스탬트, 금액, 단위 경제 지표 — 만 남습니다. 익명화 정책과 스키마는 data/README.md을 참죠하십시오.

빠른 시작

전제 조건: Python ≥ 3.11과 uv. Local REST API 플러그인이 있는 Obsidian은 에이전터 흐름에만 필요하며 서버 전용은 아닙니다.

git clone https://github.com/denkor1015-debug/funnel-calibrator.git
cd funnel-calibrator
uv sync

MCP 서버를 독립 모드로 실행합니다 (stdio의 MCP 소통, 대기 클라이언트):

uv run funnel-calibrator

MCP Inspector에서 노출된 도구들을 인터랙티브하게 확인합니다:

npx @modelcontextprotocol/inspector uv run funnel-calibrator

설정은 환경 변수로 읽기 때문에 템플릿을 복사하여 수정합니다:

cp .env.example .env

두 MCP 연결의 에이전터 조합: agent/mcp_config.example.json.

저장소 구조

src/funnel_calibrator/   MCP server: tool definitions, calibration math, policy engine
scripts/                 snapshot exporter (CRM ──► anonymised local dataset)
data/                    snapshot dataset + anonymisation policy
docs/                    tool contracts, design rationale, defence checklist
agent/                   MCP client configuration for both connections
tests/                   unit tests for calibration and policy logic

구축 계획

  • 구성 요소 프레임 워크, 아키,, 보관 위험각에 대한 근거 문서

  • PII 제거을 포함한 스냅샷 내보내기 도구

  • measure_sku_funnel — 중도절단 및 표본 크기 판정

  • recalibrate_cpl_bounds — 단위 경제성 재계산

  • recommend_next_action — 실패 모드 진단

  • audit_ad_verdict — 광고 결정 감사

  • Obsidian MCP 통합 및 엔드투엔드 에이전트 흐름

  • 파업 경로 처리 및 라이브 데모

  • 도구 계약서 문서 및 발표 스크립트


Assignment 요구사항 대응표

요구사항

해당 위치

파트 A — 승인된 기존 MCP 서버

Obsidian Local REST API; 계약정보는 docs/tool-contracts.md 에 문서화

파트 B — 커스텀 MCP 서버, 3개 이상의 실무적 도구

src/funnel_calibrator/; 네 도구 중 셋은 검색이 아니라 계산·진단·검증작업입니다.

파트 C — 도구 계약 문서

docs/contract-contracts.md 할 것

파트 D — 운영 조건

시크릿이 커밋되지 않음; 환경 변수로 구성; 로컬dataset가 런타임 네트워크 필요 없음

설계 근거 문서

docs/design-rationale.md

발표 스크립트

docs/defence-checklist.md

라이선스

MIT — LICENSE을 참조하세요.

Available Tools

5 tools
audit_ad_verdictAudit a proposed advertising decisionA
Read-only

Test an advertising decision that originated elsewhere — a daily watchdog report, an operator's judgement, a note in the decision journal — against this product's recalibrated economics. Returns 'supported', 'contradicted', or 'insufficient_data', together with the numeric chain that produced the verdict and a counter-recommendation where the proposal is contradicted. Use before acting on any recommendation this server did not itself produce. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
skuYesProduct code, e.g. 21-183
sourceNoWhere the proposal came from, for the audit record
current_cplYesCost per lead the proposal is based on, USD
cpl_trend_daysNoDays the cost per lead has held
proposed_actionYesThe decision being proposed
competitor_activeNoWhether a competitor is bidding on this product

Output Schema

ParametersJSON Schema
NameRequiredDescription
skuYes
verdictYes
evidenceYes
rationaleYes
reliabilityYes
proposed_actionYes
counter_recommendationYes

TDQS

A4.2/5.0
Behavior4/5

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

Adds real behavioral context beyond the annotations: it returns a numeric chain and a counter-recommendation when the proposal is contradicted, and clarifies the three verdict states. 'Read-only' duplicates readOnlyHint=true, so that portion is redundant rather than additive.

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?

Three dense sentences, front-loaded with the purpose and immediately followed by return values and the usage rule. The em-dash enumeration of proposal sources is slightly verbose but earns its place by clarifying scope.

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?

An output schema exists, so return values need not be exhaustively explained, yet the description still names the verdicts and the counter-recommendation. Combined with the pre-action usage rule, an agent has everything needed to call it correctly.

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%, so every parameter is already documented in the schema (sku, source, current_cpl, cpl_trend_days, proposed_action enum, competitor_active). The description adds no format, units, or edge-case guidance for any parameter, so baseline 3 applies.

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?

States a specific verb (test/audit) and resource (an advertising decision originating elsewhere), and enumerates the three possible verdicts returned. It implicitly separates itself from siblings like recommend_next_action by scoping to decisions this server did not produce.

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?

Gives an explicit trigger: 'Use before acting on any recommendation this server did not itself produce,' which also implies the exclusion (decisions the server generated). It does not name an alternative sibling tool by name, so it stops 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.

list_covered_skusList products the snapshot can answer forA
Read-only

List the product codes present in the loaded snapshot, with their order counts and whether price and cost data exist for them. Use to resolve a product code before measuring, or to see what the dataset covers. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
min_ordersNoOnly list products with at least this many orders

Output Schema

ParametersJSON Schema
NameRequiredDescription
windowYes
productsYes
total_ordersYes
status_taxonomyYes
snapshot_generated_atYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The trailing 'Read-only.' merely restates the annotation, and the listed return fields duplicate the output schema, so the description adds little behavioral context beyond what structured fields provide.

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?

Two tight sentences: the first states what is listed and what each entry contains, the second states when to use it. Nothing is wasted and the purpose is front-loaded.

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 read-only list of one optional filter parameter, the definition covers purpose, contents, and usage adequately, and an output schema exists so return structure need not be explained. Only pagination or result-size behavior is unaddressed, a minor gap.

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?

There is a single optional parameter, min_orders, whose schema description ('Only list products with at least this many orders') is complete at 100% coverage. The description does not reference this filter at all, so it adds no meaning beyond the schema; baseline 3 applies.

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 uses a specific verb+resource ('List the product codes present in the loaded snapshot') and even specifies the returned fields (order counts, price/cost availability). It implicitly routes the agent away from the measuring sibling by framing itself as the step 'before measuring', so an agent can distinguish it from measure_sku_funnel.

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?

It gives clear context cues: 'Use to resolve a product code before measuring, or to see what the dataset covers.' That covers the two main situations for calling it. It does not name a specific alternative sibling or state when not to use it, keeping it 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.

measure_sku_funnelMeasure a product's funnelA
Read-only

Measure the observed call-centre approval, post-office buyout, and return rates for one product over a date window, counting only order cohorts old enough to have resolved. Use this before any decision that depends on approval or buyout rates, instead of assuming the portfolio-wide 65% approval and 52.5% buyout. Returns rates together with sample size and a reliability flag, and returns null rates with reliability 'insufficient' rather than a number when the resolved sample is too small to support a conclusion. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
skuYesProduct code as it appears in the snapshot, e.g. 21-183
window_toNoISO date YYYY-MM-DD; defaults to the snapshot date
window_fromNoISO date YYYY-MM-DD; defaults to the snapshot start
maturity_daysNoDays an order must be old before it counts as resolved. Defaults to FC_COHORT_MATURITY_DAYS (21). Range 0–90.

Output Schema

ParametersJSON Schema
NameRequiredDescription
skuYes
leadsYes
windowYes
refusedYes
approvedYes
bought_outYes
min_sampleYes
buyout_rateYes
reliabilityYes
return_rateYes
approval_rateYes
cohort_cutoffYes
maturity_daysYes
resolved_ordersYes
shipped_resolvedYes
excluded_in_flightYes
excluded_still_movingYes
snapshot_generated_atYes
excluded_awaiting_callYes
excluded_immature_cohortYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces 'Read-only' while adding real behavioral context: only mature/resolved cohorts are counted, null is returned with reliability 'insufficient' when the sample is too small, and results include sample size and a reliability flag. That is meaningful disclosure beyond 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?

Front-loaded with the core action and scope, followed by usage guidance and return behavior; every sentence carries information. It runs slightly long, but nothing is redundant padding.

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?

With an output schema present, the description need not enumerate return fields, and it still covers usage, cohort maturity, small-sample handling, and read-only status. Nothing an agent needs to call this correctly is missing.

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?

Schema coverage is 100%, so the baseline is 3, but the description adds conceptual meaning to the parameters by explaining that only cohorts 'old enough to have resolved' are counted, which clarifies the role of maturity_days and the window parameters beyond the raw ISO-date documentation.

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?

States a specific verb (measure) and resource (call-centre approval, post-office buyout, and return rates for one product) with explicit scope (date window, resolved cohorts only). An agent can distinguish this from the sibling tools without opening any 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?

Gives clear when-to-use guidance: 'before any decision that depends on approval or buyout rates, instead of assuming the portfolio-wide 65% approval and 52.5% buyout.' It does not name a sibling alternative, but the triggering condition is unambiguous.

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

recalibrate_cpl_boundsRecalibrate CPL boundsA
Read-only

Recompute Stop CPL (the cost per lead at which profit reaches zero) and Goal CPL (the optimisation target) for one product from its own measured funnel rates instead of portfolio-wide assumptions, and report the drift against the baseline currently in use. Measures the product itself when observed rates are not supplied. Use whenever a cost-per-lead target is being set, defended, or questioned. Flags the case where the assumed target sits above the true break-even, which is invisible in the ads dashboard. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
skuYesProduct code, e.g. 21-183
usd_uahNoHryvnia per US dollar; defaults to the product's rate
window_toNoISO date, used only when measuring on demand
window_fromNoISO date, used only when measuring on demand
observed_buyoutNoMeasured buyout rate 0–1; measured on demand when omitted
observed_approvalNoMeasured approval rate 0–1; measured on demand when omitted

Output Schema

ParametersJSON Schema
NameRequiredDescription
skuYes
drift_pctYes
inputs_usedYes
rate_sourceYes
reliabilityYes
observed_ratesYes
resolved_ordersYes
structural_lossYes
contribution_uahYes
goal_cpl_assumedYes
stop_cpl_assumedYes
goal_cpl_observedYes
stop_cpl_observedYes
economics_reliableYes
target_above_breakevenYes
contribution_uah_assumedYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description confirms 'Read-only.' Parity there. The description adds real behavior: it falls back to measuring the product itself when rates are omitted, and it reports drift vs. the current baseline. It does not disclose cost/latency of on-demand measurement, keeping it out of the 5.

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?

Four sentences, each load-bearing: what is computed, the source substitution, the fallback, the trigger, and the flag. Verb+resource is front-loaded, and 'Read-only' is correctly placed last as a closing guarantee.

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?

An output schema exists, so return-value explanations are unnecessary. For a 6-param read-only tool the description covers purpose, fallback behavior, and the business flag adequately. It omits when observed_* should be supplied vs. left null (beyond 'when omitted'), a minor gap.

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%, so each parameter is documented in the schema. The description adds only the fallback semantics ('measured on demand when omitted'), which is already stated per-param in the schema. It does not explain the observed_* vs. window_* interaction beyond that. Baseline 3 applies.

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?

States a specific verb (recompute) and two named resources (Stop CPL, Goal CPL), defines each parenthetically in business terms, and distinguishes the computation source ('from its own measured funnel rates instead of portfolio-wide assumptions'). An agent can separate this from siblings like measure_sku_funnel.

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

Usage Guidelines5/5

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

Explicit trigger: 'Use whenever a cost-per-lead target is being set, defended, or questioned.' Names the specific alert condition it surfaces (assumed target above true break-even, invisible in the ads dashboard). No sibling is named as an alternative, but the when-to-use clause is unambiguous.

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

recommend_next_actionRecommend the next advertising actionA
Read-only

Diagnose why a product is underperforming and return the matching remedy. Given the product's measured funnel, its current cost per lead, and optional competitor and creative signals, identifies the likeliest failure mode — structural loss, contested auction, traffic quality, offer or price mismatch, creative fatigue, or a weak offer — and returns the action that fits it. Use when a campaign misses its target and the cause is not yet established, because cheap leads that fail on the call and leads that fail at the post office need opposite remedies. Returns action 'hold' with diagnosis 'insufficient_data' rather than guessing when the sample is too small. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
skuYesProduct code, e.g. 21-183
window_toNoISO date
current_cplYesCurrent cost per lead in USD
window_fromNoISO date
cpl_trend_daysNoDays the current cost per lead has held
competitor_activeNoWhether a known competitor is bidding on this product
creative_ctr_trendNoChange in click-through rate; negative means falling
creative_frequencyNoMeta frequency for the running creative

Output Schema

ParametersJSON Schema
NameRequiredDescription
skuYes
actionYes
evidenceYes
priorityYes
diagnosisYes
rationaleYes
confidenceYes
measurementYes
breakeven_conditionYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the closing 'Read-only' is redundant. However, the description adds real behavioral context beyond the annotations: the diagnosis taxonomy it applies, the signals it consumes, and the fallback behavior ('hold' with 'insufficient_data') instead of a forced recommendation. That fallback is the kind of trait an agent cannot infer from structured fields.

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?

Front-loads the purpose in the first sentence, then layers the failure taxonomy, the usage trigger, and the fallback rule in a logical order. The 'call vs. post office' analogy consumes a clause that is illustrative rather than strictly load-bearing, and the trailing 'Read-only' duplicates the annotation, so it is dense but not maximally tight.

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 an output schema present, the description need not document return fields, and it correctly only hints at the shape ('action hold', 'diagnosis insufficient_data'). Given 8 parameters at full schema coverage plus annotations, nearly everything an agent needs to call this correctly is present; only explicit sibling routing is absent.

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% across all 8 parameters, so the schema already defines sku, current_cpl, window_*, cpl_trend_days, competitor_active and the creative signals. The description only gestures at them collectively ('measured funnel, its current cost per lead, and optional competitor and creative signals') without adding format, units, or interaction semantics. 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?

States a specific verb and resource ('Diagnose why a product is underperforming and return the matching remedy') and enumerates the exact failure modes it distinguishes (structural loss, contested auction, traffic quality, offer or price mismatch, creative fatigue, weak offer). An agent can tell this apart from measure_sku_funnel or audit_ad_verdict, which measure or judge rather than prescribe a remedy.

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?

Gives an explicit trigger ('Use when a campaign misses its target and the cause is not yet established') and a justification for the tool's existence (opposite remedies for leads that fail on the call vs. at the post office). It also states a boundary condition — returns 'hold'/'insufficient_data' rather than guessing on small samples. It stops short of naming sibling tools as alternatives, so it is clear context without explicit routing.

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. 5 tool updatesv0.1.0
    • First observedaudit_ad_verdict
    • First observedlist_covered_skus
    • First observedmeasure_sku_funnel
    • First observedrecalibrate_cpl_bounds
    • First observedrecommend_next_action

TDQS

A4.3/5.0

Scored across 5 tools

Disambiguation5/5

Each tool targets a distinct decision stage: listing covered SKUs, measuring observed funnel rates, recalibrating CPL bounds, recommending remedies, and auditing external verdicts. The two diagnostic tools (recommend_next_action and audit_ad_verdict) are clearly separated by whether the decision originated from this server or elsewhere. No overlapping or indistinguishable purposes.

Naming Consistency5/5

All tools use a consistent snake_case verb_noun pattern (measure_sku_funnel, recalibrate_cpl_bounds, recommend_next_action, audit_ad_verdict, list_covered_skus). The convention is predictable and readable throughout.

Tool Count5/5

Five tools is well-scoped for a specialized funnel calibration server. Each tool earns its place: discovery, measurement, recalibration, diagnosis, and verification. There is no redundancy or thin surface.

Completeness4/5

The surface covers the full read-only analytics lifecycle from listing SKUs to auditing external decisions, with sensible fallbacks for insufficient data. A minor gap is the absence of a dedicated tool to fetch or compare the current portfolio-wide baseline assumptions, though descriptions imply those are internally available.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables agents to turn customer conversations into provably correct remodeling quotes by extracting catalog-bounded line items with evidence and calculating prices deterministically.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables agents to query historical call-center call reason notes and tags on demand, detect statistically significant emerging problem spikes against baselines, and evaluate automated categorizers against ground truth.
    MIT
  • F
    license
    Not graded
    quality
    A
    maintenance
    Enables AI assistants to retrieve analytics reports, compare periods, and inspect orders, leads, calls, visits, clients, and funnel data from allowed projects.
    1
    -