Skip to main content
Glama
spark-ordernet-mcp

spark-ordernet-mcp

by anhermon

Spark Ordernet MCP

Read-only MCP access to Spark / Ordernet brokerage accounts, including Meitav Trade. The server exposes current holdings, transactions, orders, returns, security lookup, price history, standing orders, and market news.

The authenticated client is constrained to an exact GET allowlist. Authentication is the only POST request; order entry, cancellation, money movement, currency conversion, and account changes are not reachable.

Requirements

  • Python 3.11 or newer

  • uv

  • A supported Spark / Ordernet brokerage login

Related MCP server: kiwoom-mcp-server

Run the MCP server

Use the packaged command directly from GitHub:

uvx --from git+https://github.com/anhermon/spark-ordernet-mcp \
  spark-ordernet-mcp

Configure an MCP client with credentials supplied only through its environment:

{
  "mcpServers": {
    "ordernet": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/anhermon/spark-ordernet-mcp",
        "spark-ordernet-mcp"
      ],
      "env": {
        "ORDERNET_BROKER": "meitav",
        "ORDERNET_USERNAME": "${ORDERNET_USERNAME}",
        "ORDERNET_PASSWORD": "${ORDERNET_PASSWORD}"
      }
    }
  }
}

Supported broker slugs include meitav, psagot, ibi, nesua, and gaon.

Install the Codex skill

Ask Codex to install:

https://github.com/anhermon/spark-ordernet-mcp/tree/main/spark-ordernet

Or clone the repository and copy spark-ordernet/ into ~/.codex/skills/spark-ordernet/.

Private portfolio report

After cloning the repository, create the ignored credential file and run:

cp .env.example .env
# Edit .env locally.
uv run --env-file .env python scripts/generate_portfolio_report.py

The report is written atomically to reports/portfolio-analysis.html with mode 0600. Reusable broker snapshots are stored under the ignored reports/.spark-cache/ directory with owner-only permissions. Completed years are reused automatically, making subsequent reports faster and less dependent on the broker's availability.

The report resolves numeric instrument IDs to safe public names when possible, normalizes income and fees to ILS using transaction-date FX, provides sortable historical-position columns, and plots indexed price action only across recorded holding lifecycles. Missing FX or market history is shown explicitly instead of being guessed.

  • --refresh refreshes all historical snapshots.

  • --offline reproduces the last successful cached report.

  • --no-cache disables cache reads and writes for one run.

  • --cache-ttl 300 controls reuse of recent current-year snapshots.

The generated report and cache contain private financial data. They are ignored by Git and must not be published.

Development checks

Install the Git hooks once per clone:

uvx --from pre-commit pre-commit install

The hooks reject source and configuration files longer than 800 lines, run Ruff, and execute the unit-test suite. Run the same checks across the repository before pushing:

uvx --from pre-commit pre-commit run --all-files

GitHub Actions runs this command on every push and pull request. Individual checks can also be run directly:

uv run python scripts/check_file_size.py .
uv run python -m unittest discover -s tests
uv run --with ruff ruff check .

License

MIT — see LICENSE.

Available Tools

11 tools
accountsA

List the brokerage accounts this login can read.

Inputs: no named parameters.

latest_newsC

Latest market-news items available in Spark.

Inputs: no named parameters.

order_historyC

Execution and status history for one order returned by orders().

Inputs: order_key (required), date.

ordersC

Orders for a given day (YYYY-MM-DD, default today): status, fills, prices.

Inputs: date, account.

portfolioB

Current holdings, cash and totals for an account — the snapshot to analyse.

Returns positions (quantity, cost, market value, % of portfolio, last price), the account summary (value, cash, credit, withdrawable) and securities totals.

Inputs: account.

price_historyA

Daily OHLCV history for a security. topic_key looks like RZF_0000001 (TASE), KRN_0000002 (fund) or CLPS_999_EXMPL (foreign) — get it from resolve_securities, search_securities, or a position key from portfolio().

Inputs: topic_key (required), points, interval.

resolve_securitiesA

Resolve exact public security identifiers to safe display metadata.

The static universe is scanned once. Account-shaped topics and raw static rows are never returned. Ambiguous identifiers remain unresolved.

Inputs: identifiers (required).

search_securitiesA

Find a security by symbol, name or TASE number. Returns topic keys usable with price_history. The platform has no search endpoint — this searches the public static instrument universe the SPA itself searches client-side. Results contain only allowlisted public security metadata.

Inputs: query (required), limit.

standing_ordersB

Standing-order definitions visible to the authenticated login.

Inputs: no named parameters.

transactionsB

Account transaction history between two dates (YYYY-MM-DD).

Buys, sells, dividends, fees, deposits and withdrawals. The API returns garbage when a range spans calendar years, so ranges are split per year automatically. Set dollar=True for the foreign-currency ledger.

Inputs: end_date (required), start_date (required), dollar, account.

yieldsC

Account return/value series for a year, monthly-style or daily-style.

Monthly fields include NominalYield, RealYield, DollarYield, Value, and MONTH_DEPOSITE_WITHRWALS. Daily-style fields include Date, NominalYield, TheoreticalYield, Value, and Deposite.

Inputs: year (required), account, monthly.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.2/5.0

    Scored across 11 tools

    Disambiguation5/5

    Each tool targets a distinct aspect: orders vs history, securities search vs resolution, accounts vs portfolio vs transactions. No two tools overlap in purpose.

    Naming Consistency3/5

    Names mix plural nouns (orders, yields, accounts, portfolio) with verb_noun (search_securities, resolve_securities) and noun_noun patterns (price_history, order_history, standing_orders, latest_news). No single consistent convention.

    Tool Count5/5

    11 tools cover a reasonable scope for a brokerage MCP: orders, history, positions, securities lookup, price data, news, accounts, and transactions. Not too few or too many.

    Completeness3/5

    Covers read operations well but lacks write tools like place_order, modify_standing_order, or cancel. Missing create/update/delete for orders and accounts, limiting full lifecycle coverage.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      A 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.
      9
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Read-only MCP server for Kiwoom Securities, enabling natural language queries of Korean stock market data and account information, including ISA tax status.
      49
      129 npm
      1
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      A read-only MCP server that exposes Interactive Brokers and Moomoo brokerage accounts as tools, enabling natural-language queries across positions, trade history, realized P&L, and sector exposure in one merged view.
      -
    • A
      license
      A
      quality
      B
      maintenance
      A local MCP server that gives AI agents read-only access to real brokerage accounts across 16 brokers and exchanges, while keeping API keys on the user's machine. It enables portfolio overviews, positions, trade history, and performance statistics through natural-language queries.
      6
      1
      MIT