ghana-data-mcp MCP SERVER · CLOUDFLARE WORKERS

A REMOTE MCP SERVER, STREAMABLE HTTP, NO API KEY

Public Ghana market data,
wired straight into your AI tools.

Fifteen read-only tools bring the Ghana Stock Exchange, the Bank of Ghana, the Ghana Statistical Service and the IMF to any MCP client — Claude, or anything else that speaks the protocol. No scraping in your prompt, no stale copy-paste from a PDF.

15
Read-only tools
4
Data sources
16
StatsBank tables
~130
IMF indicators
1971
Earliest series
0
API keys required

THE LEDGER

Fifteen tools, four sources

Every tool is read-only and namespaced by where its data comes from. Full parameter reference lives in the repo's docs/ folder, linked from each row.

GSE

Ghana Stock Exchange

gse.com.gh
gse_get_stock_history Daily prices and volume for one share code, back to 2007
gse_rank_stocks Rank the whole exchange, or compare a named basket, by return, price change, volume or turnover — one request
gse_list_companies Every listed company: share code, name, board, listing date
gse_search_company Best-matching companies for a name, with a confidence score
gse_get_market_index Market-wide GSE Composite Index, market cap, GSE-FSI, volume
gse_list_fixed_income_issuers Corporate bond issuers on the Ghana Fixed Income Market
BOG

Bank of Ghana

bog.gov.gh
bog_get_interbank_fx_rates Cedi reference rates against 19 currencies — latest day, or history to 1996
bog_get_treasury_bill_rates Government of Ghana bill, note and bond rates, back to 2013
bog_get_central_bank_bill_rates The Bank of Ghana's own bill rates, back to 2016
bog_get_interbank_interest_rates Interbank weighted average, reverse repo and depo rates, back to 2002
IMF

International Monetary Fund

DataMapper API
imf_list_indicators Search ~130 macroeconomic indicators by keyword; returns the code each match needs
imf_get_indicator_history Time series for one or more indicators — GDP, inflation, debt, and more — for Ghana and, optionally, other countries, regions or analytical groups
GSS

Ghana Statistical Service

StatsBank · PxWeb
gss_list_tables The 16 official StatsBank macroeconomic tables, filterable by keyword or sector
gss_describe_table One table's filterable dimensions, every value each accepts, and which periods are published
gss_get_data Observations for a table — official CPI for Ghana and all 16 regions, GDP, public debt, fiscal accounts, money and credit, rates, trade and more
ping — no input, returns { ok, server, version }. Belongs to no source; a clean connectivity check.

DATA PROVENANCE

Every answer says how fresh it is

Nothing is ever presented as live when it isn't. Each result carries a meta.origin stamp, so a model — and a reader — can tell the difference.

LIVE

Just fetched from the source site, this request.

CACHE

A fresh cached copy. ageSeconds says exactly how old.

STALE-CACHE

The live fetch failed, so an expired copy was served — flagged with a warning.

STATIC-SEED

The fetch failed entirely; a built-in fallback list was used instead.

OPENING THE ACCOUNT

Connect in one line, or run your own copy

No secrets either way — the underlying data is public, so there's no key to provision. Point a client at the hosted server below, or self-host in five commands if you'd rather run your own copy.

Connect to the hosted server

No clone, no install, nothing to run — every client below just needs this one address:

https://ghana-data-mcp.epigos.workers.dev/mcp

Claude Code, one line:

claude mcp add --transport http \
  ghana-data https://ghana-data-mcp.epigos.workers.dev/mcp

In claude_desktop_config.json:

{
  "mcpServers": {
    "ghana-data": {
      "type": "http",
      "url": "https://ghana-data-mcp.epigos.workers.dev/mcp"
    }
  }
}

Restart Claude Desktop after saving.

Claude.ai and the Claude desktop app take remote servers as custom connectors:

  1. Settings → Connectors → Add custom connector
  2. Paste https://ghana-data-mcp.epigos.workers.dev/mcp as the URL
  3. Name it (e.g. "Ghana Data") and save — no authentication to configure
  4. Enable it from the connector picker in a chat

ChatGPT reaches remote MCP servers through Connectors (menu names shift between plans, but the shape is the same):

  1. Settings → Connectors → Advanced settings → enable Developer mode
  2. Create connector, paste the URL above, authentication: None
  3. Enable the connector for the chat you want to use it in

Add to ~/.cursor/mcp.json (or a project's .cursor/mcp.json):

{
  "mcpServers": {
    "ghana-data": {
      "url": "https://ghana-data-mcp.epigos.workers.dev/mcp"
    }
  }
}

Anything that speaks Streamable HTTP can connect directly — point it at the URL above, no auth header required. A plain health check needs no MCP client at all:

curl https://ghana-data-mcp.epigos.workers.dev/health

Confirm the connection before asking anything real: Use the ping tool on the ghana-data server.

...or run your own copy

Run it locally

  1. Clone and install

    Pull the repo and its dependencies.

  2. Run the test suite

    Fixture-based, no network — confirms the build is sound before you serve anything.

  3. Start the dev server

    Serves MCP at http://localhost:8787/mcp via Wrangler.

  4. Point a client at it

    Streamable HTTP, no authentication — see the snippets on the right.

# one block, top to bottom
git clone git@github.com:epigos/ghana-data-mcp.git
cd ghana-data-mcp
npm install
npm test
npm run dev

Connect a client (local)

Claude Code, one line:

claude mcp add --transport http \
  ghana-data http://localhost:8787/mcp

Claude Desktop, in claude_desktop_config.json:

{
  "mcpServers": {
    "ghana-data": {
      "type": "http",
      "url": "http://localhost:8787/mcp"
    }
  }
}

Confirm the connection before asking anything real:

> Use the ping tool on the ghana-data server.

WHAT IT'S FOR

Seven things people actually build with it

All read-only, all pointed at public sources — the tools compose across GSE, BoG, GSS and IMF rather than staying siloed by source.

§

Equity research copilot

Look up a share by name, pull its full price history, and read it alongside the GSE Composite Index for context — without a ticker cheat-sheet.

gse_rank_stocks · gse_get_stock_history · gse_get_market_index
₵

FX & rates desk assistant

Cedi reference rates against 19 currencies plus T-bill, central-bank-bill and interbank rates, for a daily treasury briefing bot.

bog_get_interbank_fx_rates · bog_get_treasury_bill_rates
%

Macro briefing generator

GDP growth, inflation, government debt — each row flagged as historical actual or IMF's own forward projection, never blurred together.

imf_list_indicators · imf_get_indicator_history
⇄

West Africa comparison

Benchmark Ghana against a named neighbor or a whole bloc — Nigeria, Senegal, ECOWAS, Sub-Saharan Africa — on the same indicator, same call.

imf_get_indicator_history({ countries: [...] })
◉

Regional inflation monitor

Official GSS inflation for Ghana and all 16 regions, split by product basket and by local or imported source — the figure Ghanaian policy documents actually quote.

gss_get_data({ table: "cpi", filters: { Region: [...] } })
◈

Fixed-income screening

Cross-reference corporate bond issuers on the Fixed Income Market against prevailing benchmark rates from the Bank of Ghana.

gse_list_fixed_income_issuers · bog_get_central_bank_bill_rates
✓

Freshness-aware reporting

Every figure carries meta.origin — build a dashboard that visibly distinguishes live numbers from a stale fallback, rather than hiding the gap.

meta.origin · meta.ageSeconds · meta.warning

SAY IT IN CHAT

What the questions actually look like

No special syntax — a client with the server connected resolves these to the right tool call on its own.

Chat
What has MTN Ghana's share price done this month?
gsePulls MTNGH's daily history, reads the last few weeks, and describes the move — with the actual close prices, not a guess.
Chat
What are the best performing stocks on the GSE?
gseRanks all 41 listed securities in one request, and excludes the dozen that were quoted but never actually traded — otherwise they pad the leaderboard as fake 0% movers.
Chat
What is the cedi trading at against the dollar?
bogReads today's USD/GHS reference rate, and says if it's a fresh fetch or a cached figure from earlier today.
Chat
What is the current 91-day Treasury bill rate?
bogReads the latest published rate off the T-bill/note/bond schedule, not an average or an estimate.
Chat
What's the IMF's forecast for Ghana's GDP growth next year?
imfReads the row past the projection boundary and says explicitly that it's a forecast, not a reported figure.
Chat
How does that compare to other West African economies?
imfAdds Nigeria, Senegal and ECOWAS to the same call, and checks each one's rowCount before comparing — a bloc-wide aggregate isn't always published for a given indicator.
Chat
Find me an indicator about government debt.
imfSearches the catalog by keyword and returns matches across datasets — WEO's headline figure and the Global Debt Database's, distinguished by description.
Chat
What is Ghana's official inflation rate?
gssReads the year-on-year rate straight from the Statistical Service's own CPI table — the number quoted in Ghanaian press and policy papers, not an IMF estimate of it.
Chat
Is inflation worse in the north than in Accra?
gssOne call, one row per region: Greater Accra against Northern, Upper West and Upper East. All 16 regions are available on the same table.
Chat
How much did Ghana earn from gold exports last year?
gssQuarterly export value in US dollars from the customs trade table. Asks for a granularity first, because that table also holds monthly and annual rows and mixing them would double-count.

UNDER THE HOOD

How a request actually travels

MCP client ──▶Worker /mcp ──▶sources/{gse,bog,imf,gss} ──▶lib/{http,cache,rateLimit} ──▶source site

Runs on Cloudflare Workers with no Durable Object — every tool is an independent, read-only fetch with no session state worth keeping. Repeat questions are served from Workers KV before they ever reach a source site; a jittered backoff handles the occasional 403 or 429; an inbound limit of 30 requests/minute per IP keeps a looping client from becoming someone else's problem.