Skip to main content
Glama

pricing-mcp

An MCP server that gives AI agents real pricing analytics (elasticity, price simulation, guardrails, price-ladder and competitor checks), plus an eval suite that checks whether an agent using those tools actually gets the right answer.

Built around a packaged-coffee category, because that's where I spent years doing pricing at Starbucks and Nestlé. All data is synthetic.

Why this exists

Giving an agent pricing tools is easy. Knowing whether it uses them correctly is the hard part. An agent that says "raise the price to $10.49, margin looks fine" when the margin rule says otherwise is worse than no agent. So this project is built backwards from the evals:

  • The data is generated from known answers. Each SKU's true price elasticity is set in the generator, and a few pricing problems are planted on purpose. The tools are tested against that ground truth, not against themselves.

  • Agents are graded on behavior, not vibes. Did it call the right tool? Did it report a blocked price as blocked? Does every number in its answer actually appear in a tool result?

  • The tools are built for agents. Every result carries its inputs, assumptions and confidence. Errors list what's valid. Every tool is read-only, and every call writes a structured audit log line.

Related MCP server: Kryve Agent Evaluation MCP

Tools

Tool

What it answers

list_products

Which SKUs exist, with tier, pack size, price, cost, and the pricing policy

get_price_elasticity

How sensitive is this SKU to price? Log-log regression over 52 weeks with seasonal controls, a 95% interval, and a confidence label

simulate_price_change

What happens to weekly units, revenue and margin at a new price, and what does that projection assume

check_price_guardrails

Is a proposed price allowed? Hard rules (margin floor, ±15% per move) block; the competitor band warns

check_price_ladder

Do bigger packs cost less per ounce, and are tiers spaced value < core < premium by at least 10%?

competitor_price_index

Where each SKU sits against the median competitor and its tier's target band

Quick start

pip install -e ".[dev,evals]"
pytest                          # unit tests + tool evals
python -m evals.tool_evals      # tool evals with a readable report
pricing-mcp                     # run the server over stdio
pricing-mcp --http --port 8000  # or over streamable HTTP

Use it from Claude Code

claude mcp add pricing -- pricing-mcp

Then ask: "Are there any problems with our ground coffee price ladder?"

Use it from Claude Desktop or another MCP client

{
  "mcpServers": {
    "pricing": { "command": "pricing-mcp" }
  }
}

Evals

There are two layers.

1. Tool evals (deterministic, run in CI)

python -m evals.tool_evals checks the analytics against the generator's ground truth:

Suite

Checks

Result

Elasticity

Each SKU's estimate is within 0.30 of the true value and the true value falls in the 95% interval

14 / 14

Price ladder

Finds exactly the two planted breaks, with no false alarms

1 / 1

Competitor index

Flags exactly the two planted out-of-band SKUs

3 / 3

Guardrails

Correct verdict and the exact rules that failed, across pass / warn / block cases

7 / 7

Simulation

Revenue moves in the direction elasticity implies (elastic SKUs lose revenue on a price rise; inelastic ones gain)

14 / 14

39 / 39 passing. Largest elasticity error is 0.24 (true −2.6, estimated −2.84).

2. Agent evals (needs an API key)

python -m evals.agent_evals runs Claude against the server's tools on ten scenarios in evals/agent_cases.yaml and grades each transcript:

  • Tools used: did it call the tool the question needs?

  • Verdict: when the guardrail tool says block, does the answer say so instead of approving the price?

  • Grounding: every dollar figure, percentage and decimal in the answer must appear in a tool output or the question, or be the result of a calculation the agent wrote out. The grader re-does that arithmetic and checks that its inputs came from tools. Invented numbers, and derived numbers with no work shown, fail the case.

  • Must not say: no claiming to have changed data through read-only tools, no inventing an elasticity for a SKU that doesn't exist.

  • Multi-step: asked to fix the ground-coffee ladder, the agent has to find a price for the 32 oz that is cheaper per ounce than the 24 oz but still inside the competitor band, and prove it by getting a pass from the guardrail tool.

export ANTHROPIC_API_KEY=...
python -m evals.agent_evals                        # all cases
python -m evals.agent_evals --repeat 5             # measure consistency
python -m evals.agent_evals --case fix-ladder-multistep
PRICING_EVAL_MODEL=claude-haiku-5-5 python -m evals.agent_evals   # compare models

Each run writes a JSON report with full transcripts, pass rate, tool-call count and token usage to evals/results/. The held-out run below is saved in evals/reports/ so you can read every transcript. The graders have their own tests in tests/test_grading.py.

Results: Claude Sonnet 5.5, October 2026

Held-out run: 10 cases × 3 attempts, graded by a grader frozen before the run.

Result

Cases passed

27 / 30 (90%)

Behavior checks (right tool, right verdict, no approving a blocked price, no claimed writes, no invented estimates)

72 / 72

Number grounding

27 / 30

Tool calls

100 (about 3.3 per question)

Tokens

187k in, 28k out

The three misses were all grounding: a "26% below competitors" with no calculation shown, an example price ($5.49) offered unprompted, and a correct calculation written too far from its result for the grader to connect.

What the first live run taught me

The first run scored 11 / 30, and reading the transcripts showed most failures were the eval's fault, not the agent's:

  • The grader graded the wrong call. Asked about $4.99, the agent correctly reported it blocked, then helpfully tested $5.10 too. The grader checked the last guardrail call instead of the one for the price asked about.

  • Correct arithmetic looked like hallucination. The agent computed things like the price needed to hit the margin floor ($5.90 ÷ (1 − 0.52) = $12.29) and flagged them as its own math. A strict "must appear in tool output" rule failed them. Loosening the rule would have let real inventions through, so instead the agent is asked to show its work, and the grader re-checks it.

  • Phrase checks were too literal. "Isn't a known SKU" failed a check for the word "not", and "getting $10.49 approved would need a policy exception" tripped a check for "approved".

After fixing those, the same transcripts re-graded at 19 / 30. The remaining failures were genuine: derived numbers with no work shown. A prompt change to show calculations, plus parser fixes for the ways the agent actually writes math, brought a fresh held-out run to 27 / 30. The lesson: when an eval score is low, read the transcripts before you touch the prompt.

Design notes

  • Deterministic code for the math, the model for judgment. The agent decides which question to ask and how to explain the answer; it never does the regression or the policy check itself.

  • Hard versus soft rules. Margin and change-size limits block a price; competitor position only warns. That mirrors how most pricing teams actually run approvals.

  • Results explain themselves. Simulations list their assumptions and the observed price range they're reliable within. Elasticity comes with an interval and a confidence label, so an agent can say "medium confidence" instead of overstating.

  • Safe by construction. No tool writes anything. Every tool carries MCP read-only annotations, and the audit log records each call's tool, arguments, status and latency.

Data

scripts/generate_data.py writes 14 SKUs across whole bean, ground and cold brew in value, core and premium tiers, with 52 weeks of sales, three competitors' prices, and a pricing policy. Weekly units follow each SKU's true elasticity with seasonality (hot coffee peaks in winter, cold brew in summer) and noise. Planted problems:

  • Ground 32 oz costs more per ounce than ground 24 oz.

  • Premium ground 12 oz is priced below core ground 12 oz, and below its own margin floor.

  • Premium whole bean 12 oz sits well above competitors; value ground 12 oz sits well below.

Point the server at your own data with PRICING_MCP_DATA=/path/to/dir using the same four files.

Layout

src/pricing_mcp/
  analytics.py   pure pricing functions
  server.py      MCP server and tool definitions
  data.py        dataset loader
  data/          synthetic dataset
evals/
  tool_evals.py      deterministic checks against ground truth
  agent_evals.py     model-in-the-loop harness
  agent_cases.yaml   scenarios and expectations
  grading.py         graders
  ground_truth.json  answers from the generator (never read by the server)
scripts/generate_data.py
tests/

License

MIT

Available Tools

6 tools
check_price_guardrailsA
Read-onlyIdempotent

Check a proposed price against the pricing policy.

Hard rules (minimum margin, maximum change per move) produce "block". The soft rule (competitor price index band) produces "warn". Otherwise "pass".

NameRequiredDescriptionDefault
skuYes
proposed_priceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

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

The description adds useful behavioral detail by explaining that hard rules produce 'block', the soft rule produces 'warn', and otherwise 'pass'. Annotations already confirm this is a read-only, idempotent check, so the description adds outcome semantics rather than repeating safety metadata. It does not describe error behavior or policy-source details, but it is solid for a read-only guardrail check.

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 short, front-loaded with the core action, and immediately explains the possible outcomes. Every sentence contributes directly to understanding the tool.

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?

The tool has an output schema, so return values do not need full explanation. However, with 0% input schema description coverage, the description leaves gaps in parameter semantics and does not distinguish this check from closely related sibling tools.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for the two undocumented parameters. It mentions the proposed price conceptually but does not explain SKU format, price currency, units, or expected value ranges, leaving parameter semantics largely to inference.

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 uses a specific verb and resource: checking a proposed price against the pricing policy. It clearly explains the tool's core function, but it does not explicitly distinguish it from similar siblings such as check_price_ladder or simulate_price_change.

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?

Usage is implied by the name and description: use this to evaluate a proposed price before making a price change. However, there is no explicit guidance on when to use it versus simulate_price_change or check_price_ladder, nor are prerequisites or exclusions stated.

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

check_price_ladderA
Read-onlyIdempotent

Find price-ladder breaks in a category.

Flags bigger packs that cost more per ounce, and higher tiers priced too close to or below lower tiers.

NameRequiredDescriptionDefault
categoryYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish the safe read-only, idempotent, closed-world profile, so the bar is lower. The description still adds real behavioral value by naming the two anomaly conditions it flags, which tells the agent what the output represents beyond a generic 'check'.

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 sentences, zero filler, with the core action front-loaded and the detection criteria following as supporting detail.

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 explanation is unnecessary, and the description covers the detection logic well. The remaining gap is the ambiguous category parameter, which is a minor but real omission for a one-parameter tool.

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?

Only one parameter and schema description coverage is 0%, so the description must carry the burden. It says the check runs 'in a category' but gives no indication of the expected format (name vs. ID, taxonomy level), leaving the sole parameter under-specified.

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 ('Find') and resource ('price-ladder breaks') and then defines the detection rules concretely (bigger packs cost more per ounce, higher tiers priced at or below lower tiers). It is clearly distinguishable from siblings like check_price_guardrails or get_price_elasticity, though it never names an alternative explicitly.

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?

Usage is only implied: it's an analysis/audit tool scoped to a single category. There is no explicit statement of when to reach for this versus check_price_guardrails or simulate_price_change, and no prerequisites or exclusions.

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

competitor_price_indexB
Read-onlyIdempotent

Compare each SKU's price with the median competitor price, against its tier's target band.

NameRequiredDescriptionDefault
categoryYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3/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 openWorldHint=false, so the safety profile is covered. The description adds that this is an aggregate per-SKU comparison producing an indexed score versus a target band, but it says nothing about how SKUs outside a band are treated or what the computation needs to run.

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 no filler; the comparison logic and the target-band criterion both earn their place. It is arguably too terse for a tool whose only parameter is undocumented, but there is no structural waste.

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?

With an output schema present and read-only annotations, return values and safety need no explanation. However, the required `category` argument and the scope of 'each SKU' (all products in that category?) are left unstated, leaving the agent under-informed before invocation.

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

Parameters2/5

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

Schema description coverage is 0% and the single required parameter `category` is never mentioned in the description. The agent must guess whether it is a product category, a filter scope, or an enum-like value, so the description does not compensate for the schema gap.

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 names a specific verb (compare) and a precise comparison basis: each SKU's price vs. the median competitor price, evaluated against its tier's target band. That is enough to distinguish it from siblings like check_price_ladder or check_price_guardrails, though it never states the scope the required `category` argument implies.

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?

There is no explicit when-to-use guidance, no prerequisites, and no mention of alternatives such as check_price_ladder or get_price_elasticity. The phrase 'against its tier's target band' hints at context but leaves the agent to infer when this analysis is the right call.

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

get_price_elasticityA
Read-onlyIdempotent

Estimate how sensitive a SKU's unit sales are to price, from 52 weeks of sales.

Returns the elasticity, a 95% confidence interval, R², and a confidence label.

NameRequiredDescriptionDefault
skuYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, closed-world behavior; the description adds the meaningful trait that the estimate is derived from a 52-week historical window and that it is a statistical output with a confidence interval and confidence label. It does not say what happens when a SKU has insufficient history, which is the main remaining behavioral gap.

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 sentences, purpose front-loaded, nothing redundant. The second sentence on returns is arguably covered by the output schema, but it is short and useful.

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 single-parameter read-only tool with an output schema, the description covers what is computed, the data window, and the shape of the result. It stops short of stating data-sufficiency requirements or SKU-level scope, which matters for a statistical estimator.

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?

Only one parameter exists and schema description coverage is 0%, so the description must carry the burden. It implies the input is a SKU ('a SKU's unit sales') but adds no format, identifier convention, or granularity (per channel? per region?) beyond the property name 'sku'.

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 (estimate) and resource (price elasticity / sensitivity of unit sales to price) with the data basis (52 weeks of sales). It is distinguishable from siblings like simulate_price_change by framing itself as an estimation from historical data rather than a forward simulation, though it never names or contrasts those siblings explicitly.

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?

Usage is only implied: the 'from 52 weeks of sales' framing suggests this is the historical-measurement tool and not the what-if tool, but there is no explicit when-to-use, when-not-to-use, or reference to simulate_price_change / check_price_guardrails as alternatives.

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

list_productsA
Read-onlyIdempotent

List SKUs with tier, pack size, current price and unit cost, plus the pricing policy.

category: optional filter, one of whole_bean, ground, cold_brew.

NameRequiredDescriptionDefault
categoryNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/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 openWorldHint=false, so the safety profile is covered. The description adds useful content-level disclosure (that a pricing policy accompanies the SKU rows), but says nothing about ordering, completeness, pagination, or whether the category filter is an exact match.

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 short lines, front-loaded with the primary purpose before the parameter note; every clause carries information. Minor waste from the trailing line break and the slightly list-like formatting.

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?

A read-only, single-parameter listing tool with an output schema that already documents the return shape. The description covers purpose, return contents, and the one parameter's allowed values, so 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.

Parameters4/5

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

Schema description coverage is 0% and the schema declares category as an unconstrained anyOf string/null with no enum, so the description is the sole source of the allowed values whole_bean, ground, cold_brew, and confirms it is optional. It does not state case sensitivity or the behavior when omitted (list all), keeping it off a 5.

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 ('SKUs') and enumerates the returned fields (tier, pack size, price, unit cost, pricing policy), so the agent knows exactly what comes back. It does not explicitly contrast with siblings like get_price_elasticity or competitor_price_index, but the resource-level purpose is distinct enough to disambiguate.

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?

The description contains no when-to-use guidance, no prerequisites, and no exclusions relative to the sibling pricing tools. The only context given is that the category parameter is an optional filter, which is parameter semantics rather than usage routing.

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

simulate_price_changeA
Read-onlyIdempotent

Project weekly units, revenue and gross margin if a SKU moves to new_price.

Uses the SKU's estimated elasticity. Read the returned assumptions before relying on it.

NameRequiredDescriptionDefault
skuYes
new_priceYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, closed-world), and the description goes beyond them by disclosing the mechanism ('uses the SKU's estimated elasticity') and warning that the output is model-based and carries assumptions worth reading. That is genuine behavioral context: the numbers are projections, not measurements. It does not mention precision, edge cases (missing elasticity for a SKU), or failure modes.

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 sentences, front-loaded with what is computed, followed by the mechanism and the caveat. Nothing is redundant and every sentence carries information an agent would otherwise have to guess.

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?

The presence of an output schema means return values need not be described, and the description covers inputs, mechanism, and the caveat about assumptions. The remaining gap is units/currency for new_price, which matters for a pricing tool and is documented nowhere.

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 0% – both parameters carry only bare titles. The description clarifies what new_price means (the price the SKU 'moves to', i.e., a target price, not a delta or percentage) and that the sku drives an elasticity lookup. It does not state currency/units for new_price or expected SKU format, so it only partially compensates for the coverage gap.

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 verb 'Project' plus the concrete outputs (weekly units, revenue, gross margin) and the trigger condition (a SKU moving to new_price) make the tool's function unmistakable and clearly different in kind from siblings like get_price_elasticity or check_price_guardrails. It stops short of naming a sibling to route away from, so it is clear but not fully differentiated in text.

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?

Usage is only implied: the word 'Project' signals a what-if simulation, so an agent can infer this is a pre-change evaluation rather than a data lookup. There is no explicit statement of when to use this instead of get_price_elasticity (the input side) or check_price_guardrails (the validation side), and no stated prerequisites.

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 observedcheck_price_guardrails
    • First observedcheck_price_ladder
    • First observedcompetitor_price_index
    • First observedget_price_elasticity
    • First observedlist_products
    • First observedsimulate_price_change

TDQS

A3.7/5.0

Scored across 6 tools

Disambiguation4/5

Each tool occupies a distinct analytical niche: elasticity estimation, simulation, policy guardrails, internal ladder checks, and competitor benchmarking. The three 'check/compare' tools could look similar at a glance (guardrails vs ladder vs competitor index), but their descriptions clearly separate hard policy rules, internal consistency, and external market position.

Naming Consistency4/5

Five of six tools follow a clean verb_noun pattern (list_products, get_price_elasticity, simulate_price_change, check_price_guardrails, check_price_ladder). The lone outlier, competitor_price_index, is a noun-only name but is still readable and unambiguous.

Tool Count5/5

Six tools is well-scoped for a pricing decision-support server, with each tool covering a distinct step in the analyze-simulate-validate workflow. No filler or redundant tools.

Completeness4/5

The read/analyze/simulate/validate lifecycle is covered, including guardrails and ladder checks that agents would otherwise have to invent. The notable gap is the absence of any write or apply operation (e.g. commit a price change or record a decision), so the workflow ends at advice.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers