Skip to content

fix: accept expiration="0" wildcard + REST format parity with MCP#241

Merged
userFRM merged 2 commits into
mainfrom
fix/expiration-wildcard-and-rest-parity
Apr 10, 2026
Merged

fix: accept expiration="0" wildcard + REST format parity with MCP#241
userFRM merged 2 commits into
mainfrom
fix/expiration-wildcard-and-rest-parity

Conversation

@userFRM
Copy link
Copy Markdown
Owner

@userFRM userFRM commented Apr 10, 2026

Summary

  • Expiration wildcard "0": Added validate_expiration(), required_expiration(), and optional_expiration() to accept ThetaData's expiration="0" wildcard (all expirations) in bulk option queries. Previously validate_date() rejected anything except 8-digit YYYYMMDD. Updated build-time code generation to route Expiration param type through the new accessors instead of required_date/optional_date.

  • REST format.rs parity with MCP: Brought the REST server's JSON serializers up to parity with the MCP server:

    • quote_ticks_to_json: added midpoint field and conditional contract IDs (expiration, strike, right)
    • trade_quote_ticks_to_json: added ext_condition1-4, condition_flags, price_flags, volume_type, records_back, and conditional contract IDs
    • greeks_ticks_to_json: added conditional contract IDs
    • All tick serializers (eod, ohlc, trade, open_interest, market_value, iv): added conditional contract IDs via shared insert_contract_id_fields helper matching MCP behavior (omit when expiration == 0)

Test plan

  • 5 new expiration validation tests (wildcard zero, YYYYMMDD, invalid formats, optional variants)
  • 4 new REST format regression tests (midpoint, extended fields, greeks, contract ID omission)
  • cargo fmt --all -- --check clean
  • cargo clippy --workspace --all-targets -- -D warnings clean
  • cargo test --workspace all 149 tests pass
  • cargo test --manifest-path tools/server/Cargo.toml all 7 tests pass
  • cargo test --manifest-path tools/mcp/Cargo.toml all 13 tests pass

🤖 Generated with Claude Code

userFRM and others added 2 commits April 10, 2026 12:41
Finding 1: Bulk option queries with expiration="0" (all expirations)
were rejected by validate_date() which requires 8-digit YYYYMMDD.
Add validate_expiration() that accepts "0" as a special wildcard,
and required_expiration()/optional_expiration() accessors used by
generated endpoint dispatch for Expiration-typed params.

Finding 2: REST server format.rs was missing fields that MCP already
serializes. Updated quote_ticks_to_json (added midpoint + contract IDs),
trade_quote_ticks_to_json (added ext_condition1-4, condition_flags,
price_flags, volume_type, records_back + contract IDs), and
greeks_ticks_to_json (added contract IDs). Also added contract ID
support to eod, ohlc, trade, open_interest, market_value, and iv
tick serializers via insert_contract_id_fields helper matching MCP.

Added 5 expiration validation tests and 4 REST format regression tests.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@userFRM userFRM merged commit d2490e0 into main Apr 10, 2026
24 checks passed
@userFRM userFRM deleted the fix/expiration-wildcard-and-rest-parity branch April 10, 2026 12:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant