indexa-capital-mcp-server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@indexa-capital-mcp-serverhow are my investments doing?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
indexa-capital-mcp-server
Servidor MCP de solo lectura para monitorizar tus inversiones en Indexa Capital desde Claude (Desktop, Code, web).
Implementa el subconjunto de lectura de la API REST v1.6 de Indexa:
Tool MCP | Endpoint | Para qué sirve |
| varios | Resumen agregado de todas tus cuentas en una sola llamada |
|
| Lista de cuentas y datos del usuario |
|
| Perfil de la cuenta, riesgo, titulares |
|
| Composición actual: valor, fondos, ISIN, P/L |
|
| Serie histórica de rentabilidad y benchmark |
|
| Movimientos: aportaciones, suscripciones, retiradas |
|
| Comisiones de gestión por trimestre |
Nota de seguridad: este servidor no implementa ningún endpoint de escritura (no puede mover dinero, abrir cuentas, ni modificar tu perfil). Si en el futuro quieres añadir aportaciones programadas o transferencias, requiere un fork explícito.
Requisitos
Node.js 18 o superior
Una cuenta en Indexa Capital
Un token de API personal (instrucciones más abajo)
Related MCP server: eToro Portfolio Connector
Instalación
Desde npm (usuarios)
No hace falta clonar ni compilar: el paquete incluye el código ya construido en dist/.
Instalación global (el binario queda en tu PATH de npm):
npm install -g indexa-capital-mcp-serverO ejecutarlo sin instalar globalmente (npx descarga el paquete cuando hace falta; -y evita el prompt de confirmación):
npx -y indexa-capital-mcp-serverDesde el repositorio (desarrollo)
git clone https://github.com/dacmail/indexa-capital-mcp-server.git
cd indexa-capital-mcp-server
npm install
npm run buildObtener el token de API
Entra en tu área privada de Indexa Capital.
Ve a Configuración de usuario → Aplicaciones.
Genera un token. Tendrá esta pinta:
eyJ0eXAiOiJKV1Qi....Guárdalo a buen recaudo: es personal, intransferible, y suficiente para acceder a todos los datos de tu cuenta.
Configuración en Claude Desktop
Edita ~/Library/Application Support/Claude/claude_desktop_config.json y añade una de estas opciones.
Con npx (recomendado; no necesitas ruta al clon ni al global node_modules):
{
"mcpServers": {
"indexa-capital": {
"command": "npx",
"args": ["-y", "indexa-capital-mcp-server"],
"env": {
"INDEXA_API_TOKEN": "eyJ0eXAiOiJKV1Qi..."
}
}
}
}Si instalaste el paquete con npm install -g:
{
"mcpServers": {
"indexa-capital": {
"command": "indexa-capital-mcp-server",
"args": [],
"env": {
"INDEXA_API_TOKEN": "eyJ0eXAiOiJKV1Qi..."
}
}
}
}Si trabajas desde un clon local (tras npm run build):
{
"mcpServers": {
"indexa-capital": {
"command": "node",
"args": ["/ruta/absoluta/a/indexa-capital-mcp-server/dist/index.js"],
"env": {
"INDEXA_API_TOKEN": "eyJ0eXAiOiJKV1Qi..."
}
}
}
}Reinicia Claude Desktop. Verás las 7 tools disponibles bajo el icono del enchufe.
Configuración en Claude Code
Con paquete publicado en npm (npx):
claude mcp add indexa-capital \
--env INDEXA_API_TOKEN=eyJ0eXAiOiJKV1Qi... \
-- npx -y indexa-capital-mcp-serverCon instalación global:
claude mcp add indexa-capital \
--env INDEXA_API_TOKEN=eyJ0eXAiOiJKV1Qi... \
-- indexa-capital-mcp-serverDesde un clon local:
claude mcp add indexa-capital \
--env INDEXA_API_TOKEN=eyJ0eXAiOiJKV1Qi... \
-- node /ruta/absoluta/a/indexa-capital-mcp-server/dist/index.jsEjemplos de uso
Una vez conectado, puedes preguntarle a Claude cosas como:
"¿Cómo van mis inversiones en Indexa?" — usa
indexa_portfolio_summary"¿Qué fondos tengo en mi cartera de Indexa?" — usa
indexa_get_portfolio"¿Cuánto he ganado este año en mi plan de pensiones?" — usa
indexa_get_performancecondate_from"Lista las aportaciones que hice en 2024" — usa
indexa_get_transactionscon filtro de fechas"¿Cuánto me ha cobrado Indexa en comisiones desde que abrí la cuenta?" — usa
indexa_get_fees
Pruebas locales
# Compilar
npm run build
# Test rápido del token
INDEXA_API_TOKEN=eyJ... node -e "
const axios = require('axios');
axios.get('https://api.indexacapital.com/users/me', {
headers: { 'X-AUTH-TOKEN': process.env.INDEXA_API_TOKEN }
}).then(r => console.log(JSON.stringify(r.data, null, 2)));
"
# Inspector MCP oficial
npx @modelcontextprotocol/inspector node dist/index.js(Recuerda exportar INDEXA_API_TOKEN antes de lanzar el inspector.)
Estructura del proyecto
src/
├── index.ts # Entry point, registro de tools
├── constants.ts # API URL, headers, límites
├── schemas/
│ └── common.ts # Schemas Zod compartidos
├── services/
│ ├── client.ts # Cliente Axios + manejo de errores
│ └── format.ts # Helpers de formato (Markdown/JSON/EUR)
└── tools/
├── get_me.ts
├── get_account.ts
├── get_portfolio.ts
├── get_performance.ts
├── get_transactions.ts
├── get_fees.ts
└── portfolio_summary.tsNotas sobre la API
El base URL es
https://api.indexacapital.com.La autenticación se hace con el header
X-AUTH-TOKEN.Los tokens generados desde el área privada no caducan, a diferencia de los tokens emitidos vía
/auth/authenticateque duran ~16 h.Los endpoints
/portfolio,/performance,/transactionsy/feesno aparecen en la documentación pública RAML pero están confirmados por el soporte oficial y por clientes existentes (Indexa-Dashboard, plantillas Google Sheets, integraciones de la suite Sure). Las interfaces TypeScript son intencionalmente permisivas (?opcional,[key: string]: unknown) por si la API evoluciona.
Licencia
MIT.
Available Tools
7 toolsindexa_get_accountGet Indexa account detailsARead-onlyIdempotent
Retrieve static information about a single Indexa account: product type (cartera de fondos / plan de pensiones), risk profile (1-10), holders, account status, funding state and currency.
This tool does NOT return the current portfolio value, holdings, or performance — for those use indexa_get_portfolio and indexa_get_performance.
Args:
account_number (string): Indexa account ID, obtained from indexa_get_me
response_format ('markdown' | 'json'): Output format (default: 'markdown')
Returns: For JSON format, the raw response from GET /accounts/{account_number}: { "account_number": string, "account_type": "personal" | "company" | "minor", "type": "mutual" | "pension", "currency": string, // typically "EUR" "status": string, // "active", "pending-contract", etc. "funding": "total" | "partial" | "no", "profile": { "selected_risk": 1-10, // user-selected risk level "risk": { "tolerance": 1-10, // questionnaire-derived "capacity": 1-10, "total": 1-10 // = min(tolerance, capacity) }, "is_outdated": boolean, "needs_to_be_updated": boolean }, "holders": [...], // titulares con nombre y DNI "platform_code": string }
Examples:
Use when: "What's my risk profile on account NK1NUTP1?"
Use when: "Is my pension account active?"
Don't use when: The user wants the current portfolio value (use indexa_get_portfolio) or returns (use indexa_get_performance).
Error handling:
404: account_number does not exist or you don't have access to it.
401/403: token invalid or revoked.
| Name | Required | Description | Default |
|---|---|---|---|
| account_number | Yes | Indexa account number (account_number field from indexa_get_me). Example: 'NK1NUTP1'. | |
| response_format | No | Output format: 'markdown' for human-readable summary or 'json' for full structured data. | markdown |
indexa_get_feesGet Indexa management feesARead-onlyIdempotent
Retrieve the management fees charged by Indexa Capital on an account. Indexa bills quarterly, and this endpoint returns one record per quarter, including the asset base used, the net fee, VAT, the effective fee rate, and a link to the invoice PDF.
Args:
account_number (string): Indexa account ID
date_from (string, optional): Filter to quarters that end on or after this date (YYYY-MM-DD)
date_to (string, optional): Filter to quarters that start on or before this date (YYYY-MM-DD)
response_format ('markdown' | 'json'): Output format (default: 'markdown')
Returns: For JSON format, an array of fee records: [ { "account_number": string, "date_from": "YYYY-MM-DD", // start of the billing quarter "date_to": "YYYY-MM-DD", // end of the billing quarter "fees": number, // net management fee in EUR "vat": number, // VAT applied in EUR "amount": number, // asset base used "average_fee": number, // effective fee rate (e.g. 1.95 = 1.95 bps avg) "document": { // invoice PDF metadata "showName": string, "show_name": string, "created_at": "YYYY-MM-DD HH:mm:ss" } } ]
The Markdown format computes total fees and total VAT for the filtered range.
Examples:
Use when: "How much did Indexa charge me in fees last year?"
Use when: "What's my effective fee rate on my pension account?"
Use when: "List all fee invoices since 2023"
Error handling:
404: account not found or no fees yet (e.g. very recently opened).
401/403: token invalid.
| Name | Required | Description | Default |
|---|---|---|---|
| account_number | Yes | Indexa account number (account_number field from indexa_get_me). Example: 'NK1NUTP1'. | |
| date_from | No | Date in YYYY-MM-DD format. Example: '2024-01-15'. | |
| date_to | No | Date in YYYY-MM-DD format. Example: '2024-01-15'. | |
| response_format | No | Output format: 'markdown' for human-readable summary or 'json' for full structured data. | markdown |
indexa_get_meGet current Indexa userARead-onlyIdempotent
Retrieve the authenticated user's profile and the list of all Indexa Capital accounts they own or have access to.
This is the entry point of the API: every other tool requires an account_number, and this tool is how you discover them. The token in INDEXA_API_TOKEN identifies the user, so no input is required.
Args:
response_format ('markdown' | 'json'): Output format (default: 'markdown')
Returns: For JSON format, the raw response from GET /users/me: { "username": string, "email": string, "name"?: string, "surname"?: string, "document": string, "document_type": string, "roles": string[], "is_activated": boolean, "accounts": [ { "account_number": string, // e.g. "NK1NUTP1" — pass to other tools "status": string, // "active", "pending-contract", etc. "type": "mutual" | "pension" } ], "accounts_relations": [ { "account_number": string, "relation": "owner" | "auth" | "guest" } ] }
Examples:
Use when: User asks "what accounts do I have at Indexa?" or any question that mentions Indexa investments without specifying an account.
Use when: You need an account_number to call any other indexa_* tool.
Don't use when: The user already gave you an account_number.
Error handling:
401/403: token is invalid or revoked. Regenerate it in the Indexa private area at Configuración de usuario > Aplicaciones.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | Output format: 'markdown' for human-readable summary or 'json' for full structured data. | markdown |
indexa_get_performanceGet Indexa account performanceARead-onlyIdempotent
Retrieve the historical performance series for an Indexa account, with optional date filtering and projection data.
Performance values are returned in base 100 — a value of 105 at index N means +5% cumulative return since the start of the series. Per Indexa support, returns between two points are computed as: 100 * (return[end] / return[start] - 1).
Args:
account_number (string): Indexa account ID
date_from (string, optional): Filter the series to start on or after this date (YYYY-MM-DD)
date_to (string, optional): Filter the series to end on or before this date (YYYY-MM-DD)
include_projections (boolean, default false): Whether to include best/worst/expected forward projections in the JSON output. These can be large; leave off unless explicitly needed.
response_format ('markdown' | 'json'): Output format (default: 'markdown')
The Markdown format computes and displays:
Cumulative return over the period
Annualised return (estimated from the date range)
Plan expected return (Indexa's own projection)
Benchmark comparison and alpha (if benchmark series is present)
A sampled subset of the curve as a table (~8 points)
Returns: For JSON format, the structure is: { "plan_expected_return": number, // e.g. 0.0384 = +3.84%/year expected "performance": { "period": ["YYYY-MM-DD", ...], // dates "return": [number, ...], // base-100 actual return series "benchmark"?: [number, ...], // base-100 benchmark series "best"?: [number, ...], // best-case projection (if requested) "worst"?: [number, ...], // worst-case projection "expected"?: [number, ...] // expected projection } }
Examples:
Use when: "What's my YTD return on Indexa?" -> date_from = first day of year
Use when: "How has my account performed since I opened it?" -> no dates
Use when: "Compare my returns to the benchmark"
Don't use when: The user wants the current value (use indexa_get_portfolio) or transaction history (use indexa_get_transactions).
Error handling:
404: account not found or no performance data yet (e.g. just opened).
401/403: token invalid.
| Name | Required | Description | Default |
|---|---|---|---|
| account_number | Yes | Indexa account number (account_number field from indexa_get_me). Example: 'NK1NUTP1'. | |
| date_from | No | Lower bound for the returned series (YYYY-MM-DD). Omit for full history. | |
| date_to | No | Upper bound for the returned series (YYYY-MM-DD). Omit for latest available. | |
| include_projections | No | Include best/worst/expected projection arrays in the JSON output. These can be very large; default false to keep responses small. | |
| response_format | No | Output format: 'markdown' for human-readable summary or 'json' for full structured data. | markdown |
indexa_get_portfolioGet Indexa portfolio compositionARead-onlyIdempotent
Retrieve the current portfolio of an Indexa account: total value, cash position, and the full list of instruments currently held (ISIN, name, asset class, market value, cost basis, unrealized P/L and return %).
API response shape: { "portfolio": { "total_amount", "cash_amount", "instruments_amount", "instruments_cost", "date" }, "cash_accounts": [{ "amount", "date" }], "instrument_accounts": [{ "positions": [{ "amount", "cost_amount", "price", "titles", "instrument": { "identifier"(ISIN), "name", "asset_class", "management_company_description" } }] }] }
The Markdown output includes: grand total, cost basis, total P/L and return %, breakdown by asset class with %, and per-position detail sorted by value.
Args:
account_number (string): Indexa account ID, from indexa_get_me
response_format ('markdown' | 'json'): Output format (default: 'markdown')
Examples:
Use when: "What's my Indexa portfolio worth?"
Use when: "Show me what funds I'm holding"
Use when: "How much am I up/down on my Indexa account?"
Don't use for: historical returns → indexa_get_performance
Don't use for: transaction history → indexa_get_transactions
| Name | Required | Description | Default |
|---|---|---|---|
| account_number | Yes | Indexa account number (account_number field from indexa_get_me). Example: 'NK1NUTP1'. | |
| response_format | No | Output format: 'markdown' for human-readable summary or 'json' for full structured data. | markdown |
indexa_get_transactionsGet Indexa account transactionsARead-onlyIdempotent
Retrieve the transaction history for an Indexa account: contributions (aportaciones), withdrawals (retiradas), fund subscriptions and redemptions, dividend reinvestments, fees charged, etc.
Use this for questions about money in/out of the account or specific operations on a date.
Args:
account_number (string): Indexa account ID
date_from (string, optional): Lower date bound (YYYY-MM-DD)
date_to (string, optional): Upper date bound (YYYY-MM-DD)
limit (number, default 50, max 500): Maximum transactions to return
offset (number, default 0): Pagination offset
response_format ('markdown' | 'json'): Output format (default: 'markdown')
Returns: For JSON format, an array of transaction objects. The exact shape is not fully published in the Indexa RAML, but transactions typically include: { "date": "YYYY-MM-DD", "amount": number, // EUR; positive = into account "type": string, // e.g. "contribution", "subscription", "redemption", "fee" "description": string, "instrument"?: { "name": string, "identifier": string // ISIN } }
Examples:
Use when: "How much have I contributed to Indexa this year?"
Use when: "Show my last 20 movements on account NK1NUTP1"
Use when: "Did I get charged fees in March?"
Error handling:
404: endpoint not available for this account type or status.
401/403: token invalid.
Note: Date filtering and pagination are applied client-side after the API responds. For very active accounts with many years of history, narrow the date_from / date_to window to keep responses fast and within limits.
| Name | Required | Description | Default |
|---|---|---|---|
| account_number | Yes | Indexa account number (account_number field from indexa_get_me). Example: 'NK1NUTP1'. | |
| date_from | No | Date in YYYY-MM-DD format. Example: '2024-01-15'. | |
| date_to | No | Date in YYYY-MM-DD format. Example: '2024-01-15'. | |
| limit | No | Maximum transactions to return after date filtering. | |
| offset | No | Number of transactions to skip after date filtering. | |
| response_format | No | Output format: 'markdown' for human-readable summary or 'json' for full structured data. | markdown |
indexa_portfolio_summaryIndexa portfolio overview (all accounts)ARead-onlyIdempotent
Convenience tool that returns a one-shot overview of ALL the user's Indexa Capital accounts: total wealth, per-account value, cash, unrealized P/L and cumulative return. Calls /users/me then /portfolio and /performance for each active account in parallel.
Use this as the FIRST tool for open-ended questions like "how are my Indexa investments doing?" or "give me an overview of my Indexa". Only use account-specific tools when the user specifies one account or aspect (composition, transactions, fees).
Args:
response_format ('markdown' | 'json'): Output format (default: 'markdown')
Returns JSON: { "user": { email, name, surname }, "accounts": [{ account_number, type, status, total_value, cash, unrealized_pl, cumulative_return, plan_expected_return, error? }], "totals": { total_value, unrealized_pl, account_count } }
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | Output format: 'markdown' for human-readable summary or 'json' for full structured data. | markdown |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v0.1.0- First observed
indexa_get_account - First observed
indexa_get_fees - First observed
indexa_get_me - First observed
indexa_get_performance - First observed
indexa_get_portfolio - First observed
indexa_get_transactions - First observed
indexa_portfolio_summary
TDQS
Scored across 7 tools
Each tool targets a distinct aspect of the Indexa Capital API: user profile, account info, portfolio, performance, transactions, fees, and an aggregated summary. Descriptions explicitly state what not to use each tool for, eliminating ambiguity.
All tools follow the 'indexa_get_<noun>' pattern except 'indexa_portfolio_summary', which uses 'summary' instead of 'get'. This is a minor deviation, but overall the naming is consistent and predictable.
With 7 tools covering user info, account details, portfolio, performance, transactions, fees, and an aggregated summary, the set is well-scoped for a read-only investment API. No tool feels superfluous or missing.
The tool set covers the core read-only operations for an investment account: user profile, account details, portfolio holdings, performance returns, transaction history, and fees. A summary tool aggregates key data. Minor gaps like tax documents or dividend details are acceptable for a read-only API.
Maintenance
Related MCP Connectors
Query your real net worth, spending, transactions, budgets and portfolio from any MCP client.
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Read-only access to your own crypto portfolio across 11+ exchanges and 20+ chains: holdings, full history, FIFO cost basis and P&L, fees and income. Ask Claude or ChatGPT about your portfolio; the connector can never trade, move funds or act as a login.
Read-only finance MCP server. Connects your banks, cards, payment apps, books and payroll into one ledger for your AI. Can't move money. Open source (AGPL-3.0), free during beta.
Related MCP Servers
- AlicenseAqualityDmaintenanceA read-only MCP server that provides access to Charles Schwab account data and market information, including portfolio positions, real-time quotes, options chains, price history, and account balances through AI assistants.9MIT
- AlicenseNot gradedqualityCmaintenanceA read-only MCP server that connects Claude to your eToro account, enabling queries about your portfolio, P\&L, balances, watchlists, live prices, and price history.MIT
- AlicenseNot gradedqualityAmaintenanceRead-only MCP tools for Interactive Brokers: account, portfolio, market data, risk analysis and position sizing. Requires IBKR Pro and a local TWS or IB Gateway API session. Install the signed Canary binary or Claude Desktop MCPB bundle locally. Other local MCP clients launch the installed canary executable with the argument mcp. Setup: https://osauer.dev/canary/docs/start/install.html11MIT
- AlicenseAqualityBmaintenanceA read-only MCP server for Trading 212 accounts, enabling AI assistants to query balances, positions, orders, dividends, pies, and instruments without trading capabilities.121MIT