alloc-context 0.2.4__tar.gz → 0.2.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. {alloc_context-0.2.4 → alloc_context-0.2.5}/PKG-INFO +1 -1
  2. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloc_context.egg-info/PKG-INFO +1 -1
  3. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/__init__.py +1 -1
  4. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/http.py +2 -0
  5. {alloc_context-0.2.4 → alloc_context-0.2.5}/pyproject.toml +1 -1
  6. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_deploy.py +2 -0
  7. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_mcp_x402.py +28 -0
  8. {alloc_context-0.2.4 → alloc_context-0.2.5}/LICENSE +0 -0
  9. {alloc_context-0.2.4 → alloc_context-0.2.5}/README.md +0 -0
  10. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloc_context.egg-info/SOURCES.txt +0 -0
  11. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloc_context.egg-info/dependency_links.txt +0 -0
  12. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloc_context.egg-info/entry_points.txt +0 -0
  13. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloc_context.egg-info/requires.txt +0 -0
  14. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloc_context.egg-info/top_level.txt +0 -0
  15. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/__main__.py +0 -0
  16. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/config.py +0 -0
  17. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/constants.py +0 -0
  18. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/horizon.py +0 -0
  19. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/__init__.py +0 -0
  20. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/alt_quote_registry.py +0 -0
  21. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/alt_quote_store.py +0 -0
  22. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/alt_quotes.py +0 -0
  23. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/asset_registry.py +0 -0
  24. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/cf_benchmarks.py +0 -0
  25. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/cf_history.py +0 -0
  26. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/coinbase_client.py +0 -0
  27. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/coinbase_portfolio.py +0 -0
  28. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/coingecko.py +0 -0
  29. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/coinmarketcap.py +0 -0
  30. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/env_keys.py +0 -0
  31. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/etf_flows.py +0 -0
  32. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/exchange/__init__.py +0 -0
  33. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/exchange/coinbase_adapter.py +0 -0
  34. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/exchange/kraken_adapter.py +0 -0
  35. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/exchange/live.py +0 -0
  36. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/exchange/portfolio.py +0 -0
  37. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/exchange/registry.py +0 -0
  38. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/exchange/types.py +0 -0
  39. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/exchange_http.py +0 -0
  40. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/fear_greed.py +0 -0
  41. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/fred.py +0 -0
  42. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/http_errors.py +0 -0
  43. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/kalshi.py +0 -0
  44. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/kalshi_api.py +0 -0
  45. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/kalshi_client.py +0 -0
  46. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/kalshi_files.py +0 -0
  47. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/kalshi_state.py +0 -0
  48. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/kraken_client.py +0 -0
  49. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/kraken_portfolio.py +0 -0
  50. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/macro_calendar.py +0 -0
  51. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/macro_normalize.py +0 -0
  52. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/market_snapshots.py +0 -0
  53. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/outcome.py +0 -0
  54. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/parse_helpers.py +0 -0
  55. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/portfolio_holdings.py +0 -0
  56. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/quote_resolver.py +0 -0
  57. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/ingest/runner.py +0 -0
  58. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/integrations/__init__.py +0 -0
  59. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/integrations/langchain.py +0 -0
  60. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/__init__.py +0 -0
  61. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/assets.py +0 -0
  62. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/bazaar.py +0 -0
  63. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/bridge.py +0 -0
  64. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/bridge_portfolio.py +0 -0
  65. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/contracts.py +0 -0
  66. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/glama.py +0 -0
  67. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/handlers.py +0 -0
  68. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/instructions.py +0 -0
  69. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/payer.py +0 -0
  70. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/payment_middleware.py +0 -0
  71. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/server.py +0 -0
  72. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/setup.py +0 -0
  73. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/staleness.py +0 -0
  74. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/tool_catalog.py +0 -0
  75. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/tool_fields.py +0 -0
  76. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/upstream.py +0 -0
  77. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/validation.py +0 -0
  78. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/x402_bazaar_dynamic.py +0 -0
  79. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/x402_config.py +0 -0
  80. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/x402_pricing.py +0 -0
  81. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/mcp/x402_stables.py +0 -0
  82. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/rollup/__init__.py +0 -0
  83. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/rollup/allocation_analysis.py +0 -0
  84. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/rollup/band.py +0 -0
  85. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/rollup/breadth.py +0 -0
  86. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/rollup/cf_math.py +0 -0
  87. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/rollup/cluster.py +0 -0
  88. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/rollup/cluster_config.py +0 -0
  89. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/rollup/comparison.py +0 -0
  90. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/rollup/context.py +0 -0
  91. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/rollup/delta.py +0 -0
  92. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/rollup/etf.py +0 -0
  93. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/rollup/fear_greed.py +0 -0
  94. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/rollup/macro.py +0 -0
  95. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/rollup/portfolio.py +0 -0
  96. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/rollup/portfolio_payload.py +0 -0
  97. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/rollup/rebalance.py +0 -0
  98. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/rollup/regime.py +0 -0
  99. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/rollup/sentiment.py +0 -0
  100. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/rollup/snapshots.py +0 -0
  101. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/rollup/tape.py +0 -0
  102. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/status_report.py +0 -0
  103. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/store/__init__.py +0 -0
  104. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/store/db.py +0 -0
  105. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/store/jsonutil.py +0 -0
  106. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/store/meta.py +0 -0
  107. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/store/retention.py +0 -0
  108. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/store/status.py +0 -0
  109. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/timeutil.py +0 -0
  110. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/user_config.py +0 -0
  111. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/x402_production_check.py +0 -0
  112. {alloc_context-0.2.4 → alloc_context-0.2.5}/alloccontext/x402_smoke_redact.py +0 -0
  113. {alloc_context-0.2.4 → alloc_context-0.2.5}/setup.cfg +0 -0
  114. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_backup_sqlite.py +0 -0
  115. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_bridge.py +0 -0
  116. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_bridge_portfolio.py +0 -0
  117. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_bump_version.py +0 -0
  118. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_check_pypi_release_json.py +0 -0
  119. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_coinbase_portfolio.py +0 -0
  120. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_config_cli.py +0 -0
  121. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_context_bundle_schema.py +0 -0
  122. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_context_snapshots.py +0 -0
  123. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_db_schema.py +0 -0
  124. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_dev_stack.py +0 -0
  125. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_etf.py +0 -0
  126. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_exchanges_config.py +0 -0
  127. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_fear_greed.py +0 -0
  128. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_fred.py +0 -0
  129. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_glama_well_known.py +0 -0
  130. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_holdings_scoped_delta_regime.py +0 -0
  131. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_holdings_scoped_market.py +0 -0
  132. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_horizon.py +0 -0
  133. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_ingest_outcome.py +0 -0
  134. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_ingest_runner.py +0 -0
  135. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_ingest_store_integration.py +0 -0
  136. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_kalshi_api.py +0 -0
  137. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_kraken_portfolio.py +0 -0
  138. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_langchain_integration.py +0 -0
  139. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_live_ingest_handlers.py +0 -0
  140. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_macro.py +0 -0
  141. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_market_breadth.py +0 -0
  142. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_mcp_assets_regime.py +0 -0
  143. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_mcp_bazaar.py +0 -0
  144. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_mcp_contracts.py +0 -0
  145. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_mcp_data_staleness.py +0 -0
  146. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_mcp_handlers.py +0 -0
  147. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_mcp_health.py +0 -0
  148. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_mcp_http_lifecycle.py +0 -0
  149. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_mcp_live_portfolio.py +0 -0
  150. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_mcp_server.py +0 -0
  151. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_mcp_validation.py +0 -0
  152. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_mcp_x402_http.py +0 -0
  153. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_mcp_x402_pricing.py +0 -0
  154. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_mcp_x402_stables.py +0 -0
  155. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_payer.py +0 -0
  156. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_portfolio_holdings.py +0 -0
  157. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_quote_resolver.py +0 -0
  158. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_rebalance.py +0 -0
  159. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_rollup.py +0 -0
  160. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_script_runtime.py +0 -0
  161. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_security_hardening.py +0 -0
  162. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_server_json.py +0 -0
  163. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_setup.py +0 -0
  164. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_snapshots_and_delta.py +0 -0
  165. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_status_report.py +0 -0
  166. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_tool_catalog.py +0 -0
  167. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_user_config.py +0 -0
  168. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_workflows.py +0 -0
  169. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_x402_bazaar_dynamic.py +0 -0
  170. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_x402_production_check.py +0 -0
  171. {alloc_context-0.2.4 → alloc_context-0.2.5}/tests/test_x402_smoke_redact.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alloc-context
3
- Version: 0.2.4
3
+ Version: 0.2.5
4
4
  Summary: Portfolio-aware crypto context for agents — holdings-scoped market, sentiment, optional allocation analysis
5
5
  License: Elastic-2.0
6
6
  Project-URL: Homepage, https://mcp.alloc-context.com/llms.txt
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alloc-context
3
- Version: 0.2.4
3
+ Version: 0.2.5
4
4
  Summary: Portfolio-aware crypto context for agents — holdings-scoped market, sentiment, optional allocation analysis
5
5
  License: Elastic-2.0
6
6
  Project-URL: Homepage, https://mcp.alloc-context.com/llms.txt
@@ -1,3 +1,3 @@
1
1
  """AllocContext — portfolio-aware crypto context for agents (MCP)."""
2
2
 
3
- __version__ = "0.2.4"
3
+ __version__ = "0.2.5"
@@ -170,6 +170,8 @@ def _allow_unpaid_http_despite_payment_env() -> bool:
170
170
 
171
171
 
172
172
  def resolve_x402_enabled(*, cli_x402: bool = False) -> bool:
173
+ if _allow_unpaid_http_despite_payment_env():
174
+ return False
173
175
  return cli_x402 or _truthy_env("X402_ENABLED")
174
176
 
175
177
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "alloc-context"
3
- version = "0.2.4"
3
+ version = "0.2.5"
4
4
  description = "Portfolio-aware crypto context for agents — holdings-scoped market, sentiment, optional allocation analysis"
5
5
  readme = "README.md"
6
6
  license = { text = "Elastic-2.0" }
@@ -26,6 +26,7 @@ def test_core_deploy_installs_ingest_and_mcp_http() -> None:
26
26
  install_block = text.split("for unit in")[1].split("done")[0]
27
27
  assert "alloc-context-ingest.service" in install_block
28
28
  assert "alloc-context-mcp-http.service" in install_block
29
+ assert "alloc-context-mcp-internal.service" in install_block
29
30
  assert "alloc-context-backup.timer" in install_block
30
31
  assert "daily-brief" not in install_block
31
32
  assert "alerts.timer" not in install_block
@@ -57,6 +58,7 @@ def test_mcp_internal_systemd_unit() -> None:
57
58
  assert "--port 8001" in text
58
59
  assert "--x402" not in text
59
60
  assert "ALLOC_CONTEXT_ALLOW_UNPAID_HTTP=1" in text
61
+ assert "UnsetEnvironment=X402_ENABLED" in text
60
62
 
61
63
 
62
64
  def test_remote_install_substitutes_environment_file() -> None:
@@ -197,6 +197,7 @@ def test_x402_enabled_from_env_without_cli_flag(
197
197
  ) -> None:
198
198
  from alloccontext.mcp.http import resolve_x402_enabled
199
199
 
200
+ monkeypatch.delenv("ALLOC_CONTEXT_ALLOW_UNPAID_HTTP", raising=False)
200
201
  monkeypatch.setenv("X402_ENABLED", "true")
201
202
  assert resolve_x402_enabled(cli_x402=False) is True
202
203
  assert resolve_x402_enabled(cli_x402=True) is True
@@ -204,6 +205,33 @@ def test_x402_enabled_from_env_without_cli_flag(
204
205
  assert resolve_x402_enabled(cli_x402=False) is False
205
206
 
206
207
 
208
+ def test_resolve_x402_disabled_when_allow_unpaid_despite_x402_env(
209
+ monkeypatch: pytest.MonkeyPatch,
210
+ ) -> None:
211
+ from alloccontext.mcp.http import build_http_app, resolve_x402_enabled
212
+
213
+ monkeypatch.setenv("X402_ENABLED", "true")
214
+ monkeypatch.setenv("X402_PAY_TO", "0xSeller")
215
+ monkeypatch.setenv("X402_FACILITATOR_URL", CDP_FACILITATOR_URL)
216
+ monkeypatch.setenv("ALLOC_CONTEXT_ALLOW_UNPAID_HTTP", "1")
217
+
218
+ assert resolve_x402_enabled(cli_x402=False) is False
219
+
220
+ app = build_http_app(x402=False, config_path="config/config.example.yaml")
221
+ from starlette.testclient import TestClient
222
+
223
+ with TestClient(app) as client:
224
+ response = client.post(
225
+ "/mcp",
226
+ json={"jsonrpc": "2.0", "method": "initialize", "params": {}, "id": 1},
227
+ headers={
228
+ "Accept": "application/json",
229
+ "Content-Type": "application/json",
230
+ },
231
+ )
232
+ assert response.status_code != 402
233
+
234
+
207
235
  def test_cdp_facilitator_client_requires_keys(monkeypatch: pytest.MonkeyPatch) -> None:
208
236
  pytest.importorskip("x402")
209
237
  pytest.importorskip("cdp")
File without changes
File without changes
File without changes