Hazelcast集群管理服务器

一个开源的Model Context Protocol (MCP)服务器,使AI代理能够通过自然语言查询、写入和管理Hazelcast集群中的所有主要数据结构。

  • by bhmortim
  • Java
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 bhmortim/hazelcast-mcp

使用说明

Hazelcast客户端MCP服务器

开源 模型上下文协议(MCP) 服务器,使AI代理能够完全访问您的Hazelcast集群。Claude、Cursor、VS Code Copilot和自定义LangChain代理可以查询、编写和管理 每个主要的Hazelcast数据结构 通过自然语言。

57工具 涵盖了IMap、IQueue、IList、ISet、MultiMap、AtomicLong、ITopic、Ringbuffer、SQL和VectorCollection,以及集群发现、访问控制和三种传输选项。

Docker快速入门

零设置,包括演示数据:

# Linux / macOS
HAZELCAST_MCP_TRANSPORT=sse docker compose up --build

# Windows PowerShell
$env:HAZELCAST_MCP_TRANSPORT="sse"; docker compose up --build

这将启动一个启用Jet的Hazelcast节点,用实时流媒体馈送种子财务演示数据,并在以下位置启动MCP服务器 http://localhost:3000/mcp.

连接克劳德桌面

Claude Desktop使用stdio,因此我们与 mcp-remote (要求 Node.js 18+).

添加到您的Claude Desktop配置中:

操作系统 配置文件路径
macOS ~/Library/Application Support/Claude/claude_desktop_config.json
窗户 %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "hazelcast": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "http://localhost:3000/mcp"]
    }
  }
}

重新启动克劳德桌面。单击锤子图标以验证是否显示57个Hazelcast工具。

故障排除:

  • 没有锤子图标? 确保Docker正在运行,MCP服务器健康(docker compose ps).
  • JSON解析错误? 验证时间 Jsonlin.com.常见错误:配置块之间缺少逗号。
  • 视窗 HAZELCAST_MCP_TRANSPORT=sse 不承认? 使用PowerShell $env: 语法如上所示。

特性

工具(57次操作)

群集发现

工具 说明
list_structures 列出集群中的每个分布式对象——映射、队列、列表、集合、主题等。这是“我的集群中有什么?”工具。

IMap(14个工具)

Hazelcast核心键值存储的完整CRUD和高级操作。

工具 说明
map_get 按键获取单个条目
map_put 放置键值对(支持JSON值)
map_delete 按键删除条目
map_get_all 一次批量获取多个密钥
map_put_all 批量放置多个条目
map_size 获取条目数
map_keys 列出所有密钥(带可选限制)
map_values 列出所有值(带可选限制)
map_contains_key 检查是否存在密钥
map_clear 删除所有条目(需要 clear: true 在配置中)
map_put_if_absent 原子插入——仅在键不存在时写入
map_replace 原子替换,可选比较和设置(旧值检查)
map_entry_set 使用可选的服务器端SQL谓词过滤进行批量键值检索

SQL(4个工具)

工具 说明
sql_execute 使用参数化查询和分页运行SELECT、INSERT、UPDATE、DELETE
sql_create_mapping 为IMap创建SQL映射(启用针对它的SQL查询)
sql_drop_mapping 删除SQL映射
sql_show_mappings 列出所有活动的SQL映射

IQueue(6个工具)

用于任务处理和工作分配的分布式FIFO队列。

工具 说明
queue_offer 将项目添加到队列末尾
queue_poll 移除并归还头部物品
queue_peek 查看头部项目而不将其移除
queue_size 获取队列中的项目数
queue_drain 一次删除多个项目(批量出列)
queue_clear 删除所有项目(必需 clear: true)

IList(5个工具)

具有基于索引访问的分布式有序列表。

工具 说明
list_add 添加一个项目(可选地在特定索引处)
list_get 按索引获取项目
list_remove 按索引删除项目
list_size 获取列表长度
list_sublist 按索引获取一系列项目(从/到)

ISet(5个工具)

具有唯一性保证的分布式集合。

工具 说明
set_add 添加项目(如果已存在,则无操作)
set_remove 删除项目
set_contains 检查项目是否存在
set_size 获取设定尺寸
set_get_all 获取所有项目

MultiMap(7个工具)

每个键支持多个值的映射——非常适合标签、类别和一对多关系。

工具 说明
multimap_put 为一个键添加一个值(允许每个键有多个值)
multimap_get 获取一个键的所有值
multimap_remove 删除键的特定值或所有值
multimap_keys 列出所有密钥
multimap_values 列出所有值
multimap_size 所有按键的总输入计数
multimap_value_count 计算特定键的值

AtomicLong(5个工具)

通过CP子系统的分布式原子计数器——可线性化,在整个集群中保持一致。

工具 说明
atomic_get 获取当前值
atomic_set 设置为特定值
atomic_increment 原子递增1并返回新值
atomic_decrement 原子递减1并返回新值
atomic_compare_and_set CAS操作-仅当当前值与预期匹配时才设置新值

注: AtomicLong需要 CP子系统 在您的Hazelcast集群上启用。如果未配置CP,这些工具会优雅地报告错误。

ITopic(2个工具)

分布式发布/订阅消息。

工具 说明
topic_publish 向所有订阅者发布消息(JSON或纯文本)
topic_info 获取主题统计信息

环形缓冲区(5个工具)

固定容量循环缓冲区——非常适合审计日志、事件流和最近的历史查询。

工具 说明
ringbuffer_add 添加项目(满时覆盖最旧的项目)
ringbuffer_read 按序列号读取单个项目
ringbuffer_read_many 从起始序列中读取一批项目
ringbuffer_size 当前存储的项目数
ringbuffer_capacity 环形缓冲区的最大容量

矢量集合(4个工具)

语义相似性搜索(需要Hazelcast 5.7+/-6.0+和向量模块)。

工具 说明
vector_search 通过向量相似度查找最近邻
vector_put 存储带有向量嵌入的文档
vector_get 按关键字检索文档
vector_delete 删除文档

资源(只读集群上下文)

  • hazelcast://cluster/info --群集名称、版本、成员列表
  • hazelcast://cluster/health --连接状态和延迟
  • hazelcast://structures/list --所有类型和大小的分布式对象

提示(可重用的交互模式)

  • cache-lookup --检查缓存命中率/未命中率并给出解释
  • data-exploration --发现并采样集群数据
  • vector-search --语义相似度搜索工作流程

运输

  • 标准 --本地AI客户端的标准MCP传输(Claude Desktop、Cursor)
  • 流式HTTP --网络可访问MCP的推荐HTTP传输(协议2025-06-18)
  • SSE(传统) --较旧的HTTP服务器发送事件传输(协议2024-11-05)

示例提示

这些提示适用于Claude Desktop(或任何MCP客户端),并展示了全方位的工具。Claude会自动将自然语言翻译成正确的工具调用。

群集发现

"What data structures are in my Hazelcast cluster?"
"Show me everything in the cluster — maps, queues, lists, all of it"

地图和SQL(适用于演示数据)

"Get AAPL from the market-data map"
"Show me all keys in the trades map"
"Find Tesla trades: SELECT * FROM trades WHERE symbol='TSLA'"
"What are the top 5 trades by notional value?"
"How many buy vs sell trades? Group by side."
"Compare risk metrics for all three accounts"

队列

"Create a queue called 'work-items' and add three tasks to it"
"How many items are in the work-items queue?"
"Poll the next item from work-items"
"Peek at the head of the queue without removing it"
"Drain all remaining items"

列表和集合

"Create a list called 'watchlist' with AAPL, GOOGL, TSLA, NVDA"
"What's the third item in the watchlist?"
"Get items 0 through 3 from the watchlist"
"Create a set called 'active-symbols' and add AAPL, MSFT, AAPL — verify AAPL isn't duplicated"
"Is AMZN in the active-symbols set?"

多重映射

"Create a multimap called 'user-roles' — give user 'brian' the roles admin, editor, and viewer"
"What roles does brian have?"
"How many roles does brian have vs user 'guest'?"
"Remove the viewer role from brian"
"List all keys and values in user-roles"

原子计数器

"Create an atomic counter called 'request-count' starting at 0"
"Increment request-count 5 times and show the final value"
"Use compare-and-set: if request-count is 5, set it to 1000"

主题和Ringbuffers

"Publish an alert to the 'notifications' topic: {\"type\": \"warning\", \"message\": \"High CPU usage\"}"
"Add 5 log entries to a ringbuffer called 'audit-log'"
"Read the last 3 entries from audit-log"
"What's the capacity of the audit-log ringbuffer?"

SQL-DDL

"Show all SQL mappings in the cluster"
"Create a SQL mapping for the trades map with varchar keys and json values"
"Now query it: SELECT * FROM trades LIMIT 5"
"Drop the trades mapping"

端到端工作流

"Build me a job processing system: create a 'jobs' queue with 5 tasks, a 'completed' set to
track finished work, and a 'jobs-processed' counter. Then process 2 jobs — poll from the queue,
add to the completed set, and increment the counter each time."

"Set up a market alert system: create a 'price-alerts' multimap where each symbol can have
multiple alert thresholds. Add alerts for AAPL at 150 and 200, TSLA at 250. Then check what
alerts exist for AAPL."

"Audit everything: list all structures in the cluster, check the sizes of each map, show me the
queue depths, and give me a summary of what's in the cluster."

演示数据

Docker快速入门包括一个带有实时流媒体提要的金融交易数据集。

静态种子数据

IMap 键 内容 记录
market-data 票务符号(AAPL, GOOGL, MSFT, ...) 出价、询问、最后、打开、高、低、音量、变化、变化Pct 12个符号
trades 贸易ID(TRD-00001 – TRD-00080) 符号、侧面、数量、价格、名义、账户、状态 ~80笔交易
positions 账户符号键 净数量、侧面、平均成本、市价、未变现PnL ~15个头寸
risk-metrics 帐户ID(ACCT-HF-001, ACCT-HF-002, ACCT-AM-003) 总风险敞口、VaR95、VaR99、夏普比率、最大提款、贝塔 3个账户

符号: AAPL、GOOGL、MSFT、AMZN、TSLA、JPM、GS、NVDA、META、NFLX、BAC、INTC

实时数据馈送

IMap 源 API密钥? 间隔
crypto CoinGecko 否 30s
stocks 阿尔法优势 是(免费) 5m
news 新闻API 是(免费) 10m
market-insights 喷射管道(内部) 无 5m

加密货币开箱即用。 股票和新闻是可选的:

ALPHA_VANTAGE_API_KEY=your_key NEWS_API_KEY=your_key HAZELCAST_MCP_TRANSPORT=sse docker compose up --build

免费API密钥: 阿尔法优势 (每天需要25次)· 新闻API (每天100个要求)

快速入门(无Docker)

先决条件

  • Java 17+
  • 正在运行的Hazelcast集群(建议5.5+/5.6)

构建

./mvnw clean package -DskipTests

配置

创建 hazelcast-mcp.yaml:

hazelcast:
  cluster:
    name: "dev"
    members:
      - "127.0.0.1:5701"

mcp:
  server:
    name: "hazelcast-mcp-server"
    version: "1.0.0"
    transport: "stdio"    # or "sse" for Streamable HTTP, "sse-legacy" for legacy SSE
    http:
      port: 3000
      host: "0.0.0.0"

access:
  mode: "all"
  operations:
    sql: true
    write: true
    clear: false

使用Claude Desktop(stdio)运行

{
  "mcpServers": {
    "hazelcast": {
      "command": "java",
      "args": ["-jar", "/path/to/hazelcast-mcp-server-1.0.0-SNAPSHOT.jar"],
      "env": {
        "HAZELCAST_MCP_CLUSTER_NAME": "dev",
        "HAZELCAST_MCP_CLUSTER_MEMBERS": "127.0.0.1:5701"
      }
    }
  }
}

使用Claude Desktop运行(可流式HTTP)

# Start server
HAZELCAST_MCP_TRANSPORT=sse java -jar hazelcast-mcp-server-1.0.0-SNAPSHOT.jar
{
  "mcpServers": {
    "hazelcast": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "http://localhost:3000/mcp"]
    }
  }
}

使用光标运行

添加 .cursor/mcp.json:

{
  "mcpServers": {
    "hazelcast": {
      "command": "java",
      "args": ["-jar", "/path/to/hazelcast-mcp-server-1.0.0-SNAPSHOT.jar"]
    }
  }
}

Docker+stdio(替代方案)

{
  "mcpServers": {
    "hazelcast": {
      "command": "docker",
      "args": ["exec", "-i", "hazelcast-mcp-server",
               "java", "-Xmx512m", "-cp", "hazelcast-mcp-server.jar",
               "com.hazelcast.mcp.server.HazelcastMcpServer",
               "/app/hazelcast-mcp.yaml"]
    }
  }
}

配置参考

环境变量

变量 描述 默认值
HAZELCAST_MCP_CLUSTER_NAME 群集名称 dev
HAZELCAST_MCP_CLUSTER_MEMBERS 逗号分隔的成员地址 127.0.0.1:5701
HAZELCAST_MCP_SECURITY_USERNAME 身份验证用户名 (空)
HAZELCAST_MCP_SECURITY_PASSWORD 身份验证密码 (空)
HAZELCAST_MCP_SECURITY_TOKEN 基于令牌的身份验证 (空)
HAZELCAST_MCP_TRANSPORT 运输: stdio, sse,或 sse-legacy stdio
HAZELCAST_MCP_ACCESS_MODE 访问控制: all, allowlist, denylist all
ALPHA_VANTAGE_API_KEY Alpha Vantage API实时股票数据密钥 (已禁用)
NEWS_API_KEY 实时财经新闻的NewsAPI密钥 (已禁用)

访问控制

限制哪些数据结构和操作暴露给AI代理:

access:
  mode: "allowlist"          # "all" (default), "allowlist", or "denylist"
  allowlist:
    maps: ["session-cache", "user-profiles"]
    vectors: ["document-embeddings"]
    queues: ["task-queue"]
    lists: []                # empty = allow all
    sets: []
    multimaps: []
    topics: []
    ringbuffers: []
    atomics: []
  denylist:                  # used when mode is "denylist"
    maps: ["internal-config"]
    queues: ["system-queue"]
  operations:
    sql: true
    write: false             # read-only mode
    clear: false             # destructive ops require explicit enable

建筑

AI Agent (Claude, Cursor, etc.)
    │ MCP Protocol (stdio or Streamable HTTP)
    ▼
Hazelcast Client MCP Server
    ├── MapTools         (14)  — IMap CRUD + atomic ops + predicate queries
    ├── SqlTools          (4)  — SQL DML/DDL with parameterized queries
    ├── QueueTools        (6)  — IQueue offer/poll/drain/clear
    ├── CollectionTools  (10)  — IList + ISet operations
    ├── MultiMapTools     (7)  — Multi-value map operations
    ├── AtomicTools       (5)  — CP Subsystem atomic counters
    ├── TopicTools        (2)  — Pub/sub messaging
    ├── RingbufferTools   (5)  — Circular buffer read/write
    ├── VectorTools       (4)  — Semantic similarity search
    ├── ClusterResources  (3)  — Read-only cluster context
    ├── AccessController       — Per-structure allowlist/denylist + operation gating
    └── Transport Layer        — stdio / Streamable HTTP / legacy SSE (Jetty 12)
            │ Hazelcast Binary Protocol
            ▼
    Hazelcast Cluster (5.5+)

技术栈

  • 语言:Java 17+
  • MCP-SDK: MCP Java SDK v1.0.0 GA(杰克逊2.x)
  • MCP协议:2025-06-18(流式HTTP),2024-11-05(传统SSE)
  • Hazelcast客户端:5.6(与5.5+兼容)
  • 运输:stdio(本地),通过嵌入式Jetty 12流式传输HTTP/传统SSE
  • 构建:Maven通过胖JAR maven-shade-plugin
  • 码头工人:多阶段构建(eclipse-temurin:17),撰写快速入门
  • 实时数据:CoinGecko、Alpha Vantage、与Hazelcast Jet合作的NewsAPI
  • 经过测试:克劳德桌面+ mcp-remote 0.1.37(Windows和macOS)

已知问题

  • Jackson 3.x类路径冲突。 MCP SDK 1.0.0可传递地包括 mcp-json-jackson3 这带来了杰克逊3.x,导致 NoSuchFieldError: POJO 在运行时。本项目不包括 mcp-json-jackson3 在 pom.xml 并使用 mcp-json-jackson2 只有。如果您进行分叉或升级,请保留此排除。
  • AtomicLong需要CP子系统。 如果集群上未启用CP,则5个原子工具将返回描述性错误消息,而不是默默失败。

许可证

Apache许可证2.0