Complexity Cost Calculator
Server Details
Prices the cost of software complexity and how AI adoption changes engineering cost over time.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 2 tools
The two tools are clearly distinct: calculate performs the domain computation, while health checks API availability. There is no plausible overlap or risk of misselection.
Both names are simple lowercase identifiers, but calculate is an action verb while health is a conventional diagnostic noun. This is a minor deviation from a strict verb-based pattern and remains readable.
The server exposes only one functional tool plus a health check, making the surface feel thin. Two tools is borderline for the stated purpose, though the narrow calculator scope makes it defensible.
The calculate tool appears to cover the main domain outputs: per-feature, quarterly/yearly costs, AI adoption effects, and Pro levers. Minor gaps exist around inspecting assumptions, comparing scenarios, or retrieving prior calculations, but core usage is covered.
Available Tools
2 toolscalculateBRead-onlyInspect
Calculate what software complexity costs an engineering organization per feature, per quarter and per year, how AI adoption changes that cost over the coming quarters, and (Pro) which levers lower it.
| Name | Required | Description | Default |
|---|---|---|---|
| teams | Yes | Teams in the organization (not more than engineers) | |
| levers | No | Pro. Levers that put people back in the loop, or automate, where AI makes a cost worse: human_interfaces (people design and review every change that crosses a module boundary), explain_before_merge, safety_net (contract tests, monitoring, canary releases with automatic rollback) and decision_rights (decisions move to the teams that own the code). Each has its own cost. On Pro the response also has a plan with the cheapest mix of levers for every AI level. | |
| engineers | Yes | Engineers in the organization | |
| ai_adoption | No | AI adoption for every team. Leave it out for no AI. | |
| hourly_rate | No | Cost of one engineering hour; adds dollar amounts to the results | |
| team_adoption | No | Pro. Different AI levels per group of teams; the team counts must add up to teams. Use instead of ai_adoption. | |
| vacuum_effort | Yes | Hours a typical change would take in a perfectly modular system | |
| ai_assumptions | No | Pro. Your own AI values instead of the starting values | |
| decision_people | No | People outside the teams who take part in a typical cross-team decision (default 2) | |
| teams_per_change | No | Teams a typical change crosses (not more than teams) | |
| features_per_year | No | Features shipped per year (default 20) | |
| lever_assumptions | No | Pro. Your own values for the levers instead of the starting values | |
| connascence_degree | Yes | How many other modules usually change along with it (a count) | |
| coordination_hours | Yes | Hours of meetings, threads and reviews the change causes | |
| calibration_changes | No | Pro. Past changes with their actual hours, to fit the interdependence factor. Use instead of interdependence_factor. | |
| incident_cost_hours | No | Hours an incident costs; give it together with incident_likelihood | |
| incident_likelihood | No | Chance that a change causes an incident; give it together with incident_cost_hours | |
| projection_quarters | No | Quarters to project (default 12) | |
| interdependence_factor | No | How strongly coupled modules drag work along (default 0.5) | |
| maintenance_hours_per_quarter | No | Maintenance hours per quarter | |
| infrastructure_hours_per_quarter | No | Infrastructure hours per quarter | |
| connascence_degree_change_per_quarter | No | Pro. Planned change in coupling per quarter (negative when you decouple) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ai | Yes | Team ownership, lost understanding, and which costs AI made cheaper or more expensive than no AI |
| plan | Yes | Pro: the cheapest lever mix for the chosen adoption and for every AI level; null on Free |
| levers | Yes | |
| notice | No | Present when Pro fields were sent on the Free plan and ignored |
| horizon | Yes | Hours (and dollars) over the projection, with and without AI |
| per_year | Yes | |
| projection | Yes | One entry per quarter with expected, low, high and no-AI values |
| assumptions | Yes | Starting values used, not fitted |
| calibration | No | |
| per_feature | Yes | |
| per_quarter | Yes | |
| model_version | Yes | |
| sync_tax_multiplier | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true is consistent with a pure computation, and the description usefully discloses the three time horizons and that lever analysis is gated behind Pro. It does not say the output is a model estimate driven by default assumptions, nor that defaults exist for many inputs (projection_quarters, interdependence_factor, features_per_year) — context the schema only hints at. With annotations carrying the safety profile, this is adequate but not rich.
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 that packs the cost dimensions, the AI projection, and the Pro lever capability without filler. It is dense but well ordered by time horizon. No wasted wording, though the parenthetical '(Pro)' reads slightly awkwardly mid-clause.
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?
The tool is a complex 22-parameter model with nested objects, but it ships a fully described schema and an output schema, so return values need not be explained. The description covers scope and Pro gating but omits that results are estimates resting on default assumptions and how this relates to the sibling 'health' tool. Adequate, with clear remaining gaps for a model of this complexity.
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%, so every one of the 22 parameters, including nested Pro objects, is already documented in the schema. The description adds only the aggregate notion of 'levers' and Pro gating; it explains no parameter's meaning, units, or defaults beyond what the schema states. Baseline 3 applies when the schema does the heavy lifting.
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 (Calculate) and the exact quantity produced: software complexity cost per feature, per quarter, per year, plus AI-driven projections and (Pro) levers. An agent can immediately tell this is a cost-modeling calculator rather than a diagnostic. It does not explicitly contrast itself with the sibling 'health' tool, so it stops short of a 5.
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?
Usage is only implied by the name and the phrase '(Pro) which levers lower it', which hints at a tiered capability. There is no statement of when to reach for this versus 'health', nor prerequisites such as required inputs or what the model assumes. An agent must infer the selection rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
healthARead-onlyInspect
Health check for the Complexity Cost Calculator API. No API key required.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| message | No | |
| service | No | |
| version | No | |
| database | No | |
| environment | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds genuinely non-redundant context beyond that: no API key is required, which tells an agent this call works pre-authentication. It does not say what a healthy vs unhealthy result looks like, but an output schema exists to cover the return shape.
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 short sentences, front-loaded with purpose before the auth note. Every clause carries information and there is no filler.
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 parameterless health check with an output schema and a readOnly annotation, the description is essentially sufficient. The only minor gap is that it does not state what conditions constitute a healthy response, but the output schema can carry that.
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 tool takes zero parameters, so there is no parameter meaning to convey; the baseline for a 0-param tool applies. Nothing in the description misleads about inputs.
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 names a specific operation and target: a health check for the Complexity Cost Calculator API. That is unambiguous and clearly distinct from the sibling 'calculate', though the description does not explicitly name that sibling as the contrast.
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?
Usage is only implied: an agent can infer this is the liveness/availability probe to call before or instead of 'calculate'. There is no explicit when-to-use or when-not-to-use statement, and no mention of whether it checks liveness vs readiness.
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 tool update
- Changed
calculate100 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - removed
Input schema / properties / ai_adoption / additionalPropertiesRemoved value: -false - added
Input schema / properties / ai_adoption / properties / level / anyOfAdded value: +[ + { + "const": 0, + "type": "number" + }, + { + "const": 1, + "type": "number" + }, + { + "const": 2, + "type": "number" + }, + { + "const": 3, + "type": "number" + } +] - removed
Input schema / properties / ai_adoption / properties / level / enumRemoved value: -[ - 0, - 1, - 2, - 3 -] - removed
Input schema / properties / ai_adoption / properties / level / typeRemoved value: -"number" - removed
Input schema / properties / ai_assumptions / additionalPropertiesRemoved value: -false - removed
Input schema / properties / ai_assumptions / properties / levels / additionalPropertiesRemoved value: -false - removed
Input schema / properties / ai_assumptions / properties / levels / properties / 1 / additionalPropertiesRemoved value: -false - removed
Input schema / properties / ai_assumptions / properties / levels / properties / 1 / properties / automation_saving / $refRemoved value: -"#/properties/lever_assumptions/properties/human_interfaces/properties/understanding_kept" - added
Input schema / properties / ai_assumptions / properties / levels / properties / 1 / properties / automation_saving / maximumAdded value: +1 - added
Input schema / properties / ai_assumptions / properties / levels / properties / 1 / properties / automation_saving / minimumAdded value: +0 - added
Input schema / properties / ai_assumptions / properties / levels / properties / 1 / properties / automation_saving / typeAdded value: +"number" - removed
Input schema / properties / ai_assumptions / properties / levels / properties / 1 / properties / review_share / $refRemoved value: -"#/properties/maintenance_hours_per_quarter" - added
Input schema / properties / ai_assumptions / properties / levels / properties / 1 / properties / review_share / minimumAdded value: +0 - added
Input schema / properties / ai_assumptions / properties / levels / properties / 1 / properties / review_share / typeAdded value: +"number" - removed
Input schema / properties / ai_assumptions / properties / levels / properties / 1 / properties / understanding_kept / $refRemoved value: -"#/properties/lever_assumptions/properties/human_interfaces/properties/understanding_kept" - added
Input schema / properties / ai_assumptions / properties / levels / properties / 1 / properties / understanding_kept / maximumAdded value: +1 - added
Input schema / properties / ai_assumptions / properties / levels / properties / 1 / properties / understanding_kept / minimumAdded value: +0 - added
Input schema / properties / ai_assumptions / properties / levels / properties / 1 / properties / understanding_kept / typeAdded value: +"number" - removed
Input schema / properties / ai_assumptions / properties / levels / properties / 2 / $refRemoved value: -"#/properties/ai_assumptions/properties/levels/properties/1" - added
Input schema / properties / ai_assumptions / properties / levels / properties / 2 / propertiesAdded value: +{ + "ai_speedup": { + "description": "Share of own work time AI saves", + "exclusiveMaximum": 1, + "minimum": 0, + "type": "number" + }, + "automation_saving": { + "description": "Share of maintenance and infrastructure work AI automates", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "event_response": { + "description": "Share of incident cost AI's reaction to events saves", + "exclusiveMaximum": 1, + "minimum": 0, + "type": "number" + }, + "review_share": { + "description": "Review time added, as a share of own work", + "minimum": 0, + "type": "number" + }, + "understanding_kept": { + "description": "Share of code understanding a team keeps for code AI writes", + "maximum": 1, + "minimum": 0, + "type": "number" + } +} - added
Input schema / properties / ai_assumptions / properties / levels / properties / 2 / typeAdded value: +"object" - removed
Input schema / properties / ai_assumptions / properties / levels / properties / 3 / $refRemoved value: -"#/properties/ai_assumptions/properties/levels/properties/1" - added
Input schema / properties / ai_assumptions / properties / levels / properties / 3 / propertiesAdded value: +{ + "ai_speedup": { + "description": "Share of own work time AI saves", + "exclusiveMaximum": 1, + "minimum": 0, + "type": "number" + }, + "automation_saving": { + "description": "Share of maintenance and infrastructure work AI automates", + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "event_response": { + "description": "Share of incident cost AI's reaction to events saves", + "exclusiveMaximum": 1, + "minimum": 0, + "type": "number" + }, + "review_share": { + "description": "Review time added, as a share of own work", + "minimum": 0, + "type": "number" + }, + "understanding_kept": { + "description": "Share of code understanding a team keeps for code AI writes", + "maximum": 1, + "minimum": 0, + "type": "number" + } +} - added
Input schema / properties / ai_assumptions / properties / levels / properties / 3 / typeAdded value: +"object" - removed
Input schema / properties / calibration_changes / items / additionalPropertiesRemoved value: -false - added
Input schema / properties / engineers / maximumAdded value: +9007199254740991 - removed
Input schema / properties / incident_cost_hours / $refRemoved value: -"#/properties/maintenance_hours_per_quarter" - added
Input schema / properties / incident_cost_hours / minimumAdded value: +0 - added
Input schema / properties / incident_cost_hours / typeAdded value: +"number" - removed
Input schema / properties / infrastructure_hours_per_quarter / $refRemoved value: -"#/properties/maintenance_hours_per_quarter" - added
Input schema / properties / infrastructure_hours_per_quarter / minimumAdded value: +0 - added
Input schema / properties / infrastructure_hours_per_quarter / typeAdded value: +"number" - removed
Input schema / properties / lever_assumptions / additionalPropertiesRemoved value: -false - removed
Input schema / properties / lever_assumptions / properties / decision_rights / additionalPropertiesRemoved value: -false - removed
Input schema / properties / lever_assumptions / properties / decision_rights / properties / people_removed / $refRemoved value: -"#/properties/lever_assumptions/properties/human_interfaces/properties/understanding_kept" - added
Input schema / properties / lever_assumptions / properties / decision_rights / properties / people_removed / maximumAdded value: +1 - added
Input schema / properties / lever_assumptions / properties / decision_rights / properties / people_removed / minimumAdded value: +0 - added
Input schema / properties / lever_assumptions / properties / decision_rights / properties / people_removed / typeAdded value: +"number" - removed
Input schema / properties / lever_assumptions / properties / decision_rights / properties / record_hours_per_change / $refRemoved value: -"#/properties/maintenance_hours_per_quarter" - added
Input schema / properties / lever_assumptions / properties / decision_rights / properties / record_hours_per_change / minimumAdded value: +0 - added
Input schema / properties / lever_assumptions / properties / decision_rights / properties / record_hours_per_change / typeAdded value: +"number" - removed
Input schema / properties / lever_assumptions / properties / explain_before_merge / additionalPropertiesRemoved value: -false - removed
Input schema / properties / lever_assumptions / properties / explain_before_merge / properties / speedup_given_up / $refRemoved value: -"#/properties/lever_assumptions/properties/human_interfaces/properties/understanding_kept" - added
Input schema / properties / lever_assumptions / properties / explain_before_merge / properties / speedup_given_up / maximumAdded value: +1 - added
Input schema / properties / lever_assumptions / properties / explain_before_merge / properties / speedup_given_up / minimumAdded value: +0 - added
Input schema / properties / lever_assumptions / properties / explain_before_merge / properties / speedup_given_up / typeAdded value: +"number" - removed
Input schema / properties / lever_assumptions / properties / explain_before_merge / properties / understanding_recovered / $refRemoved value: -"#/properties/lever_assumptions/properties/human_interfaces/properties/understanding_kept" - added
Input schema / properties / lever_assumptions / properties / explain_before_merge / properties / understanding_recovered / maximumAdded value: +1 - added
Input schema / properties / lever_assumptions / properties / explain_before_merge / properties / understanding_recovered / minimumAdded value: +0 - added
Input schema / properties / lever_assumptions / properties / explain_before_merge / properties / understanding_recovered / typeAdded value: +"number" - removed
Input schema / properties / lever_assumptions / properties / human_interfaces / additionalPropertiesRemoved value: -false - removed
Input schema / properties / lever_assumptions / properties / human_interfaces / properties / incident_share / $refRemoved value: -"#/properties/lever_assumptions/properties/human_interfaces/properties/understanding_kept" - added
Input schema / properties / lever_assumptions / properties / human_interfaces / properties / incident_share / maximumAdded value: +1 - added
Input schema / properties / lever_assumptions / properties / human_interfaces / properties / incident_share / minimumAdded value: +0 - added
Input schema / properties / lever_assumptions / properties / human_interfaces / properties / incident_share / typeAdded value: +"number" - removed
Input schema / properties / lever_assumptions / properties / human_interfaces / properties / review_share / $refRemoved value: -"#/properties/maintenance_hours_per_quarter" - added
Input schema / properties / lever_assumptions / properties / human_interfaces / properties / review_share / minimumAdded value: +0 - added
Input schema / properties / lever_assumptions / properties / human_interfaces / properties / review_share / typeAdded value: +"number" - removed
Input schema / properties / lever_assumptions / properties / safety_net / additionalPropertiesRemoved value: -false - removed
Input schema / properties / lever_assumptions / properties / safety_net / properties / build_hours_per_team / $refRemoved value: -"#/properties/maintenance_hours_per_quarter" - added
Input schema / properties / lever_assumptions / properties / safety_net / properties / build_hours_per_team / minimumAdded value: +0 - added
Input schema / properties / lever_assumptions / properties / safety_net / properties / build_hours_per_team / typeAdded value: +"number" - removed
Input schema / properties / lever_assumptions / properties / safety_net / properties / test_share / $refRemoved value: -"#/properties/maintenance_hours_per_quarter" - added
Input schema / properties / lever_assumptions / properties / safety_net / properties / test_share / minimumAdded value: +0 - added
Input schema / properties / lever_assumptions / properties / safety_net / properties / test_share / typeAdded value: +"number" - removed
Input schema / properties / lever_assumptions / properties / safety_net / properties / upkeep_hours_per_team_per_quarter / $refRemoved value: -"#/properties/maintenance_hours_per_quarter" - added
Input schema / properties / lever_assumptions / properties / safety_net / properties / upkeep_hours_per_team_per_quarter / minimumAdded value: +0 - added
Input schema / properties / lever_assumptions / properties / safety_net / properties / upkeep_hours_per_team_per_quarter / typeAdded value: +"number" - removed
Input schema / properties / levers / additionalPropertiesRemoved value: -false - removed
Input schema / properties / team_adoption / items / additionalPropertiesRemoved value: -false - removed
Input schema / properties / team_adoption / items / properties / level / $refRemoved value: -"#/properties/ai_adoption/properties/level" - added
Input schema / properties / team_adoption / items / properties / level / anyOfAdded value: +[ + { + "const": 0, + "type": "number" + }, + { + "const": 1, + "type": "number" + }, + { + "const": 2, + "type": "number" + }, + { + "const": 3, + "type": "number" + } +] - added
Input schema / properties / team_adoption / items / properties / level / descriptionAdded value: +"AI adoption level: 0 none, 1 coding help, 2 AI does all the coding, 3 AI does coding, checks, reviews and monitoring" - added
Input schema / properties / team_adoption / items / properties / teams / maximumAdded value: +9007199254740991 - added
Input schema / properties / teams / maximumAdded value: +9007199254740991 - added
Input schema / properties / teams_per_change / maximumAdded value: +9007199254740991 - changed
Output schema / properties / ai / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Output schema / properties / assumptions / additionalPropertiesPrevious value: -trueNew value: +{} - removed
Output schema / properties / calibration / $refRemoved value: -"#/properties/per_quarter" - added
Output schema / properties / calibration / additionalPropertiesAdded value: +{} - added
Output schema / properties / calibration / propertiesAdded value: +{} - added
Output schema / properties / calibration / typeAdded value: +"object" - changed
Output schema / properties / horizon / additionalPropertiesPrevious value: -trueNew value: +{} - removed
Output schema / properties / levers / $refRemoved value: -"#/properties/per_quarter" - added
Output schema / properties / levers / additionalPropertiesAdded value: +{} - added
Output schema / properties / levers / propertiesAdded value: +{} - added
Output schema / properties / levers / typeAdded value: +"object" - changed
Output schema / properties / notice / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Output schema / properties / per_feature / additionalPropertiesPrevious value: -trueNew value: +{} - changed
Output schema / properties / per_quarter / additionalPropertiesPrevious value: -trueNew value: +{} - removed
Output schema / properties / per_year / $refRemoved value: -"#/properties/per_quarter" - added
Output schema / properties / per_year / additionalPropertiesAdded value: +{} - added
Output schema / properties / per_year / propertiesAdded value: +{} - added
Output schema / properties / per_year / typeAdded value: +"object" - changed
Output schema / properties / plan / anyOfPrevious value: -[ - { - "$ref": "#/properties/per_quarter" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / projection / items / $refRemoved value: -"#/properties/per_quarter" - added
Output schema / properties / projection / items / additionalPropertiesAdded value: +{} - added
Output schema / properties / projection / items / propertiesAdded value: +{} - added
Output schema / properties / projection / items / typeAdded value: +"object"
2 tool updates
- First observed
calculate - First observed
health
Publisher details
- Operator
- Beamer - Complexity Cost Calculator · Publisher source
- Operator website
- https://beamersoftware.com
- Vendor relationship
- First-party · Publisher source
- Trust center
- Not applicable
- Restrictions
- Free tier: up to 100 requests per day. Paid tier: $29/month 10k requests per day + additional features · Publisher source
Related MCP Connectors
Engineering spend: GitHub seats, Copilot, Actions and coding agents, priced, with fixes
Query empirical frontier LLM release velocity, inference token deflation, and enterprise AI spend.
Codebase intelligence for AI agents — dead code, blast radius, ownership.
Software prices for AI agents: hosting, SEO, backup, antivirus, email and more. True 3-year cost
Related MCP Servers
- AlicenseAqualityDmaintenanceClassifies development task complexity (LIGHT/MEDIUM/HEAVY) and recommends the most cost-efficient AI model per provider, enabling optimized model selection for coding tasks.341 npmMIT

Mapnosticsofficial
AlicenseNot gradedqualityCmaintenanceCodebase intelligence for AI agents - dead code, blast radius, ownership.24 npmMIT
Modelmeterofficial
AlicenseNot gradedqualityDmaintenanceEnables AI agents to query model pricing, deprecations, and cost estimates via a machine-readable changelog of the AI stack.1MIT- FlicenseAqualityBmaintenanceParametric price benchmarking for engineering and procurement trade-offs. Agentic first, runs on your data, stays on your machine.1228 PyPI2-
Glama MCP Gateway
Add one secure layer between your agents and this server.