PoliErgaleio

PoliErgaleio Public Calculation API & MCP Server

Free MCP server and REST API for Cyprus income tax, state pension, retirement stress test and unemployment benefit calculations. Setup guides for Claude Desktop, ChatGPT, Gemini and Cursor.

Endpoints

MCP endpointhttps://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/mcp
REST tools endpointhttps://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/tools (list) · https://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/tools/<tool_name> (POST, call)
Machine-readable schemashttps://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/schemas and https://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/schemas/<tool_name>
Discovery manifesthttps://poliergaleio.com/.well-known/mcp.json
Version & changeloghttps://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/version
Deprecation / sunset policyhttps://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/policy
Latest migration guidehttps://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/migrations/latest
Lifecycle error schemahttps://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/schemas/errors/lifecycle
Verify a keyhttps://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/whoami · https://poliergaleio.com/developers/verify

Authentication

Anonymous-first: omit x-api-key to try instantly (10/min, 50/day, 200/week on stateless calculators). Get a free key at https://poliergaleio.com/profile for 60/min, 1,000/day, 5,000/week plus saved-calculation tools. Send x-guest-id (any opaque id) to avoid sharing anonymous quota. Always prefer structuredContent over content text.

ChatGPT Work MCP plugin: connect https://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/mcp. The six saved-calculation tools request PoliErgaleio OAuth sign-in; calculators remain anonymous. Register the exact callback URL shown by ChatGPT as a confidential client in Supabase Authentication → OAuth Apps, then enter that client's ID and secret in the plugin settings.

Calculator inputs (API 3.0.1)

REST and MCP share strict request validation. Reuse facts already provided and ask only for missing essential inputs; request personal facts from the user instead of copying schema examples, which are examples and never defaults. Missing or invalid fields return actionable fieldErrors and hint rather than an estimate. Successful results include structuredContent.assumptions and a concise text disclosure for defaults and exclusions actually used. API 3.0.1 clarifies that rent-vs-buy must ask for the unit of a deposit such as “20” before interpreting it or calculating, and stock-option gain, tax and savings figures require user-confirmed scheme approval before any personalized calculation. It retains API 2.0.1 guidance to confirm financial facts remembered from another chat or scenario and disclose material assumptions and excluded costs; mortgage simulation is reserved for repayment and rate scenarios.

API keys: limits, scopes, headers, rotation, errors

  • Limits: at most 10 active keys per account; creation capped at 3 new keys per 24h. Keyed quota is enforced per key and account-wide (revoked keys included).
  • Scopes: every key carries scopes ["read", "write"]. Stateless calculators work anonymously; list/load/save/update/delete/compare of saved calculations require a key scoped to its own account.
  • Headers: send x-api-key: YOUR_KEY on every request (never in URLs or client bundles). Optional x-guest-id separates anonymous quota; optional X-Request-Id is echoed back for support.
  • Rotation: create a new key at https://poliergaleio.com/profile, switch your app, then revoke the old one (immediate). The full secret shows once — copy it then; only the prefix is stored.
  • Errors: 400 validation (fieldErrors + hint, check GET https://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/schemas/<tool_name>), 401 missing/invalid key (verify at https://poliergaleio.com/developers/verify), 404 unknown tool/save, 429 rate limit (Retry-After; scope "account" means new keys will not help). Removed tools return 410, stale clients 426 (shared lifecycle error schema).

All developer platforms use the same API

MCP host? Use https://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/mcp. ChatGPT Actions? Use https://poliergaleio.com/poliergaleio-chatgpt-actions.json (Action 1, 19 calculators) plus optionally https://poliergaleio.com/poliergaleio-chatgpt-user-actions.json (Action 2, 6 saved-calculation tools). Full OpenAPI import (Copilot, Poe)? Use https://poliergaleio.com/poliergaleio-openapi.json (32 operations — exceeds ChatGPT's 30-operation limit). Grok / Gemini / anything else? POST https://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/tools/<tool_name> with the schema from GET https://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/schemas/<tool_name> (examples[0] is ready to send). Never re-implement Cyprus rules.

Claude Desktop / Claude Code (MCP)

Add this to your claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json, Windows: %APPDATA%\Claude\claude_desktop_config.json). Anonymous-first: delete the "--header" lines to try without a key, then restart Claude Desktop:

{
  "mcpServers": {
    "poliergaleio": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote@latest",
        "https://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/mcp",
        "--header",
        "x-api-key:YOUR_API_KEY"
      ]
    }
  }
}

Claude Code: claude mcp add --transport http poliergaleio https://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/mcp --header "x-api-key: YOUR_API_KEY" (omit --header for anonymous).

Cursor (MCP)

{
  "mcpServers": {
    "poliergaleio": {
      "url": "https://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/mcp",
      "headers": {
        "x-api-key": "YOUR_API_KEY"
      }
    }
  }
}

Anonymous-first: omit "headers" entirely to try without a key.

ChatGPT (Actions / MCP)

Use https://poliergaleio.com/poliergaleio-chatgpt-actions.json (Action 1, 19 calculators, Authentication: None) as the Action schema, plus optionally https://poliergaleio.com/poliergaleio-chatgpt-user-actions.json (Action 2, saved calculations, Authentication: OAuth). Full https://poliergaleio.com/poliergaleio-openapi.json (32 operations) is for Copilot/Poe/REST only and will not import into ChatGPT. Privacy Policy URL (required to publish): https://poliergaleio.com/privacy.

Gemini (REST / function calling) + Grok / any other assistant

Call any tool with plain HTTP POST. Gems have no tools — use AI Studio / Vertex AI with a FunctionDeclaration, then execute REST yourself. Grok API is OpenAI-compatible: same function JSON works. Example:

curl -s -X POST https://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/tools/calculate_cyprus_income_tax \
  -H "Content-Type: application/json" \
  -d '{"salaryIncome": 45000, "legislationVersion": "2026", "employmentType": "private"}'
# Anonymous-first: omit x-api-key to try. Keyed: add -H "x-api-key: YOUR_API_KEY". Schemas: GET https://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/schemas/{tool_name}

Available tools

ToolWhat it does
calculate_cyprus_income_taxComputes Cyprus personal income tax, GESY (National Health System) contributions, social insurance, and net (take-home) salary. Use for a Cyprus resident or non-resident employee or sole proprietor tax estimate. Before calling, confirm whether a stated salary is monthly or annual and confirm employment category (private, civil or self-employed); do not infer either. Supply gross annual salary in EUR (use explicit 0 for self-employed-only cases); self-employed calculations also need turnover and occupational category. Identify when 2026 tax rules are a default rather than a user-supplied year. Optional incomes, deductions, tax year and eligibility facts must come from the user. Article 8 exemptions are applied only after the existing eligibility checks; never infer exemption eligibility.
calculate_cyprus_state_pensionEstimates the Cyprus state (contributory) pension amount at retirement based on accumulated insurance units and contribution history. Use to estimate contributory Cyprus state pension entitlement and amount at retirement. Reuse supplied facts and ask only for missing essentials: mode and retirement age are always required; quick mode also needs current age, years worked and total insurance units; advanced mode needs the actual non-empty yearly contribution record. Ask for dependants or state the zero-dependants assumption before presenting a personalized result. Never infer contribution history. Units are per calendar year; a legacy year-to-units map is accepted.
run_retirement_stress_testRuns a deterministic projection plus Monte Carlo simulation of a retirement savings plan to estimate the probability of not running out of money. Use for a retirement savings sustainability or portfolio-longevity projection. Reuse the user's ages, savings, contributions and planned monthly spending; ask for each missing essential input and never use example personal values. Values are EUR, contributions/drawdown are monthly, and ages are years. Omitted state pension means pension income is excluded. Returns, inflation, horizon and simulation count use disclosed modelling assumptions when omitted. Runs without seed are stochastic; a supplied seed makes identical inputs repeatable for the same implementation version.
calculate_cyprus_unemployment_benefitEstimates the Cyprus unemployment benefit amount and separately assesses entitlement when qualifying facts are supplied. Use to estimate the conditional Cyprus unemployment benefit amount and separately assess entitlement. Require the claim date, relevant-year insurable earnings and dependants to estimate an amount. Ask for qualifying insurance history, employee status, unemployment registration and availability for work before claiming entitlement; when those facts are missing, state that entitlement is undetermined and ask each missing follow-up question. Do not infer those facts from annual earnings.
get_pension_reference_dataReturns official Cyprus Social Insurance reference tables for a given year. Use to retrieve official Cyprus social-insurance reference figures for a user-specified calendar year. Reuse a year already given or ask for the missing year; do not assume which tax/reference year applies.
parse_pension_statementExtracts structured contribution history from pasted Cyprus Social Insurance Services pension statement text. Use to extract supported contribution years and units from an actual pasted Cyprus Social Insurance statement. Do not fill gaps or create contribution records; report missing or unreadable details to the caller.
calculate_cyprus_capital_gainsCalculates Cyprus Capital Gains Tax on an immovable property disposal, including CPI indexation of the acquisition cost, lifetime first-disposal exemptions, the 20% CGT rate and the 0.4% property transfer fee. Use for Cyprus capital-gains tax on an immovable-property sale. Obtain the actual acquisition price and year, sale price and property type; ask for missing essentials. Currency defaults to EUR only as a modelling convention. Omission of isFirstDisposal means no lifetime exemption is claimed; do not infer eligibility.
simulate_mortgageSimulates a Cyprus mortgage: monthly payment, outstanding principal, interest, and best/worst/varied variable-rate scenarios. Supports fixed then variable periods, monthly overpayments, lump sums and interest-only loans. Interest-only principal remains due at maturity. KFIK and cash-collateral configurations are not available through this API. Use only to estimate a Cyprus mortgage payment, amortization, overpayments or rate scenarios. Require the actual loan amount, term, selected fixed-period length and the rate inputs for each phase that applies; never substitute example loan terms or rates. EUR amounts and annual percentage rates are expected. For document checklists or general mortgage information, do not call the calculator; answer or research directly without narrating tool selection.
calculate_stock_optionsCompares the Cyprus tax on an employee stock option exercise under the 2025 benefit-in-kind rules (progressive income tax) and the 2026 approved-scheme rules (flat 8% within caps), including the 2x salary annual cap and the €1m rolling 10-year lifetime cap. Use to compare Cyprus tax on an employee's share-option exercise. Require actual annual salary, share count, exercise and market prices, and user-confirmed approved-scheme status before any personalized calculation or call. If status is missing or unclear, ask one concise question first; do not infer it, call with an assumed status, or present option gain, tax, savings, or other personalized option figures before confirmation. Amounts are EUR and per-share prices are EUR/share.
compare_rent_vs_buyCompares buying a home against renting and investing the difference over a multi-year horizon, modelling the mortgage, purchase and selling costs, maintenance, rent inflation and investment returns, and reporting the breakeven year. Use only to compare buying a Cyprus home with renting over a stated horizon. Use financial facts stated or confirmed for this scenario. Do not carry values from another chat or scenario into the calculation until the user explicitly confirms the relevant values. Ask for any missing core term: property price, monthly rent, down payment and whether it is EUR or percent, mortgage rate, and mortgage term. If the deposit is given without a unit (for example, '20'), ask whether it means EUR or percent before interpreting, converting, deriving a loan amount, or calling this tool. Never infer the unit from context. Optional growth, inflation and return assumptions require user acceptance when not stated. After calculating, briefly summarize every material modelling default used (including defaults supplied in the call) and costs excluded or treated as zero; use structuredContent.assumptions for defaults and exclusions returned by the API.
calculate_ev_savingsCompares the annual running cost of an electric car against a petrol/diesel car in Cyprus, splitting charging between spare solar production, home grid electricity and public chargers, and reporting yearly savings and payback on the extra purchase cost. Use to compare EV and petrol/diesel running costs. Ask for actual annual distance, vehicle consumption, fuel price, charging shares and tariffs for each active charging source; when solar charging is selected, require available spare solar production. Reuse supplied facts and ask only for missing essentials. Omitted extra purchase cost means no payback estimate.
compare_investment_vehiclesCompares a taxable investment (option 1) against a tax-deductible vehicle such as a provident fund or life-insurance savings plan (option 2), matching the true out-of-pocket cost of both and applying entry/exit fees, AUM fees, commission and exit tax. Use to compare taxable investment with a tax-deductible investment vehicle. Require the annual contribution, the user's tax-relief rate and option 2's management fee. Reuse supplied facts and ask only for missing essentials. Disclosed forecast returns and optional omitted fee/tax inputs are modelling assumptions; do not invent personal contribution amounts.
plan_monthly_budgetBuilds a monthly budget from a list of expenses at any frequency: normalises everything to a monthly basis, tiers each item (T1 fixed essentials, T2 variable essentials, T3 lifestyle, T4 discretionary), and returns disposable income, savings rate, the biggest optimisable leak and a surplus projection. Use to summarize a household's actual monthly net income and expense items. Ask for the actual expense ledger or item amounts; never fabricate expenses. Entries without a frequency are treated as monthly and disclosed. Omitted investment contributions are treated as zero and disclosed.
analyze_portfolioAnalyses an investment portfolio from its transaction history: net invested capital, current value, absolute return, chain-linked time-weighted return (TWR), CAGR on initial invested capital, per-sub-portfolio breakdown and allocation shares, with multi-currency support via per-transaction FX rates. Use to analyze actual portfolio ledgers or current holdings and valuation data. Require real transactions/holdings and a current valuation for each holding; require FX rates where currencies differ. TWR needs a valuation immediately before each later external cash flow and at the end date; report null with its reason when absent. Equal and opposite same-day movements between sleeves in the base currency net to an internal transfer for combined TWR; confirm both legs before using that treatment. Missing acquisition cost may use the disclosed performance-from-today behavior. Never create transactions or holdings records.
simulate_life_insurance_flushSimulates a Cyprus unit-linked life insurance policy year by year (monthly compounding, AUM and fixed fees, age-based mortality cost, 5% bid/ask spread when premiums are self-funded from the policy) and computes the tax-free 'safe limit' for partial surrenders under the 2026 rules, the tax due on any excess, and IRR with and without the premium tax relief. Use to model withdrawals from an existing Cyprus life-insurance policy. Require actual policy terms, tax rate, historical policy records and future premium/withdrawal projections; ask for missing items and never generate policy history. Forecast returns are assumptions and must be identified as such.
audit_mortgage_statementForensic audit of a mortgage statement: replays the loan day by day and grid-searches the bank's interest convention (Actual/365, Actual/360 or Actual/Actual day count; monthly, semi-annual or annual capitalisation; exact or 2-decimal daily rounding), ranks candidates by RMS error against the bank's own running balance, and reports the interest overcharge implied by the best fit. Use to audit an actual mortgage statement. Require statement rows, at least one usable interest rate and balance checkpoints sufficient to fit the calculation. Reuse only extracted facts; inferred day-count and capitalization conventions are estimates, not confirmed bank terms.
list_saved_calculations 🔑Lists metadata of an authenticated user's saved calculations by calculator type. Use so an agent can help a user find a previously saved scenario before loading it. Never returns encrypted contents.
load_saved_calculation 🔑Loads one saved calculation belonging to the authenticated API key's user. Use after list_saved_calculations to retrieve full details of a specific saved scenario. Locked saves return locked: true and no contents.
save_calculation 🔑Saves a calculator scenario to the authenticated user's stored history. Use when the user asks to save, keep or remember a scenario. Stores the inputs unencrypted (with server-computed results) so list/load can return them later.
update_calculation 🔑Renames a saved calculation and/or replaces its inputs (recomputing results). Use when the user asks to rename a save or re-run it with different inputs. Encrypted saves stay locked.
delete_saved_calculation 🔑Deletes one saved calculation belonging to the authenticated API key's user. Use when the user asks to delete or forget a saved scenario. Works on encrypted saves too.
compare_saved_calculations 🔑Diffs two saved calculations (inputs and results) field by field. Use for 'compare my mortgage before/after' style questions instead of reconstructing the diff from two loads. Encrypted sides report locked instead of contents.
parse_portfolio_csvTurns pasted broker CSV or ledger text into analyze_portfolio transactions. Use to extract supported transactions from actual pasted broker CSV or ledger text. Require the source text and actual base currency, report missing/unreadable values, and never create transactions or assume EUR. Output rows can be sent to analyze_portfolio.
parse_mortgage_statement_textTurns pasted bank mortgage-statement rows into audit_mortgage_statement inputs. Use to extract supported fields from actual mortgage statement text. Report missing fields and do not create or infer statement rows.
optimize_company_director_remunerationOptimizes Cyprus LTD company-director remuneration: finds the salary-vs-dividend split with maximum net cash in pocket. Use for a Cyprus LTD director remuneration comparison. Require company profit/revenue, deductible expenses, tax year and domicile status; reuse supplied data and request missing essentials. The default €2,000 corporate administration cost is a disclosed modelling assumption.

🔑 requires an API key; all other tools work anonymously at the lower rate limits.

Use it on your phone

Remote MCP servers work inside desktop apps. On mobile or the web, use a ChatGPT Custom GPT or Claude's custom connectors instead.

ChatGPT (Custom GPT)

The easiest way for normal users. The GPT calls PoliErgaleio through two size-limited Actions (the full OpenAPI spec has 32 operations and exceeds ChatGPT's 30-operation limit).

  • Open ChatGPT → Explore GPTs → Create.
  • Turn on Actions, Action 1: import from URL https://poliergaleio.com/poliergaleio-chatgpt-actions.json (19 calculators).
  • Set Action 1 Authentication to None (anonymous tier). Optional Action 2: import https://poliergaleio.com/poliergaleio-chatgpt-user-actions.json with OAuth sign-in for saved calculations.
  • Publish as "Anyone with the link" and share.

GPT instructions (copy-paste):

You are a Cyprus financial calculator assistant powered by PoliErgaleio. Use the available tools to answer questions about Cyprus income tax, state pension, retirement stress tests, unemployment benefit, capital gains, mortgages, rent vs buy, stock options, EV savings, budgeting, portfolio performance and life-insurance surrenders. Always ask for missing required inputs. Mention that results use current Cyprus tax rules (2025/2026) and are estimates, not tax advice.

Claude (custom connector)

Claude supports remote MCP custom connectors on Free, Pro, Max, Team and Enterprise plans (Free users get one connector). Works on iOS, Android and the web.

  1. Open claude.ai or the Claude app.
  2. Go to Settings → Connectors → Add custom connector.
  3. Paste the MCP endpoint URL: https://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/mcp.
  4. Add a custom header: x-api-key with your API key, or leave it out for anonymous use.
  5. Enable the connector in a new chat and ask your question.

Is this server legitimate?

  • Operated by: PoliErgaleio (poliergaleio.com)
  • Hosted on: Supabase Edge Functions tied to this project.
  • What the server sees: Only the JSON payload you send. API keys are used for rate-limiting and owner-scoped saved-calculation lookups.
  • What it cannot see: Your PoliErgaleio web session, saved-calculation encryption keys, or third-party accounts. Encrypted saves stay locked (locked: true) and are never decrypted through the API — open password-protected saves on poliergaleio.com instead.
  • Verify yourself: discovery manifest /.well-known/mcp.json, tool list GET https://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/tools, key check GET https://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/whoami, browser checker /developers/verify, OpenAPI /poliergaleio-openapi.json.

Staying up to date

  • Every response carries the current API version in the X-API-Version header and the apiVersion body field. Check GET https://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/version for the current version and changelog.
  • MCP clients (Claude, Cursor) pick up new tools automatically on reconnect — no reinstall needed.
  • ChatGPT Custom GPTs cache the Action schema; re-import /poliergaleio-chatgpt-actions.json (and /poliergaleio-chatgpt-user-actions.json if used) in the GPT editor to pick up new tools.
  • Breaking changes are announced in advance with Deprecation and Sunset headers plus a plain-language notice field in the response body.
  • GET https://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/migrations/latest returns the newest migration guide with #what-changed, #tool-changes and #update-steps deep links. It is cacheable: keep the ETag and send If-None-Match to get a 304 (Cache-Control: public, max-age=300, stale-while-revalidate=86400).
  • Validate lifecycle errors automatically against the published JSON Schema 2020-12: /poliergaleio-lifecycle-error.schema.json (also live at GET https://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/schemas/errors/lifecycle). It covers both 410 Gone (code: "tool_gone") and 426 Upgrade Required (code: "upgrade_required"), which share error, code, tool, status, replacement, migrationGuide and migrationSections.

Copy-paste examples

# Newest migration guide, keeping the ETag for later revalidation
curl -sD - https://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/migrations/latest -o latest.json | grep -i -E '^(etag|cache-control)'

# Revalidate: 304 with an empty body while the guide is unchanged
curl -s -o /dev/null -w '%{http_code}
' -H 'If-None-Match: "<stored-etag>"'   https://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/migrations/latest

# Validate an error body against the published schema
curl -s https://poliergaleio.com/poliergaleio-lifecycle-error.schema.json -o lifecycle-error.schema.json
npx ajv-cli validate -s lifecycle-error.schema.json -d error-body.json --spec=draft2020

# 426 Upgrade Required (stale client)
curl -s -X POST https://gpkpjfdlbsuyevfdsnbq.supabase.co/functions/v1/public-api/tools/calculate_cyprus_income_tax   -H 'Content-Type: application/json' -H 'X-Client-Version: 0.9.0'   -d '{"salaryIncome": 45000}'

Downloads

Προγραμματιστές & AI Agents — Δημόσιο API & MCP Server | PoliErgaleio

Δωρεάν MCP server και REST API για υπολογισμούς φόρου εισοδήματος, κρατικής σύνταξης και επιδόματος ανεργίας Κύπρου. Οδηγοί για Claude Desktop, ChatGPT, Gemini και Cursor.