AIDEVELOPER TOOLS

Adversarial Regulatory Arbitrage MCP Server

Regulatory arbitrage detection and beneficial ownership tracing for AI agents via the Model Context Protocol. This MCP server is built for compliance teams, financial crime investigators, and AI workflows that need to detect multi-jurisdiction shell layering, trace ultimate beneficial ownership through circular corporate structures, and model the strategic dynamics between regulators and regulated entities.

Try on Apify Store
$0.10per event
0
Users (30d)
0
Runs (30d)
90
Actively maintained
Maintenance Pulse
$0.10
Per event

Maintenance Pulse

90/100
Last Build
Today
Last Version
1d ago
Builds (30d)
8
Issue Response
N/A

Cost Estimate

How many results do you need?

detect-regulatory-arbitrages
Estimated cost:$10.00

Pricing

Pay Per Event model. You only pay for what you use.

EventDescriptionPrice
detect-regulatory-arbitrageCross-jurisdiction regulatory gap detection$0.10
trace-beneficial-ownershipStochastic reachability ownership resolution$0.10
analyze-jurisdiction-topologyMapper TDA with Betti numbers$0.10
simulate-enforcement-gameStackelberg GNEP best response iteration$0.12
classify-regulatory-regimeK-means regulatory regime clustering$0.06
assess-shell-company-riskBayesian posterior + hypergraph min-cut$0.10
compute-arbitrage-equilibriumAdversarial GAN co-evolution$0.12
forecast-regulatory-convergenceAnderson-Rubin IV mean-reversion$0.08

Example: 100 events = $10.00 · 1,000 events = $100.00

Connect to your AI agent

Add this MCP server to Claude Desktop, Cursor, Windsurf, or any MCP-compatible client.

MCP Endpoint
https://ryanclinton--adversarial-regulatory-arbitrage-mcp.apify.actor/mcp
Claude Desktop Config
{
  "mcpServers": {
    "adversarial-regulatory-arbitrage-mcp": {
      "url": "https://ryanclinton--adversarial-regulatory-arbitrage-mcp.apify.actor/mcp"
    }
  }
}

Documentation

Regulatory arbitrage detection and beneficial ownership tracing for AI agents via the Model Context Protocol. This MCP server is built for compliance teams, financial crime investigators, and AI workflows that need to detect multi-jurisdiction shell layering, trace ultimate beneficial ownership through circular corporate structures, and model the strategic dynamics between regulators and regulated entities.

It orchestrates 17 live data sources — spanning 5 corporate registries (UK, Canada, Australia, NZ, OpenCorporates), 3 sanctions databases (OFAC, OpenSanctions, Interpol), SEC filings, insider trading records, GLEIF LEIs, EU VAT, EUIPO trademarks, and the Federal Register — applying 8 analytical tools backed by original quantitative algorithms: Stackelberg GNEP enforcement games, mapper TDA topology, Tarjan SCC ownership cycles, Fiedler spectral bisection, FATF-derived Bayesian shell scoring, GAN adversarial strategy co-evolution, and Anderson-Rubin instrumental variable causal analysis.

⬇️ What data can you access?

Data PointSourceCoverage
📋 Global corporate registriesOpenCorporates200M+ companies worldwide
🇬🇧 UK company filings, officers, PSCsUK Companies HouseAll active and dissolved UK entities
🇨🇦 Federal corporationsCanada Corporate RegistryAll federally registered corps
🇦🇺 Australian business numbersAustralia ABN LookupAll ABN-registered entities
🇳🇿 New Zealand companiesNZ Companies OfficeAll NZ registered entities
🔴 US Treasury sanctions (SDN)OFAC Sanctions SearchFull SDN + consolidated lists
🌐 Global sanctions and watchlistsOpenSanctions Search100+ programs across 60+ countries
🚔 International law enforcementInterpol Red NoticesGlobal fugitive and wanted notices
📄 US public company filingsSEC EDGAR SearchAll public filings by date
📊 SEC insider trading (Form 4)SEC Insider TradingDirector and officer transactions
🔑 Legal entity identifiersGLEIF LEI SearchGlobal LEI database
🇪🇺 EU VAT registrationEU VAT ValidatorAll EU member state VAT numbers
™️ EU trademark registrationsEUIPO Trademark SearchEU trademark database
📰 US regulatory actions and noticesFederal Register SearchAll federal rules by date

❓ Why use this MCP server for regulatory arbitrage detection?

Manual multi-jurisdiction investigation means opening 7 corporate registries, running separate sanctions screenings, cross-referencing insider trading records, and then manually reasoning about ownership chains — a process that takes a trained investigator 4-8 hours per entity and still misses structural patterns that only become visible when the data is modeled as a graph.

This server collapses that process to a single tool call. Your AI agent queries all sources in parallel, builds an ownership graph, scores every node for shell company risk, and returns a structured analytical result in under 3 minutes.

Beyond data aggregation, it applies algorithms that manual analysis cannot replicate: Tarjan SCC detects circular ownership that fools simple tree traversal; spectral Fiedler bisection clusters ownership communities; the Stackelberg GNEP models whether a set of jurisdictions is in a race-to-the-bottom enforcement equilibrium; and the GAN adversarial loop reveals which novel evasion strategies would survive current detection.

  • Runs on Apify Standby — sub-second MCP connection, always-on server with no cold start
  • Pay-per-event pricing — $0.045 per tool call, no subscription, no monthly minimums
  • 17 data sources in one server — no API keys or separate subscriptions required
  • Parallel data fetching — all registry and sanctions queries run concurrently per tool call
  • Structured JSON output — every tool returns typed, nested JSON ready for downstream agents
  • Spending controls — set a per-run budget cap; the server stops cleanly when reached

Features

  • Parallel multi-registry search — each tool call fans out across all relevant registries simultaneously using Promise.all, minimizing latency per investigation
  • Ownership graph construction — builds typed OwnershipNode and OwnershipEdge objects from UK PSC disclosures, corporate officer filings, OpenCorporates relationships, and GLEIF LEI linkages with confidence scores per edge
  • Tarjan SCC cycle detection — identifies circular ownership structures (A owns B, B owns C, C owns A) that are a hallmark of financial crime layering; resolves effective share ownership via polynomial system (I-A)^{-1}d using Gauss-Seidel iteration
  • Stochastic UBO reachability — traces ultimate beneficial ownership chains via depth-first search with absorption probabilities; uses Monte Carlo estimation for unknown ownership percentages (50 samples per unknown edge)
  • Spectral Fiedler bisection — clusters ownership graph communities via power iteration on the normalized Laplacian L_norm = I - D^{-1/2} A D^{-1/2}, 50 iterations, deterministic sinusoidal initialization
  • Mapper TDA topology — projects 16 jurisdictions onto 7-dimensional feature space, applies PCA power iteration for first principal component filter, constructs overlapping cover with single-linkage clustering within intervals, computes Betti numbers (b0 = regulatory clusters, b1 = exploitable topology holes)
  • Stackelberg GNEP enforcement game — multi-leader follower game with softmax quantal response jurisdiction-shopping; Jacobi damped best-response iteration (convergence threshold 1e-6) up to 2,000 iterations; classifies equilibrium as race-to-bottom, race-to-top, mixed, or stable
  • 10 FATF-derived shell company indicators — dormancy, registered agent addresses (matched against 8 known agent name patterns), minimal officers, recent incorporation, high-risk jurisdiction (30-jurisdiction set), circular ownership, layered structure, sanctions connections, mismatched activity, nominee directors — scored via Bayesian posterior with configurable priors
  • Hypergraph minimum cut — structural shell detection via partition of ownership graph into shell-side and legitimate-side using iterative edge-weight contraction; returns cut value, partition sizes, and cut edges
  • GAN adversarial co-evolution — generator evolves novel arbitrage strategies via tournament selection and mutation; discriminator learns detection patterns via gradient-descent-inspired weight updates; classifies arms race phase as regulator_advantage, arbitrageur_advantage, or red_queen_equilibrium
  • Anderson-Rubin IV analysis — weak-instrument-robust causal inference on whether treaty network similarity causally drives regulatory convergence; reports AR statistic, p-value, first-stage F-statistic, and confidence interval
  • Regulatory regime classification — scores 16 jurisdictions across 7 dimensions (tax rate, regulatory burden, transparency, enforcement capacity, treaty network, AML rating, stability index); k-means-style cluster assignment with labeled cluster types (Tax Haven, Conduit, High Compliance, Mixed)
  • Jurisdiction parameters for 16 jurisdictions — hard-coded calibrated vectors for GB, US, CA, AU, NZ, IE, LU, NL, SG, HK, CH, BM, KY, VG, PA, CY with fallback defaults for any ISO code

Use cases for regulatory arbitrage detection

Corporate due diligence and M&A risk assessment

An M&A team evaluating an acquisition target needs to know who actually controls the target and whether the ownership structure passes the smell test. trace_beneficial_ownership builds the full ownership graph across UK, Canada, Australia, NZ, and OpenCorporates, resolves circular ownership via polynomial system, and returns a ranked list of UBO candidates with their control paths, effective ownership percentages, and any sanctions hits in the chain.

AML and financial crime investigation

Compliance officers investigating potential money laundering need to determine whether a counterparty is a shell company used for layering. assess_shell_company_risk scores the entity against 10 FATF-derived indicators — dormancy, registered agent addresses, minimal officers, high-risk jurisdictions, circular ownership, nominee directors — using Bayesian posterior scoring and hypergraph minimum cut for structural detection. Results return a 0-100 risk score with indicator breakdown.

Regulatory strategy and tax planning intelligence

Law firms and tax advisors need to understand the regulatory landscape before advising clients on jurisdictional structure. analyze_jurisdiction_topology returns the mapper TDA complex with Betti numbers revealing how many distinct regulatory clusters exist and how many topology holes (exploitable divergences) are present across your chosen jurisdiction set. forecast_regulatory_convergence shows which arbitrage windows are closing and over what timeframe.

Enforcement game analysis for policy research

Academic researchers and policy analysts studying regulatory competition between jurisdictions can use simulate_enforcement_game to model the Stackelberg equilibrium: which jurisdictions end up in a race-to-the-bottom due to jurisdictional tax competition, what is the dominant arbitrage route at equilibrium, and what is the social welfare cost of the current enforcement configuration.

AI agent financial crime workflows

AI agents built on Claude, GPT-4, or any MCP-compatible framework can call this server as part of automated KYC/AML pipelines. The MCP protocol means the agent gets structured JSON back on every call — ownership graphs, risk scores, equilibrium states — which it can reason about, summarize, or pass downstream to CRM systems or compliance platforms.

Investigative journalism and open-source intelligence

Journalists investigating corporate structures — Pandora Papers-style investigations — need to rapidly cross-reference entities across multiple jurisdictions' public registers. detect_regulatory_arbitrage runs all registry and sanctions lookups in parallel and calls detectArbitrage() on the assembled graph to surface multi-jurisdiction shell layering, regulatory timing patterns, and insider trading correlations with regulatory filings.

⬇️ How to connect this MCP server

Claude Desktop

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "adversarial-regulatory-arbitrage": {
      "url": "https://adversarial-regulatory-arbitrage-mcp.apify.actor/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_APIFY_TOKEN"
      }
    }
  }
}

Cursor

Add to your .cursor/mcp.json:

{
  "mcpServers": {
    "adversarial-regulatory-arbitrage": {
      "url": "https://adversarial-regulatory-arbitrage-mcp.apify.actor/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_APIFY_TOKEN"
      }
    }
  }
}

Windsurf / Cline / any MCP client

Use the same URL and Bearer token header pattern. Any client that supports the MCP Streamable HTTP transport will connect successfully.

Programmatic HTTP

curl -X POST "https://adversarial-regulatory-arbitrage-mcp.apify.actor/mcp" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_APIFY_TOKEN" \
  -d '{
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "detect_regulatory_arbitrage",
      "arguments": {
        "entity_name": "Pinnacle Holdings Ltd",
        "jurisdictions": ["GB", "CA", "AU", "NZ", "US"],
        "include_sec_filings": true,
        "include_insider_trades": true,
        "days_back": 90
      }
    },
    "id": 1
  }'

❓ MCP tools reference

ToolPurposeKey algorithmPrice
detect_regulatory_arbitrageCross-reference 7 jurisdictions + sanctions + SEC to detect shell layeringdetectArbitrage() on assembled graph$0.045
trace_beneficial_ownershipTrace UBO through layered structures with circular ownership resolutionTarjan SCC + polynomial (I-A)^{-1}d + Fiedler bisection$0.045
analyze_jurisdiction_topologyMapper TDA on regulatory landscape; classify regimes; find arbitrage-prone pairsPCA filter + single-linkage nerve + Betti numbers$0.045
simulate_enforcement_gameStackelberg GNEP between regulators and entities; equilibrium race classificationJacobi damped best-response iteration$0.045
classify_regulatory_regime7-dimension regime score + rankings for a single jurisdictionk-means cluster assignment$0.045
assess_shell_company_riskFATF-derived 10-indicator shell scoring + hypergraph cutBayesian posterior + hypergraph min-cut$0.045
compute_arbitrage_equilibriumGAN adversarial co-evolution; novel evasion strategies; arms race phaseTournament selection + discriminator update$0.045
forecast_regulatory_convergenceMean-reversion convergence forecast + AR-IV causal analysisAnderson-Rubin weak-instrument-robust IV$0.045

Tool input parameters

detect_regulatory_arbitrage

ParameterTypeRequiredDefaultDescription
entity_namestringYesEntity name to investigate
jurisdictionsstring[]No["GB","CA","AU","NZ","US"]ISO country codes to search
include_sec_filingsbooleanNotrueCross-reference with SEC EDGAR
include_insider_tradesbooleanNotrueCheck Form 4 insider trading patterns
days_backnumber (1-365)No90Lookback window for regulatory filings
max_results_per_sourcenumber (1-100)No20Results cap per data source

trace_beneficial_ownership

ParameterTypeRequiredDefaultDescription
entity_namestringYesCompany or entity name
jurisdictionsstring[]No["GB","CA","AU","NZ"]Jurisdictions to search
max_depthnumber (1-15)No8Maximum ownership chain depth
include_sanctionsbooleanNotrueCheck OFAC and OpenSanctions
include_leibooleanNotrueEnrich with GLEIF LEI data

analyze_jurisdiction_topology

ParameterTypeRequiredDefaultDescription
jurisdictionsstring[]No16 jurisdictions including KY, BM, VGISO country codes to analyze
num_clustersnumber (2-8)No4Number of regime clusters
mapper_intervalsnumber (3-15)No5Cover intervals for mapper TDA
mapper_overlapnumber (0.1-0.5)No0.3Overlap fraction for cover intervals

simulate_enforcement_game

ParameterTypeRequiredDefaultDescription
jurisdictionsstring[]No["US","GB","IE","NL","LU","SG","KY","BM"]Jurisdictions in the game
num_entitiesnumber (10-1000)No200Simulated regulated entities
max_iterationsnumber (50-2000)No500Max equilibrium iterations
damping_factornumber (0.01-0.99)No0.3Jacobi update damping

classify_regulatory_regime

ParameterTypeRequiredDefaultDescription
jurisdictionstringYesISO country code (e.g., GB, KY, SG)

assess_shell_company_risk

ParameterTypeRequiredDefaultDescription
entity_namestringYesEntity name to assess
jurisdictionsstring[]No["GB","CA","AU","NZ"]Jurisdictions to search
include_sanctionsbooleanNotrueCheck OFAC and OpenSanctions

compute_arbitrage_equilibrium

ParameterTypeRequiredDefaultDescription
jurisdictionsstring[]No["US","GB","IE","LU","SG","KY","BM","VG"]Jurisdictions in the simulation
num_generationsnumber (10-200)No50Co-evolutionary generations
population_sizenumber (50-1000)No200Strategy population size

forecast_regulatory_convergence

ParameterTypeRequiredDefaultDescription
jurisdictionsstring[]No["US","GB","IE","NL","LU","SG","CH"]Jurisdictions to compare
horizon_yearsnumber (1-20)No5Forecast horizon in years

⬆️ Output examples

detect_regulatory_arbitrage — Pinnacle Holdings Ltd

{
  "entity": "Pinnacle Holdings Ltd",
  "jurisdictionsSearched": ["GB", "CA", "AU", "NZ", "US"],
  "dateRange": { "from": "2025-12-22", "to": "2026-03-21" },
  "ownershipGraph": {
    "totalEntities": 14,
    "totalEdges": 19,
    "jurisdictions": ["GB", "CA", "KY", "NZ"],
    "circularOwnershipCycles": 2,
    "maxOwnershipDepth": 5
  },
  "regulatoryTopology": {
    "mapperNodes": 8,
    "mapperEdges": 11,
    "betti0": 3,
    "betti1": 2
  },
  "detections": [
    {
      "entityName": "Pinnacle Holdings Ltd",
      "entityId": "uk:12847391",
      "arbitrageType": "shell_layering",
      "confidence": 0.83,
      "severity": "HIGH",
      "jurisdictionsInvolved": ["GB", "KY"],
      "mechanism": "Cayman subsidiary receiving IP royalties from UK parent",
      "evidence": [
        { "source": "uk-companies-house", "finding": "Registered at CT Corporation agent address", "weight": 0.4, "dataPoint": "1 Canada Square, London E14 5AB" },
        { "source": "opencorporates", "finding": "Subsidiary registered KY-2023-0841 incorporated 14 months ago", "weight": 0.3, "dataPoint": "Pinnacle IP Holdings Ltd, KY" }
      ],
      "estimatedTaxBenefit": 0.22,
      "riskIndicators": ["registered_agent_address", "high_risk_jurisdiction_subsidiary", "recent_incorporation", "layered_structure"]
    }
  ],
  "totalDetections": 3,
  "sanctionsHits": 0,
  "dataSources": {
    "corporateRegistries": 47,
    "sanctionsRecords": 0,
    "secFilings": 12,
    "insiderTrades": 3,
    "regulatoryActions": 8
  }
}

trace_beneficial_ownership — Meridian Capital Group

{
  "entity": "Meridian Capital Group",
  "targetEntityFound": true,
  "graph": {
    "totalEntities": 11,
    "totalEdges": 16,
    "jurisdictions": ["GB", "CA", "KY"],
    "circularOwnershipCycles": [["Meridian Capital Group", "Meridian GP Holdings", "Meridian Capital Group"]],
    "maxOwnershipDepth": 4
  },
  "beneficialOwners": [
    {
      "beneficialOwner": "person:james-whitmore",
      "ownerName": "James Whitmore",
      "effectiveOwnership": 67.4,
      "controlPath": [
        { "id": "person:james-whitmore", "name": "James Whitmore", "jurisdiction": "GB" },
        { "id": "uk:09341827", "name": "JW Family Trust Ltd", "jurisdiction": "GB" },
        { "id": "corp:meridian-gp-holdings", "name": "Meridian GP Holdings", "jurisdiction": "KY" },
        { "id": "uk:08124593", "name": "Meridian Capital Group", "jurisdiction": "GB" }
      ],
      "pathLength": 3,
      "confidence": 0.78,
      "jurisdictionsTraversed": ["GB", "KY"]
    }
  ],
  "totalUBOCandidates": 3,
  "circularOwnershipResolution": {
    "converged": true,
    "iterations": 12,
    "residual": 0.0000034,
    "effectiveShares": {
      "Meridian Capital Group": 0.3425,
      "Meridian GP Holdings": 0.6575
    }
  },
  "ownershipCommunities": {
    "Meridian Capital Group": 0,
    "JW Family Trust Ltd": 1,
    "Meridian GP Holdings": 0
  },
  "sanctionedEntitiesInChain": []
}

simulate_enforcement_game — US/GB/IE/KY equilibrium

{
  "gameConfiguration": {
    "jurisdictions": ["US", "GB", "IE", "KY"],
    "numEntities": 200,
    "maxIterations": 500,
    "dampingFactor": 0.3
  },
  "equilibrium": {
    "converged": true,
    "convergenceIterations": 143,
    "epsilon": 0.00000087,
    "regulatoryRace": "mixed",
    "socialWelfare": 1.247
  },
  "regulatorStrategies": [
    { "jurisdiction": "US", "strategy": "enforcement_level=0.6823", "payoff": 0.312, "detectionProbability": 0.546, "penaltyRevenue": 0.389 },
    { "jurisdiction": "GB", "strategy": "enforcement_level=0.5941", "payoff": 0.278, "detectionProbability": 0.505, "penaltyRevenue": 0.341 },
    { "jurisdiction": "IE", "strategy": "enforcement_level=0.2134", "payoff": 0.041, "detectionProbability": 0.160, "penaltyRevenue": 0.063 },
    { "jurisdiction": "KY", "strategy": "enforcement_level=0.0872", "payoff": 0.009, "detectionProbability": 0.031, "penaltyRevenue": 0.015 }
  ],
  "dominantArbitrageStrategies": [
    { "fromJurisdiction": "US", "toJurisdiction": "KY", "mechanism": "ip_box_routing", "expectedBenefit": 0.2100, "detectionRisk": 0.031, "netPayoff": 0.2007 },
    { "fromJurisdiction": "GB", "toJurisdiction": "IE", "mechanism": "treaty_shopping", "expectedBenefit": 0.1375, "detectionRisk": 0.160, "netPayoff": 0.0895 }
  ],
  "interpretation": "Converged to approximate Nash equilibrium in 143 iterations (epsilon=0.00000087). MIXED equilibrium: significant enforcement variation creates arbitrage opportunities. Dominant route: US -> KY via ip_box_routing (net payoff: 0.2007)."
}

assess_shell_company_risk — Orion Trading (NZ) Ltd

{
  "entity": "Orion Trading (NZ) Ltd",
  "assessments": [
    {
      "entityId": "nz:9429048211843",
      "entityName": "Orion Trading (NZ) Ltd",
      "jurisdiction": "NZ",
      "riskScore": 74,
      "riskLevel": "HIGH",
      "indicators": {
        "dormantOrInactive": true,
        "registeredAgentAddress": false,
        "minimalOfficers": true,
        "recentIncorporation": true,
        "highRiskJurisdiction": false,
        "circularOwnership": false,
        "layeredStructure": true,
        "sanctionedConnections": false,
        "mismatchedActivity": true,
        "nomineeDirectors": false
      },
      "indicatorCount": 5,
      "totalIndicators": 10,
      "explanation": "HIGH risk: dormant status, minimal officers (1 director), incorporated 8 months ago, 3-tier ownership structure, stated SIC code inconsistent with banking sector transactions",
      "connectedEntities": 4,
      "ownershipDepth": 3
    }
  ],
  "graphSummary": { "totalEntities": 8, "circularOwnershipDetected": false, "cycleCount": 0, "maxDepth": 3 },
  "hypergraphCut": { "cutValue": 0.312, "shellSideEntities": 3, "legitimateSideEntities": 5, "cutEdges": 2 }
}

⬆️ Output field reference

detect_regulatory_arbitrage

FieldTypeDescription
entitystringInput entity name
jurisdictionsSearchedstring[]ISO codes searched
dateRangeobjectfrom / to ISO dates
ownershipGraph.totalEntitiesnumberNodes in assembled graph
ownershipGraph.totalEdgesnumberEdges (ownership relationships)
ownershipGraph.jurisdictionsstring[]Distinct jurisdictions found
ownershipGraph.circularOwnershipCyclesnumberTarjan SCC cycle count
ownershipGraph.maxOwnershipDepthnumberDeepest chain found
regulatoryTopology.betti0numberConnected regulatory clusters (mapper)
regulatoryTopology.betti1numberTopological holes = exploitable gaps
detections[]ArbitrageDetection[]Up to 20 arbitrage detections, sorted by confidence
detections[].arbitrageTypestringE.g., shell_layering, treaty_shopping
detections[].confidencenumber0.0-1.0 confidence score
detections[].severitystringLOW, MEDIUM, HIGH, CRITICAL
detections[].evidence[]object[]Supporting findings with weight and data point
detections[].estimatedTaxBenefitnumberEstimated tax rate differential (0.0-1.0)
sanctionsHitsnumberUnique sanctioned entity names found
dataSourcesobjectRecord counts from each source category

trace_beneficial_ownership

FieldTypeDescription
targetEntityFoundbooleanWhether entity matched in graph
graph.circularOwnershipCyclesstring[][]Cycle member names
beneficialOwners[]object[]UBO candidates sorted by effective ownership
beneficialOwners[].effectiveOwnershipnumberPercentage (0-100) via chain multiplication
beneficialOwners[].controlPathobject[]{id, name, jurisdiction} per node
beneficialOwners[].confidencenumberProduct of edge confidences along path
circularOwnershipResolution.convergedbooleanPolynomial system convergence
circularOwnershipResolution.effectiveSharesobjectName → effective share fraction
ownershipCommunitiesobjectName → cluster index (Fiedler bisection)
sanctionedEntitiesInChainobject[]Entities with sanctions hits in the graph

simulate_enforcement_game

FieldTypeDescription
equilibrium.convergedbooleanNash condition satisfied within epsilon
equilibrium.regulatoryRacestringto_bottom, to_top, mixed, stable
equilibrium.socialWelfarenumberAggregate welfare at equilibrium
regulatorStrategies[]StackelbergPayoff[]Per-jurisdiction equilibrium strategy and payoff
regulatorStrategies[].detectionProbabilitynumbertransparency × enforcement_level
dominantArbitrageStrategies[]ArbitrageStrategy[]Top entity flows at equilibrium
dominantArbitrageStrategies[].mechanismstringE.g., ip_box_routing, treaty_shopping

assess_shell_company_risk

FieldTypeDescription
assessments[].riskScorenumber0-100 Bayesian posterior risk score
assessments[].riskLevelstringLOW, MEDIUM, HIGH, CRITICAL
assessments[].indicatorsShellCompanyIndicators10-field boolean indicator set
assessments[].indicatorCountnumberNumber of positive indicators
hypergraphCut.cutValuenumberMin-cut value separating shell/legitimate sides
hypergraphCut.shellSideEntitiesnumberEntities on the shell partition

How much does it cost to run regulatory arbitrage analysis?

This MCP server uses pay-per-event pricing — you pay $0.045 per tool call. Compute costs are included.

ScenarioTool callsCost per callTotal cost
Quick test — single entity check1$0.045$0.045
Basic due diligence — 3 tools per entity3$0.045$0.14
Standard investigation — all 8 tools8$0.045$0.36
Batch — 25 entity investigations (3 tools each)75$0.045$3.38
Compliance pipeline — 100 entities monthly300$0.045$13.50

You can set a maximum spending limit per run to control costs. The server returns a clean error when your budget cap is reached, so you never receive unexpected charges.

The Apify free plan includes $5 of monthly platform credits — enough for approximately 111 tool calls at no cost.

Compare this to commercial KYC/AML platforms (ComplyAdvantage, Refinitiv World-Check, Dow Jones Risk & Compliance) which typically run $500-5,000/month for API access. With this server, a 100-entity monthly compliance workflow costs under $15 with no subscription commitment.

How this MCP server works

Phase 1: Parallel data collection

Each tool call fans out across all relevant data sources in parallel using Promise.all. The runActorsParallel function in actor-client.ts calls up to 10 downstream Apify actors simultaneously, each with a 180-second timeout and 256MB memory cap. Results are returned as typed arrays — openCorpData, ukData, caData, auData, nzData, ofacData, openSanctionsData, secFilings, insiderTrades, fedRegData — merged into a unified sanctions map keyed by entity name.

Phase 2: Ownership graph construction

buildOwnershipGraph() ingests data from all registries and constructs typed OwnershipNode objects. UK Companies House data includes officers (with role classification: director, officer, registered_agent) and PSC disclosures (Persons with Significant Control, parsed to extract ownership percentage from ranges like 25-50%). Edge confidence scores are set per source: UK Companies House PSC edges get 0.9, officer edges get 0.95. OpenCorporates and GLEIF LEI data are merged. Registered agent address detection uses 8 regex patterns covering CT Corporation, National Registered Agents, Trident Trust, Mossack Fonseca, Appleby, and Portcullis. Sanctions hits are cross-referenced against both OFAC and OpenSanctions by name matching and stored directly on each node.

Phase 3: Algorithmic analysis

Once the graph is assembled, the relevant algorithms run:

UBO tracing (traceUBO): depth-first search from the target node up the ownership chain. For unknown ownership percentages, 50 Monte Carlo samples estimate the effective stake. Tarjan SCC (detectOwnershipCycles) first identifies all circular structures. Circular ownership is resolved via resolveCircularOwnership: the system builds the ownership matrix A, computes (I-A)^{-1}d via Gauss-Seidel iteration (up to 100 iterations, convergence at residual < 1e-6), and returns effective share fractions.

Spectral community detection (spectralOwnershipCommunities): constructs the normalized Laplacian L_norm = I - D^{-1/2} A D^{-1/2} from the ownership graph adjacency matrix. Power iteration (50 steps) with sinusoidal deterministic initialization approximates the Fiedler eigenvector. The resulting vector is partitioned into numClusters groups by sorted value.

Mapper TDA (regulatoryMapper): each jurisdiction is represented as a 7-dimensional vector [taxRate, regulatoryBurden, transparency, enforcementCapacity, amlRating, treatyNetwork, stabilityIndex]. PCA power iteration (30 steps) extracts the first principal component as a filter function. Overlapping cover intervals are constructed with configurable width and overlap fraction. Single-linkage clustering within each interval (threshold 0.15 in feature space) produces mapper nodes. The nerve simplicial complex is built by finding shared members across nodes. Betti-0 counts connected components; Betti-1 is estimated via nodes - edges + betti0 - 1 (Euler characteristic).

Stackelberg GNEP (computeStackelbergEquilibrium): iterated best-response with Jacobi damped updates. Followers use softmax quantal response at temperature 5.0; cost includes taxRate + regulatoryBurden × enforcementLevel × 0.5 + transparency × enforcementLevel × riskAversion - stabilityIndex × 0.1. Leaders optimize R(e) = e × transparency × presence × penalty with cost e²/(2 × capacity). Convergence checked via sup-norm across all variables.

Shell company scoring (assessShellCompanyRisk): 10 FATF-derived boolean indicators are scored with a Bayesian prior P(shell | indicators) ∝ Π P(indicator_i | shell) × P(shell). Prior P(shell) is 0.05 (5% base rate). Each indicator is parameterized with conditional probabilities derived from FATF typology reports. Hypergraph minimum cut (hypergraphMinCut) partitions the graph into shell-side and legitimate-side using iterative edge-weight contraction.

Phase 4: Response assembly

All results are JSON-serialized via the json() helper and returned as MCP CallToolResult with content[0].type = "text". All numeric fields are rounded to 3-4 decimal places. Arrays are sliced to reasonable maximums (20 detections, 10 assessments, 15 novel strategies) before return.

Tips for best results

  1. Start with detect_regulatory_arbitrage for unknown entities. This is the broadest sweep — it covers all registries plus sanctions plus SEC in a single call. Use it first to understand what data exists, then follow up with trace_beneficial_ownership on specific entities of interest.

  2. Specify only the jurisdictions you need. Each additional jurisdiction adds a parallel actor call. For entities with no known connection to Australia or NZ, remove those from the jurisdictions array to reduce per-call cost and latency.

  3. Use classify_regulatory_regime before simulate_enforcement_game. Understanding the regime profiles of your target jurisdictions first makes the enforcement game results easier to interpret — you'll know whether IE is acting as a conduit jurisdiction before seeing it appear as a dominant destination in the arbitrage strategies.

  4. For circular ownership investigation, request max_depth: 12 or higher. The default of 8 is sufficient for most structures, but multi-tier Cayman or BVI layering can exceed 10 hops. The polynomial system resolves circular ownership regardless of depth.

  5. Interpret Betti numbers carefully. In analyze_jurisdiction_topology, betti0 = 1 means all jurisdictions form one connected regulatory cluster (convergence scenario). betti1 > 0 means topological holes exist — these correspond to regulatory gaps that arbitrageurs exploit. A result of betti0=3, betti1=2 indicates 3 isolated regulatory regimes with 2 exploitable gaps between them.

  6. Use forecast_regulatory_convergence for strategic planning. The Anderson-Rubin IV output tells you whether treaty network similarity causally predicts convergence (check firstStageF > 10 for instrument strength). Pairs with trendDirection: "converging" represent closing arbitrage windows; plan structure changes before estimatedYearsToConverge runs out.

  7. Set a max_results_per_source of 5-10 for exploratory work. The default of 20 is appropriate for thorough investigations. For quick entity screening, reducing this value cuts latency significantly since each downstream actor returns fewer records.

  8. Combine assess_shell_company_risk with trace_beneficial_ownership for the most complete AML picture. Shell scoring tells you the risk level of the entity; UBO tracing tells you who is ultimately behind it.

Combine with other Apify actors

ActorHow to combine
Company Deep ResearchAfter trace_beneficial_ownership identifies the UBO, run deep research on that individual or entity to get a comprehensive intelligence report
WHOIS Domain LookupCross-reference domain registration data against entities found in ownership graphs — nominee directors often register domains in their own name
SEC EDGAR Filing AnalyzerAfter detect_regulatory_arbitrage flags SEC filings of interest, use the filing analyzer to extract full text and financial data from specific filings
Sanctions Network AnalysisWhen assess_shell_company_risk returns sanctions hits, use sanctions network analysis to map the broader sanctions network around those entities
B2B Lead QualifierFor M&A teams: after beneficial ownership tracing clears an acquisition target, use lead qualifier to score the commercial opportunity
Export Compliance ScreeningPair shell company risk scoring with export compliance to catch dual-use goods violations facilitated through shell structures
Startup Due DiligenceUse beneficial ownership tracing as the corporate structure component of a broader startup due diligence workflow

Limitations

  • Public data only. All data sources are publicly available registries, sanctions lists, and filings. Nominee arrangements, bearer shares, and undisclosed beneficial ownership are by definition not present in public records.
  • UK PSC coverage is strongest; other registries vary. UK Companies House PSC disclosures are the most structured data for beneficial ownership. Canada and NZ registries return less granular ownership data, leading to lower edge confidence scores.
  • OpenCorporates aggregates across 200M records but completeness varies by jurisdiction. Some jurisdictions' corporate registries are not available or have delayed updates.
  • Regime scores are modeled, not real-time. The 7-dimension jurisdiction parameter vectors in scoring.ts are calibrated from published indices (Fraser Institute, Basel AML Index, FATF evaluations) as of the build date. They do not update dynamically with regulatory changes.
  • Shell company risk scores are probabilistic, not legal determinations. A riskLevel: "HIGH" score means the entity has structural characteristics consistent with shell company patterns. It does not constitute legal advice or a finding of wrongdoing.
  • Stackelberg equilibrium assumes bounded rationality. The softmax quantal response model uses a fixed temperature of 5.0. Real-world jurisdiction shopping involves factors not captured in the 7-dimensional parameter space.
  • GAN adversarial strategies are theoretical. The compute_arbitrage_equilibrium output describes strategies that would be optimal given the modeled detection environment. They describe theoretical risks, not documented real-world schemes.
  • No real-time event data. The server does not monitor for ongoing transactions or provide alerts. For continuous monitoring, schedule regular runs or integrate with Website Change Monitor.
  • Interpol red notices cover wanted persons, not entities. Corporate entity investigations will rarely return Interpol hits; this source is most relevant for individual officer or director screening.
  • The actor client has a 180-second timeout per downstream actor. If a registry or sanctions API is slow or unavailable, that source returns an empty array without failing the entire tool call.

Integrations

  • Apify API — Call the MCP server programmatically from any backend; authenticate with Bearer token in the Authorization header
  • Webhooks — Trigger downstream alerts when a tool call returns riskLevel: "CRITICAL" or detects new sanctions hits
  • Make — Build no-code compliance workflows: new counterparty record in your CRM triggers a beneficial ownership trace, result pushed back as a CRM note
  • Zapier — Connect to Google Sheets to maintain a live risk register: run shell company assessment on new entries, write risk scores back to the sheet
  • LangChain / LlamaIndex — Embed MCP tool calls in RAG pipelines; use ownership graph output as structured context for LLM reasoning about corporate structures
  • Google Sheets — Export jurisdiction topology analysis or regime classifications to spreadsheets for compliance reporting

Troubleshooting

Tool call returns empty detections array despite known entity. The entity name must match what appears in the corporate registries. Try abbreviated versions, acronyms, or trading names. UK Companies House searches are fuzzy but require partial name overlap. For entities known primarily by their parent's name, search the parent first.

trace_beneficial_ownership returns targetEntityFound: false. The target node is only set when an assembled graph node name contains the input string as a substring (case-insensitive). If the entity's registered name differs from the commonly used name (e.g., "Acme Corp Ltd" vs "Acme"), adjust the input entity_name to match the registered form.

simulate_enforcement_game equilibrium does not converge. If converged: false, the GNEP solution set may be disconnected or the configuration produces cycling best responses. Try reducing num_entities to 50-100 and increasing max_iterations to 1,000. Alternatively, add more jurisdictions — very small sets (2-3 jurisdictions with extreme parameter divergence) can produce non-convergent games.

High latency on tool calls. The server calls up to 10 downstream actors in parallel; individual slow registry APIs (especially NZ Companies Office during peak hours) can extend total latency. Reducing max_results_per_source to 10 and limiting jurisdictions to the most relevant set significantly reduces response time.

forecast_regulatory_convergence returns causalAnalysis: null. The Anderson-Rubin IV analysis requires at least 5 jurisdiction pairs. If you provide fewer than 4 jurisdictions, the pairwise count falls below the threshold. Add more jurisdictions to enable the causal analysis.

Responsible use

  • This server only accesses publicly available corporate registrations, sanctions lists, regulatory filings, and financial disclosures.
  • Outputs are analytical tools, not legal determinations. All results should be reviewed by qualified compliance or legal professionals before use in regulatory decisions.
  • Comply with GDPR, local data protection laws, and your jurisdiction's AML regulations when using this server's outputs in compliance processes.
  • Do not use output data to facilitate discrimination, harassment, or unauthorized profiling of individuals.
  • For guidance on the legal landscape of public data access, see Apify's guide to web scraping legality.

❓ FAQ

How does regulatory arbitrage detection work, and what exactly does this server detect? The server cross-references an entity across 7 corporate registries, 3 sanctions databases, SEC filings, and the Federal Register. It assembles an ownership graph and applies detectArbitrage(), which scores evidence across 8 arbitrage mechanisms: transfer pricing, treaty shopping, regulatory migration, shell layering, nominee directors, trust interposition, hybrid mismatch, and IP box routing. Each detection has a confidence score, severity level, and supporting evidence list.

How is beneficial ownership traced through circular ownership structures? Circular ownership is first detected via Tarjan's SCC algorithm. The circular subgraph is then modeled as a linear system: if A owns 60% of B and B owns 40% of A, the effective ownership matrix is constructed and solved via (I-A)^{-1}d using Gauss-Seidel iteration. The result gives the economically effective share each entity holds, resolving the circularity into net fractions.

Which jurisdictions are covered for corporate registry lookups? Live registry lookups cover GB (UK Companies House), CA (Canada Corporate Registry), AU (Australia ABN Lookup), and NZ (NZ Companies Office). OpenCorporates provides global coverage across 200M+ companies. Regulatory regime modeling covers 16 jurisdictions: GB, US, CA, AU, NZ, IE, LU, NL, SG, HK, CH, BM, KY, VG, PA, CY.

What is the Betti number output in analyze_jurisdiction_topology and how do I interpret it? Betti-0 counts connected components in the mapper simplicial complex — the number of distinct regulatory clusters. Betti-1 counts topological holes — closed loops in the complex that represent exploitable regulatory gaps between jurisdictions that are linked but not fully aligned. A betti1 > 0 result indicates the existence of such gaps and their count.

How accurate are the shell company risk scores? The 10-indicator scoring is calibrated against FATF typology reports on shell company indicators. Each indicator has empirically derived conditional probabilities. The Bayesian posterior combines them with a 5% base rate prior. The result is a relative risk signal — entities scoring above 70 exhibit multiple structural red flags — but it is not a validated forensic tool and should be used as a screening mechanism, not a final determination.

Can this server detect money laundering? It identifies structural risk patterns consistent with money laundering typologies: shell layering, circular ownership, nominee directors, high-risk jurisdiction connections, and sanctions proximity. It cannot observe transaction flows, and it does not make legal determinations. Results should be reviewed by a qualified AML compliance officer.

How does the Stackelberg enforcement game differ from a simple regulatory comparison? A static regulatory comparison lists each jurisdiction's rules. The Stackelberg GNEP models the strategic interaction: how does a regulator change its enforcement level in response to entities moving capital to avoid regulation, and how do entities respond to that enforcement change? The iterated best-response process converges to an equilibrium that reflects the stable outcome of this strategic competition — including whether the system ends in a race-to-the-bottom.

Is it legal to use public corporate registry data for compliance screening? Public corporate registries are explicitly designed for transparency and public access. OFAC and OpenSanctions publish their lists specifically for compliance use. SEC EDGAR is public record. Using this data for due diligence, AML screening, and compliance purposes is well within normal and expected use. For the full legal context, see Apify's web scraping legality guide.

How is this different from commercial KYC platforms like ComplyAdvantage or World-Check? Commercial platforms provide curated, maintained databases with analyst review and legal defensibility guarantees. This server aggregates live public data with algorithmic analysis — it is faster to access, significantly cheaper ($0.045/call vs $500-5,000/month), and provides game-theoretic and topological analysis layers that commercial platforms do not offer. It is best positioned as a first-pass screening tool or a research layer, not as a replacement for auditable commercial KYC records.

Can I run this as part of an automated AI agent pipeline? Yes — this is the primary design intent. The MCP protocol means Claude, GPT-4, or any MCP-compatible agent can call these tools directly within an agentic loop. The structured JSON output is designed for LLM consumption. Tools return at most 20 records in primary arrays to keep context window usage manageable.

How long does a typical tool call take? Most tools take 30-90 seconds, dominated by the parallel downstream actor calls. classify_regulatory_regime is instantaneous (pure computation, no data fetches). detect_regulatory_arbitrage with all 5 jurisdictions and SEC data enabled typically takes 60-90 seconds. Reducing max_results_per_source and limiting jurisdictions brings most calls under 45 seconds.

What happens if one of the downstream data sources is unavailable? Each downstream actor call is wrapped in a try-catch with a 180-second timeout. If any source fails or times out, it returns an empty array. The tool call continues with the data that was successfully retrieved and notes the missing source implicitly in the dataSources record counts.

Help us improve

If you encounter issues, you can help us debug faster by enabling run sharing in your Apify account:

  1. Go to Account Settings > Privacy
  2. Enable Share runs with public Actor creators

This lets us see your run details when something goes wrong, so we can fix issues faster. Your data is only visible to the actor developer, not publicly.

Support

Found a bug or have a feature request? Open an issue in the Issues tab on this actor's page. For custom implementations, enterprise integrations, or bespoke jurisdiction coverage, reach out through the Apify platform.

How it works

01

Configure

Set your parameters in the Apify Console or pass them via API.

02

Run

Click Start, trigger via API, webhook, or set up a schedule.

03

Get results

Download as JSON, CSV, or Excel. Integrate with 1,000+ apps.

Use cases

Sales Teams

Build targeted lead lists with verified contact data.

Marketing

Research competitors and identify outreach opportunities.

Data Teams

Automate data collection pipelines with scheduled runs.

Developers

Integrate via REST API or use as an MCP tool in AI workflows.

Ready to try Adversarial Regulatory Arbitrage MCP Server?

Start for free on Apify. No credit card required.

Open on Apify Store