使用说明
会话化MCP服务器
用于访问的MCP服务器 会话 事件数据——演讲者、会话和日程——来自任何兼容MCP的AI助手(Claude Desktop、Claude Code、Cursor、Windsurf、VS Code……)。
内置于 Quarkus 3.33+Java 25+Quarkus MCP服务器1.13,作为小型本地可执行文件(Mandrel)分发,并通过 npx mcp-sessionize.
特征
工具
| 工具 | 说明 |
|---|---|
sessionize_get_speakers |
列出所有发言者(分页) |
sessionize_find_speaker |
按姓名搜索演讲者(分页) |
sessionize_get_sessions_by_speaker |
列出发言者介绍的会议 |
sessionize_get_sessions |
已确认的非服务会话列表(分页) |
sessionize_find_session |
按标题/描述搜索会话(分页) |
sessionize_get_schedule |
按日期和时间段获取活动日程 |
工具名称使用 sessionize_ 前缀(snake_case),以避免与其他MCP服务器一起使用时发生冲突。所有工具均标注为 只读 和 幂等 (@Tool.Annotations),所以MCP客户端知道他们永远不会改变状态。列表工具接受 limit (默认值25,最大值100)和 offset 参数并返回分页元数据。
提示
| 提示 | 描述 |
|---|---|
event_overview |
会议概述(发言者/会议次数、主题) |
find_speaker_info |
关于演讲者的详细信息 |
sessions_by_topic |
查找关于某个主题/技术的会话 |
conference_schedule |
按天和时间列出的完整时间表 |
speaker_sessions |
一位发言者主持的会议 |
recommend_sessions |
基于兴趣的会议建议 |
MCP的工作原理——架构与概念
简短的入门 为什么 此服务器的形状是这样的。MCP服务器是 不 只是一个API代理-它公开 能力 通过三个不同的基元,每个基元都有自己的 控制模型 (谁决定何时运行)。
体系结构
MCP遵循 host → 客户→ 服务器 模型。主机(AI应用程序)每台服务器运行一个客户端;每个服务器都通过JSON-RPC公开其功能。服务器可以是本地(STDIO)或远程(HTTP)。
graph LR
subgraph Host["AI Application (Host)"]
LLM[LLM]
C[MCP Client]
LLM --- C
end
subgraph Server["Sessionize MCP Server"]
T[Tools]
P[Prompts]
R[Resources]
end
API[("Sessionize API")]
C -- JSON-RPC --> Server
T <--> API
R <--> API
三个原语(以及谁控制它们)
这是核心思想: 工具是模型可以调用的函数,而不是数据库行。 按以下方式选择图元 谁 应该驾驶它。
| 原始 | 控制模型 | 目的 | 类比 | 在本服务器中 |
|---|---|---|---|---|
| 工具 | 模型受控 --LLM根据对话决定何时调用它们 | 行动/能力:按需执行操作、计算、查询 | 函数调用/ POST |
findSpeaker, getSchedule…--模型 主动搜索 事件 |
| 资源 | 应用程序受控 --主机决定加载什么上下文 | 数据/上下文:公开由URI | 文件寻址的可读内容/ GET |
(候选人) 例如 sessionize://{eventId}/speakers 作为可附加的上下文 |
| 提示 | 用户控制 --用于显式用户选择(例如斜线命令) | 模板/工作流:引导式、可重用的交互 | 已保存的命令 | event_overview, recommend_sessions… |
所以“工具必须包含功能,而不仅仅是API调用”是正确的。 一个好的工具映射到 模型想要完成的任务 (
findSpeaker by name,getSessionsBySpeaker),具有清晰的描述、类型化的参数和行为提示-即使在后台它碰巧调用了RESTneneneba API。如果你的工具是 “将此原始数据集作为上下文返回” 不涉及任何决定,这是一个 资源不是工具。如果是 “用户触发的预设多步交互”,这是一个 提示.
超越三:更丰富的能力
MCP 1.13也支持服务器↔使工具不止一次调用的客户端交互:
- 采样 --服务器询问 主人的 LLM生成文本(代理循环)——总是有人在循环中。
- 启发 --工具在执行过程中暂停,要求用户提供额外的输入。
- 进度和取消 --长时间运行的工具可以报告进度并被取消。
- 根 -客户端告诉服务器它可以在哪个文件系统/URI作用域中操作。
此服务器当前使用 工具+提示资源、采样和启发是自然的下一步。
先决条件
到 使用 服务器(推荐路径)
| 要求 | 为什么 |
|---|---|
Node.js 18+ (npx) 或 Docker |
启动预构建的服务器 |
| A. 会话事件ID | 您要公开其数据的事件(如何获得它) |
| MCP客户端 | 克劳德桌面、克劳德代码、光标、风帆、VS代码 |
这 npx Docker发行版捆绑了一个本机二进制文件-- 不需要JDK 跑步。
到 从源代码构建
| 要求 | 版本 | 注释 |
|---|---|---|
| Java开发工具包 | 25 (LTS) | 必填:项目使用 maven.compiler.release=25JEP 511模块导入,以及JDK 23+中引入的JVM标志。Java≤21将无法构建。 |
| Maven | 捆绑 | 使用附带的包装器 ./mvnw (Maven 3.9.x)。不要使用全局 mvn. |
| 主轴 / GraalVM 25 | 可选 | 仅需要 -Dnative 建筑。 sdk install java 25-graalce 作品。 |
| Docker | 可选 | 只需要构建容器镜像。 |
⚠️
JAVA_HOME明白了。./mvnw偏爱JAVA_HOME在...之上java在你PATH.如果JAVA_HOME指向Java≤21,构建失败Unrecognized option: --sun-misc-unsafe-memory-access=allow.指向JDK 25:export JAVA_HOME="$HOME/.sdkman/candidates/java/current" # e.g. sdkman 25-graalce ./mvnw verify
获取您的活动ID
- 登录 会话.
- 选择您的活动→ API/嵌入 → 启用 API.
- 从URL复制事件ID:
https://sessionize.com/api/v2/{EVENT_ID}/view/All.
通过设置 SESSIONIZE_EVENT_ID 环境变量(默认事件)或传递 eventId 直接在任何工具调用中。
安装
克劳德桌面
添加 ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)或 %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"sessionize": {
"command": "npx",
"args": ["-y", "mcp-sessionize"],
"env": {
"SESSIONIZE_EVENT_ID": "your-event-id"
}
}
}
}
克劳德代码
claude mcp add sessionize -e SESSIONIZE_EVENT_ID="your-event-id" -- npx -y mcp-sessionize
光标/风帆/VS代码
| 编辑器 | 配置文件 |
|---|---|
| 光标 | ~/.cursor/mcp.json |
| 风帆冲浪 | ~/.codeium/windsurf/mcp_config.json |
| VS代码 | code --add-mcp '{"name":"sessionize","command":"npx","args":["-y","mcp-sessionize"],"env":{"SESSIONIZE_EVENT_ID":"your-event-id"}}' |
码头工人
图像进入 HTTP模式 (流式HTTP在 /mcp苏格兰和南方能源公司 /mcp/sse):
docker run -i --rm -p 8080:8080 \
-e SESSIONIZE_EVENT_ID=your-event-id \
ghcr.io/jeanlopezxyz/mcp-sessionize
配置
环境变量
| 变量 | 默认值 | 适用于 | 描述 |
|---|---|---|---|
SESSIONIZE_EVENT_ID |
(空) | all | 工具调用省略时的默认事件ID eventId. |
PORT |
8080 |
HTTP/SSE | HTTP传输端口(%sse 配置文件/Docker)。 |
QUARKUS_MCP_SERVER_STDIO_ENABLED |
true |
全部 | false 禁用STDIO(Docker镜像设置了此项)。 |
QUARKUS_HTTP_CORS_ORIGINS |
* |
HTTP/SSE | 允许的CORS源。 限制生产。 |
Sessionize REST客户端使用10秒的连接超时和30秒的读取超时,并强制不使用缓存标头。
运输和概况
服务器从活动的Quarkus配置文件(在中配置)中选择其传输 application.properties):
| 模式 | 如何激活 | 传输 | 端点 |
|---|---|---|---|
| 工作室 (默认) | 不带配置文件运行 | stdio | stdin/stdout |
| HTTP/SSE | %sse 个人资料(-Dquarkus.profile=sse)或Docker镜像 |
流式HTTP+SSE | /mcp, /mcp/sse |
| 开发 | ./mvnw quarkus:dev |
HTTP+实时重新加载 | /mcp |
STDIO注释。 在STDIO模式下,Quarkus已经将控制台日志重定向到 标准错误 并将stdout设置为null,这样日志就不会损坏JSON-RPC流。默认配置文件使用
quarkus.log.level=WARN(错误在调试时保持可见),横幅已禁用。从不写信给System.out来自工具/提示代码。
安全
MCP赋予AI模型以下能力 行动,因此安全性是设计的一部分,而不是事后的想法。规范定义了四个 信任与安全原则:
- 用户同意和控制 --用户必须了解并批准访问的数据和运行的操作。
- 数据隐私 --不要暴露或传输超出所需范围的数据。
- 工具安全 --工具描述和结果如下 不可信的 直至核实;总有一个 人在回路 能够拒绝调用。
- 取样控制 --如果服务器要求主机的LLM生成(采样),用户将保持控制。
MCP服务器何时需要加固?
这要看情况 运输和暴露,而不仅仅是数据:
| 场景 | 曝光 | 它需要什么 |
|---|---|---|
| 本地STDIO (Claude Desktop/Code) | 作为主机的子进程运行,作为您的操作系统用户。没有网络侦听器。 | 输入验证,无秘密泄露,正常超时。认证通常是不必要的(信任=本地用户)。 |
| 远程HTTP/SSE (Docker,共享主机) | 监听端口;可通过网络访问 | 添加身份验证 (OAuth2/承载令牌), 限制CORS (没有 *), 速率限制, TLS/HTTPS,并请求大小限制。 |
经验法则: 当服务器停止作为本地stdio子级并开始侦听套接字时,它就变成了API并需要API级别的安全性。
服务器端职责(根据MCP规范)
- 验证所有工具输入 在使用之前(永远不要相信模型中的参数)。
- 对输出进行消毒/编码;不要泄漏堆栈痕迹或内部错误。
- 访问控制和权限检查 用于敏感操作和资源URI。
- 速率限制 调用和设置 超时.
- 永远不要硬编码秘密 --使用env-vars/a秘密管理器。
如何 这 服务器应用它们
| 问题 | 实施 |
|---|---|
| 输入验证 | sanitizeEventId 在其到达API之前剥离所有非α-姜黄(防止路径/URL注入);已检入所需的参数 validateAndExecute. |
| 最小特权/诚实 | 所有工具都是 readOnlyHint=true, destructiveHint=false --它们只能读取公共Sessionize数据。 |
| 无数据泄露 | extractErrorMessage 将HTTP状态代码映射到友好消息,而不是显示原始异常或堆栈跟踪。 |
| 代码中没有秘密 | 唯一的配置是 SESSIONIZE_EVENT_ID (一个环境变量);会话API是公共的,不需要密钥。 |
| 超时 | REST客户端:10秒连接/30秒读取——挂起的上游无法阻止服务器。 |
远程(HTTP)部署强化检查表
- []将身份验证放在前面
/mcp(反向代理或OAuth2)。 - []替换
QUARKUS_HTTP_CORS_ORIGINS=*带有明确的允许列表。 - []添加速率限制(网关或Quarkus过滤器)。
- []终止TLS(HTTPS)并设置请求大小限制。
使用示例
"Show me all speakers"
"Find speaker John Doe"
"What sessions does Jane Smith have?"
"List all sessions about Kubernetes"
"What's the schedule?"
从源代码构建
# Always export a JDK 25 first (see Prerequisites)
export JAVA_HOME="$HOME/.sdkman/candidates/java/current"
./mvnw verify # Build + run tests (this is what CI runs)
./mvnw package # JVM build → target/quarkus-app/
./mvnw package -Dnative # Native executable → target/*-runner (needs Mandrel/GraalVM 25)
docker build -t mcp-sessionize . # Multi-stage native container image
运行本地构建
# JVM
java -jar target/quarkus-app/quarkus-run.jar
# Native binary (STDIO)
./target/mcp-sessionize-*-runner
# Native binary (HTTP/SSE on :8080)
./target/mcp-sessionize-*-runner -Dquarkus.profile=sse
发展
./mvnw quarkus:dev # Dev mode: HTTP enabled, DEBUG logs, live reload
./mvnw test # Unit tests only
./mvnw test -Dtest=SessionizeToolTest # Single test class
./mvnw test -Dtest=SessionizeToolTest#testGetSchedule # Single test method
与MCP检查员一起检查
npx @modelcontextprotocol/inspector java -jar target/quarkus-app/quarkus-run.jar
技术栈
- Java 25 (LTS)+ 心轴25 (本地)
- Quarkus 3.33.2
- Quarkus MCP服务器1.13.0 (MCP规范
2025-11-25)--通过管理的版本quarkus-mcp-server-bom