# tutorial-java
**Repository Path**: kunjs/tutorial-java
## Basic Information
- **Project Name**: tutorial-java
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-05-29
- **Last Updated**: 2026-05-29
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
**Java后端 + MCP协议 + LLM Agent**
---
## 🎯 整体架构设计
```
┌─────────────────┐ MCP Protocol ┌─────────────────┐
│ LLM Agent │◄────JSON-RPC/SSE────►│ Java MCP Server│
│ (Claude/Copilot)│ (stdio/HTTP) │ (Spring Boot) │
└─────────────────┘ └────────┬────────┘
│
┌─────────────────────────────┼─────────────────────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Log Query │ │ Log Analyze│ │ Log Export │
│ Tool │ │ Tool │ │ Tool │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│Elasticsearch│ │ Aggregation│ │ File/JSON │
│/SQLite/Loki │ │ Engine │ │ Stream │
└─────────────┘ └─────────────┘ └─────────────┘
```
---
## 🔧 技术选型(纯Java栈)
| 模块 | 推荐方案 | 说明 |
|------|---------|------|
| **MCP SDK** | `io.modelcontextprotocol.sdk:mcp` [[1]][[4]] | 官方Java SDK,支持stdio/SSE/HTTP传输 |
| **框架集成** | `spring-ai-starter-mcp-server` [[5]][[9]] | Spring Boot注解式开发,`@McpTool`一键暴露工具 |
| **日志存储** | **SQLite** (轻量) / **Elasticsearch** (企业级) | 教学场景用SQLite零部署,生产切ES |
| **JSON处理** | Jackson (SDK内置) [[13]] | 自动序列化工具参数/结果 |
| **传输协议** | STDIO (本地调试) / SSE (远程调用) | Claude Desktop默认用stdio,Web用SSE |
---
## 🚀 最小可运行示例(15分钟出效果)
### 1️⃣ 添加依赖(pom.xml)
```xml
org.springframework.ai
spring-ai-starter-mcp-server
1.0.0-M4
org.springframework.boot
spring-boot-starter-data-jpa
org.xerial
sqlite-jdbc
3.45.1.0
```
### 2️⃣ 定义日志实体(纯JPA注解)
```java
@Entity
@Table(name = "app_logs")
public class LogEntry {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String level; // INFO/WARN/ERROR
@Column(nullable = false)
private String service; // 微服务名称
@Column(columnDefinition = "TEXT")
private String message;
@Column
private LocalDateTime timestamp;
@Column(columnDefinition = "JSON")
private String context; // 额外上下文(JSON字符串)
// getter/setter...
}
```
### 3️⃣ 创建MCP工具类(核心:@McpTool注解)
```java
@Service
@RequiredArgsConstructor
public class LogTools {
private final LogRepository logRepo; // JpaRepository
// 🔍 工具1:按条件查询日志
@McpTool(
name = "query_logs",
description = "Query application logs with filters. Returns structured JSON for LLM analysis."
)
public List queryLogs(
@McpToolParam(description = "Log level: INFO/WARN/ERROR") String level,
@McpToolParam(description = "Service name filter") String service,
@McpToolParam(description = "Time range in hours (default: 24)") Integer hours
) {
var cutoff = LocalDateTime.now().minusHours(hours != null ? hours : 24);
var specs = LogSpecs.and(
level != null ? LogSpecs.byLevel(level) : null,
service != null ? LogSpecs.byService(service) : null,
LogSpecs.afterTime(cutoff)
);
return logRepo.findAll(specs, Sort.by(Sort.Direction.DESC, "timestamp"))
.stream().limit(100) // 限制返回量防token溢出
.map(this::toSummary)
.toList();
}
// 📊 工具2:日志聚合分析(供Agent做统计)
@McpTool(name = "analyze_logs", description = "Aggregate logs by level/service for trend analysis")
public LogAnalysis analyzeLogs(@McpToolParam(description = "Group by: level/service/hour") String groupBy) {
// 使用JPA Criteria API或原生SQL实现聚合
// 返回结构化结果,LLM可直接解读
return logRepo.aggregateBy(groupBy);
}
// 📤 工具3:导出日志(供Agent生成报告)
@McpTool(name = "export_logs", description = "Export filtered logs as JSON/CSV for external use")
public ExportResult exportLogs(
@McpToolParam(description = "Export format: json/csv") String format,
@McpToolParam(description = "Max entries to export") Integer limit
) {
// 生成临时文件或直接返回流式JSON
return new ExportResult("download_url_or_inline_data", format);
}
private LogSummary toSummary(LogEntry log) {
// 精简字段,减少token消耗
return new LogSummary(log.getTimestamp(), log.getLevel(), log.getService(), log.getMessage());
}
}
```
### 4️⃣ 配置MCP服务器(application.yml)
```yaml
spring:
main:
web-application-type: none # STDIO模式必须关闭Web容器
ai:
mcp:
server:
name: "log-agent-server"
version: "1.0.0"
# STDIO传输配置(本地调试用)
stdio:
enabled: true
# 如需远程调用,启用SSE:
# protocol: SSE
# webmvc:
# path: /mcp
# 关闭控制台日志干扰STDIO通信
logging:
pattern:
console: ""
level:
root: WARN
```
### 5️⃣ 启动类
```java
@SpringBootApplication
public class LogAgentApp {
public static void main(String[] args) {
SpringApplication.run(LogAgentApp.class, args);
}
// 注册工具到MCP框架
@Bean
public List logTools(LogTools tools) {
return ToolCallbacks.from(tools); // 自动扫描@McpTool方法
}
}
```
### 6️⃣ 构建与连接测试
```bash
# 1. 打包
mvn clean package -DskipTests
# 2. 本地测试:用MCP Inspector(官方调试工具)
# 或连接Claude Desktop(配置claude_desktop_config.json):
{
"mcpServers": {
"log-agent": {
"command": "java",
"args": ["-jar", "/path/to/log-agent-app.jar"]
}
}
}
# 3. Agent对话示例:
# 👤 用户: "最近2小时有哪些ERROR级别的日志?"
# 🤖 Agent: [自动调用 query_logs(level="ERROR", hours=2)]
# 🤖 Agent: "发现3条ERROR日志:[精简结果],需要我进一步分析原因吗?"
```
---
## 📦 日志存储方案对比(按场景选择)
| 方案 | 适用场景 | 优势 | 两周教学建议 |
|------|---------|------|-------------|
| **SQLite + JPA** | 教学/原型/轻量演示 | 零部署、单文件、纯Java操作 | ✅ **首选**:聚焦MCP逻辑,避免运维复杂度 |
| **Elasticsearch** | 企业级/海量日志 | 全文检索、聚合分析、Kibana可视化 | 备选:提供docker-compose.yml一键启动 |
| **Loki + Grafana** | 云原生/K8s环境 | 轻量级、Prometheus生态集成 | 暂不推荐:需额外学习曲线 |
> 💡 **教学技巧**:先用SQLite快速跑通MCP流程,演示成功后再展示"如何切换到ES"的配置差异,体现架构扩展性。
---
## 🤖 Agent交互设计模式(关键!)
### 1. 工具描述优化(让LLM准确调用)
```java
@McpTool(
name = "query_logs",
description = """
Query application logs with precise filters.
Use this when user asks about:
- Specific error messages
- Service health status
- Time-range log review
Returns: List of {timestamp, level, service, message}
Limit: Max 100 entries per call
"""
)
```
### 2. 结果结构化(减少LLM解析负担)
```java
// 避免返回完整Entity,设计LLM友好的DTO
public record LogSummary(
LocalDateTime timestamp,
String level, // 枚举值: "INFO"|"WARN"|"ERROR"
String service, // 服务名,便于Agent分组
String message, // 精简message(截断+脱敏)
String suggestion // 可选:预置分析建议,如"建议检查数据库连接"
) {}
```
### 3. 安全与限流(生产必备)
```java
@McpTool(name = "query_logs", ...)
@PreAuthorize("hasRole('LOG_READER')") // Spring Security集成
@RateLimit(maxCalls = 10, perSeconds = 60) // 自定义限流注解
public List queryLogs(...) {
// 业务逻辑
}
```
---
## 🗓️ 两周教学/开发节奏
| 时间 | 任务 | 交付物 |
|------|------|--------|
| **D1** | 环境搭建 + SQLite集成 + JPA实体 | 可插入/查询日志的空白服务 |
| **D2** | MCP Server配置 + `@McpTool`基础工具 | `query_logs`工具可被Inspector调用 |
| **D3** | 工具参数优化 + 结果结构化 + 错误处理 | Agent能准确理解并调用工具 |
| **D4** | 多工具开发:`analyze_logs` + `export_logs` | 支持统计/导出场景 |
| **D5** | Spring Security集成 + 工具级权限控制 | 不同角色看到不同日志 |
| **D6** | 连接Claude Desktop/Copilot实测 | 完整对话演示视频 |
| **D7** | 性能优化:结果截断/缓存/异步 | 响应时间<2s |
| **D8** | 扩展:接入Elasticsearch(可选) | 展示架构演进能力 |
| **D9** | 编写Agent Prompt模板 + 演示脚本 | 标准化交付文档 |
| **D10** | 生产打包 + `java -jar`演示 | 单文件交付,开箱即用 |
---
## 📚 开源参考与资源
| 资源 | 链接 | 价值 |
|------|------|------|
| **MCP Java SDK官方示例** | [github.com/modelcontextprotocol/java-sdk](https://github.com/modelcontextprotocol/java-sdk) [[4]][[10]] | 学习`@McpTool`/传输配置/测试方法 |
| **Spring AI MCP指南** | [docs.spring.io/spring-ai/reference/api/mcp](https://docs.spring.io/spring-ai/reference/api/mcp/mcp-overview.html) [[5]] | Spring Boot集成最佳实践 |
| **Dan Vega教程** | [danvega.dev/creating-your-first-mcp-server-java](https://www.danvega.dev/blog/creating-your-first-mcp-server-java) [[11]] | 完整代码+Claude Desktop连接步骤 |
| **SQLite + JPA示例** | [github.com/xerial/sqlite-jdbc](https://github.com/xerial/sqlite-jdbc) | 零配置数据库集成参考 |
---
## ⚠️ 关键避坑指南
1. **STDIO模式必须关闭Web容器**
`spring.main.web-application-type=none` + 禁用banner/console日志,否则JSON-RPC通信会被干扰 [[11]]
2. **工具返回值要精简**
LLM有token限制,返回`List`而非`List`,message字段建议截断到200字符
3. **异步更新需用access()**
如果后台任务需推送日志到Agent,用`McpServerSession.sendNotification()`而非直接操作UI
4. **演示前必做生产打包**
`mvn clean package` 生成的JAR已包含所有依赖,`java -jar`直接运行,避免现场编译翻车
---
## 🎁 下一步:获取完整代码模板
如需以下任一资源,回复对应编号,我直接输出可克隆的工程:
1. **SQLite + MCP基础版**:含完整`@McpTool`示例 + Claude Desktop配置
2. **Elasticsearch扩展版**:docker-compose.yml + JPA Native Query聚合示例
3. **Agent Prompt模板库**:针对日志查询/分析/报告的10+个优化提示词
4. **安全加固版**:Spring Security + 工具级RBAC + 审计日志
这个方案完全满足:**纯Java注解 + 零前端 + 企业级架构 + Agent高展示度**,且所有依赖均有官方维护,教学/生产均可放心使用。