Skip to main content
Glama
CSOAI-ORG

EU AI Act Compliance MCP

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

TableJSON Schema
NameRequiredDescriptionDefault
violation_typeYes
annual_global_turnover_eurNo
is_smeNo
callerNoanonymous
api_keyNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Implementation Reference

  • 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()
  • 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.
    """
  • 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",
        },
    }
Behavior5/5

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

Since no annotations are provided, the description fully covers behavioral traits: states it is read-only, stateless, idempotent, specifies rate limits for free/pro tiers, and notes no authentication required for basic usage. No contradictions.

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?

The description is well-structured with bold sections and bullet-like explanations. It is front-loaded with the main purpose. Slightly verbose in the behavior section where it repeats stateless and idempotent, but overall efficient for the level of detail.

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 description provides a good overview of behavior and usage, but due to the parameter mismatch (tier vs api_key) and omission of api_key parameter explanation, it is not fully complete. The tool has an output schema, so return values are not needed, but parameter documentation has a gap.

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. It explains violation_type, annual_global_turnover_eur, is_sme, and caller reasonably well, but it mentions a 'tier' parameter (with free/pro descriptions) that does not exist in the input schema (schema has api_key instead). This mismatch is misleading and reduces effectiveness.

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 starts with a clear verb+resource: 'Calculate potential EU AI Act penalties'. It specifies the violation type and returns the fine range per Article 99, which distinguishes it from sibling tools like 'audit_report' or 'check_compliance' that likely have different purposes.

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?

Includes explicit 'When to use' and 'When NOT to use' sections. It advises using for compliance assessment, gap analysis, and documentation, and clearly warns not to substitute legal counsel. This provides excellent decision support for the agent.

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

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/CSOAI-ORG/eu-ai-act-compliance-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server