alloc-context 0.2.2__tar.gz → 0.2.3__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 (168) hide show
  1. {alloc_context-0.2.2 → alloc_context-0.2.3}/PKG-INFO +17 -16
  2. {alloc_context-0.2.2 → alloc_context-0.2.3}/README.md +10 -9
  3. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloc_context.egg-info/PKG-INFO +17 -16
  4. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloc_context.egg-info/SOURCES.txt +1 -0
  5. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/__init__.py +1 -1
  6. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/bazaar.py +10 -8
  7. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/server.py +2 -1
  8. {alloc_context-0.2.2 → alloc_context-0.2.3}/pyproject.toml +11 -11
  9. alloc_context-0.2.3/tests/test_check_pypi_release_json.py +55 -0
  10. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_glama_well_known.py +1 -1
  11. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_server_json.py +1 -1
  12. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_workflows.py +16 -2
  13. {alloc_context-0.2.2 → alloc_context-0.2.3}/LICENSE +0 -0
  14. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloc_context.egg-info/dependency_links.txt +0 -0
  15. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloc_context.egg-info/entry_points.txt +0 -0
  16. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloc_context.egg-info/requires.txt +0 -0
  17. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloc_context.egg-info/top_level.txt +0 -0
  18. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/__main__.py +0 -0
  19. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/config.py +0 -0
  20. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/constants.py +0 -0
  21. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/horizon.py +0 -0
  22. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/__init__.py +0 -0
  23. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/alt_quote_registry.py +0 -0
  24. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/alt_quote_store.py +0 -0
  25. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/alt_quotes.py +0 -0
  26. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/asset_registry.py +0 -0
  27. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/cf_benchmarks.py +0 -0
  28. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/cf_history.py +0 -0
  29. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/coinbase_client.py +0 -0
  30. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/coinbase_portfolio.py +0 -0
  31. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/coingecko.py +0 -0
  32. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/coinmarketcap.py +0 -0
  33. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/env_keys.py +0 -0
  34. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/etf_flows.py +0 -0
  35. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/exchange/__init__.py +0 -0
  36. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/exchange/coinbase_adapter.py +0 -0
  37. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/exchange/kraken_adapter.py +0 -0
  38. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/exchange/live.py +0 -0
  39. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/exchange/portfolio.py +0 -0
  40. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/exchange/registry.py +0 -0
  41. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/exchange/types.py +0 -0
  42. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/exchange_http.py +0 -0
  43. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/fear_greed.py +0 -0
  44. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/fred.py +0 -0
  45. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/http_errors.py +0 -0
  46. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/kalshi.py +0 -0
  47. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/kalshi_api.py +0 -0
  48. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/kalshi_client.py +0 -0
  49. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/kalshi_files.py +0 -0
  50. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/kalshi_state.py +0 -0
  51. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/kraken_client.py +0 -0
  52. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/kraken_portfolio.py +0 -0
  53. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/macro_calendar.py +0 -0
  54. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/macro_normalize.py +0 -0
  55. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/market_snapshots.py +0 -0
  56. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/outcome.py +0 -0
  57. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/parse_helpers.py +0 -0
  58. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/portfolio_holdings.py +0 -0
  59. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/quote_resolver.py +0 -0
  60. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/ingest/runner.py +0 -0
  61. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/__init__.py +0 -0
  62. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/assets.py +0 -0
  63. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/bridge.py +0 -0
  64. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/bridge_portfolio.py +0 -0
  65. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/contracts.py +0 -0
  66. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/glama.py +0 -0
  67. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/handlers.py +0 -0
  68. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/http.py +0 -0
  69. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/instructions.py +0 -0
  70. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/payer.py +0 -0
  71. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/payment_middleware.py +0 -0
  72. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/setup.py +0 -0
  73. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/staleness.py +0 -0
  74. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/tool_catalog.py +0 -0
  75. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/tool_fields.py +0 -0
  76. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/upstream.py +0 -0
  77. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/validation.py +0 -0
  78. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/x402_bazaar_dynamic.py +0 -0
  79. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/x402_config.py +0 -0
  80. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/x402_pricing.py +0 -0
  81. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/mcp/x402_stables.py +0 -0
  82. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/__init__.py +0 -0
  83. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/allocation_analysis.py +0 -0
  84. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/band.py +0 -0
  85. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/breadth.py +0 -0
  86. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/cf_math.py +0 -0
  87. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/cluster.py +0 -0
  88. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/cluster_config.py +0 -0
  89. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/comparison.py +0 -0
  90. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/context.py +0 -0
  91. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/delta.py +0 -0
  92. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/etf.py +0 -0
  93. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/fear_greed.py +0 -0
  94. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/macro.py +0 -0
  95. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/portfolio.py +0 -0
  96. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/portfolio_payload.py +0 -0
  97. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/rebalance.py +0 -0
  98. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/regime.py +0 -0
  99. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/sentiment.py +0 -0
  100. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/snapshots.py +0 -0
  101. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/rollup/tape.py +0 -0
  102. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/status_report.py +0 -0
  103. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/store/__init__.py +0 -0
  104. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/store/db.py +0 -0
  105. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/store/jsonutil.py +0 -0
  106. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/store/meta.py +0 -0
  107. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/store/retention.py +0 -0
  108. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/store/status.py +0 -0
  109. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/timeutil.py +0 -0
  110. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/user_config.py +0 -0
  111. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/x402_production_check.py +0 -0
  112. {alloc_context-0.2.2 → alloc_context-0.2.3}/alloccontext/x402_smoke_redact.py +0 -0
  113. {alloc_context-0.2.2 → alloc_context-0.2.3}/setup.cfg +0 -0
  114. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_backup_sqlite.py +0 -0
  115. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_bridge.py +0 -0
  116. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_bridge_portfolio.py +0 -0
  117. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_bump_version.py +0 -0
  118. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_coinbase_portfolio.py +0 -0
  119. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_config_cli.py +0 -0
  120. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_context_bundle_schema.py +0 -0
  121. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_context_snapshots.py +0 -0
  122. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_db_schema.py +0 -0
  123. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_deploy.py +0 -0
  124. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_dev_stack.py +0 -0
  125. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_etf.py +0 -0
  126. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_exchanges_config.py +0 -0
  127. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_fear_greed.py +0 -0
  128. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_fred.py +0 -0
  129. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_holdings_scoped_delta_regime.py +0 -0
  130. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_holdings_scoped_market.py +0 -0
  131. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_horizon.py +0 -0
  132. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_ingest_outcome.py +0 -0
  133. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_ingest_runner.py +0 -0
  134. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_ingest_store_integration.py +0 -0
  135. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_kalshi_api.py +0 -0
  136. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_kraken_portfolio.py +0 -0
  137. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_live_ingest_handlers.py +0 -0
  138. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_macro.py +0 -0
  139. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_market_breadth.py +0 -0
  140. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_assets_regime.py +0 -0
  141. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_bazaar.py +0 -0
  142. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_contracts.py +0 -0
  143. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_data_staleness.py +0 -0
  144. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_handlers.py +0 -0
  145. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_health.py +0 -0
  146. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_http_lifecycle.py +0 -0
  147. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_live_portfolio.py +0 -0
  148. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_server.py +0 -0
  149. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_validation.py +0 -0
  150. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_x402.py +0 -0
  151. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_x402_http.py +0 -0
  152. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_x402_pricing.py +0 -0
  153. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_mcp_x402_stables.py +0 -0
  154. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_payer.py +0 -0
  155. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_portfolio_holdings.py +0 -0
  156. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_quote_resolver.py +0 -0
  157. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_rebalance.py +0 -0
  158. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_rollup.py +0 -0
  159. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_script_runtime.py +0 -0
  160. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_security_hardening.py +0 -0
  161. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_setup.py +0 -0
  162. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_snapshots_and_delta.py +0 -0
  163. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_status_report.py +0 -0
  164. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_tool_catalog.py +0 -0
  165. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_user_config.py +0 -0
  166. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_x402_bazaar_dynamic.py +0 -0
  167. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_x402_production_check.py +0 -0
  168. {alloc_context-0.2.2 → alloc_context-0.2.3}/tests/test_x402_smoke_redact.py +0 -0
@@ -1,15 +1,15 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alloc-context
3
- Version: 0.2.2
4
- Summary: Portfolio-aware crypto context for agents — holdings, market, optional allocation analysis
3
+ Version: 0.2.3
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
7
- Project-URL: Documentation, https://github.com/negillett/alloc-context/blob/main/docs/agent-integration.md
8
- Project-URL: Repository, https://github.com/negillett/alloc-context
9
- Project-URL: Issues, https://github.com/negillett/alloc-context/issues
10
- Project-URL: Changelog, https://github.com/negillett/alloc-context/releases
7
+ Project-URL: Documentation, https://github.com/AllocContext/alloc-context/blob/main/docs/agent-integration.md
8
+ Project-URL: Repository, https://github.com/AllocContext/alloc-context
9
+ Project-URL: Issues, https://github.com/AllocContext/alloc-context/issues
10
+ Project-URL: Changelog, https://github.com/AllocContext/alloc-context/releases
11
11
  Project-URL: MCP Server, https://mcp.alloc-context.com/mcp
12
- Keywords: mcp,x402,bitcoin,ethereum,crypto,cryptocurrency,portfolio,allocation,holdings,rebalance,coinbase,kraken,agents
12
+ Keywords: mcp,x402,holdings,portfolio,crypto,cryptocurrency,bitcoin,ethereum,agents,allocation,rebalance,coinbase,kraken
13
13
  Classifier: Development Status :: 4 - Beta
14
14
  Classifier: Intended Audience :: Developers
15
15
  Classifier: Programming Language :: Python :: 3
@@ -44,14 +44,15 @@ Dynamic: license-file
44
44
 
45
45
  # AllocContext
46
46
 
47
- [![smithery badge](https://smithery.ai/badge/@negillett/alloc-context)](https://smithery.ai/server/@negillett/alloc-context)
48
- [![Glama MCP server](https://glama.ai/mcp/servers/negillett/alloc-context/badges/score.svg)](https://glama.ai/mcp/servers/negillett/alloc-context)
47
+ [![smithery badge](https://smithery.ai/badge/@AllocContext/alloc-context)](https://smithery.ai/server/@AllocContext/alloc-context)
48
+ [![Glama MCP server](https://glama.ai/mcp/servers/AllocContext/alloc-context/badges/score.svg)](https://glama.ai/mcp/servers/AllocContext/alloc-context)
49
49
 
50
- mcp-name: io.github.negillett/alloc-context
50
+ mcp-name: io.github.AllocContext/alloc-context
51
51
 
52
- **Portfolio-aware crypto context for agents** — discover holdings, market,
53
- sentiment, macro, and regime; optional allocation analysis. Deterministic
54
- JSON over MCP with x402 pay-per-call on Base.
52
+ **Portfolio-aware crypto context for whatever you hold** — discover your
53
+ holdings, holdings-scoped market data, sentiment, macro, and regime; optional
54
+ allocation analysis when you supply targets. Deterministic JSON over MCP with
55
+ x402 pay-per-call on Base.
55
56
 
56
57
  > **Privacy:** nothing stored · one-time read-only · pass-through only — your
57
58
  > keys and portfolio never persist on our servers. See [USE.md](docs/USE.md).
@@ -113,7 +114,7 @@ Not financial advice.
113
114
  | **Discovery** | [llms.txt](https://mcp.alloc-context.com/llms.txt), [x402 manifest](https://mcp.alloc-context.com/.well-known/x402.json) |
114
115
  | **Pricing** | **$0.02** cached context/math · **$0.05** live ingest or portfolio |
115
116
  | **Payment** | x402 on Base — USDC or EURC |
116
- | **Market scope** | Holdings-scoped (BTC/ETH OHLC; alt quote snapshots); bridge auto-scopes from portfolio |
117
+ | **Market scope** | Tailored to your holdings (band OHLC for BTC/ETH; alt quote snapshots); bridge auto-scopes from portfolio |
117
118
 
118
119
  Agents and wallets connect directly to the hosted endpoint — see
119
120
  [agent-integration.md](docs/agent-integration.md). The Cursor bridge above
@@ -130,7 +131,7 @@ combines local portfolio reads with this upstream for market context.
130
131
  | `get_rebalance_plan` | USD rebalance moves from allocation, target, and NAV |
131
132
  | `check_allocation_band` | Drift vs target and whether allocation is outside the band |
132
133
  | `check_allocation_bands` | Batch band checks for multiple target scenarios |
133
- | `get_portfolio_state` | Live NAV and holdings from Kraken or Coinbase |
134
+ | `get_portfolio_state` | Live NAV and holdings (e.g. Coinbase, Kraken read-only keys) |
134
135
 
135
136
  Market context is **holdings-scoped**: band assets (BTC/ETH) use OHLC bars; alt
136
137
  holdings (e.g. HYPE) use quote snapshots when cached. The bridge auto-scopes
@@ -146,7 +147,7 @@ See [self-hosting.md](docs/self-hosting.md) (`self_host: true` in user config)
146
147
  or [local-dev.md](docs/local-dev.md) for the dev stack.
147
148
 
148
149
  ```bash
149
- git clone git@github.com:negillett/alloc-context.git
150
+ git clone git@github.com:AllocContext/alloc-context.git
150
151
  cd alloc-context
151
152
  python3.11 -m venv .venv && source .venv/bin/activate
152
153
  pip install -e ".[dev]"
@@ -1,13 +1,14 @@
1
1
  # AllocContext
2
2
 
3
- [![smithery badge](https://smithery.ai/badge/@negillett/alloc-context)](https://smithery.ai/server/@negillett/alloc-context)
4
- [![Glama MCP server](https://glama.ai/mcp/servers/negillett/alloc-context/badges/score.svg)](https://glama.ai/mcp/servers/negillett/alloc-context)
3
+ [![smithery badge](https://smithery.ai/badge/@AllocContext/alloc-context)](https://smithery.ai/server/@AllocContext/alloc-context)
4
+ [![Glama MCP server](https://glama.ai/mcp/servers/AllocContext/alloc-context/badges/score.svg)](https://glama.ai/mcp/servers/AllocContext/alloc-context)
5
5
 
6
- mcp-name: io.github.negillett/alloc-context
6
+ mcp-name: io.github.AllocContext/alloc-context
7
7
 
8
- **Portfolio-aware crypto context for agents** — discover holdings, market,
9
- sentiment, macro, and regime; optional allocation analysis. Deterministic
10
- JSON over MCP with x402 pay-per-call on Base.
8
+ **Portfolio-aware crypto context for whatever you hold** — discover your
9
+ holdings, holdings-scoped market data, sentiment, macro, and regime; optional
10
+ allocation analysis when you supply targets. Deterministic JSON over MCP with
11
+ x402 pay-per-call on Base.
11
12
 
12
13
  > **Privacy:** nothing stored · one-time read-only · pass-through only — your
13
14
  > keys and portfolio never persist on our servers. See [USE.md](docs/USE.md).
@@ -69,7 +70,7 @@ Not financial advice.
69
70
  | **Discovery** | [llms.txt](https://mcp.alloc-context.com/llms.txt), [x402 manifest](https://mcp.alloc-context.com/.well-known/x402.json) |
70
71
  | **Pricing** | **$0.02** cached context/math · **$0.05** live ingest or portfolio |
71
72
  | **Payment** | x402 on Base — USDC or EURC |
72
- | **Market scope** | Holdings-scoped (BTC/ETH OHLC; alt quote snapshots); bridge auto-scopes from portfolio |
73
+ | **Market scope** | Tailored to your holdings (band OHLC for BTC/ETH; alt quote snapshots); bridge auto-scopes from portfolio |
73
74
 
74
75
  Agents and wallets connect directly to the hosted endpoint — see
75
76
  [agent-integration.md](docs/agent-integration.md). The Cursor bridge above
@@ -86,7 +87,7 @@ combines local portfolio reads with this upstream for market context.
86
87
  | `get_rebalance_plan` | USD rebalance moves from allocation, target, and NAV |
87
88
  | `check_allocation_band` | Drift vs target and whether allocation is outside the band |
88
89
  | `check_allocation_bands` | Batch band checks for multiple target scenarios |
89
- | `get_portfolio_state` | Live NAV and holdings from Kraken or Coinbase |
90
+ | `get_portfolio_state` | Live NAV and holdings (e.g. Coinbase, Kraken read-only keys) |
90
91
 
91
92
  Market context is **holdings-scoped**: band assets (BTC/ETH) use OHLC bars; alt
92
93
  holdings (e.g. HYPE) use quote snapshots when cached. The bridge auto-scopes
@@ -102,7 +103,7 @@ See [self-hosting.md](docs/self-hosting.md) (`self_host: true` in user config)
102
103
  or [local-dev.md](docs/local-dev.md) for the dev stack.
103
104
 
104
105
  ```bash
105
- git clone git@github.com:negillett/alloc-context.git
106
+ git clone git@github.com:AllocContext/alloc-context.git
106
107
  cd alloc-context
107
108
  python3.11 -m venv .venv && source .venv/bin/activate
108
109
  pip install -e ".[dev]"
@@ -1,15 +1,15 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alloc-context
3
- Version: 0.2.2
4
- Summary: Portfolio-aware crypto context for agents — holdings, market, optional allocation analysis
3
+ Version: 0.2.3
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
7
- Project-URL: Documentation, https://github.com/negillett/alloc-context/blob/main/docs/agent-integration.md
8
- Project-URL: Repository, https://github.com/negillett/alloc-context
9
- Project-URL: Issues, https://github.com/negillett/alloc-context/issues
10
- Project-URL: Changelog, https://github.com/negillett/alloc-context/releases
7
+ Project-URL: Documentation, https://github.com/AllocContext/alloc-context/blob/main/docs/agent-integration.md
8
+ Project-URL: Repository, https://github.com/AllocContext/alloc-context
9
+ Project-URL: Issues, https://github.com/AllocContext/alloc-context/issues
10
+ Project-URL: Changelog, https://github.com/AllocContext/alloc-context/releases
11
11
  Project-URL: MCP Server, https://mcp.alloc-context.com/mcp
12
- Keywords: mcp,x402,bitcoin,ethereum,crypto,cryptocurrency,portfolio,allocation,holdings,rebalance,coinbase,kraken,agents
12
+ Keywords: mcp,x402,holdings,portfolio,crypto,cryptocurrency,bitcoin,ethereum,agents,allocation,rebalance,coinbase,kraken
13
13
  Classifier: Development Status :: 4 - Beta
14
14
  Classifier: Intended Audience :: Developers
15
15
  Classifier: Programming Language :: Python :: 3
@@ -44,14 +44,15 @@ Dynamic: license-file
44
44
 
45
45
  # AllocContext
46
46
 
47
- [![smithery badge](https://smithery.ai/badge/@negillett/alloc-context)](https://smithery.ai/server/@negillett/alloc-context)
48
- [![Glama MCP server](https://glama.ai/mcp/servers/negillett/alloc-context/badges/score.svg)](https://glama.ai/mcp/servers/negillett/alloc-context)
47
+ [![smithery badge](https://smithery.ai/badge/@AllocContext/alloc-context)](https://smithery.ai/server/@AllocContext/alloc-context)
48
+ [![Glama MCP server](https://glama.ai/mcp/servers/AllocContext/alloc-context/badges/score.svg)](https://glama.ai/mcp/servers/AllocContext/alloc-context)
49
49
 
50
- mcp-name: io.github.negillett/alloc-context
50
+ mcp-name: io.github.AllocContext/alloc-context
51
51
 
52
- **Portfolio-aware crypto context for agents** — discover holdings, market,
53
- sentiment, macro, and regime; optional allocation analysis. Deterministic
54
- JSON over MCP with x402 pay-per-call on Base.
52
+ **Portfolio-aware crypto context for whatever you hold** — discover your
53
+ holdings, holdings-scoped market data, sentiment, macro, and regime; optional
54
+ allocation analysis when you supply targets. Deterministic JSON over MCP with
55
+ x402 pay-per-call on Base.
55
56
 
56
57
  > **Privacy:** nothing stored · one-time read-only · pass-through only — your
57
58
  > keys and portfolio never persist on our servers. See [USE.md](docs/USE.md).
@@ -113,7 +114,7 @@ Not financial advice.
113
114
  | **Discovery** | [llms.txt](https://mcp.alloc-context.com/llms.txt), [x402 manifest](https://mcp.alloc-context.com/.well-known/x402.json) |
114
115
  | **Pricing** | **$0.02** cached context/math · **$0.05** live ingest or portfolio |
115
116
  | **Payment** | x402 on Base — USDC or EURC |
116
- | **Market scope** | Holdings-scoped (BTC/ETH OHLC; alt quote snapshots); bridge auto-scopes from portfolio |
117
+ | **Market scope** | Tailored to your holdings (band OHLC for BTC/ETH; alt quote snapshots); bridge auto-scopes from portfolio |
117
118
 
118
119
  Agents and wallets connect directly to the hosted endpoint — see
119
120
  [agent-integration.md](docs/agent-integration.md). The Cursor bridge above
@@ -130,7 +131,7 @@ combines local portfolio reads with this upstream for market context.
130
131
  | `get_rebalance_plan` | USD rebalance moves from allocation, target, and NAV |
131
132
  | `check_allocation_band` | Drift vs target and whether allocation is outside the band |
132
133
  | `check_allocation_bands` | Batch band checks for multiple target scenarios |
133
- | `get_portfolio_state` | Live NAV and holdings from Kraken or Coinbase |
134
+ | `get_portfolio_state` | Live NAV and holdings (e.g. Coinbase, Kraken read-only keys) |
134
135
 
135
136
  Market context is **holdings-scoped**: band assets (BTC/ETH) use OHLC bars; alt
136
137
  holdings (e.g. HYPE) use quote snapshots when cached. The bridge auto-scopes
@@ -146,7 +147,7 @@ See [self-hosting.md](docs/self-hosting.md) (`self_host: true` in user config)
146
147
  or [local-dev.md](docs/local-dev.md) for the dev stack.
147
148
 
148
149
  ```bash
149
- git clone git@github.com:negillett/alloc-context.git
150
+ git clone git@github.com:AllocContext/alloc-context.git
150
151
  cd alloc-context
151
152
  python3.11 -m venv .venv && source .venv/bin/activate
152
153
  pip install -e ".[dev]"
@@ -109,6 +109,7 @@ tests/test_backup_sqlite.py
109
109
  tests/test_bridge.py
110
110
  tests/test_bridge_portfolio.py
111
111
  tests/test_bump_version.py
112
+ tests/test_check_pypi_release_json.py
112
113
  tests/test_coinbase_portfolio.py
113
114
  tests/test_config_cli.py
114
115
  tests/test_context_bundle_schema.py
@@ -1,3 +1,3 @@
1
1
  """AllocContext — portfolio-aware crypto context for agents (MCP)."""
2
2
 
3
- __version__ = "0.2.2"
3
+ __version__ = "0.2.3"
@@ -107,10 +107,11 @@ DISCOVERY_KEYWORD_MARKERS = (
107
107
  )
108
108
 
109
109
  LISTING_DESCRIPTION = (
110
- "Portfolio-aware crypto context for AI agents: discover holdings, market, "
111
- "sentiment, macro, and regime; optional allocation analysis and rebalance "
112
- "math. Fused backdrop (Fear & Greed, Kalshi, ETF flows), optional live "
113
- "Kraken/Coinbase reads. Structured JSON only no LLM. "
110
+ "Portfolio-aware crypto context for AI agents: discover holdings and "
111
+ "holdings-scoped market, sentiment, macro, and regime; optional allocation "
112
+ "analysis and rebalance math. Fused backdrop (Fear & Greed, Kalshi, ETF "
113
+ "flows), optional live portfolio reads (e.g. Coinbase, Kraken). Structured "
114
+ "JSON only — no LLM. "
114
115
  f"{PRIVACY_COMPACT_COPY} "
115
116
  "Source-available (Elastic License 2.0); self-host friendly; official hosted "
116
117
  f"MCP at {OFFICIAL_HOSTED_MCP_URL} — see {USE_DOCS_PATH}."
@@ -237,9 +238,10 @@ _MCP_TOOLS: tuple[dict[str, Any], ...] = (
237
238
  "tool_name": "get_portfolio_state",
238
239
  "description": (
239
240
  "Fetch live read-only portfolio NAV, holdings[], and band weights from "
240
- "Kraken or Coinbase credentials passed in this call (never stored). "
241
- "Requires exchange, api_key, and api_secret. Returns available=false "
242
- "with reason on invalid credentials — no side effects."
241
+ "a supported spot exchange (e.g. Kraken, Coinbase) using credentials "
242
+ "passed in this call (never stored). Requires exchange, api_key, and "
243
+ "api_secret. Returns available=false with reason on invalid "
244
+ "credentials — no side effects."
243
245
  ),
244
246
  "input_schema": {
245
247
  "type": "object",
@@ -570,7 +572,7 @@ model context protocol, context bundle
570
572
  ## Examples
571
573
 
572
574
  Redacted tool JSON samples (evaluate before paying):
573
- https://github.com/negillett/alloc-context/blob/main/docs/examples.md
575
+ https://github.com/AllocContext/alloc-context/blob/main/docs/examples.md
574
576
  """
575
577
 
576
578
 
@@ -209,7 +209,8 @@ def create_server(
209
209
  annotations=_tool_hints("get_portfolio_state"),
210
210
  description=(
211
211
  "Fetch live read-only portfolio NAV, holdings[], and band weights from "
212
- "Kraken or Coinbase credentials passed in this call (never stored). "
212
+ "a supported spot exchange (e.g. Kraken, Coinbase) using credentials "
213
+ "passed in this call (never stored). "
213
214
  "Requires exchange, api_key, and api_secret. Use get_context_bundle "
214
215
  "for cached market and history without exchange keys. Optional "
215
216
  "target_pct attaches allocation_analysis; optional band sets drift "
@@ -1,24 +1,24 @@
1
1
  [project]
2
2
  name = "alloc-context"
3
- version = "0.2.2"
4
- description = "Portfolio-aware crypto context for agents — holdings, market, optional allocation analysis"
3
+ version = "0.2.3"
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" }
7
7
  requires-python = ">=3.11"
8
8
  keywords = [
9
9
  "mcp",
10
10
  "x402",
11
- "bitcoin",
12
- "ethereum",
11
+ "holdings",
12
+ "portfolio",
13
13
  "crypto",
14
14
  "cryptocurrency",
15
- "portfolio",
15
+ "bitcoin",
16
+ "ethereum",
17
+ "agents",
16
18
  "allocation",
17
- "holdings",
18
19
  "rebalance",
19
20
  "coinbase",
20
21
  "kraken",
21
- "agents",
22
22
  ]
23
23
  classifiers = [
24
24
  "Development Status :: 4 - Beta",
@@ -38,10 +38,10 @@ dependencies = [
38
38
 
39
39
  [project.urls]
40
40
  Homepage = "https://mcp.alloc-context.com/llms.txt"
41
- Documentation = "https://github.com/negillett/alloc-context/blob/main/docs/agent-integration.md"
42
- Repository = "https://github.com/negillett/alloc-context"
43
- Issues = "https://github.com/negillett/alloc-context/issues"
44
- Changelog = "https://github.com/negillett/alloc-context/releases"
41
+ Documentation = "https://github.com/AllocContext/alloc-context/blob/main/docs/agent-integration.md"
42
+ Repository = "https://github.com/AllocContext/alloc-context"
43
+ Issues = "https://github.com/AllocContext/alloc-context/issues"
44
+ Changelog = "https://github.com/AllocContext/alloc-context/releases"
45
45
  "MCP Server" = "https://mcp.alloc-context.com/mcp"
46
46
 
47
47
  [project.optional-dependencies]
@@ -0,0 +1,55 @@
1
+ from __future__ import annotations
2
+
3
+ from scripts.check_pypi_release_json import pypi_release_is_ready
4
+
5
+
6
+ def _payload(*, version: str = "0.2.2", urls: list[dict] | None = None) -> dict:
7
+ if urls is None:
8
+ urls = [
9
+ {"packagetype": "bdist_wheel", "filename": "alloc_context-0.2.2-py3-none-any.whl"},
10
+ {"packagetype": "sdist", "filename": "alloc_context-0.2.2.tar.gz"},
11
+ ]
12
+ return {
13
+ "info": {"name": "alloc-context", "version": version},
14
+ "urls": urls,
15
+ }
16
+
17
+
18
+ def test_pypi_release_is_ready_accepts_wheel_and_sdist() -> None:
19
+ ready, reason = pypi_release_is_ready(
20
+ _payload(),
21
+ package="alloc-context",
22
+ version="0.2.2",
23
+ )
24
+ assert ready is True
25
+ assert reason == "ok"
26
+
27
+
28
+ def test_pypi_release_is_ready_rejects_version_mismatch() -> None:
29
+ ready, reason = pypi_release_is_ready(
30
+ _payload(version="0.2.1"),
31
+ package="alloc-context",
32
+ version="0.2.2",
33
+ )
34
+ assert ready is False
35
+ assert "expected '0.2.2'" in reason
36
+
37
+
38
+ def test_pypi_release_is_ready_rejects_empty_urls() -> None:
39
+ ready, reason = pypi_release_is_ready(
40
+ _payload(urls=[]),
41
+ package="alloc-context",
42
+ version="0.2.2",
43
+ )
44
+ assert ready is False
45
+ assert "empty" in reason
46
+
47
+
48
+ def test_pypi_release_is_ready_rejects_missing_wheel() -> None:
49
+ ready, reason = pypi_release_is_ready(
50
+ _payload(urls=[{"packagetype": "sdist"}]),
51
+ package="alloc-context",
52
+ version="0.2.2",
53
+ )
54
+ assert ready is False
55
+ assert "bdist_wheel" in reason
@@ -47,5 +47,5 @@ def test_glama_json_is_valid_server_schema() -> None:
47
47
  path = Path(__file__).resolve().parents[1] / "glama.json"
48
48
  data = json.loads(path.read_text(encoding="utf-8"))
49
49
  assert data["$schema"] == "https://glama.ai/mcp/schemas/server.json"
50
- assert data["maintainers"] == ["negillett"]
50
+ assert data["maintainers"] == ["AllocContext"]
51
51
  assert data["connector_emails"][0] == "nathangillett@icloud.com"
@@ -32,4 +32,4 @@ def test_server_json_version_matches_pyproject():
32
32
 
33
33
  def test_readme_includes_mcp_registry_name_for_pypi():
34
34
  readme = (REPO_ROOT / "README.md").read_text(encoding="utf-8")
35
- assert "mcp-name: io.github.negillett/alloc-context" in readme
35
+ assert "mcp-name: io.github.AllocContext/alloc-context" in readme
@@ -151,6 +151,20 @@ def test_publish_mcp_registry_workflow_dispatch():
151
151
 
152
152
 
153
153
  def test_publish_mcp_registry_waits_for_pypi():
154
- script = (REPO_ROOT / "scripts/publish-mcp-registry.sh").read_text()
155
- assert "wait-for-pypi.sh" in script
156
154
  assert (REPO_ROOT / "scripts/wait-for-pypi.sh").exists()
155
+ assert (REPO_ROOT / "scripts/check_pypi_release_json.py").exists()
156
+
157
+
158
+ def test_publish_mcp_registry_workflow_waits_before_publish():
159
+ workflow = _load_workflow("publish-mcp-registry.yml")
160
+ runs = [step.get("run", "") for step in _job_steps(workflow, "publish")]
161
+ assert any("wait-for-pypi.sh" in run for run in runs)
162
+ assert any("publish-mcp-registry.sh" in run for run in runs)
163
+
164
+
165
+ def test_release_publish_mcp_registry_waits_with_version_env():
166
+ workflow = _load_workflow("release.yml")
167
+ job = workflow["jobs"]["publish-mcp-registry"]
168
+ assert job["env"]["PYPI_VERSION"] == "${{ needs.check.outputs.version }}"
169
+ runs = [step.get("run", "") for step in _job_steps(workflow, "publish-mcp-registry")]
170
+ assert any("wait-for-pypi.sh" in run for run in runs)
File without changes
File without changes