Skip to main content
Glama
ivossos

FCCS MCP Agentic Server

by ivossos

generate_consolidation_process_report

Generate consolidation process reports in Oracle FCCS to visualize data flow from local GAAP to consolidated financial statements for specified entities, accounts, periods, and scenarios.

Instructions

Generate a Consolidation Process Overview Report showing data flow from Local GAAP to Consolidated / Gerar relatorio de processo de consolidacao

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
entityNoThe Entity member (default: 'FCCS_Total Geography')
accountNoThe Account member (default: 'FCCS_Net Income')
periodNoThe Period member (default: 'Jan')
yearNoThe Year member (default: 'FY24')
scenarioNoThe Scenario member (default: 'Actual')

Implementation Reference

  • The main asynchronous handler function for the MCP tool 'generate_consolidation_process_report'. It coordinates data retrieval and HTML report generation using imported helpers, returning a success response with the report path.
    async def generate_consolidation_process_report(
        entity: str = "FCCS_Total Geography",
        account: str = "FCCS_Net Income",
        period: str = "Jan",
        year: str = "FY24",
        scenario: str = "Actual"
    ) -> dict[str, Any]:
        """Generate a Consolidation Process Overview Report / Gerar relatorio de processo de consolidacao.
    
        Args:
            entity: The Entity member.
            account: The Account member.
            period: The Period member.
            year: The Year member.
            scenario: The Scenario member.
    
        Returns:
            dict: Report generation summary and path.
        """
        from scripts.consolidation_process_report import get_consolidation_data, generate_html_report
        
        data = await get_consolidation_data(entity, account, period, year, scenario)
        report_path = generate_html_report(entity, account, period, year, scenario, data)
        
        return {
            "status": "success",
            "data": {
                "report_path": report_path,
                "entity": entity,
                "account": account,
                "message": f"Consolidation process report generated for {entity}"
            }
        }
  • The JSON schema definition for the tool input parameters in the TOOL_DEFINITIONS list, specifying entity, account, period, year, and scenario with descriptions and types.
    {
        "name": "generate_consolidation_process_report",
        "description": "Generate a Consolidation Process Overview Report showing data flow from Local GAAP to Consolidated / Gerar relatorio de processo de consolidacao",
        "inputSchema": {
            "type": "object",
            "properties": {
                "entity": {
                    "type": "string",
                    "description": "The Entity member (default: 'FCCS_Total Geography')",
                },
                "account": {
                    "type": "string",
                    "description": "The Account member (default: 'FCCS_Net Income')",
                },
                "period": {
                    "type": "string",
                    "description": "The Period member (default: 'Jan')",
                },
                "year": {
                    "type": "string",
                    "description": "The Year member (default: 'FY24')",
                },
                "scenario": {
                    "type": "string",
                    "description": "The Scenario member (default: 'Actual')",
                },
            },
        },
    },
  • The registration of the tool handler in the central TOOL_HANDLERS dictionary, mapping the tool name to the function imported from the consolidation module.
    "generate_consolidation_process_report": consolidation.generate_consolidation_process_report,
  • Helper function that fetches consolidation stage data (Entity Input, Total, Proportion, Elimination, Contribution) for the specified POV using FCCS client's export_data_slice, with mock data fallback.
    async def get_consolidation_data(
        entity: str,
        account: str,
        period: str,
        year: str,
        scenario: str = "Actual"
    ) -> Dict[str, float]:
        """Retrieve data for different consolidation stages."""
        stages = {
            "Entity Input": "FCCS_Entity Input",
            "Entity Total": "FCCS_Entity Total",
            "Proportion": "FCCS_Proportion",
            "Elimination": "FCCS_Elimination",
            "Contribution": "FCCS_Contribution"
        }
        
        results = {}
        
        # We need to import the global variables from agent.py
        # Since they are not exported, we use initialize_agent and then access them via the tool functions
        # or we can use the client directly if we have access to it.
        
        from fccs_agent.agent import _fccs_client, _app_name
        
        for stage_name, consol_member in stages.items():
            try:
                # POV order based on smart_retrieve in fccs_agent/tools/data.py
                # 13 dimensions in POV: Years, Scenario, View, Consolidation, ICP, Data Source, Movement, Entity, Currency, 4 Customs
                grid_definition = {
                    "suppressMissingBlocks": True,
                    "pov": {
                        "members": [
                            [year], [scenario], ["FCCS_YTD"], [consol_member],
                            ["FCCS_Intercompany Top"], ["FCCS_Total Data Source"],
                            ["FCCS_Mvmts_Total"], [entity], ["Entity Currency"],
                            ["Total Custom 3"], ["Total Region"], ["Total Venturi Entity"],
                            ["Total Custom 4"]
                        ]
                    },
                    "columns": [{"members": [[period]]}],
                    "rows": [{"members": [[account]]}]
                }
                
                res = await _fccs_client.export_data_slice(_app_name, "Consol", grid_definition)
                
                value = 0.0
                if res and "rows" in res and res["rows"]:
                    data_row = res["rows"][0].get("data")
                    if data_row and data_row[0] is not None:
                        value = float(data_row[0])
                
                # Special handling for Mock Mode to make the report look better
                if os.environ.get("FCCS_MOCK_MODE", "false").lower() == "true":
                    base = 1000.0 if account == "FCCS_Net Income" else 5000.0
                    mock_values = {
                        "FCCS_Entity Input": base,
                        "FCCS_Entity Total": base * 1.05,
                        "FCCS_Proportion": base * 1.05,
                        "FCCS_Elimination": -base * 0.2,
                        "FCCS_Contribution": base * 1.05 - base * 0.2
                    }
                    value = mock_values.get(consol_member, value)
                
                results[stage_name] = value
                print(f"[OK] {stage_name} ({consol_member}): ${value:,.2f}")
                
            except Exception as e:
                # If in mock mode or error, generate some semi-realistic mock data if needed
                if os.environ.get("FCCS_MOCK_MODE", "false").lower() == "true":
                    # Create a flow: 1000 -> 1050 -> 1050 -> -200 -> 850
                    base = 1000.0 if account == "FCCS_Net Income" else 5000.0
                    mock_values = {
                        "Entity Input": base,
                        "Entity Total": base * 1.05,
                        "Proportion": base * 1.05,
                        "Elimination": -base * 0.2,
                        "Contribution": base * 1.05 - base * 0.2
                    }
                    results[stage_name] = mock_values.get(stage_name, 0.0)
                    print(f"[MOCK] {stage_name} ({consol_member}): ${results[stage_name]:,.2f}")
                else:
                    print(f"[ERROR] Failed to fetch {stage_name}: {e}")
                    results[stage_name] = 0.0
                
        return results
  • Helper function that generates a detailed HTML report visualizing the consolidation process flow, including a step-by-step diagram, data table with adjustments, and styling for positive/negative movements.
    def generate_html_report(
        entity: str,
        account: str,
        period: str,
        year: str,
        scenario: str,
        data: Dict[str, float]
    ) -> str:
        """Generate HTML report with a consolidation flow visualization."""
        timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
        filename = f"consolidation_overview_{entity}_{timestamp}.html"
        
        # Calculate variances/adjustments
        local_adj = data["Entity Total"] - data["Entity Input"]
        prop_adj = data["Proportion"] - data["Entity Total"]
        elim = data["Elimination"]
        
        local_adj_class = "negative" if local_adj < 0 else ""
        prop_adj_class = "negative" if prop_adj < 0 else ""
        elim_class = "negative" if elim < 0 else ""
        
        local_adj_sign = "+" if local_adj >= 0 else ""
        prop_adj_sign = "+" if prop_adj >= 0 else ""
        elim_sign = "+" if elim >= 0 else ""
        
        local_adj_color = "#dc3545" if local_adj < 0 else "#28a745"
        elim_color = "#dc3545" if elim < 0 else "#28a745"
        
        html_content = f"""<!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Consolidation Process Overview - {entity}</title>
        <style>
            body {{ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; margin: 40px; background-color: #f0f2f5; color: #333; }}
            .container {{ max-width: 1000px; margin: auto; background-color: white; padding: 40px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); border-radius: 8px; }}
            h1 {{ color: #1a3a6c; border-bottom: 3px solid #1a3a6c; padding-bottom: 10px; margin-bottom: 20px; }}
            .metadata {{ display: flex; justify-content: space-between; margin-bottom: 30px; background: #f8f9fa; padding: 15px; border-radius: 4px; border-left: 5px solid #1a3a6c; }}
            .metadata-item {{ font-size: 14px; }}
            .metadata-label {{ font-weight: bold; color: #666; text-transform: uppercase; font-size: 11px; display: block; }}
            
            /* Flow Visualization */
            .flow-container {{ display: flex; align-items: center; justify-content: space-between; margin: 50px 0; padding: 20px; background: #fff; overflow-x: auto; }}
            .flow-step {{ text-align: center; flex: 1; min-width: 150px; position: relative; }}
            .step-box {{ background: #1a3a6c; color: white; padding: 15px; border-radius: 8px; margin-bottom: 10px; box-shadow: 0 2px 4px rgba(0,0,0,0.2); }}
            .step-value {{ font-size: 18px; font-weight: bold; }}
            .step-name {{ font-size: 12px; text-transform: uppercase; margin-top: 5px; opacity: 0.9; }}
            .flow-arrow {{ font-size: 24px; color: #1a3a6c; padding: 0 10px; }}
            .flow-adj {{ font-size: 11px; color: #28a745; font-weight: bold; margin-bottom: 5px; }}
            .flow-adj.negative {{ color: #dc3545; }}
            
            /* Table Styles */
            table {{ width: 100%; border-collapse: collapse; margin-top: 30px; }}
            th {{ background-color: #1a3a6c; color: white; padding: 12px; text-align: left; font-size: 14px; }}
            td {{ padding: 12px; border-bottom: 1px solid #eee; font-size: 14px; }}
            tr:hover {{ background-color: #f8f9fa; }}
            .val {{ text-align: right; font-family: 'Courier New', Courier, monospace; font-weight: bold; }}
            .total-row {{ background-color: #e9ecef; font-weight: bold; }}
            
            .footer {{ margin-top: 50px; font-size: 12px; color: #888; text-align: center; border-top: 1px solid #eee; padding-top: 20px; }}
            .tag {{ display: inline-block; padding: 2px 8px; border-radius: 12px; font-size: 10px; font-weight: bold; margin-left: 5px; }}
            .tag-input {{ background: #e3f2fd; color: #0d47a1; }}
            .tag-total {{ background: #e8f5e9; color: #1b5e20; }}
            .tag-elim {{ background: #fff3e0; color: #e65100; }}
            .tag-contrib {{ background: #f3e5f5; color: #4a148c; }}
        </style>
    </head>
    <body>
        <div class="container">
            <h1>Consolidation Process Overview</h1>
            
            <div class="metadata">
                <div class="metadata-item">
                    <span class="metadata-label">Entity</span>
                    {entity}
                </div>
                <div class="metadata-item">
                    <span class="metadata-label">Account</span>
                    {account}
                </div>
                <div class="metadata-item">
                    <span class="metadata-label">Period / Year</span>
                    {period} {year}
                </div>
                <div class="metadata-item">
                    <span class="metadata-label">Scenario</span>
                    {scenario}
                </div>
            </div>
    
            <h3>Consolidation Flow</h3>
            <div class="flow-container">
                <div class="flow-step">
                    <div class="step-box">
                        <div class="step-value">${data['Entity Input']:,.0f}</div>
                        <div class="step-name">Local GAAP</div>
                    </div>
                    <div class="flow-adj {local_adj_class}">{local_adj_sign}{local_adj:,.0f} Adj.</div>
                </div>
                
                <div class="flow-arrow">→</div>
                
                <div class="flow-step">
                    <div class="step-box" style="background: #2c5aa0;">
                        <div class="step-value">${data['Entity Total']:,.0f}</div>
                        <div class="step-name">Entity Total</div>
                    </div>
                    <div class="flow-adj {prop_adj_class}">{prop_adj_sign}{prop_adj:,.0f} Prop.</div>
                </div>
                
                <div class="flow-arrow">→</div>
                
                <div class="flow-step">
                    <div class="step-box" style="background: #4a90e2;">
                        <div class="step-value">${data['Proportion']:,.0f}</div>
                        <div class="step-name">Proportion</div>
                    </div>
                    <div class="flow-adj {elim_class}">{elim_sign}{elim:,.0f} Elim.</div>
                </div>
                
                <div class="flow-arrow">→</div>
                
                <div class="flow-step">
                    <div class="step-box" style="background: #00bcd4;">
                        <div class="step-value">${data['Contribution']:,.0f}</div>
                        <div class="step-name">Contribution</div>
                    </div>
                </div>
            </div>
    
            <h3>Detailed Process Steps</h3>
            <table>
                <thead>
                    <tr>
                        <th>Consolidation Step</th>
                        <th>Member</th>
                        <th class="val">Value ($)</th>
                        <th>Description</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>Local Data Entry <span class="tag tag-input">STEP 1</span></td>
                        <td>FCCS_Entity Input</td>
                        <td class="val">${data['Entity Input']:,.2f}</td>
                        <td>Original data as loaded from the local ERP/Source.</td>
                    </tr>
                    <tr>
                        <td>Local Adjustments</td>
                        <td>-</td>
                        <td class="val" style="color: {local_adj_color};">{local_adj:,.2f}</td>
                        <td>Manual journals and automated local adjustments.</td>
                    </tr>
                    <tr class="total-row">
                        <td>Entity Total <span class="tag tag-total">STEP 2</span></td>
                        <td>FCCS_Entity Total</td>
                        <td class="val">${data['Entity Total']:,.2f}</td>
                        <td>Total value for the entity before any group-level processing.</td>
                    </tr>
                    <tr>
                        <td>Proportional Consolidation</td>
                        <td>FCCS_Proportion</td>
                        <td class="val">${data['Proportion']:,.2f}</td>
                        <td>Entity total multiplied by consolidation percentage.</td>
                    </tr>
                    <tr>
                        <td>Intercompany Eliminations <span class="tag tag-elim">STEP 3</span></td>
                        <td>FCCS_Elimination</td>
                        <td class="val" style="color: {elim_color};">{elim:,.2f}</td>
                        <td>Elimination of intercompany balances at the first common parent.</td>
                    </tr>
                    <tr class="total-row">
                        <td>Contribution to Parent <span class="tag tag-contrib">STEP 4</span></td>
                        <td>FCCS_Contribution</td>
                        <td class="val">${data['Contribution']:,.2f}</td>
                        <td>The final amount this entity contributes to its parent's consolidated total.</td>
                    </tr>
                </tbody>
            </table>
    
            <div class="footer">
                <p><strong>Oracle EPM FCCS Consolidation Report</strong></p>
                <p>Generated by Aliki FCCS Agent on {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}</p>
            </div>
        </div>
    </body>
    </html>
    """
        
        # Save file
        filepath = Path(filename)
        with open(filepath, "w", encoding="utf-8") as f:
            f.write(html_content)
        
        return str(filepath.absolute())
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions generating a report but doesn't specify whether this is a read-only operation, if it triggers background jobs, what the output format is, or any rate limits or permissions required. This leaves significant gaps for a tool that likely involves data processing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief but includes redundant bilingual text ('Gerar relatorio de processo de consolidacao') that doesn't add value. It's front-loaded with the main purpose but lacks structure for clarity. While not verbose, the repetition reduces efficiency, making it adequate but not optimal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, no output schema, and a tool with 5 parameters for generating a report, the description is incomplete. It doesn't explain the report's format, how to access results, or behavioral aspects like job status or errors. For a tool likely involving data consolidation, this leaves critical context gaps.

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 the input schema fully documents the 5 parameters (entity, account, period, year, scenario) with descriptions and defaults. The description adds no additional meaning beyond the schema, such as explaining how parameters affect the report or their interdependencies, resulting in a baseline score of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool generates a 'Consolidation Process Overview Report' showing 'data flow from Local GAAP to Consolidated', which clarifies the verb (generate) and resource (report). However, it's vague about the report's specific content or format, and the bilingual phrasing adds redundancy without enhancing clarity. It doesn't distinguish from siblings like 'generate_report' or 'generate_intercompany_matching_report'.

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?

No guidance is provided on when to use this tool versus alternatives. The description doesn't mention prerequisites, context, or exclusions, and it fails to differentiate from sibling tools such as 'generate_report' or 'generate_intercompany_matching_report', leaving the agent without usage direction.

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/ivossos/fccs-mcp-ag-server'

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