spice-mcp 0.1.2__tar.gz → 0.1.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.
Potentially problematic release.
This version of spice-mcp might be problematic. Click here for more details.
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/.gitignore +3 -0
- spice_mcp-0.1.3/.hypothesis/constants/03230d036f66298e +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/06eb11a7027a88cd +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/0f801575b114e021 +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/1eeb4d051122e156 +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/366c70be49a7442b +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/4753a088eccf5421 +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/4a324fb33357cad2 +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/4cc858fdf36f013d +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/5405706eff340311 +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/6cfc775ad89a5b6a +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/71bc6f8cf28bcc19 +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/851c74a7cccd312b +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/8c85c7b24d65d86a +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/8d1eb008907ca218 +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/9da684ed8a9b8d9c +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/adc83b19e793491b +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/ae79689a9c0be3fc +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/c9f1afd2a84c92ac +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/d427659fa4d8fdef +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/d946c4cbd3f551fb +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/da39a3ee5e6b4b0d +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/df167ab23556209e +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/e5d028d6ca3bc6c6 +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/ea30e4add0a6171c +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/ebbaf5778e99a3e9 +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/ebfda9399227f401 +4 -0
- spice_mcp-0.1.3/.hypothesis/constants/f8058dd8f3978a9f +4 -0
- spice_mcp-0.1.3/.hypothesis/examples/04e6b3400353b141/3297e56a00db6e8d +0 -0
- spice_mcp-0.1.3/.hypothesis/examples/04e6b3400353b141/5206044c103f45ca +2 -0
- spice_mcp-0.1.3/.hypothesis/examples/04e6b3400353b141/8c16f33e2460573e +1 -0
- spice_mcp-0.1.3/.hypothesis/examples/04e6b3400353b141/c67ab7f30dd41ebd +1 -0
- spice_mcp-0.1.3/.hypothesis/examples/3297e56a00db6e8d/1236c0a13f38a176 +0 -0
- spice_mcp-0.1.3/.hypothesis/examples/5206044c103f45ca/e4201915c9a55aa8 +1 -0
- spice_mcp-0.1.3/.hypothesis/examples/8c16f33e2460573e/05f4853fe973fb8f +1 -0
- spice_mcp-0.1.3/.hypothesis/examples/8c16f33e2460573e/57bd1d7010b0a3e5 +1 -0
- spice_mcp-0.1.3/.hypothesis/examples/8c16f33e2460573e/6c3ff7a3026f98fd +1 -0
- spice_mcp-0.1.3/.hypothesis/examples/8c16f33e2460573e/ccd03e0f6bc2e1a2 +1 -0
- spice_mcp-0.1.3/.hypothesis/examples/8c16f33e2460573e/d179779eaa64628d +1 -0
- spice_mcp-0.1.3/.hypothesis/examples/c67ab7f30dd41ebd/31f5e37d90db6ce6 +1 -0
- spice_mcp-0.1.3/.hypothesis/unicode_data/15.1.0/charmap.json.gz +0 -0
- spice_mcp-0.1.3/.hypothesis/unicode_data/15.1.0/codec-utf-8.json.gz +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/PKG-INFO +18 -13
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/README.md +17 -12
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/docs/architecture.md +3 -4
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/docs/codex_cli.md +7 -13
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/docs/config.md +1 -1
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/docs/development.md +3 -3
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/docs/discovery.md +0 -4
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/docs/index.md +1 -1
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/docs/tools.md +1 -14
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/pyproject.toml +1 -1
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/adapters/dune/__init__.py +4 -2
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/adapters/dune/cache.py +2 -34
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/adapters/dune/extract.py +33 -631
- spice_mcp-0.1.3/src/spice_mcp/adapters/spellbook/__init__.py +6 -0
- spice_mcp-0.1.3/src/spice_mcp/adapters/spellbook/explorer.py +313 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/config.py +1 -1
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/core/models.py +0 -8
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/core/ports.py +0 -15
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/mcp/server.py +321 -116
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/mcp/tools/base.py +1 -1
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/mcp/tools/execute_query.py +26 -59
- spice_mcp-0.1.3/tests/fastmcp/test_resources_and_validation.py +58 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/fastmcp/test_server_fastmcp.py +34 -27
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/fastmcp/test_server_mcp_extras.py +1 -3
- spice_mcp-0.1.3/tests/integration/__init__.py +2 -0
- spice_mcp-0.1.3/tests/integration/test_spellbook_discovery.py +214 -0
- spice_mcp-0.1.3/tests/integration/test_user_journeys.py +327 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/mcp/conftest.py +2 -21
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/mcp/test_tool_contracts.py +0 -16
- spice_mcp-0.1.3/tests/offline/test_cache_consistency.py +253 -0
- spice_mcp-0.1.3/tests/offline/test_edge_cases.py +256 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/offline/test_typing_utils.py +4 -6
- spice_mcp-0.1.3/tests/property/__init__.py +2 -0
- spice_mcp-0.1.3/tests/property/test_property_based.py +195 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/scripts/test_mcp_simulation.py +0 -1
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/scripts/test_mcp_tools.py +4 -5
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/support/helpers.py +2 -7
- spice_mcp-0.1.3/tests/tools/test_additional_mcp_tools.py +117 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/tools/test_execute_query_tool.py +6 -15
- spice_mcp-0.1.3/tests/tools/test_unified_discover.py +183 -0
- spice_mcp-0.1.3/tests/validation/__init__.py +2 -0
- spice_mcp-0.1.3/tests/validation/test_error_messages.py +206 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/uv.lock +1 -1
- spice_mcp-0.1.2/debug_mcp_tool.py +0 -147
- spice_mcp-0.1.2/debug_template_query.py +0 -147
- spice_mcp-0.1.2/docs/commands.md +0 -41
- spice_mcp-0.1.2/issue_diagnostics.py +0 -76
- spice_mcp-0.1.2/src/spice_mcp/mcp/tools/sui_package_overview.py +0 -56
- spice_mcp-0.1.2/src/spice_mcp/service_layer/sui_service.py +0 -131
- spice_mcp-0.1.2/test_semaphore_fix.py +0 -101
- spice_mcp-0.1.2/test_sync_fix.py +0 -55
- spice_mcp-0.1.2/tests/fastmcp/test_resources_and_validation.py +0 -49
- spice_mcp-0.1.2/tests/mcp/test_resources.py +0 -53
- spice_mcp-0.1.2/tests/tools/test_additional_mcp_tools.py +0 -82
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/.python-version +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/CONTRIBUTING.md +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/LICENSE +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/docs/codex_cli_tools.md +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/docs/dune_api.md +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/docs/installation.md +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/pytest.ini +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/scripts/bridgez/make_circle_comparison.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/scripts/codex_tools_doctor.sh +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/__init__.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/adapters/__init__.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/adapters/dune/admin.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/adapters/dune/client.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/adapters/dune/helpers.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/adapters/dune/transport.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/adapters/dune/types.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/adapters/dune/typing_utils.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/adapters/dune/urls.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/adapters/http_client.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/core/__init__.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/core/errors.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/logging/query_history.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/mcp/__init__.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/mcp/tools/__init__.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/observability/__init__.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/observability/logging.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/polars_utils.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/py.typed +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/service_layer/__init__.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/service_layer/discovery_service.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/service_layer/query_admin_service.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/src/spice_mcp/service_layer/query_service.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/cassettes/.gitkeep +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/config/environments.yaml +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/config/test_queries.yaml +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/conftest.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/http_stubbed/test_age.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/http_stubbed/test_errors.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/http_stubbed/test_pagination.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/live/test_live_basic.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/live/test_live_sui.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/offline/test_cache.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/offline/test_discovery.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/offline/test_dune_adapter.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/offline/test_parsing.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/offline/test_query_history.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/offline/test_show_rewrite.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/offline/test_timeout.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/offline/test_urls.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/scripts/comprehensive_test_runner.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/scripts/run_tests.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/scripts/test_api_health.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/scripts/test_cache_functionality.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/scripts/test_data_types.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/scripts/test_dune_connectivity.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/scripts/test_dune_query_execution.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/scripts/test_error_handling.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/scripts/test_performance.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/scripts/test_query_lifecycle.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/scripts/test_resilience.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/scripts/test_resource_management.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/style/test_polars_lazy.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/support/api_client.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/support/query_factory.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/support/test_data.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/tools/test_health_tool.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/tools/test_query_service.py +0 -0
- {spice_mcp-0.1.2 → spice_mcp-0.1.3}/tests/tools/test_schemas.py +0 -0
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /Users/evandekim/Documents/spice_mcp/src/spice_mcp/mcp/tools/sui_package_overview.py
|
|
2
|
+
# hypothesis_version: 6.142.5
|
|
3
|
+
|
|
4
|
+
['additionalProperties', 'array', 'default', 'hours', 'integer', 'items', 'number', 'object', 'packages', 'properties', 'required', 'string', 'sui_package_overview', 'timeout_seconds', 'tool', 'type']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /Users/evandekim/Documents/spice_mcp/src/spice_mcp/config.py
|
|
2
|
+
# hypothesis_version: 6.142.5
|
|
3
|
+
|
|
4
|
+
[500, '0.35', '15', '3', '30', '5', '5.0', '500', 'DUNE_API_KEY', 'DUNE_API_URL', 'SPICE_ARTIFACT_ROOT', 'SPICE_CACHE_DIR', 'SPICE_CACHE_MODE', 'SPICE_HTTP_BACKOFF', 'SPICE_HTTP_RETRIES', 'SPICE_HTTP_TIMEOUT', 'SPICE_QUERY_HISTORY', 'disabled', 'enabled', 'read_only', 'refresh', 'true']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /Users/evandekim/Documents/spice_mcp/src/spice_mcp/mcp/tools/execute_query.py
|
|
2
|
+
# hypothesis_version: 6.142.5
|
|
3
|
+
|
|
4
|
+
[10.0, 1000, '4060379', 'DUNE_API_KEY', 'DUNE_API_KEY_present', 'GET', 'Query parameters', 'User-Agent', 'X-Dune-API-Key', 'additionalProperties', 'array', 'boolean', 'columns', 'compute_query_sha256', 'data', 'data_preview', 'debug_info', 'default', 'description', 'dune.com/queries', 'dune_error', 'dune_query', 'dune_state', 'duration_ms', 'enum', 'environment_vars', 'error', 'execution', 'execution_ended_at', 'execution_id', 'execution_started_at', 'extras', 'format', 'https://', 'integer', 'items', 'large', 'limit', 'max_age', 'medium', 'metadata', 'next_offset', 'next_uri', 'number', 'object', 'offset', 'parameters', 'performance', 'poll', 'preview', 'properties', 'query', 'query_id', 'query_sha256', 'query_sql', 'query_type', 'query_url', 'raw', 'raw_sql', 'refresh', 'required', 'rowcount', 'sample_count', 'sort_by', 'state', 'status', 'string', 'submitted', 'success', 'suggested_action', 'template_query_id', 'timeout_seconds', 'tool', 'type', 'unknown', 'url', 'write_sql_artifact']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /Users/evandekim/Documents/spice_mcp/src/spice_mcp/adapters/dune/urls.py
|
|
2
|
+
# hypothesis_version: 6.142.5
|
|
3
|
+
|
|
4
|
+
['&', ',', '.', '/', '/api/v1/query/(\\d+)', '/query/', '/query/{query_id}', '?', 'DUNE_API_KEY', 'DUNE_API_URL', 'X-Dune-API-Key', 'execution_results', 'execution_status', 'invalid query id: ', 'params', 'query', 'query_create', 'query_execution', 'query_fork', 'query_parameters', 'query_results', 'query_results_json']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /Users/evandekim/Documents/spice_mcp/src/spice_mcp/service_layer/sui_service.py
|
|
2
|
+
# hypothesis_version: 6.142.5
|
|
3
|
+
|
|
4
|
+
[200, 1000, 3600, ' OR ', ',', '0x', 'columns', 'data_preview', 'events_count', 'events_error', 'events_preview', 'events_timeout', 'large', 'objects_count', 'objects_error', 'objects_preview', 'objects_timeout', 'ok', 'rowcount', 'transactions_count', 'transactions_error', 'transactions_preview', 'transactions_timeout']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /Users/evandekim/Documents/spice_mcp/src/spice_mcp/adapters/dune/cache.py
|
|
2
|
+
# hypothesis_version: 6.142.5
|
|
3
|
+
|
|
4
|
+
['/tmp/dune_spice', '_tmp_', 'all_types', 'cache_dir', 'columns', 'execution_id', 'extras', 'include_execution', 'invalid format for ', 'limit', 'offset', 'parameters', 'query_id', 'sample_count', 'sort_by', 'spice-mcp', 'spice_version', 'timestamp', 'types', 'utf-8', 'verbose']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /Users/evandekim/Documents/spice_mcp/src/spice_mcp/logging/query_history.py
|
|
2
|
+
# hypothesis_version: 6.142.5
|
|
3
|
+
|
|
4
|
+
[200, '.spice_mcp', 'SPICE_ARTIFACT_ROOT', 'SPICE_QUERY_HISTORY', 'a', 'artifacts', 'by_sha', 'cache_hit', 'disabled', 'duration_ms', 'error', 'execution_id', 'logs', 'queries', 'queries.jsonl', 'query_preview', 'query_sha256', 'query_type', 'reason', 'rowcount', 'sql_path', 'status', 'timestamp', 'ts', 'utf-8']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /Users/evandekim/Documents/spice_mcp/src/spice_mcp/adapters/dune/admin.py
|
|
2
|
+
# hypothesis_version: 6.142.5
|
|
3
|
+
|
|
4
|
+
['Content-Type', 'GET', 'PATCH', 'POST', 'User-Agent', 'X-Dune-API-Key', 'application/json', 'description', 'is_private', 'name', 'parameters', 'query', 'query_create', 'query_fork', 'query_sql', 'spice-mcp-admin/1', 'tags']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /Users/evandekim/Documents/spice_mcp/src/spice_mcp/adapters/dune/extract.py
|
|
2
|
+
# hypothesis_version: 6.142.5
|
|
3
|
+
|
|
4
|
+
[0.5, 1.0, 1.5, 2.5, 5.0, 15.0, 404, 429, 502, '%.02f', ',', ', t = ', '30', '<nil>', 'GET', 'QUERY_STATE_FAILED', 'SPICE_HTTP_TIMEOUT', 'User-Agent', 'X-Dune-API-Key', 'Z', 'all_types', 'api.dune.com', 'api_key', 'cache', 'cache_dir', 'columns', 'dune.com/queries', 'empty query', 'error', 'execute_kwargs', 'execution_id', 'execution_started_at', 'extras', 'https://', 'include_execution', 'latest result age:', 'limit', 'medium', 'offset', 'parameters', 'performance', 'poll_interval', 'query', 'query_id', 'query_parameters', 'result_kwargs', 'sample_count', 'save_to_cache', 'sort_by', 'spice-mcp-adapter', 'spice-mcp/', 'state', 'timeout_seconds', 'timestamp', 'true', 'types', 'unknown', 'verbose', 'x-dune-next-offset', 'x-dune-next-uri']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /Users/evandekim/Documents/spice_mcp/src/spice_mcp/adapters/dune/client.py
|
|
2
|
+
# hypothesis_version: 6.142.5
|
|
3
|
+
|
|
4
|
+
[1000, 'Column', 'Comment', 'DUNE_API_KEY', 'Extra', 'GET', 'Schema', 'Table', 'Type', 'User-Agent', 'X-Dune-API-Key', 'column_name', 'columns', 'data_type', 'error', 'limit', 'medium', 'metadata', 'name', 'next_offset', 'next_uri', 'offset', 'query_parameters', 'result', 'sample_count', 'sort_by', 'state']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /Users/evandekim/Documents/spice_mcp/src/spice_mcp/mcp/server.py
|
|
2
|
+
# hypothesis_version: 6.142.5
|
|
3
|
+
|
|
4
|
+
[5.0, 10.0, 30.0, 200, 1000, '#', ',', '.env', '1', '=', 'Create Saved Query', 'DUNE_API_KEY', 'Describe Table', 'ERROR', 'FASTMCP_LOG_LEVEL', 'FASTMCP_NO_BANNER', 'Find Tables', 'Fork Saved Query', 'GET', 'Health Check', 'Query History Tail', 'Query Info', 'Run Dune Query', 'SQL Artifact', 'Sui Events Preview', 'Sui Package Overview', 'Update Saved Query', 'User-Agent', 'X-Dune-API-Key', '[a-f0-9]{64}', '_', '__main__', 'admin', 'api_key_present', 'application/json', 'artifact_root', 'by_sha', 'columns', 'comment', 'content-type', 'degraded', 'description', 'dune', 'dune_describe_table', 'dune_find_tables', 'dune_health_check', 'dune_query', 'dune_query_create', 'dune_query_fork', 'dune_query_info', 'dune_query_update', 'dune_type', 'extra', 'health', 'history_path', 'hours', 'keyword', 'limit', 'logging_enabled', 'metadata', 'name', 'offset', 'ok', 'packages', 'parameters', 'polars_dtype', 'poll', 'preview', 'queries', 'query', 'query_history_path', 'query_id', 'query_sql', 'query_url', 'raw', 'resource', 'schema', 'schemas', 'source_query_id', 'spice-mcp', 'spice:artifact/{sha}', 'status', 'sui', 'sui_events_preview', 'sui_package_overview', 'table', 'tables', 'tags', 'template_query_id', 'template_query_ok', 'timeout_seconds', 'tool', 'utf-8', 'version', '~/.env']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /Users/evandekim/Documents/spice_mcp/src/spice_mcp/adapters/http_client.py
|
|
2
|
+
# hypothesis_version: 6.142.5
|
|
3
|
+
|
|
4
|
+
[0.35, 1.25, 2.25, 5.0, 15.0, 408, 409, 425, 429, 500, 502, 503, 504, 1000, 'attempt', 'duration_ms', 'error', 'http_request', 'http_request_error', 'http_request_failed', 'method', 'spice_mcp.http', 'status', 'url']
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
# file: /Users/evandekim/Documents/spice_mcp/src/spice_mcp/core/errors.py
|
|
2
|
+
# hypothesis_version: 6.142.5
|
|
3
|
+
|
|
4
|
+
['****', '401', '429', 'AUTH_ERROR', 'QUERY_ERROR', 'QUERY_TIMEOUT', 'Query timed out', 'RATE_LIMIT', 'Retry the request.', 'UNKNOWN_ERROR', 'api key', 'api_key', 'code', 'context', 'data', 'error', 'message', 'ok', 'query failed', 'rate limit', 'secret', 'sql', 'suggestions', 'syntax', 'timed out', 'timeout', 'token', 'unauthorized']
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
�%�%�=��0��X����E.@��C
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
�%�%�=��0��X����E.@��C
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
A
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
�LPT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
�Uü
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
�LPT1
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
�LP
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
�L
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
�1
|
|
Binary file
|
|
Binary file
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: spice-mcp
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.3
|
|
4
4
|
Summary: MCP server for Dune Analytics data access
|
|
5
5
|
Author-email: Evan-Kim2028 <ekcopersonal@gmail.com>
|
|
6
6
|
License-File: LICENSE
|
|
@@ -21,7 +21,12 @@ Description-Content-Type: text/markdown
|
|
|
21
21
|
|
|
22
22
|
# spice-mcp
|
|
23
23
|
|
|
24
|
-
spice-mcp is an MCP server for [Dune](https://dune.com/) Analytics. It wraps a curated subset of the original Spice client inside a clean architecture (`core` models/ports → `adapters.dune` → service layer → FastMCP tools) and adds agent-friendly workflows for discovery
|
|
24
|
+
spice-mcp is an MCP server for [Dune](https://dune.com/) Analytics. It wraps a curated subset of the original Spice client inside a clean architecture (`core` models/ports → `adapters.dune` → service layer → FastMCP tools) and adds agent-friendly workflows for discovery. Results are Polars-first in Python and compact, token-efficient in MCP responses.
|
|
25
|
+
|
|
26
|
+
[](https://pypi.org/project/spice-mcp/)
|
|
27
|
+
<a href="https://glama.ai/mcp/servers/@Evan-Kim2028/spice-mcp">
|
|
28
|
+
<img width="380" height="200" src="https://glama.ai/mcp/servers/@Evan-Kim2028/spice-mcp/badge" alt="Spice MCP server" />
|
|
29
|
+
</a>
|
|
25
30
|
|
|
26
31
|
Requirements: Python 3.13+
|
|
27
32
|
|
|
@@ -31,16 +36,17 @@ This project uses FastMCP for typed, decorator-registered tools and resources.
|
|
|
31
36
|
- Polars LazyFrame-first pipeline: results stay lazy until explicitly materialized
|
|
32
37
|
- Ports/adapters layering for maintainable integrations ([docs/architecture.md](docs/architecture.md))
|
|
33
38
|
- Discovery utilities (find schemas/tables, describe columns)
|
|
34
|
-
- Sui package workflows (events/transactions/objects) with safe defaults
|
|
35
39
|
- JSONL query history + SQL artifacts (SHA-256) for reproducibility
|
|
36
|
-
- Rich MCP surface: query info/run, discovery, health,
|
|
40
|
+
- Rich MCP surface: query info/run, discovery, health, and Dune admin (create/update/fork)
|
|
37
41
|
|
|
38
42
|
## What is Dune?
|
|
39
43
|
[Dune](https://dune.com/) is a crypto data platform providing curated blockchain datasets and a public API to run and fetch query results. See the [Dune Docs](https://dune.com/docs) and [Dune API](https://dune.com/docs/api/) for full details.
|
|
40
44
|
|
|
41
45
|
## Quick Start
|
|
42
46
|
- Export `DUNE_API_KEY` in your shell (the server can also load a local `.env`; set `SPICE_MCP_SKIP_DOTENV=1` to skip during tests).
|
|
43
|
-
- Install
|
|
47
|
+
- Install from PyPI: `uv pip install spice-mcp`
|
|
48
|
+
- Or install from source:
|
|
49
|
+
- `uv sync` then `uv pip install -e .`
|
|
44
50
|
- Start the FastMCP stdio server:
|
|
45
51
|
- `python -m spice_mcp.mcp.server --env PYTHONPATH=$(pwd)/src`
|
|
46
52
|
- or install the console script via `uv tool install .` and run `spice-mcp`.
|
|
@@ -51,9 +57,12 @@ To use spice-mcp with Cursor IDE:
|
|
|
51
57
|
|
|
52
58
|
1. **Install the MCP Server**:
|
|
53
59
|
```bash
|
|
54
|
-
# Install
|
|
60
|
+
# Install from PyPI (recommended)
|
|
61
|
+
uv pip install spice-mcp
|
|
62
|
+
|
|
63
|
+
# Or install from source
|
|
55
64
|
uv sync
|
|
56
|
-
pip install -e .
|
|
65
|
+
uv pip install -e .
|
|
57
66
|
|
|
58
67
|
# Or install via uv tool (creates console script)
|
|
59
68
|
uv tool install .
|
|
@@ -97,7 +106,6 @@ To use spice-mcp with Cursor IDE:
|
|
|
97
106
|
- `dune_query`: Run Dune queries by ID, URL, or raw SQL
|
|
98
107
|
- `dune_find_tables`: Search schemas and list tables
|
|
99
108
|
- `dune_describe_table`: Get column metadata
|
|
100
|
-
- `sui_package_overview`: Analyze Sui packages
|
|
101
109
|
- `dune_health_check`: Verify API connection
|
|
102
110
|
|
|
103
111
|
**Tip**: Create a `.env` file in your project root with `DUNE_API_KEY=your-key-here` for easier configuration.
|
|
@@ -121,9 +129,6 @@ All tools expose typed parameters, titles, and tags; failures return a consisten
|
|
|
121
129
|
- `dune_describe_table` (Describe Table, tags: dune, schema)
|
|
122
130
|
- Column metadata for `schema.table` (Dune types + Polars inferred dtypes when available).
|
|
123
131
|
|
|
124
|
-
- `sui_package_overview` (Sui Package Overview, tag: sui)
|
|
125
|
-
- Compact Sui activity overview for `packages[]` with `hours` (default 72) and `timeout_seconds`.
|
|
126
|
-
|
|
127
132
|
- Dune Admin tools (tags: dune, admin)
|
|
128
133
|
- `dune_query_create(name, query_sql, description?, tags?, parameters?)`
|
|
129
134
|
- `dune_query_update(query_id, name?, query_sql?, description?, tags?, parameters?)`
|
|
@@ -178,7 +183,7 @@ Core Tools (with parameters)
|
|
|
178
183
|
- See [docs/index.md](docs/index.md) for full documentation:
|
|
179
184
|
- Dune API structure and capabilities: [docs/dune_api.md](docs/dune_api.md)
|
|
180
185
|
- Discovery patterns and examples: [docs/discovery.md](docs/discovery.md)
|
|
181
|
-
|
|
186
|
+
|
|
182
187
|
- Tool reference and schemas: [docs/tools.md](docs/tools.md)
|
|
183
188
|
- Codex CLI + tooling integration: [docs/codex_cli.md](docs/codex_cli.md), [docs/codex_cli_tools.md](docs/codex_cli_tools.md)
|
|
184
189
|
- Architecture overview: [docs/architecture.md](docs/architecture.md)
|
|
@@ -190,4 +195,4 @@ Notes
|
|
|
190
195
|
- Ports and models live in `src/spice_mcp/core`; services consume ports and are exercised by FastMCP tools.
|
|
191
196
|
- Query history and SQL artefacts are always-on (see `src/spice_mcp/logging/query_history.py`).
|
|
192
197
|
- To bypass dot-env loading during tests/CI, export `SPICE_MCP_SKIP_DOTENV=1`.
|
|
193
|
-
- LazyFrames everywhere: eager `.collect()` or `pl.DataFrame` usage outside dedicated helpers is blocked by `tests/style/test_polars_lazy.py`; materialization helpers live in `src/spice_mcp/polars_utils.py`.
|
|
198
|
+
- LazyFrames everywhere: eager `.collect()` or `pl.DataFrame` usage outside dedicated helpers is blocked by `tests/style/test_polars_lazy.py`; materialization helpers live in `src/spice_mcp/polars_utils.py`.
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
# spice-mcp
|
|
2
2
|
|
|
3
|
-
spice-mcp is an MCP server for [Dune](https://dune.com/) Analytics. It wraps a curated subset of the original Spice client inside a clean architecture (`core` models/ports → `adapters.dune` → service layer → FastMCP tools) and adds agent-friendly workflows for discovery
|
|
3
|
+
spice-mcp is an MCP server for [Dune](https://dune.com/) Analytics. It wraps a curated subset of the original Spice client inside a clean architecture (`core` models/ports → `adapters.dune` → service layer → FastMCP tools) and adds agent-friendly workflows for discovery. Results are Polars-first in Python and compact, token-efficient in MCP responses.
|
|
4
|
+
|
|
5
|
+
[](https://pypi.org/project/spice-mcp/)
|
|
6
|
+
<a href="https://glama.ai/mcp/servers/@Evan-Kim2028/spice-mcp">
|
|
7
|
+
<img width="380" height="200" src="https://glama.ai/mcp/servers/@Evan-Kim2028/spice-mcp/badge" alt="Spice MCP server" />
|
|
8
|
+
</a>
|
|
4
9
|
|
|
5
10
|
Requirements: Python 3.13+
|
|
6
11
|
|
|
@@ -10,16 +15,17 @@ This project uses FastMCP for typed, decorator-registered tools and resources.
|
|
|
10
15
|
- Polars LazyFrame-first pipeline: results stay lazy until explicitly materialized
|
|
11
16
|
- Ports/adapters layering for maintainable integrations ([docs/architecture.md](docs/architecture.md))
|
|
12
17
|
- Discovery utilities (find schemas/tables, describe columns)
|
|
13
|
-
- Sui package workflows (events/transactions/objects) with safe defaults
|
|
14
18
|
- JSONL query history + SQL artifacts (SHA-256) for reproducibility
|
|
15
|
-
- Rich MCP surface: query info/run, discovery, health,
|
|
19
|
+
- Rich MCP surface: query info/run, discovery, health, and Dune admin (create/update/fork)
|
|
16
20
|
|
|
17
21
|
## What is Dune?
|
|
18
22
|
[Dune](https://dune.com/) is a crypto data platform providing curated blockchain datasets and a public API to run and fetch query results. See the [Dune Docs](https://dune.com/docs) and [Dune API](https://dune.com/docs/api/) for full details.
|
|
19
23
|
|
|
20
24
|
## Quick Start
|
|
21
25
|
- Export `DUNE_API_KEY` in your shell (the server can also load a local `.env`; set `SPICE_MCP_SKIP_DOTENV=1` to skip during tests).
|
|
22
|
-
- Install
|
|
26
|
+
- Install from PyPI: `uv pip install spice-mcp`
|
|
27
|
+
- Or install from source:
|
|
28
|
+
- `uv sync` then `uv pip install -e .`
|
|
23
29
|
- Start the FastMCP stdio server:
|
|
24
30
|
- `python -m spice_mcp.mcp.server --env PYTHONPATH=$(pwd)/src`
|
|
25
31
|
- or install the console script via `uv tool install .` and run `spice-mcp`.
|
|
@@ -30,9 +36,12 @@ To use spice-mcp with Cursor IDE:
|
|
|
30
36
|
|
|
31
37
|
1. **Install the MCP Server**:
|
|
32
38
|
```bash
|
|
33
|
-
# Install
|
|
39
|
+
# Install from PyPI (recommended)
|
|
40
|
+
uv pip install spice-mcp
|
|
41
|
+
|
|
42
|
+
# Or install from source
|
|
34
43
|
uv sync
|
|
35
|
-
pip install -e .
|
|
44
|
+
uv pip install -e .
|
|
36
45
|
|
|
37
46
|
# Or install via uv tool (creates console script)
|
|
38
47
|
uv tool install .
|
|
@@ -76,7 +85,6 @@ To use spice-mcp with Cursor IDE:
|
|
|
76
85
|
- `dune_query`: Run Dune queries by ID, URL, or raw SQL
|
|
77
86
|
- `dune_find_tables`: Search schemas and list tables
|
|
78
87
|
- `dune_describe_table`: Get column metadata
|
|
79
|
-
- `sui_package_overview`: Analyze Sui packages
|
|
80
88
|
- `dune_health_check`: Verify API connection
|
|
81
89
|
|
|
82
90
|
**Tip**: Create a `.env` file in your project root with `DUNE_API_KEY=your-key-here` for easier configuration.
|
|
@@ -100,9 +108,6 @@ All tools expose typed parameters, titles, and tags; failures return a consisten
|
|
|
100
108
|
- `dune_describe_table` (Describe Table, tags: dune, schema)
|
|
101
109
|
- Column metadata for `schema.table` (Dune types + Polars inferred dtypes when available).
|
|
102
110
|
|
|
103
|
-
- `sui_package_overview` (Sui Package Overview, tag: sui)
|
|
104
|
-
- Compact Sui activity overview for `packages[]` with `hours` (default 72) and `timeout_seconds`.
|
|
105
|
-
|
|
106
111
|
- Dune Admin tools (tags: dune, admin)
|
|
107
112
|
- `dune_query_create(name, query_sql, description?, tags?, parameters?)`
|
|
108
113
|
- `dune_query_update(query_id, name?, query_sql?, description?, tags?, parameters?)`
|
|
@@ -157,7 +162,7 @@ Core Tools (with parameters)
|
|
|
157
162
|
- See [docs/index.md](docs/index.md) for full documentation:
|
|
158
163
|
- Dune API structure and capabilities: [docs/dune_api.md](docs/dune_api.md)
|
|
159
164
|
- Discovery patterns and examples: [docs/discovery.md](docs/discovery.md)
|
|
160
|
-
|
|
165
|
+
|
|
161
166
|
- Tool reference and schemas: [docs/tools.md](docs/tools.md)
|
|
162
167
|
- Codex CLI + tooling integration: [docs/codex_cli.md](docs/codex_cli.md), [docs/codex_cli_tools.md](docs/codex_cli_tools.md)
|
|
163
168
|
- Architecture overview: [docs/architecture.md](docs/architecture.md)
|
|
@@ -169,4 +174,4 @@ Notes
|
|
|
169
174
|
- Ports and models live in `src/spice_mcp/core`; services consume ports and are exercised by FastMCP tools.
|
|
170
175
|
- Query history and SQL artefacts are always-on (see `src/spice_mcp/logging/query_history.py`).
|
|
171
176
|
- To bypass dot-env loading during tests/CI, export `SPICE_MCP_SKIP_DOTENV=1`.
|
|
172
|
-
- LazyFrames everywhere: eager `.collect()` or `pl.DataFrame` usage outside dedicated helpers is blocked by `tests/style/test_polars_lazy.py`; materialization helpers live in `src/spice_mcp/polars_utils.py`.
|
|
177
|
+
- LazyFrames everywhere: eager `.collect()` or `pl.DataFrame` usage outside dedicated helpers is blocked by `tests/style/test_polars_lazy.py`; materialization helpers live in `src/spice_mcp/polars_utils.py`.
|
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
## Layers
|
|
25
25
|
|
|
26
26
|
### Core (`src/spice_mcp/core`)
|
|
27
|
-
- `models.py` – dataclass representations for query requests, previews, metadata, schema descriptions
|
|
28
|
-
- `ports.py` – protocols defining the boundaries (`QueryExecutor`, `CatalogExplorer
|
|
27
|
+
- `models.py` – dataclass representations for query requests, previews, metadata, schema descriptions.
|
|
28
|
+
- `ports.py` – protocols defining the boundaries (`QueryExecutor`, `CatalogExplorer`).
|
|
29
29
|
- `errors.py` – MCP-oriented error categorisation and envelope helpers (`error_response`).
|
|
30
30
|
|
|
31
31
|
These modules contain zero infrastructure concerns; they define the shapes that higher layers orchestrate.
|
|
@@ -39,13 +39,12 @@ These modules contain zero infrastructure concerns; they define the shapes that
|
|
|
39
39
|
### Service Layer (`src/spice_mcp/service_layer`)
|
|
40
40
|
- `query_service.py` – orchestrates `QueryExecutor` calls and shapes the dictionaries returned to MCP tools. Handles `performance` passthrough, metadata merging, and preview formatting.
|
|
41
41
|
- `discovery_service.py` – thin façade around `CatalogExplorer`, returning friendlier lists for schema/table introspection.
|
|
42
|
-
- `sui_service.py` – composes `QueryService` to deliver Sui-specific behaviours (events preview, package overview defaults).
|
|
43
42
|
|
|
44
43
|
Services are pure Python and easily testable with stubbed ports (see `tests/tools/test_query_service.py`).
|
|
45
44
|
|
|
46
45
|
### MCP Integration (`src/spice_mcp/mcp`)
|
|
47
46
|
- `server.py` – FastMCP stdio bridge. Lazily initialises configuration, adapters, services, tools, and resources. Provides resource URIs and tools while keeping stdout clean.
|
|
48
|
-
- `tools/execute_query.py
|
|
47
|
+
- `tools/execute_query.py` – thin glue calling into services, handling logging/audit trails, and shaping agent-friendly responses.
|
|
49
48
|
- Uses `QueryHistory` (`src/spice_mcp/logging/query_history.py`) for JSONL audit trails and SQL artefact storage.
|
|
50
49
|
|
|
51
50
|
### Observability (`src/spice_mcp/observability`)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Codex CLI MCP Setup (spice_mcp_beta)
|
|
2
2
|
|
|
3
3
|
Goal
|
|
4
|
-
- Register the spice-mcp server as an MCP provider named `spice_mcp_beta` for Codex CLI, so you can call tools like `dune_query
|
|
4
|
+
- Register the spice-mcp server as an MCP provider named `spice_mcp_beta` for Codex CLI, so you can call tools like `dune_query`.
|
|
5
5
|
|
|
6
6
|
Prereqs
|
|
7
7
|
- Dune API key in your shell (e.g., export `DUNE_API_KEY=...`)
|
|
@@ -54,23 +54,17 @@ Verify configuration
|
|
|
54
54
|
- `codex mcp list` should list `spice_mcp_beta` with the python command and no secrets in Env.
|
|
55
55
|
|
|
56
56
|
Try some tools
|
|
57
|
-
- Find
|
|
58
|
-
- `mcp__spice_mcp_beta__dune_find_tables {"keyword": "
|
|
59
|
-
- Describe
|
|
60
|
-
- `mcp__spice_mcp_beta__dune_describe_table {"schema": "
|
|
57
|
+
- Find schemas
|
|
58
|
+
- `mcp__spice_mcp_beta__dune_find_tables {"keyword": "dex"}`
|
|
59
|
+
- Describe a table
|
|
60
|
+
- `mcp__spice_mcp_beta__dune_describe_table {"schema": "dex", "table": "trades"}`
|
|
61
61
|
- Query preview (with metadata/pagination)
|
|
62
62
|
- `mcp__spice_mcp_beta__dune_query {"query": "4388", "limit": 5}`
|
|
63
|
-
- `mcp__spice_mcp_beta__dune_query {"query": "SELECT * FROM
|
|
64
|
-
MCP command URIs (resources)
|
|
65
|
-
- You can read command-style resources for safe defaults (3-day windows, small LIMITs):
|
|
66
|
-
- Events preview: `spice:sui/events_preview/72/50/0xcaf6...,0x2c8d...`
|
|
67
|
-
- Package overview (cmd): `spice:sui/package_overview/72/30/0xcaf6...,0x2c8d...`
|
|
68
|
-
- Global preview (no package filter): `spice:sui/events_preview/72/50/_`
|
|
69
|
-
- See `docs/commands.md` for details. (Your client must support reading MCP resources.)
|
|
63
|
+
- `mcp__spice_mcp_beta__dune_query {"query": "SELECT * FROM dex.trades LIMIT 5"}`
|
|
70
64
|
|
|
71
65
|
Notes & troubleshooting
|
|
72
66
|
- Secret safety: Never store `DUNE_API_KEY` in Codex config; use `shell_environment_policy.inherit=["DUNE_API_KEY"]` or set it in your shell.
|
|
73
67
|
- Missing key error: If you see `DUNE_API_KEY required`, export it in your shell and relaunch. The server also attempts to load `.env` from the project or home directory as a fallback.
|
|
74
68
|
- FastMCP stdout: This server disables FastMCP banners/logging to keep stdio clean; if handshakes fail, ensure you used the exact `python -m spice_mcp.mcp.server` and PYTHONPATH as shown.
|
|
75
|
-
- Heavy scans: Start with `format="metadata"` on `dune_query`, use `performance="large"`, and small `limit` with a recent time window
|
|
69
|
+
- Heavy scans: Start with `format="metadata"` on `dune_query`, use `performance="large"`, and small `limit` with a recent time window.
|
|
76
70
|
- Tests/CI: set `SPICE_MCP_SKIP_DOTENV=1` to stop `_ensure_initialized` from reading local `.env` files when the key is intentionally absent.
|
|
@@ -15,7 +15,7 @@ Optional
|
|
|
15
15
|
- `SPICE_LOGGING_ENABLED`: true/false (default: true)
|
|
16
16
|
- Timeouts
|
|
17
17
|
- `SPICE_TIMEOUT_SECONDS`: default polling timeout (seconds)
|
|
18
|
-
- `SPICE_MAX_CONCURRENT_QUERIES`:
|
|
18
|
+
- `SPICE_MAX_CONCURRENT_QUERIES`: reserved for future concurrency control (default: 5, not currently enforced)
|
|
19
19
|
- Raw SQL
|
|
20
20
|
- `SPICE_RAW_SQL_QUERY_ID`: ID of the template query used to execute raw SQL (default: 4060379). Health is reported by `dune_health_check` when set.
|
|
21
21
|
|
|
@@ -4,7 +4,7 @@ This document summarizes local development workflows for spice-mcp.
|
|
|
4
4
|
|
|
5
5
|
## Tooling
|
|
6
6
|
|
|
7
|
-
- Tests: `pytest` (+ `
|
|
7
|
+
- Tests: `pytest` (+ `responses`, `vcrpy`, `hypothesis`)
|
|
8
8
|
- Lint/Format: `ruff` (lint + import sort + formatting)
|
|
9
9
|
- Types: `mypy`
|
|
10
10
|
|
|
@@ -27,7 +27,7 @@ Enable live tests explicitly:
|
|
|
27
27
|
- `tests/offline/`: pure unit tests; no network.
|
|
28
28
|
- `tests/http_stubbed/`: HTTP boundary via `responses`.
|
|
29
29
|
- `tests/tools/`: service + MCP tool unit tests.
|
|
30
|
-
- `tests/mcp/`: FastMCP contract tests with stubbed services (preview/raw/metadata
|
|
30
|
+
- `tests/mcp/`: FastMCP contract tests with stubbed services (preview/raw/metadata).
|
|
31
31
|
- `tests/fastmcp/`: registration/metadata smoke tests for FastMCP wiring.
|
|
32
32
|
- `tests/style/`: static safety checks (lazyframe enforcement, etc.).
|
|
33
33
|
- `tests/live/`: opt-in integrations; require `SPICE_TEST_LIVE=1` and `DUNE_API_KEY`.
|
|
@@ -36,7 +36,7 @@ Most unit/contract tests construct stub implementations of the ports in `src/spi
|
|
|
36
36
|
|
|
37
37
|
## Style
|
|
38
38
|
|
|
39
|
-
- Follow Ruff + ruff-format defaults (88 cols,
|
|
39
|
+
- Follow Ruff + ruff-format defaults (88 cols, py313).
|
|
40
40
|
- Prefer small, focused functions and explicit typing in `src/`.
|
|
41
41
|
- Tests prioritize readability over strict typing.
|
|
42
42
|
- Export `SPICE_MCP_SKIP_DOTENV=1` when running tests that expect the API key to be unset.
|
|
@@ -17,10 +17,6 @@ Approach
|
|
|
17
17
|
- Some deployments allow: information_schema.schemata/tables/columns
|
|
18
18
|
- If blocked, use SHOW + probes
|
|
19
19
|
|
|
20
|
-
Sui Examples
|
|
21
|
-
- Find Sui schemas: SHOW SCHEMAS LIKE '%sui%'
|
|
22
|
-
- Confirm core tables: SELECT * FROM sui.events/transactions/checkpoints/objects LIMIT 1
|
|
23
|
-
- SHOW TABLES works on some Sui-related schemas (e.g., sui_base), but not all
|
|
24
20
|
|
|
25
21
|
Helpers in this repo
|
|
26
22
|
- `src/spice_mcp/service_layer/discovery_service.py` provides service wrappers around the Dune adapter:
|
|
@@ -7,7 +7,7 @@ spice-mcp Documentation
|
|
|
7
7
|
- Architecture Overview: `docs/architecture.md`
|
|
8
8
|
- Dune API Overview: `docs/dune_api.md`
|
|
9
9
|
- Catalog Discovery Guide: `docs/discovery.md`
|
|
10
|
-
|
|
10
|
+
|
|
11
11
|
- Codex CLI MCP Setup: `docs/codex_cli.md`
|
|
12
12
|
- Development & Testing: `docs/development.md`
|
|
13
13
|
|
|
@@ -53,20 +53,7 @@ Logging & Artifacts
|
|
|
53
53
|
- columns: [{ name, dune_type?, polars_dtype?, extra?, comment? }]
|
|
54
54
|
- Errors follow the standard MCP envelope.
|
|
55
55
|
|
|
56
|
-
4)
|
|
57
|
-
- Purpose: Preview Sui package activity (events, transactions, objects) over a time window; timeouts supported.
|
|
58
|
-
- Input schema:
|
|
59
|
-
- packages: string[] (required)
|
|
60
|
-
- hours?: integer (default 72)
|
|
61
|
-
- timeout_seconds?: number (default 30)
|
|
62
|
-
- Output fields (best-effort):
|
|
63
|
-
- ok: boolean
|
|
64
|
-
- events_count?, events_preview?, events_timeout?, events_error?
|
|
65
|
-
- transactions_count?, transactions_preview?, transactions_timeout?, transactions_error?
|
|
66
|
-
- objects_count?, objects_preview?, objects_timeout?, objects_error?
|
|
67
|
-
- On error: { ok: false, error: { … } }
|
|
68
|
-
|
|
69
|
-
5) dune_health_check
|
|
56
|
+
4) dune_health_check
|
|
70
57
|
- Purpose: Basic environment and logging readiness check.
|
|
71
58
|
- Output fields: ok, api_key_present, status
|
|
72
59
|
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
This module provides a thin façade used by the new service layer while
|
|
4
4
|
keeping the battle-tested logic that the original spice client offered.
|
|
5
|
+
|
|
6
|
+
Only synchronous interfaces are exposed.
|
|
5
7
|
"""
|
|
6
8
|
|
|
7
9
|
from . import urls # re-export for callers needing low-level helpers
|
|
8
|
-
from .extract import
|
|
10
|
+
from .extract import query # noqa: F401
|
|
9
11
|
|
|
10
|
-
__all__ = ["query", "
|
|
12
|
+
__all__ = ["query", "urls"]
|