assess_penalties
Calculate potential EU AI Act penalties based on violation type, company turnover, and SME status to determine applicable fine ranges under Article 99.
Instructions
Calculate potential EU AI Act penalties for a given violation type.
Returns the applicable fine range per Article 99, considering company size and the type of violation (prohibited practices, high-risk non-compliance, or providing incorrect information).
Args: violation_type: Type of violation — one of "prohibited" (Article 5 violations), "high_risk_obligations" (Articles 9-15 and other requirements), or "incorrect_information" (misleading info to authorities). annual_global_turnover_eur: Company's annual global turnover in EUR. Used to calculate turnover-based penalties. is_sme: Whether the company qualifies as an SME (Small/Medium Enterprise). SMEs and startups may benefit from proportionate penalties per Article 99(6). caller: Identifier for rate limiting. tier: "free" (10 calls/day) or "pro" (unlimited, $29/mo).
Behavior: This tool is read-only and stateless — it produces analysis output without modifying any external systems, databases, or files. Safe to call repeatedly with identical inputs (idempotent). Free tier: 10/day rate limit. Pro tier: unlimited. No authentication required for basic usage.
When to use: Use this tool when you need to assess, audit, or verify compliance requirements. Ideal for gap analysis, readiness checks, and generating compliance documentation.
When NOT to use: Do not use as a substitute for qualified legal counsel. This tool provides technical compliance guidance, not legal advice.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| violation_type | Yes | ||
| annual_global_turnover_eur | No | ||
| is_sme | No | ||
| caller | No | anonymous | |
| api_key | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes |
Implementation Reference
- server.py:1280-1383 (handler)The assess_penalties function implements the main tool logic. It calculates potential EU AI Act penalties for a given violation type (prohibited, high_risk_obligations, incorrect_information) per Article 99, considering company annual turnover and SME status. Returns fine ranges, aggravating/mitigating factors, and additional notes.
def assess_penalties( violation_type: str, annual_global_turnover_eur: float = 0, is_sme: bool = False, caller: str = "anonymous", api_key: str = "") -> str: """Calculate potential EU AI Act penalties for a given violation type. Returns the applicable fine range per Article 99, considering company size and the type of violation (prohibited practices, high-risk non-compliance, or providing incorrect information). Args: violation_type: Type of violation — one of "prohibited" (Article 5 violations), "high_risk_obligations" (Articles 9-15 and other requirements), or "incorrect_information" (misleading info to authorities). annual_global_turnover_eur: Company's annual global turnover in EUR. Used to calculate turnover-based penalties. is_sme: Whether the company qualifies as an SME (Small/Medium Enterprise). SMEs and startups may benefit from proportionate penalties per Article 99(6). caller: Identifier for rate limiting. tier: "free" (10 calls/day) or "pro" (unlimited, $29/mo). Behavior: This tool is read-only and stateless — it produces analysis output without modifying any external systems, databases, or files. Safe to call repeatedly with identical inputs (idempotent). Free tier: 10/day rate limit. Pro tier: unlimited. No authentication required for basic usage. When to use: Use this tool when you need to assess, audit, or verify compliance requirements. Ideal for gap analysis, readiness checks, and generating compliance documentation. When NOT to use: Do not use as a substitute for qualified legal counsel. This tool provides technical compliance guidance, not legal advice. """ allowed, msg, tier = check_access(api_key) if not allowed: return {"error": msg, "upgrade_url": "https://meok.ai/pricing"} limit_err = _check_rate_limit(caller, tier) if limit_err: return {"error": "rate_limited", "message": limit_err} if violation_type not in PENALTY_TIERS: return { "error": "invalid_violation_type", "message": f"Valid types: {', '.join(PENALTY_TIERS.keys())}", "violation_types": { "prohibited": "Article 5 violations (subliminal manipulation, exploitation, social scoring, etc.)", "high_risk_obligations": "Non-compliance with Articles 9-15, registration, conformity assessment, etc.", "incorrect_information": "Supplying incorrect/misleading information to notified bodies or authorities", }, } tier_info = PENALTY_TIERS[violation_type] turnover_fine = (annual_global_turnover_eur * tier_info["turnover_pct"] / 100) if annual_global_turnover_eur > 0 else 0 max_fine = max(tier_info["max_fine_eur"], turnover_fine) applicable_fine = turnover_fine if turnover_fine > tier_info["max_fine_eur"] else tier_info["max_fine_eur"] result = { "violation_type": violation_type, "legal_basis": tier_info["article"], "violation_description": tier_info["description"], "penalty_calculation": { "fixed_maximum_eur": f"{tier_info['max_fine_eur']:,.0f}", "turnover_percentage": f"{tier_info['turnover_pct']}%", "company_turnover_eur": f"{annual_global_turnover_eur:,.0f}" if annual_global_turnover_eur > 0 else "Not provided", "turnover_based_fine_eur": f"{turnover_fine:,.0f}" if turnover_fine > 0 else "N/A", "applicable_maximum_eur": f"{applicable_fine:,.0f}", "calculation_method": "Whichever is higher: fixed amount or percentage of global annual turnover of the preceding financial year", }, "sme_considerations": ( "As an SME/startup, proportionate administrative fines apply per Article 99(6). " "National authorities should take into account the economic viability of the company. " "The European AI Office will issue guidelines on proportionate penalties for SMEs." ) if is_sme else ( "Standard penalty regime applies. Consider requesting SME status assessment if applicable." ), "aggravating_factors": [ "Intentional or negligent nature of the infringement (Article 99(7)(a))", "Previous infringements by the same operator (Article 99(7)(c))", "Nature, gravity, and duration of the infringement (Article 99(7)(b))", "Size, annual turnover, and market share of the operator (Article 99(7)(d))", "Degree of harm suffered (Article 99(7)(e))", ], "mitigating_factors": [ "Steps taken to mitigate the damage suffered (Article 99(7)(f))", "Degree of cooperation with national authorities (Article 99(7)(g))", "Degree of responsibility taking into account technical measures implemented (Article 99(7)(h))", "Manner in which the infringement became known to the authority (Article 99(7)(i))", ], "additional_notes": [ "Member States may set rules on penalties for other infringements (Article 99(1))", "Penalties for Union institutions/bodies: up to EUR 1.5M (prohibited), EUR 750K (other), EUR 375K (incorrect info) per Article 99(8)", "Article 99(2): penalties shall be effective, proportionate, and dissuasive", ], "regulation": "Regulation (EU) 2024/1689, Article 99", "meok_labs": "https://meok.ai", } return result - server.py:1279-1279 (registration)The @mcp.tool() decorator registers assess_penalties as an MCP tool in the FastMCP server instance.
@mcp.tool() - server.py:1286-1318 (schema)The function signature and docstring define the input schema (violation_type str, annual_global_turnover_eur float, is_sme bool) and output structure (dict with penalty_calculation, sme_considerations, aggravating/mitigating factors, etc.).
"""Calculate potential EU AI Act penalties for a given violation type. Returns the applicable fine range per Article 99, considering company size and the type of violation (prohibited practices, high-risk non-compliance, or providing incorrect information). Args: violation_type: Type of violation — one of "prohibited" (Article 5 violations), "high_risk_obligations" (Articles 9-15 and other requirements), or "incorrect_information" (misleading info to authorities). annual_global_turnover_eur: Company's annual global turnover in EUR. Used to calculate turnover-based penalties. is_sme: Whether the company qualifies as an SME (Small/Medium Enterprise). SMEs and startups may benefit from proportionate penalties per Article 99(6). caller: Identifier for rate limiting. tier: "free" (10 calls/day) or "pro" (unlimited, $29/mo). Behavior: This tool is read-only and stateless — it produces analysis output without modifying any external systems, databases, or files. Safe to call repeatedly with identical inputs (idempotent). Free tier: 10/day rate limit. Pro tier: unlimited. No authentication required for basic usage. When to use: Use this tool when you need to assess, audit, or verify compliance requirements. Ideal for gap analysis, readiness checks, and generating compliance documentation. When NOT to use: Do not use as a substitute for qualified legal counsel. This tool provides technical compliance guidance, not legal advice. """ - server.py:404-423 (helper)The PENALTY_TIERS dictionary provides the penalty data (max fines, turnover percentages) that assess_penalties reads for its calculations.
PENALTY_TIERS = { "prohibited": { "max_fine_eur": 35_000_000, "turnover_pct": 7, "article": "Article 99(3)", "description": "Violations of prohibited AI practices (Article 5)", }, "high_risk_obligations": { "max_fine_eur": 15_000_000, "turnover_pct": 3, "article": "Article 99(4)", "description": "Non-compliance with any requirements or obligations under the Regulation (other than Article 5)", }, "incorrect_information": { "max_fine_eur": 7_500_000, "turnover_pct": 1, "article": "Article 99(5)", "description": "Supplying incorrect, incomplete, or misleading information to notified bodies or national authorities", }, }