Skip to main content
All projects
FLAGSHIP PROJECT · 2026Python · MCP · Railway● Live

I built the infrastructure that
South African AI was missing.

When financial advisors and estate administrators started using AI tools, they ran into the same wall: the models estimated South African statutory figures. They approximated the estate duty abatement. They guessed the prime lending rate. They had no way to verify CIPC compliance dates or test SBC qualification against the five Section 12E conditions.

I built the SA Professional Financial Services MCP Server to fix that. It is not an app. It has no user interface of its own. It is the calculation engine that sits underneath every AI-assisted financial and estate planning tool in the CenturionAI suite — and it is open to any practitioner or platform that speaks the Model Context Protocol.

33 tools · 5 modules live · 7 Acts encoded · Budget 2026/27 · Live on Railway · Claude Desktop native

The problem I was solving

South Africa's AI gap was not about the models. It was about the data.

I come from financial services. FAIS Key Individual, years in financial planning, a deep understanding of how South African practitioners work. When I started building AI tools for that market — estate administration, financial planning, insurance — I kept hitting the same problem.

General-purpose AI models have no reliable access to South African statutory data. Ask Claude what the current estate duty abatement is and it will give you a number from its training data — correct as of some historical point, potentially wrong right now, and with no source you can verify. Ask it to calculate SBC tax for a specific income and it will produce a plausible-looking answer that a practitioner cannot act on without checking.

In financial planning, estate administration, and tax practice, you cannot act on "plausible." You need the current figure, the exact formula, and the source. You need to be able to put it in a client file and stand behind it.

No government body in South Africa offers a free, stable, public API for statutory calculation data. So I built the calculation layer myself — as AI infrastructure, not a calculator app.

What separates this from a calculator app

It is AI-callable

Any compatible AI host — Claude Desktop, a custom agentic platform, any Anthropic API integration — can call these tools in real time. The AI does not estimate. It calls the tool and returns a structured result with legislation source and disclaimer.

It is infrastructure, not an app

There is no user interface. It serves multiple platforms simultaneously from a single Railway deployment. Every CenturionAI product shares the same calculation layer. One maintenance update propagates everywhere simultaneously.

The disclaimers are tiered by consequence

Estate duty carries a HIGH disclaimer — a tax practitioner must sign off before the REV267 is filed. Rate references carry LOW. The disclaimer is not generic — it reflects the real-world consequence of acting on each tool's output without professional verification.

33

Active tools

7

Acts encoded

60+

Tests

Live demonstration

Ask a real question. Get a real South African statutory answer.

Eight calculations across all five active modules. Adjust the inputs, click Calculate. The result comes from Claude using the exact statutory figures encoded in the SA Financial Services MCP Server — current legislation, Budget 2026/27.

Powered by Claude with CenturionAI statutory data

2 free calculations remaining

Note: These calculations use Claude with the statutory data encoded in the SA Financial Services MCP Server. The full interactive product — with direct MCP tool calls across all 33 tools — will be available on the commercial marketing site currently in development.

To connect directly to the server via MCP: sa-financial-services-mcp-production.up.railway.app/sse

What was built

The technical decisions behind it.

The statutory data layer

Every statutory figure — estate duty rates, executor fee caps, intestate minimums, SBC income limits — lives in a dedicated statutory_data/ folder. One Python file per legislation area. Every figure has a source comment above it showing the exact document, section, and effective date. Every file has a header recording when it was last maintained and what triggers a review. When Parliament amends the Estate Duty Act or SARS publishes new tax tables after the February Budget, I open the relevant file, update the figure, run the test suite, commit, and redeploy. One change. Every platform updated simultaneously.

The hybrid data strategy

South African government bodies do not offer reliable free APIs. SARS has no public endpoint. The Master of the High Court has no digital interface. The solution: encode statutory figures from official publications and update manually — the same approach every commercial tax calculator in South Africa uses. For data that does have a reliable free API (exchange rates from Frankfurter, public holidays from Nager Date API), the server calls live and falls back to maintained static data if the API is unavailable. Every response includes data_source and figures_as_at fields so the AI and the practitioner always know which source was used.

The disclaimer architecture

Every tool output carries a tiered disclaimer — LOW, MEDIUM, or HIGH — based on the real-world consequence of acting on the calculation without professional verification. The estate duty calculator carries a HIGH disclaimer: the executor is legally responsible for the REV267; a tax practitioner must sign off before filing. The deadline calculator carries LOW: it is a reference, not a legal document. These strings are static constants in disclaimers.py — not AI-generated text. Any change requires my sign-off. The disclaimer is part of the product design.

The MCP server pattern

The server uses FastMCP from Anthropic's official Python SDK. Every tool is registered with a docstring that Claude reads to decide when and how to call it. The business logic lives in modules — estate_administration/, personal_tax/, retirement_planning/, small_business/. The server.py file only wires things together. Transport modes: stdio for local Claude Desktop use (Wandile's demonstration environment), SSE (Server-Sent Events) for the Railway production endpoint. The same codebase, one environment variable switched, serves both contexts.

What it covers

Five modules. 33 active tools.

📈

Economic Context

5 tools live

SARB · StatsSA · VAT Act

Live exchange rates, SARB repo rate, CPI inflation, VAT calculations, and South African public holidays.

🏛

Estate Administration

7 tools live

Administration of Estates Act · Estate Duty Act · Intestate Succession Act · Matrimonial Property Act

Estate duty, executor fees, intestate succession, accrual claims, filing deadlines, and liquidity assessment.

📊

Personal Tax

8 tools live

Income Tax Act 58/1962 · Transfer Duty Act 40/1949

Income tax, PAYE, CGT, provisional tax, transfer duty, retirement withdrawal tax, and full tax tables.

🔐

Retirement Planning

7 tools live

Income Tax Act s11F · Pension Funds Act · Long-term Insurance Act

RA deductibility (R430,000 cap — Budget 2026), two-pot system, living annuity drawdown, and retirement projections.

🏢

Small Business

6 tools live

Income Tax Act s12E · VAT Act 89/1991 · Companies Act 71/2008

SBC qualification (all five Section 12E conditions), VAT invoice checker, CIPC compliance, and corporate tax comparison.

Module 4 — Property and Bonds

Roadmap

Transfer Duty Act · Deeds Registries Act

Bond repayment, transfer costs, affordability, sectional title levy analysis

Module 6 — Labour Law and CCMA

Roadmap

Labour Relations Act 66/1995 · BCEA 75/1997 · CCMA Rules

Dismissal deadlines, severance pay, CCMA referral calculator, Section 189 retrenchment compliance

Module 7 — Insurance and Risk

Roadmap

Long-term Insurance Act · Pension Funds Act s37C

Section 37C death benefit routing, risk needs analysis, replacement ratio calculator

Module 8 — Market and Economic Data

Roadmap

EODHD JSE integration

JSE price data, sector indices, listed company financial data for financial planning context

The ecosystem

The engine underneath three products.

Every CenturionAI platform that involves a South African financial or compliance calculation calls this server. One deployment. One maintenance update. Every platform updated simultaneously.

EstateHelp

The estate administration module was built to power EstateHelp. The app calls the server for duty calculations, statutory deadlines, and executor fee verification — giving surviving spouses an independent check on what they are being charged.

Tools called

calculate_estate_duty()

get_estate_deadlines()

calculate_executor_fees()

get_small_estate_info()

View project

SmartDocAI

When SmartDocAI analyses a supplier invoice, it calls check_vat_invoice to validate Section 20 compliance. When it processes financial statements, it calls check_sbc_qualification to surface an SBC optimisation check. Document intelligence plus statutory compliance in one workflow.

Tools called

check_vat_invoice()

check_sbc_qualification()

calculate_transfer_duty()

View project

FinPlan AI

FinPlan AI calls the retirement planning module for every client scenario — RA deductibility, two-pot projections, living annuity sustainability. The MCP server is FinPlan AI's calculation backbone.

Tools called

calculate_ra_deductibility()

calculate_living_annuity_drawdown()

calculate_income_tax()

get_two_pot_info()

View project

Technical architecture

What runs under it.

Consumer Layer

EstateHelp

SmartDocAI

FinPlan AI

Claude Desktop (Wandile)

MCP Protocol

stdio (local) · SSE (Railway)

SA Professional Financial Services MCP Server

5

Economic

7

Estate

8

Personal

7

Retirement

6

Small

Statutory Data Layer · 25+ Python files · Manually maintained · Budget 2026/27

Frankfurter API

Exchange rates · Live · 15-min TTL · Free

Nager Date API

SA public holidays · Live · 24h TTL · Free

Protocol

Model Context Protocol (MCP) · FastMCP from Anthropic Python SDK

Transport — local

stdio — Claude Desktop launches server as subprocess, no port, no auth

Transport — hosted

SSE (Server-Sent Events) — Railway production endpoint, persistent HTTP

Runtime

Python 3.11 · uvicorn · httpx · pydantic · cachetools

Statutory data

Manually maintained Python files — one per legislation area · source comments on every figure

Live data

Frankfurter API (exchange rates, 15min TTL) · Nager Date API (public holidays)

Hybrid data

SARB rates: live fetch → static fallback · flagged in every response which source was used

Caching

In-memory TTL cache — rates 15min, SARB/CPI/VAT 24h, statutory calculations uncached

Deployment

Railway — auto-deploy from main branch · env: TRANSPORT_MODE=sse

Tests

60+ pytest tests across 6 test files · run before every push

Building with MCP or evaluating this for a project?

Talk to Wandile directly.
A real reply. No sequences.

If you are building AI tools for South African financial services, evaluating the MCP server for a platform integration, or want full documentation — get in touch. This is not a contact form that routes to a CRM. It goes directly to Wandile.

wandile@centurionai.co.za · Based in Centurion, Gauteng

Subject line at Wandile's end: Portfolio visitor · MCP Server enquiry