{
  "markdown": "# Index One MCP Server\n\nRemote [MCP](https://modelcontextprotocol.io) server for [Index One](https://indexone.io) — query financial index data, run backtests, and build and deploy systematic investment strategies from any MCP-capable client.\n\n| | |\n|---|---|\n| **Endpoint** | `https://api.indexone.io/mcp` |\n| **Transport** | Streamable HTTP (stateless, POST only) |\n| **Auth** | OAuth 2.1, or a team API key in `x-api-key` |\n| **Tools** | 22 |\n| **Registry** | [`io.indexone/mcp`](https://registry.modelcontextprotocol.io/v0/servers?search=io.indexone) |\n| **Docs** | https://indexone.io/docs/mcp |\n\n> This repository is the public home for the server's manifest, tool reference and client examples. The server itself is hosted by Index One — there is nothing to install, build or run locally, and the server implementation is not open source.\n\n## What it does\n\nIndex One builds and calculates custom financial indices. The MCP server exposes that platform as tools, so an agent can:\n\n- **Read index data** — metadata, historical value series, holdings, weightings, universes, and risk/return statistics for your team's indices and public ones.\n- **Backtest** — simulate any index definition over history, with performance summaries and value series.\n- **Build and deploy** — discover the workflow operations and datasets available, preview a workflow against real data, validate it, save it as a draft, and deploy it as a live, continuously calculated index.\n\nThe server is a tool surface, not a chatbot: your client's own model does the reasoning and calls tools one at a time. Every call is scoped to your team.\n\n## Authentication\n\n**OAuth** — clients that implement the MCP authorization spec (the Claude web and Desktop connectors, among others) need only the endpoint URL. You'll be sent to a sign-in page and log in with your normal Index One account; no key ends up in a config file.\n\n**API key** — everything else sends a team API key as the `x-api-key` header. This covers Claude Code, Cursor, VS Code and custom agents, which register on a random local port that OAuth providers can't pre-approve. Create and revoke keys in the Index One console under **Team → API Keys**.\n\nBoth resolve to the same team scope. Rate limit is roughly 60 calls per minute per team; over that you get `429` with `Retry-After`.\n\n## Quick start\n\n### Claude (web or Desktop) — connector\n\nSettings → Connectors → Add custom connector, paste `https://api.indexone.io/mcp`, leave the advanced OAuth fields empty, and sign in with your Index One account.\n\n### Claude Code\n\n```bash\nclaude mcp add --transport http indexone https://api.indexone.io/mcp \\\n  --header \"x-api-key: YOUR_API_KEY\"\n```\n\n### Cursor — `~/.cursor/mcp.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"indexone\": {\n      \"url\": \"https://api.indexone.io/mcp\",\n      \"headers\": { \"x-api-key\": \"YOUR_API_KEY\" }\n    }\n  }\n}\n```\n\n### VS Code — `.vscode/mcp.json`\n\n```json\n{\n  \"servers\": {\n    \"indexone\": {\n      \"type\": \"http\",\n      \"url\": \"https://api.indexone.io/mcp\",\n      \"headers\": { \"x-api-key\": \"YOUR_API_KEY\" }\n    }\n  }\n}\n```\n\n### Claude Desktop — `claude_desktop_config.json`\n\nDesktop reaches remote servers through the `mcp-remote` bridge:\n\n```json\n{\n  \"mcpServers\": {\n    \"indexone\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\", \"mcp-remote\", \"https://api.indexone.io/mcp\",\n        \"--header\", \"x-api-key:${INDEXONE_API_KEY}\"\n      ],\n      \"env\": { \"INDEXONE_API_KEY\": \"YOUR_API_KEY\" }\n    }\n  }\n}\n```\n\nOn Windows, use `\"command\": \"cmd\"` with `\"args\": [\"/c\", \"npx\", ...]` — Desktop resolves `npx` to a path containing a space, which breaks the launch. Write the header with no space after the colon; Desktop does not escape spaces inside arguments.\n\n### Anything else\n\nSee [`examples/`](examples/) for a raw JSON-RPC call over curl and a Python client using the official MCP SDK.\n\n## Tools\n\nFull reference with descriptions: [**TOOLS.md**](TOOLS.md).\n\n| Group | Tools |\n|---|---|\n| Index data | `get_index`, `get_index_values`, `get_index_holdings`, `get_index_weightings`, `get_index_universe`, `get_index_stats` |\n| Backtesting | `run_backtest`, `get_backtest` |\n| Discovery | `list_operations`, `get_operations`, `list_examples`, `get_example`, `list_workflows`, `get_workflow`, `list_datasets`, `inspect_dataset` |\n| Preview | `run_workflow`, `inspect_run`, `get_column_values` |\n| Persistence | `validate_workflow`, `save_workflow`, `deploy_index` |\n\nWrites are deliberately narrow: an agent can save drafts and deploy an index — the latter only with `confirm=true`, after a full backtest, and never as an empty index — and there is no delete tool.\n\n## Building an index\n\nAn index workflow is a DAG of operations: a trigger that sets the schedule, operations that select, filter and weight securities, and a `create_index_holdings` step that turns the result into holdings. Agents discover that shape rather than assuming it. The server ships instructions telling the client's model to follow this path:\n\n```\nlist_operations     what operations exist?\nget_example         copy wiring from a real workflow\nget_operations      exact parameter schemas\ninspect_dataset     real columns, real values\nrun_workflow        preview against real data (nothing saved)\nvalidate_workflow   optional draft check (the run tools validate on their own)\nsave_workflow       persist as a draft\nrun_backtest        validates + simulates, returns a backtest_id immediately\ndeploy_index        register a live index (confirm=true)\n```\n\nOperation names, dataset ids, column names and filter values are always looked up, never guessed.\n\n## Notes\n\n- Stateless streamable HTTP: every request is self-contained, `POST` only (`GET`/`DELETE` return `405`), JSON responses returned directly — no SSE stream required.\n- Preview runs cache their outputs for two hours so `inspect_run` and `get_column_values` work across calls.\n- `run_backtest` and `deploy_index` never hold the connection open: they validate synchronously, then return a `backtest_id` (and, for deploys, the pending `index_id`) immediately; poll `get_backtest` for the result — it absorbs part of the wait server-side, so polling back-to-back is fine.\n\n## Support\n\nQuestions, higher rate limits, or anything odd: support@indexone.io\n",
  "bytes": 6241,
  "sha": "a4abaea2a2a15a0aebad92116da71dac22b4e012288c15483e6ca7c2e7a32b3e",
  "repo_slug": "index1one/indexone-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_indexone_mcp_cb93bfb4/readme"
}