Skip to content

qtsurfer-mcp: dead default API domain (api.qtsurfer.com) + backtests/sweeps never complete #3

Description

@leonardojgv

REPORT: QTSurfer MCP Setup and Integration
Date: 2026-08-12

========================================
WHAT WORKED

  1. Installation

    • Native qtsurfer-mcp binary installed via install.sh
  2. Registration in Claude Code

    • claude mcp add with "user" scope
    • "qtsurfer" server available across all projects
  3. Broken domain diagnosis

    • api.qtsurfer.com was tried first because it's the binary's built-in
      default (--url default) and the domain documented in the mcp-java
      README's example Claude Code config
    • It turned out to be a dead Vercel deployment
      (header x-vercel-error: DEPLOYMENT_NOT_FOUND)
    • Found the correct, live domain: api.qtsurfer.net (found empirically
      by trying the .net TLD as a hypothesis after .com failed — this
      domain is NOT mentioned anywhere in the mcp-java or strategy-skills
      documentation; worth flagging to QTSurfer as a doc gap)
    • Reconfigured the server with --url pointing to api.qtsurfer.net
  4. Authentication

    • The API key worked correctly against the .net domain
    • Final status: Connected
  5. Data exploration

    • list_exchanges -> Binance
    • list_instruments -> 1,872 pairs available
      BTC/USDT with data from 2026-03-30 to 2026-08-12
  6. Strategy authoring

    • Cloned the QTSurfer/strategy-skills repo (git clone; npx skills add
      was blocked by the permission classifier)
    • Built EmaCrossoverStrategy: 9/21 EMA crossover using CrossDetector
  7. Bug found and fixed

    • The first sweep failed because a @StrategyProperty without an
      explicit JavaBean setter cannot be swept
    • Added setFastPeriod / setSlowPeriod / setWindowSeconds
    • This is not documented in the official skill

========================================
WHAT FAILED

  1. Backtest 6FEFDG2wYsejzk4hiOc10O
    BTC/USDT, 3 days (2026-08-10 -> 2026-08-12)
    Result: got stuck in EXECUTING indefinitely (10+ min with no state
    change). There is no cancel operation for individual backtests
    (only for sweeps). Abandoned.

  2. Sweep swp_76ef979908fd2f3b (66 runs)
    Error: NoSuchMethodException: setSlowPeriod
    Cause: missing JavaBean setters on the strategy

  3. Sweep swp_024500d618deac2a (window 2026-08-11 -> 2026-08-12, 1 day)
    Error: "Tiered data not ready for BTC/USDT: 24 missing hours"
    Cause: window sitting right at the most recent edge of available data

  4. Sweep swp_41006933b729575d (window 2026-08-04 -> 2026-08-05, 1 day)
    Same tiering error, despite being far from the recent edge.
    Conclusion: a 1-day window appears insufficient for data
    warm-up/tiering, regardless of how recent it is.

  5. Sweep swp_1d2af950d3c9055b (66 runs, 4-day window 07-01 -> 07-05)
    Passed data validation and went RUNNING, but did not advance past
    0/66 runs for several minutes. Cancelled manually.

  6. Sweep swp_eb838ace9300f186 (6 runs, same window 07-01 -> 07-05)
    Error: "prepared dataset must contain at least one ticker"
    Likely cause: dataset cache left in a bad state by the previous
    cancelled sweep on the same window/instrument.

  7. Sweep swp_0e2f88ff0d1ae06f (6 runs, new window 06-01 -> 06-05)
    Passed data preparation (RUNNING) but also never advanced past 0/6.
    Cancelled by the user.

========================================
CONCLUSION

MCP server connectivity and configuration ended up fully functional:
connection, authentication, and the instrument catalogue all worked
without issues.

The recurring problem was on the QTSurfer execution engine/backend
side: no run ever reached completion, neither the individual backtest
nor any sweep, regardless of date window or grid size. This suggests
the engine's compile-and-execute pipeline was slow or degraded on the
day of testing.

Recommendation: report this to the QTSurfer team, or retry later.

========================================
NOT YET TESTED

Of the 11 tools exposed by the qtsurfer MCP server, 9 were exercised
(list_exchanges, list_instruments, submit_backtest, get_job_status,
submit_sweep, get_sweep_status, cancel_sweep, list_jobs, version).
Two remain untested because they require a completed run:

  • get_equity_curve: needs a jobId from a COMPLETED backtest
  • get_sweep_sensitivity: needs a sweep with leaderboard rows

version was called separately and confirmed:
qtsurfer-mcp 0.10.0
API: https://api.qtsurfer.net/v1

========================================
RELEVANT FILES

Fixed strategy (with setters): EmaCrossoverStrategy.java (kept in the
session scratchpad)

MCP configuration (claude mcp get qtsurfer):
Args: --url https://api.qtsurfer.net/v1
Scope: user

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions