MCPInstall
risingwave-mcp logo

risingwave-mcp

by risingwavelabs 19 stars risingwavelabs/risingwave-mcp

RisingWave MCP Server

READMEmain

RisingWave MCP Server

RisingWave MCP Server is a comprehensive Model Context Protocol (MCP) server that lets you query and manage your RisingWave streaming database using natural language through AI assistants like VS Code Copilot and Claude Desktop.


Features

  • Real-time access to RisingWave tables, materialized views, and streaming data
  • Complete management of sources, sinks, connections, indexes, and UDFs
  • Streaming job monitoring with fragment, actor, and backfill tracking
  • Storage analysis with Hummock/compaction insights
  • Built on FastMCP and risingwave-py with high-performance STDIO transport
  • Seamless integration with VS Code Copilot, Claude Desktop, and other MCP-compatible tools

Installation

Option 1: Docker (Recommended)

docker pull risingwavelabs/risingwave-mcp-server:0.1.0

Option 2: From Source

Requires Python 3.10 or newer.

git clone https://github.com/risingwavelabs/risingwave-mcp.git
cd risingwave-mcp
pip install -r requirements.txt

Setting Up

You'll need a running RisingWave instance—either locally or in the cloud.

Option 1: Run RisingWave Locally

# Install RisingWave standalone
curl -L https://risingwave.com/sh | sh

# macOS
risingwave

# Linux
./risingwave

For Docker or other options, see the docs: https://docs.risingwave.com/get-started/quickstart

Option 2: Use RisingWave Cloud

You can also spin up a free-tier cluster in seconds: https://cloud.risingwave.com/auth/signin


Integration

VS Code Copilot

  1. In the VS Code Chat panel: Agent Mode → Select Tools → Create MCP Server.
  2. Add the following to .vscode/mcp.json.

Option 1: Use a connection string

{
  "servers": {
    "risingwave-mcp": {
      "type": "stdio",
      "command": "python",
      "args": ["path_to/risingwave-mcp/src/main.py"],
      "env": {
        "RISINGWAVE_CONNECTION_STR": "postgresql://root:root@localhost:4566/dev"
      }
    }
  }
}

Explanation:

  • postgresql:// — Use PostgreSQL protocol (RisingWave is compatible)
  • root:root@ — Username and password
  • localhost:4566 — Host and port
  • /dev — Database name

Option 2: Use individual parameters

{
  "servers": {
    "risingwave-mcp": {
      "type": "stdio",
      "command": "python",
      "args": ["path_to/risingwave-mcp/src/main.py"],
      "env": {
        "RISINGWAVE_HOST": "localhost",
        "RISINGWAVE_PORT": "4566",
        "RISINGWAVE_USER": "root",
        "RISINGWAVE_PASSWORD": "root",
        "RISINGWAVE_DATABASE": "dev",
        "RISINGWAVE_SSLMODE": "disable"
      }
    }
  }
}
  1. Start chatting!

    Ask questions like:

    • "List my tables"
    • "Create a materialized view that aggregates payments by minute"
    • "Show me the backfill progress for all streaming jobs"
    • "What's the cluster status?"

Claude Desktop

  1. Add the MCP server to your claude_desktop_config.json under mcpServers:
{
  "mcpServers": {
    "risingwave-mcp": {
      "command": "python",
      "args": ["path_to/risingwave-mcp/src/main.py"],
      "env": {
        "RISINGWAVE_CONNECTION_STR": "postgresql://root:root@localhost:4566/dev"
      }
    }
  }
}
  1. Restart Claude Desktop to apply changes.

Docker

Run the MCP server as a container with HTTP transport:

docker run -p 8000:8000 \
  -e RISINGWAVE_CONNECTION_STR="postgresql://root:root@host.docker.internal:4566/dev" \
  risingwavelabs/risingwave-mcp-server:0.1.0

The server listens on http://localhost:8000/mcp by default. You can configure it with environment variables:

VariableDefaultDescription
MCP_TRANSPORTstreamable-httpTransport protocol (streamable-http, sse, stdio)
MCP_HOST0.0.0.0Listen address
MCP_PORT8000Listen port

Verify It Works

# Check the server is running
curl -s http://localhost:8000/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","method":"tools/list","id":1}'

Manual Testing (Dev / CI)

You can run the MCP server directly from the CLI:

python src/main.py

This will listen for MCP messages over STDIN/STDOUT.


Available Tools

The MCP server provides 100+ tools organized into the following categories:

Query Tools

Tool NameDescription
run_select_queryExecute a SELECT query against RisingWave
table_row_countGet the row count for a specific table
get_table_statsGet comprehensive statistics for a table

Explain Tools

Tool NameDescription
explain_queryGet query execution plan without running it
explain_analyzeExecute EXPLAIN ANALYZE for detailed runtime statistics
explain_distsqlGet distributed execution plan for streaming statements

Schema Tools

Tool NameDescription
show_tablesList all tables in the database
list_databasesList all databases in the cluster
describe_tableDescribe table structure (columns, types)
describe_materialized_viewDescribe materialized view structure
show_create_tableShow CREATE TABLE statement
show_create_materialized_viewShow CREATE MATERIALIZED VIEW statement
check_table_existsCheck if a table or MV exists
list_schemasList all schemas in the database
list_materialized_viewsList all materialized views in a schema
get_table_columnsGet detailed column information
list_subscriptionsList all subscriptions in a schema
list_table_privilegesList privileges for a table
list_sinksList all sinks in the database
show_create_sinkShow CREATE SINK statement
get_relation_infoGet info about any relation by name
show_create_sourceShow CREATE SOURCE statement

DDL Tools (Data Definition)

Tool NameDescription
create_schemaCreate a new schema
drop_tableDrop a table
add_table_columnAdd a column to a table
drop_table_columnRemove a column from a table
rename_tableRename a table
alter_table_parallelismChange table parallelism
alter_table_source_rate_limitModify source rate limit for tables
create_materialized_viewCreate a new materialized view
drop_materialized_viewDrop a materialized view
alter_mv_parallelismChange MV parallelism
alter_mv_backfill_rate_limitModify MV backfill rate limit
rename_materialized_viewRename a materialized view
swap_materialized_viewsAtomically swap two MVs
execute_ddl_statementExecute generic DDL statements
create_kafka_tableCreate a table with Kafka connector
add_table_commentAdd comment to a table
add_column_commentAdd comment to a column

DML Tools (Data Manipulation)

Tool NameDescription
insert_single_rowInsert a single row into a table
insert_multiple_rowsBatch insert multiple rows
update_rowsUpdate rows in a table
delete_rowsDelete rows from a table

Source Tools

Tool NameDescription
list_sourcesList all sources
describe_sourceDescribe source structure
alter_source_parallelismChange source parallelism
alter_source_rate_limitModify source ingestion rate
refresh_source_schemaRefresh schema from registry
rename_sourceRename a source
drop_sourceDrop a source

Sink Tools

Tool NameDescription
describe_sinkDescribe sink structure
alter_sink_parallelismChange sink parallelism
alter_sink_rate_limitModify sink output rate
rename_sinkRename a sink
drop_sinkDrop a sink

Connection Tools

Tool NameDescription
list_connectionsList all connections
show_create_connectionShow CREATE CONNECTION statement
drop_connectionDrop a connection

Secret Tools

Tool NameDescription
list_secretsList all secrets (values hidden)
drop_secretDrop a secret

Index Tools

Tool NameDescription
list_indexesList indexes for a table
describe_indexDescribe index structure
show_create_indexShow CREATE INDEX statement
drop_indexDrop an index

Function Tools (UDFs)

Tool NameDescription
list_functionsList all user-defined functions
show_create_functionShow CREATE FUNCTION statement
drop_functionDrop a function

User & Access Control Tools

Tool NameDescription
list_usersList all users
get_user_privilegesGet privileges for a user
get_schema_privilegesGet schema-level privileges
get_database_privilegesGet database-level privileges

Cluster Tools

Tool NameDescription
show_clusterDisplay cluster node details
show_jobsList active streaming jobs
cancel_jobsCancel running jobs
recover_clusterTrigger manual recovery
get_cluster_infoGet comprehensive cluster info

Database Management Tools

Tool NameDescription
get_database_versionGet RisingWave version info
show_running_queriesShow currently running queries
flush_databaseForce flush pending writes

Session Tools

Tool NameDescription
set_session_variableSet a session variable
show_session_variableShow a session variable value
show_all_session_variablesShow all session variables
alter_system_variableAlter system-wide defaults

Iceberg Tools

Tool NameDescription
vacuum_tableExpire old snapshots on Iceberg table
vacuum_full_tableFull compaction + vacuum

Streaming Infrastructure Tools

Tool NameDescription
get_worker_nodesGet all worker nodes with status
get_actor_distributionShow actor count per worker
get_fragment_statsGet fragment statistics
get_fragment_communication_costCalculate shuffle overhead
list_fragmentsList all fragments
get_fragment_detailsGet detailed fragment info
list_actorsList all actors
get_actors_for_fragmentGet actors for a fragment
get_object_id_by_nameGet internal ID by name
get_mv_by_fragment_idFind MV by fragment ID
get_mv_by_actor_idTrace actor to MV
get_worker_for_actorFind worker for actor
get_workers_for_fragmentFind workers for fragment
get_streaming_job_fragmentsGet fragments for a job
get_streaming_job_actorsGet actors for a job
get_backfill_progressGet backfill progress
get_fragment_backfill_progressGet fragment-level backfill
get_upstream_fragmentsGet upstream fragments
get_downstream_fragmentsGet downstream fragments
get_fragments_by_state_tableFind fragments by state table
get_streaming_parallelismGet parallelism settings
get_mv_worker_distributionGet MV actor distribution
get_job_by_state_table_idFind job by state table
get_internal_tablesGet internal state tables
check_vnode_distributionCheck for data skew
get_downstream_dependentsFind dependent MVs
get_upstream_dependentsFind upstream dependencies
get_sink_decouple_statusCheck sink decouple status
get_sink_logstore_lagMonitor decoupled sink lag

Storage Tools (Hummock)

Tool NameDescription
get_table_storage_statsGet storage stats for a table
get_all_table_storage_statsGet storage stats for all tables
get_sst_level_layoutCheck SST layout per level
get_compaction_group_configsGet compaction configs
get_sst_delete_ratioCheck SST delete ratios
get_sst_vnode_distributionCheck vnode distribution in SSTs
get_large_state_tables_in_compaction_groupFind large state tables
get_l0_statsGet L0 level statistics
get_jobs_in_compaction_groupFind jobs in compaction group
get_meta_snapshot_infoGet meta snapshot info
get_compaction_group_summaryGet compaction group summary

System Catalog Tools

Tool NameDescription
get_table_constraintsGet table constraints
get_views_infoGet views information
get_all_objects_in_schemaList all objects in schema
get_object_commentsGet object comments
get_streaming_job_statusGet streaming job status
get_system_tables_infoList system tables
query_system_catalogQuery any system catalog

Architecture

src/
├── main.py              # Entry point, registers all tools
├── connection.py        # Database connection setup
├── query_tools.py       # SELECT queries and table stats
├── explain.py           # EXPLAIN and EXPLAIN ANALYZE
├── schema_tools.py      # Schema inspection tools
├── ddl_tools.py         # CREATE, ALTER, DROP operations
├── dml_tools.py         # INSERT, UPDATE, DELETE operations
├── source_tools.py      # Source management
├── sink_tools.py        # Sink management
├── connection_tools.py  # Connection management
├── secret_tools.py      # Secret management
├── index_tools.py       # Index management
├── function_tools.py    # UDF management
├── user_tools.py        # User and access control
├── cluster_tools.py     # Cluster management
├── management_tools.py  # Database management
├── session_tools.py     # Session variables
├── iceberg_tools.py     # Iceberg/vacuum operations
├── streaming_tools.py   # Fragments, actors, backfill
├── storage_tools.py     # Hummock/compaction analysis
└── catalog_tools.py     # System catalog queries

Example Conversations

Query Data

User: Show me all tables in the public schema
Assistant: [calls show_tables]

User: What's in the orders table?
Assistant: [calls describe_table with table_name="orders"]

User: Get me the last 10 orders
Assistant: [calls run_select_query with query="SELECT * FROM orders ORDER BY created_at DESC LIMIT 10"]

Monitor Streaming Jobs

User: What's the backfill progress?
Assistant: [calls get_backfill_progress]

User: Show me the cluster status
Assistant: [calls show_cluster]

User: Are there any running jobs?
Assistant: [calls show_jobs]

Manage Objects

User: Create a materialized view that counts orders per customer
Assistant: [calls create_materialized_view with appropriate SQL]

User: Change the parallelism of mv_orders to 4
Assistant: [calls alter_mv_parallelism with mv_name="mv_orders", parallelism="4"]

User: Drop the old_source source
Assistant: [calls drop_source with source_name="old_source"]

Debug Performance

User: Explain this query: SELECT * FROM orders WHERE status = 'pending'
Assistant: [calls explain_query]

User: What's the storage usage for each table?
Assistant: [calls get_all_table_storage_stats]

User: Check for data skew in the orders table
Assistant: [calls check_vnode_distribution with table_name="orders", distribution_key="customer_id"]

Testing

The MCP server includes comprehensive testing tools:

1. Unit Tests (with mocked connections)

# Install test dependencies
pip install pytest

# Run all unit tests
pytest tests/test_tools.py -v

# Run specific test class
pytest tests/test_tools.py::TestSchemaTools -v

2. Integration Tests (requires running RisingWave)

# Set connection string
export RISINGWAVE_CONNECTION_STR="postgresql://root:root@localhost:4566/dev"

# Run all integration tests
python tests/integration_test.py

# Run specific category
python tests/integration_test.py --category schema
python tests/integration_test.py --category cluster
python tests/integration_test.py --category streaming

# Verbose output
python tests/integration_test.py -v

Available test categories: schema, source, sink, cluster, management, session, streaming, storage, catalog, connection, secret, function, user, explain, query

3. Interactive MCP Inspector

# Start interactive mode
python tests/mcp_inspector.py

# List all tools
python tests/mcp_inspector.py --list

# List tools by category
python tests/mcp_inspector.py --list --category schema

# Run a specific tool
python tests/mcp_inspector.py --tool show_tables

# Run a tool with arguments
python tests/mcp_inspector.py --tool describe_table --args '{"table_name": "orders"}'

Interactive mode commands:

mcp> list              # List all tools
mcp> list schema       # List schema tools
mcp> run show_tables   # Run a tool
mcp> run describe_table {"table_name": "orders"}  # Run with args
mcp> help show_cluster # Show tool details
mcp> quit              # Exit

4. Manual Testing with MCP CLI

If you have the MCP CLI installed:

# Test the server directly
echo '{"jsonrpc": "2.0", "method": "tools/list", "id": 1}' | python src/main.py

Contributing

Contributions are welcome! Please feel free to submit issues or pull requests.


License

This project is licensed under the Apache License 2.0 - see the LICENSE file for details.