Indexed FP&A MCP Server
Gives Claude full read/write access to the Indexed FP&A portal's data, enabling everything a person can do manually on the portal through conversation.
README
Indexed FP&A — MCP Server
Gives Claude full read/write access to the Indexed FP&A portal's data — everything a person can do manually on the portal, through conversation.
How it works
The server runs the portal itself, headlessly. On every tool call it:
- Fetches the live
forecast_datarow from Supabase (same row the portal syncs). - Loads the portal's
index.html(from GitHub Pages, cached 5 min) and executes its<script>inside a sandboxed VM with a fake DOM, seeding the fakelocalStoragefrom the cloud row — exactly how a browser session hydrates. - Calls the portal's own functions (
getD,buildCFGroups,getFounderPayments,recalcARRow,parseXeroAccountTx, …) to compute answers or apply changes. - For writes, PATCHes only the touched columns back to Supabase (
ar_fcst,ap_fcst,ct_map,gl_mappings,cf_tx_overrides,cf_net_overrides,actuals_snap).
Because the portal's own code computes everything, the numbers Claude reports are always identical to what the portal shows — and when the portal's logic changes, the server picks it up automatically on the next HTML refresh. No drift, no re-implementation.
Tools (25)
Read — get_dashboard_metrics, get_cf_statement, get_cf_groups, get_cf_transactions, get_bank_breakdown, get_financials, get_ar, get_ap, get_client_history, get_contacts, get_comments
Analysis — forecast_client_cash (collection-rate based cash proposals)
Write — add/update/delete_ar_rows, add/update/delete_ap_rows, set_contact_mapping, set_gl_mapping, manage_dashboard_rows, set_cf_override, import_xero_data, add_comment, resolve_comment
Run locally
npm install
npm start # port 3000
DRY_RUN=1 npm start # writes are logged, not sent — safe testing
node test-client.js # full test suite against localhost:3000
No env vars needed — Supabase config is extracted from the portal source. Comment tools additionally need SUPABASE_SERVICE_KEY (see .env.example).
Deploy (Railway — recommended)
Needs a full Node runtime (uses the vm module and fetch), so a container host works; edge platforms (Cloudflare Workers, Vercel Edge) do not.
npm i -g @railway/cli
cd indexed-fpa-mcp
railway login # opens browser
railway init # create a project
railway up # build + deploy this folder (no GitHub needed)
railway domain # generate a public HTTPS URL
Then set environment variables (Railway dashboard → Variables, or railway variables set):
| Variable | Required | Purpose |
|---|---|---|
MCP_AUTH_TOKEN |
yes for prod | Comma-separated per-person tokens, each label:token — e.g. karan:abc123,anjan:def456. Any match authorizes; revoke one person by deleting their entry and redeploying. |
SUPABASE_SERVICE_KEY |
for comment tools | service_role key (Supabase → Settings → API). |
Generate a token per person: node -e "console.log(require('crypto').randomBytes(24).toString('hex'))".
Verify: curl https://<app>.railway.app/health → {"status":"ok",...}.
Access control — restricting to specific people
Two layers, together, mean only people you personally hand a token to can use it:
- Server token gate —
/mcprejects any request without a valid token (401). Each person gets their own. - Personal connector in Claude.ai — each authorized person adds the connector to their own account with their own token in the URL. It is never published to an org directory, so nobody else can discover or add it.
To revoke someone: remove their label:token entry from MCP_AUTH_TOKEN and redeploy. Everyone else is unaffected.
Connect to Claude.ai
Each person, in their own account: Settings → Connectors → Add custom connector. URL (their own token):
https://<app>.railway.app/mcp?token=<their-token>
(The server also accepts the token as an Authorization: Bearer header.)
Notes
GET /healthhydrates a full portal session and reports the actual months — good smoke test.- The portal auto-pushes its entire state when a user edits there. If someone keeps a stale portal tab open for hours and then edits, their push can overwrite changes made through Claude in the meantime. Refreshing the portal (or "Pull latest") before editing avoids this — same rule as between two human users.
- Xero imports through Claude: attach the Xero .xlsx in chat, Claude converts the sheet to raw rows and calls
import_xero_data; the portal's own parser processes them.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.