domain-mcp-server
域感知服务器,将整个微服务生态系统转化为统一的内存图。 它摄取代码和文档,提取业务逻辑、API和数据模型,并将所有内容链接为一流实体,以实现快速上下文推理。 所有知识都保存在PostgreSQL中用于长期查询,服务器公开了一个MCP接口,可以直接插入LLM工作流或其他基于MCP的工具。
目录
- list_项目 - 搜索项目 - get_class_context - get_method_context - get_stack_trace_context - get_ass_dependency - get_project_overview - get_service_api - graph_query - 仅REST端点
动机
现代后端进入了微服务和monorepos的动物园。 域mcp服务器集中了业务/域知识、链接代码、, 将文档、API和DB模型合并到LLM的单个结构化存储库中 以及工具。
这个MCP做什么
- 通过JGit进行Git克隆(浅层克隆、分支选择)
- 自动检测项目语言(Java、Node.js/TypeScript、Go)
- 基于导入的依赖图构建(无LLM)
- Per-class/module Claude API分析(语言软件提示)
- PostgreSQL支持的类、方法和端点目录
- 堆栈跟踪相关性与图增强邻居分辨率
- MCP stdio+REST双传输
支持的语言
| 语言 | 解析器 | 源根 | 入口点 |
|---|---|---|---|
Java JavaSourceParser | src/main/java | @RestController, @Controller, @KafkaListener, @Scheduled, @EventListener, @SpringBootApplication | |
| Node.js/TypeScript | NodeJsSourceParser | src NestJS @Controller,快递路线(app.get, router.post等),众所周知的文件(main.ts, index.ts, app.ts, server.ts) | |
| 去吧 | GoSourceParser | . (项目根) | func main()、HTTP处理程序注册(net/HTTP、gin、chi、echo、fiber)、gRPC服务注册 |
从项目标记文件中自动检测语言: pom.xml / build.gradle 对于Java, package.json 对于Node.js/TypeScript, go.mod 为Go。
建筑
Java 21+Spring Boot 3.3(启用MCP)\ JGit用于存储库克隆\ 每种语言源解析器(Java、Node.js/TypeScript、Go)\ Claude API(Sonnet 4.5),用于每类业务分析(语言软件提示)\ 基于导入的依赖关系图(图不需要LLM)\ PostgreSQL持久性(JDBI3)\ 用于克劳德代码集成的MCP stdio传输
与克劳德互动
连接MCP服务器后,您可以用自然语言与Claude交谈,它会自动选择合适的工具。下面是按用例组织的示例提示。
发现项目
哪些项目被编入索引?
给我看看你所知道的所有微服务。
支付服务是否已经过分析?
克劳德会打电话的 list_projects 并对结果进行总结。
在项目中搜索
在计费服务中查找与“发票”相关的所有类别。
在订单服务中搜索与“Kafka”相关的任何内容。
支付服务有哪些处理退款的课程?
克劳德会打电话的 search_project 使用项目名称和关键字。
理解一个类
什么意思 co.fanki.order.domain.OrderService 是吗?解释PaymentGatewayClient在支付服务中的用途。
告诉我关于OrderController的情况,特别是在订单服务项目中。
克劳德会打电话的 get_class_context (可选 projectName 范围界定)并解释类类型、业务描述、方法和图关系。
理解一种方法
这是什么placeOrder方法do inco.fanki.order.domain.OrderService?
解释以下业务逻辑 processRefund 在支付服务的退款服务中。哪些例外情况可以 chargeCustomer 扔?克劳德会打电话的 get_method_context 并返回描述、业务逻辑步骤、异常、HTTP端点信息和参数类型。
调查Datadog的错误
我在生产中看到PaymentDecledException。这是堆栈跟踪:\[粘贴堆栈跟踪\]
关联此Datadog错误跟踪,并告诉我出了什么问题。
我们出了个错误 co.fanki.order.domain.OrderService.placeOrder 在第92行。这段代码的作用是什么,它的依赖关系是什么?克劳德会打电话的 get_stack_trace_context 使用框架并解释执行路径中的每个步骤,标记缺失的上下文,并包含相关的依赖类。
探索依赖关系
什么意思 OrderService 依靠?导入哪些类 PaymentGatewayClient?向我展示完整的依赖关系图 co.fanki.billing.domain.InvoiceService 在计费服务中。克劳德会打电话的 get_class_dependencies 并显示传出依赖关系、传入依赖关系和方法参数类型。
获取项目概述
给我一个订单服务架构的概述。
支付服务有哪些切入点?
计费服务有多少控制器、服务和存储库?
克劳德会打电话的 get_project_overview 并总结了架构:入口点、HTTP端点、类类型分解和项目描述。
与另一个微服务集成
为端点创建Feign客户端 getStock 从股票服务。我需要打电话给支付服务 chargeCustomer 订单服务的端点。生成Feign客户端、请求DTO和响应DTO。向我展示通知服务的完整API表面,以便我可以构建集成层。
计费服务对DTO的期望是什么 createInvoice 终点?在我的项目中生成它们。克劳德会打电话的 get_service_api 和 get_method_context 检索端点详细信息(HTTP方法、路径、参数类型、响应),然后生成Feign客户端接口、DTO以及与目标服务集成所需的任何配置。
在一次对话中组合工具
你可以链接多个问题,克劳德会自动选择合适的工具:
1. 哪些项目被编入索引? 1. 在股票服务中搜索“股票”类别。 1. 我想使用 getStock 方法——它做什么,需要什么参数,我应该调用哪个端点? 1. 向我展示股票服务的完整API表面,这样我就可以构建一个Feign客户端。克劳德将链 list_projects -> search_project -> get_method_context -> get_service_api 在整个对话过程中,建立上下文。
Datadog+域MCP组合工作流
当Datadog MCP和Domain MCP服务器都连接时:
检查过去一小时内订单服务的最后10个错误跟踪,关联日志,并解释堆栈跟踪中的每个类的作用。
Claude将自动链接Datadog工具(trace_list_error_traces, log_correlate)使用域MCP工具(get_stack_trace_context, get_class_context)进行全面的根本原因分析。
MCP工具
服务器暴露 9个MCP工具 通过stdio传输。所有工具都返回JSON响应。
______________________________________________________________________
list_projects
列出所有索引项目。使用此选项检查哪些存储库已被分析,并且可用于Datadog堆栈跟踪关联。包括源自README的项目描述。
参数:无
响应字段:
| 字段 | 类型 | 描述 |
|---|---|---|
id | string | 项目ID |
name | string | 项目名称(从存储库URL派生) |
repositoryUrl | string | Git存储库URL |
basePackage | string | 通用基础包(例如。, co.fanki.order) |
description | string | README中的项目描述 |
status | 字符串 | PENDING, ANALYZING, ANALYZED, SYNCING,或 ERROR |
lastAnalyzedAt | string | ISO-8601上次分析时间戳 |
classCount | number | 索引类的数量 |
endpointCount | number | 找到的HTTP端点数 |
请求示例:
{}示例响应:
[
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "order-service",
"repositoryUrl": "git@github.com:fanki/order-service.git",
"basePackage": "co.fanki.order",
"description": "Microservice for order lifecycle management",
"status": "ANALYZED",
"lastAnalyzedAt": "2025-06-15T14:30:00Z",
"classCount": 42,
"endpointCount": 12
},
{
"id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"name": "payment-service",
"repositoryUrl": "git@github.com:fanki/payment-service.git",
"basePackage": "co.fanki.payment",
"description": "Handles payment processing and refunds",
"status": "ANALYZED",
"lastAnalyzedAt": "2025-06-14T10:00:00Z",
"classCount": 28,
"endpointCount": 8
}
]______________________________________________________________________
search_project
按部分名称搜索特定项目中的类。返回匹配的类及其类型、描述、入口点状态和源文件。当您不知道确切的完全限定名时,使用此功能可以发现项目中的类。
参数:
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
projectName | yes | string | 返回的项目名称 list_projects |
query | yes | string | 要搜索的部分类名或关键字(不区分大小写) |
响应字段:
| 字段 | 类型 | 描述 |
|---|---|---|
found | boolean | 是否找到项目 |
projectName | string | 项目名称 |
query | string | 搜索查询 |
matches | array | 匹配类 |
matches[].className | string | 完全限定类名 |
matches[].classType | string | 类类型(SERVICE, CONTROLLER, REPOSITORY, DTO等),如果未富集,则为空 |
matches[].description | string | 业务描述,如果不丰富,则为空 |
matches[].entryPoint | boolean | 类是否是入口点(控制器、监听器) |
matches[].sourceFile | string | 相对源文件路径 |
totalClassesInProject | number | 项目图中的类总数 |
message | string | 信息消息(根据错误设置) |
请求示例:
{
"projectName": "order-service",
"query": "Payment"
}示例响应:
{
"found": true,
"projectName": "order-service",
"query": "Payment",
"matches": [
{
"className": "co.fanki.order.domain.PaymentService",
"classType": "SERVICE",
"description": "Orchestrates payment processing for orders",
"entryPoint": false,
"sourceFile": "src/main/java/co/fanki/order/domain/PaymentService.java"
},
{
"className": "co.fanki.order.application.PaymentController",
"classType": "CONTROLLER",
"description": "REST endpoints for payment operations",
"entryPoint": true,
"sourceFile": "src/main/java/co/fanki/order/application/PaymentController.java"
},
{
"className": "co.fanki.order.domain.PaymentResult",
"classType": "DTO",
"description": "Result of a payment attempt",
"entryPoint": false,
"sourceFile": "src/main/java/co/fanki/order/domain/PaymentResult.java"
}
],
"totalClassesInProject": 42,
"message": null
}______________________________________________________________________
get_class_context
通过类的完全限定名获取类的业务上下文。从README返回类类型、描述、所有方法和项目描述。当Datadog在特定类中显示错误时使用此选项,以了解其目的和行为。
参数:
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
className | yes | string | 完全限定类名(例如。, co.fanki.order.OrderService) |
projectName | no | string | 将搜索范围限定到此项目(由返回 list_projects) |
响应字段:
| 字段 | 类型 | 描述 |
|---|---|---|
found | boolean | 是否找到类 |
className | string | 完全限定类名 |
classType | string | 类类型(SERVICE, CONTROLLER, REPOSITORY, DTO等等) |
description | string | 克劳德丰富的业务描述 |
projectDescription | string | README中的项目描述 |
methods | array | 此类中的方法 |
methods[].name | string | 方法名称 |
methods[].description | string | 业务描述 |
methods[].businessLogic | array | 分步业务逻辑 |
projectUrl | string | Git存储库URL |
graphInfo | object | 图形关系数据(如果没有图形,则为空) |
graphInfo.dependencies | array | 此类导入的内容(输出边) |
graphInfo.dependents | array | 导入此类的内容(传入边) |
graphInfo.entryPoint | boolean | 此类是否为入口点 |
knownProjects | array | 可用项目(未找到类时填充) |
message | string | 信息消息(未找到时设置) |
请求示例 (全局搜索):
{
"className": "co.fanki.order.domain.OrderService"
}请求示例 (仅限于一个项目):
{
"className": "co.fanki.order.domain.OrderService",
"projectName": "order-service"
}示例响应:
{
"found": true,
"className": "co.fanki.order.domain.OrderService",
"classType": "SERVICE",
"description": "Core domain service for order lifecycle management. Handles order creation, validation, and state transitions.",
"projectDescription": "Microservice for order lifecycle management",
"methods": [
{
"name": "placeOrder",
"description": "Creates a new order for a customer after validating stock and payment",
"businessLogic": [
"Validate order items against inventory",
"Calculate total with discounts",
"Reserve stock",
"Process payment via PaymentService",
"Persist order with PENDING status"
]
},
{
"name": "cancelOrder",
"description": "Cancels an existing order and releases reserved stock",
"businessLogic": [
"Load order by ID",
"Verify order is cancellable (not shipped)",
"Release reserved stock",
"Initiate refund if paid",
"Update status to CANCELLED"
]
}
],
"projectUrl": "git@github.com:fanki/order-service.git",
"graphInfo": {
"dependencies": [
"co.fanki.order.domain.OrderRepository",
"co.fanki.order.domain.PaymentService",
"co.fanki.order.domain.InventoryClient"
],
"dependents": [
"co.fanki.order.application.OrderController"
],
"entryPoint": false
},
"knownProjects": [],
"message": null
}______________________________________________________________________
get_method_context
从README获取特定方法的详细上下文,包括业务逻辑、依赖关系、异常、HTTP端点信息和项目描述。当Datadog在特定方法中显示错误时,使用此选项来了解它的作用以及它可能失败的原因。
参数:
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
className | yes | string | 完全限定类名 |
methodName | yes | string | 方法名 |
projectName | no | string | 将搜索范围限定到此项目(由返回 list_projects) |
响应字段:
| 字段 | 类型 | 描述 |
|---|---|---|
found | boolean | 是否找到该方法 |
className | string | 完全限定类名 |
methodName | string | 方法名称 |
httpEndpoint | string | HTTP端点(例如。, POST /api/orders),如果不是端点,则为null |
description | string | 业务描述 |
projectDescription | string | README中的项目描述 |
businessLogic | array | 分步业务逻辑 |
exceptions | array | 此方法可能引发的异常 |
sourceFile | string | 相对源文件路径 |
lineNumber | number | 源文件中的行号 |
projectUrl | string | Git存储库URL |
parameterTypes | array | 从项目图解析的方法参数类型 |
parameterTypes[].position | 基于数字 | 0的参数位置 |
parameterTypes[].typeName | string | 参数类型的FQCN |
knownProjects | array | 可用项目(未找到时填充) |
message | string | 信息消息(未找到时设置) |
请求示例:
{
"className": "co.fanki.order.domain.OrderService",
"methodName": "placeOrder"
}请求示例 (仅限于一个项目):
{
"className": "co.fanki.order.domain.OrderService",
"methodName": "placeOrder",
"projectName": "order-service"
}示例响应:
{
"found": true,
"className": "co.fanki.order.domain.OrderService",
"methodName": "placeOrder",
"httpEndpoint": "POST /api/orders",
"description": "Creates a new order for a customer after validating stock and payment",
"projectDescription": "Microservice for order lifecycle management",
"businessLogic": [
"Validate order items against inventory",
"Calculate total with discounts",
"Reserve stock",
"Process payment via PaymentService",
"Persist order with PENDING status"
],
"exceptions": [
"InsufficientStockException",
"PaymentDeclinedException"
],
"sourceFile": "src/main/java/co/fanki/order/domain/OrderService.java",
"lineNumber": 85,
"projectUrl": "git@github.com:fanki/order-service.git",
"parameterTypes": [
{
"position": 0,
"typeName": "co.fanki.order.domain.CreateOrderRequest"
}
],
"knownProjects": [],
"message": null
}______________________________________________________________________
get_stack_trace_context
Datadog错误关联的主要工具。 获取完整的堆栈跟踪(className/methodName/lineNumber帧数组),并返回每个帧的业务上下文,以及README中的项目描述。在从Datadog获取错误跟踪或堆栈跟踪后立即使用此功能,以了解执行路径和根本原因。
参数:
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
stackTrace | yes | array | 堆栈跟踪帧数组 |
stackTrace[].className | yes | string | 完全限定类名 |
stackTrace[].methodName | yes | string | 方法名称 |
stackTrace[].lineNumber | no | integer | 源文件中的行号 |
响应字段:
| 字段 | 类型 | 描述 |
|---|---|---|
executionPath | array | 每个堆栈帧的有序条目 |
executionPath[].order | number | 执行路径中的位置 |
executionPath[].className | string | 完全限定类名 |
executionPath[].methodName | string | 方法名称 |
executionPath[].classType | string | 类类型,如果找不到则为null |
executionPath[].description | string | 业务描述,如果找不到则为空 |
executionPath[].businessLogic | array | 分步业务逻辑 |
executionPath[].httpEndpoint | string | HTTP端点,如果不适用,则为null |
executionPath[].found | boolean | 业务上下文是否已解析 |
missingContext | array | 无法解析的帧 |
projectUrl | string | Git存储库URL |
projectDescription | string | README中的项目描述 |
relatedDependencies | array | 匹配类的图邻居(深度1) |
请求示例:
{
"stackTrace": [
{
"className": "co.fanki.order.application.OrderController",
"methodName": "createOrder",
"lineNumber": 45
},
{
"className": "co.fanki.order.domain.OrderService",
"methodName": "placeOrder",
"lineNumber": 92
},
{
"className": "co.fanki.order.domain.PaymentService",
"methodName": "processPayment",
"lineNumber": 67
},
{
"className": "org.springframework.web.servlet.DispatcherServlet",
"methodName": "doDispatch",
"lineNumber": 1067
}
]
}示例响应:
{
"executionPath": [
{
"order": 1,
"className": "co.fanki.order.application.OrderController",
"methodName": "createOrder",
"classType": "CONTROLLER",
"description": "Validates input and delegates to OrderService",
"businessLogic": ["Validate request body", "Delegate to OrderService.placeOrder"],
"httpEndpoint": "POST /api/orders",
"found": true
},
{
"order": 2,
"className": "co.fanki.order.domain.OrderService",
"methodName": "placeOrder",
"classType": "SERVICE",
"description": "Creates a new order after validating stock and payment",
"businessLogic": ["Validate items", "Calculate total", "Reserve stock", "Process payment", "Persist order"],
"httpEndpoint": null,
"found": true
},
{
"order": 3,
"className": "co.fanki.order.domain.PaymentService",
"methodName": "processPayment",
"classType": "SERVICE",
"description": "Charges the customer via the payment gateway",
"businessLogic": ["Validate card", "Call payment gateway", "Handle response"],
"httpEndpoint": null,
"found": true
},
{
"order": 4,
"className": "org.springframework.web.servlet.DispatcherServlet",
"methodName": "doDispatch",
"classType": null,
"description": null,
"businessLogic": [],
"httpEndpoint": null,
"found": false
}
],
"missingContext": [
{
"className": "org.springframework.web.servlet.DispatcherServlet",
"methodName": "doDispatch",
"lineNumber": 1067
}
],
"projectUrl": "git@github.com:fanki/order-service.git",
"projectDescription": "Microservice for order lifecycle management",
"relatedDependencies": [
{
"order": 1,
"className": "co.fanki.order.domain.OrderRepository",
"methodName": "save",
"classType": "REPOSITORY",
"description": "Persists order entities to the database",
"businessLogic": ["Insert order into orders table"],
"httpEndpoint": null,
"found": true
}
]
}______________________________________________________________________
get_class_dependencies
获取类周围的依赖关系图。返回此类导入的内容(依赖项)、导入的内容和方法参数类型。使用此方法了解类如何连接到系统的其他部分。
参数:
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
className | yes | string | 完全限定类名 |
projectName | no | string | 将搜索范围限定到此项目(由返回 list_projects) |
响应字段:
| 字段 | 类型 | 描述 |
|---|---|---|
found | boolean | 是否找到类 |
className | string | 完全限定类名 |
entryPoint | boolean | 此类是否为入口点 |
dependencies | array | 传出:这个类导入什么 |
dependencies[].className | string | 依赖关系的FQCN |
dependencies[].classType | string | 类类型,如果没有索引,则为null |
dependencies[].description | string | 业务描述,如果没有索引,则为空 |
dependents | array | 传入:导入此类的内容 |
dependents[].className | string | 依赖项的FQCN |
dependents[].classType | string | 类类型,如果没有索引,则为null |
dependents[].description | string | 业务描述,如果没有索引,则为空 |
methodParameterTypes | array | 每个方法的参数类型 |
methodParameterTypes[].methodName | string | 方法名称 |
methodParameterTypes[].parameterTypes | array | 参数类型摘要 |
message | string | 信息消息(未找到时设置) |
请求示例:
{
"className": "co.fanki.order.domain.OrderService"
}请求示例 (仅限于一个项目):
{
"className": "co.fanki.order.domain.OrderService",
"projectName": "order-service"
}示例响应:
{
"found": true,
"className": "co.fanki.order.domain.OrderService",
"entryPoint": false,
"dependencies": [
{
"className": "co.fanki.order.domain.OrderRepository",
"classType": "REPOSITORY",
"description": "Persists order entities to the database"
},
{
"className": "co.fanki.order.domain.PaymentService",
"classType": "SERVICE",
"description": "Charges the customer via the payment gateway"
}
],
"dependents": [
{
"className": "co.fanki.order.application.OrderController",
"classType": "CONTROLLER",
"description": "REST endpoints for order operations"
}
],
"methodParameterTypes": [
{
"methodName": "placeOrder",
"parameterTypes": [
{
"className": "co.fanki.order.domain.CreateOrderRequest",
"classType": "DTO",
"description": "Request payload for creating a new order"
}
]
}
],
"message": null
}______________________________________________________________________
get_project_overview
获取索引项目的结构概述。返回入口点(控制器、侦听器)、HTTP端点、类类型细分和项目描述。在深入特定类之前,使用此工具了解架构。
参数:
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
projectName | yes | string | 返回的项目名称 list_projects |
响应字段:
| 字段 | 类型 | 描述 |
|---|---|---|
found | boolean | 是否找到项目 |
projectName | string | 项目名称 |
repositoryUrl | string | Git存储库URL |
description | string | README中的项目描述 |
totalClasses | number | 索引类的总数 |
totalEntryPoints | number | 图中的入口点数量 |
classTypeBreakdown | object | 按类类型计数(例如。, {"SERVICE": 5, "CONTROLLER": 2}) |
entryPoints | array | 入口点摘要 |
entryPoints[].className | string | 入口点的FQCN |
entryPoints[].classType | string | 类类型 |
entryPoints[].description | string | 业务描述 |
entryPoints[].httpEndpoints | array | HTTP端点(例如。, ["GET /api/users", "POST /api/users"]) |
message | string | 信息消息(未找到时设置) |
请求示例:
{
"projectName": "order-service"
}示例响应:
{
"found": true,
"projectName": "order-service",
"repositoryUrl": "git@github.com:fanki/order-service.git",
"description": "Microservice for order lifecycle management",
"totalClasses": 42,
"totalEntryPoints": 3,
"classTypeBreakdown": {
"CONTROLLER": 3,
"SERVICE": 8,
"REPOSITORY": 5,
"DTO": 12,
"ENTITY": 6,
"CONFIGURATION": 2,
"OTHER": 6
},
"entryPoints": [
{
"className": "co.fanki.order.application.OrderController",
"classType": "CONTROLLER",
"description": "REST endpoints for order operations",
"httpEndpoints": [
"POST /api/orders",
"GET /api/orders/{id}",
"PUT /api/orders/{id}/cancel"
]
},
{
"className": "co.fanki.order.application.PaymentController",
"classType": "CONTROLLER",
"description": "REST endpoints for payment operations",
"httpEndpoints": [
"POST /api/payments",
"GET /api/payments/{id}/status"
]
},
{
"className": "co.fanki.order.application.OrderEventListener",
"classType": "CONTROLLER",
"description": "Kafka listener for order-related events",
"httpEndpoints": []
}
],
"message": null
}______________________________________________________________________
get_service_api
获取索引微服务的公共API表面。返回按控制器分组的所有HTTP端点,包括参数类型(DTO)、描述、业务逻辑和异常。当您需要与其他微服务集成或调用其他微服务时,请使用此功能。
参数:
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
projectName | yes | string | 返回的项目名称 list_projects |
响应字段:
| 字段 | 类型 | 描述 |
|---|---|---|
found | boolean | 项目是否已找到并具有图形数据 |
projectName | string | 项目名称 |
repositoryUrl | string | Git存储库URL |
description | string | README中的项目描述 |
controllers | array | 控制器及其HTTP端点 |
controllers[].className | string | 控制器的FQCN |
controllers[].description | string | 业务描述 |
controllers[].endpoints | array | HTTP端点 |
controllers[].endpoints[].methodName | string | Java方法名 |
controllers[].endpoints[].httpMethod | string | HTTP动词(GET, POST, PUT, DELETE) |
controllers[].endpoints[].httpPath | string | URL路径 |
controllers[].endpoints[].description | string | 业务描述 |
controllers[].endpoints[].businessLogic | array | 分步业务逻辑 |
controllers[].endpoints[].exceptions | array | 此端点可能引发的异常 |
controllers[].endpoints[].parameters | array | 已解析的参数类型 |
controllers[].endpoints[].parameters[].position | 基于数字 | 0的参数位置 |
controllers[].endpoints[].parameters[].className | string | 参数类型的FQCN |
controllers[].endpoints[].parameters[].classType | string | 类类型(例如。, DTO),如果没有索引,则为null |
controllers[].endpoints[].parameters[].description | string | 业务描述,如果没有索引,则为空 |
message | string | 信息消息(未找到时设置) |
请求示例:
{
"projectName": "order-service"
}示例响应:
{
"found": true,
"projectName": "order-service",
"repositoryUrl": "git@github.com:fanki/order-service.git",
"description": "Microservice for order lifecycle management",
"controllers": [
{
"className": "co.fanki.order.application.OrderController",
"description": "REST endpoints for order operations",
"endpoints": [
{
"methodName": "createOrder",
"httpMethod": "POST",
"httpPath": "/api/orders",
"description": "Creates a new order for a customer",
"businessLogic": [
"Validate request body",
"Delegate to OrderService.placeOrder",
"Return created order with 201"
],
"exceptions": ["InvalidOrderException"],
"parameters": [
{
"position": 0,
"className": "co.fanki.order.domain.CreateOrderRequest",
"classType": "DTO",
"description": "Request payload for creating a new order"
}
]
},
{
"methodName": "getOrder",
"httpMethod": "GET",
"httpPath": "/api/orders/{id}",
"description": "Retrieves an order by its ID",
"businessLogic": [
"Parse order ID from path",
"Query OrderRepository",
"Return 404 if not found"
],
"exceptions": ["OrderNotFoundException"],
"parameters": []
},
{
"methodName": "cancelOrder",
"httpMethod": "PUT",
"httpPath": "/api/orders/{id}/cancel",
"description": "Cancels an existing order and releases reserved stock",
"businessLogic": [
"Load order by ID",
"Verify order is cancellable",
"Delegate to OrderService.cancelOrder",
"Return updated order"
],
"exceptions": ["OrderNotFoundException", "OrderNotCancellableException"],
"parameters": []
}
]
}
],
"message": null
}______________________________________________________________________
graph_query
使用冒号分隔的DSL查询内存中的项目图。支持列出端点、类和入口点;按名称导航到任何顶点(类);子导航(方法、依赖关系、依赖项);投影修改器(+logic, +dependencies);以及存在检查(?methodName).所有查询都从内存中解析,没有数据库访问。看 图形查询DSL 获取完整的语法文档。
参数:
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
query | yes | string | 冒号分隔图查询(例如。, order-service:endpoints:+logic) |
响应字段:
| 字段 | 类型 | 描述 |
|---|---|---|
resultType | string | 结果类型(endpoints, classes, entrypoints, class, methods, method, dependencies, dependents, check) |
project | string | 项目名称 |
count | number | 结果数量 |
results | array | 结果数据(因查询类型而异) |
请求示例:
{ "query": "order-service:endpoints" }{ "query": "order-service:endpoints:+logic" }{ "query": "order-service:UserService:methods" }{ "query": "order-service:UserService:?createUser" }示例响应 (端点):
{
"resultType": "endpoints",
"project": "order-service",
"count": 2,
"results": [
{
"className": "co.fanki.order.application.OrderController",
"classType": "CONTROLLER",
"methodName": "createOrder",
"httpMethod": "POST",
"httpPath": "/api/orders",
"description": "Creates a new order"
}
]
}示例响应 (检查):
{
"resultType": "check",
"project": "order-service",
"count": 1,
"results": [
{
"className": "co.fanki.order.application.OrderController",
"check": "createOrder",
"exists": true,
"methodName": "createOrder",
"description": "Creates a new order for a customer",
"httpEndpoint": "POST /api/orders"
}
]
}______________________________________________________________________
仅REST端点
这些操作可通过REST API(端口8080)使用,但不能作为MCP工具使用。请参阅 索引项目 有关详细用法的部分。
图形查询DSL
图形查询端点(POST /api/graph/query)提供了一个冒号分隔的DSL,用于查询内存中的项目图。所有查询都完全从内存中解析,在查询时没有数据库访问。
语法
project:target[:navigation]*[:+include]*[:?check]查询是一个用冒号分隔的字符串,其中:
- 这 第一节 始终是项目名称。
- 这 第二部分 是目标:一个关键字(
endpoints,classes,entrypoints)或图中的任何顶点(类名)。 - 后续段由其前缀标记。
令牌类型
| 前缀 | 令牌类型 | 描述 |
|---|---|---|
| *(无)* | NAVIGATE | 遍历图表(例如。, methods, dependencies, UserService) |
+ | INCLUDE | 投影修改器——在响应中添加额外数据(例如。, +logic, +dependencies) |
? | CHECK | 存在谓词——检查顶点上是否存在方法(例如。, ?createUser) |
关键词
当用作第一个导航目标时,这些保留字充当列表操作:
| 关键字 | 描述 |
|---|---|
endpoints | 列出项目中的所有HTTP端点 |
classes | 列出项目中的所有类/模块 |
entrypoints | 列出入口点类(控制器、侦听器) |
任何其他值都将解析为图中的顶点(类名),并进行模糊匹配(精确、后缀、包含)。
例子
列出端点
# All HTTP endpoints in the project
curl -X POST http://localhost:8080/api/graph/query \
-H "Content-Type: application/json" \
-d '{"query": "order-service:endpoints"}'
# Endpoints with business logic included
curl -X POST http://localhost:8080/api/graph/query \
-H "Content-Type: application/json" \
-d '{"query": "order-service:endpoints:+logic"}'答复:
{
"resultType": "endpoints",
"project": "order-service",
"count": 5,
"results": [
{
"className": "co.fanki.order.application.OrderController",
"classType": "CONTROLLER",
"methodName": "createOrder",
"httpMethod": "POST",
"httpPath": "/api/orders",
"description": "Creates a new order",
"businessLogic": ["Validate input", "Delegate to OrderService"]
}
]
}列出类
# All classes
curl -X POST http://localhost:8080/api/graph/query \
-H "Content-Type: application/json" \
-d '{"query": "order-service:classes"}'
# Classes with dependencies and dependents
curl -X POST http://localhost:8080/api/graph/query \
-H "Content-Type: application/json" \
-d '{"query": "order-service:classes:+dependencies:+dependents"}'
# Classes with method summaries
curl -X POST http://localhost:8080/api/graph/query \
-H "Content-Type: application/json" \
-d '{"query": "order-service:classes:+methods"}'列出入口点
# All entry points (controllers, listeners)
curl -X POST http://localhost:8080/api/graph/query \
-H "Content-Type: application/json" \
-d '{"query": "order-service:entrypoints"}'
# Entry points with business logic on their endpoints
curl -X POST http://localhost:8080/api/graph/query \
-H "Content-Type: application/json" \
-d '{"query": "order-service:entrypoints:+logic"}'导航到顶点(类)
按名称直接导航到任何类--否 class: 需要前缀。支持简单名称、FQCN或部分匹配。
# Class overview (methods summary, dependencies, dependents)
curl -X POST http://localhost:8080/api/graph/query \
-H "Content-Type: application/json" \
-d '{"query": "order-service:OrderService"}'
# Same with fully qualified name
curl -X POST http://localhost:8080/api/graph/query \
-H "Content-Type: application/json" \
-d '{"query": "order-service:co.fanki.order.domain.OrderService"}'
# Class overview with business logic in method summaries
curl -X POST http://localhost:8080/api/graph/query \
-H "Content-Type: application/json" \
-d '{"query": "order-service:OrderService:+logic"}'答复:
{
"resultType": "class",
"project": "order-service",
"count": 1,
"results": [
{
"className": "co.fanki.order.domain.OrderService",
"classType": "SERVICE",
"description": "Core domain service for order lifecycle management",
"sourceFile": "src/main/java/co/fanki/order/domain/OrderService.java",
"entryPoint": false,
"dependencies": ["co.fanki.order.domain.OrderRepository", "co.fanki.order.domain.PaymentService"],
"dependents": ["co.fanki.order.application.OrderController"],
"methods": [
{
"methodName": "placeOrder",
"description": "Creates a new order after validating stock and payment",
"httpEndpoint": null
},
{
"methodName": "cancelOrder",
"description": "Cancels an existing order and releases reserved stock",
"httpEndpoint": null
}
]
}
]
}顶点上的子导航
# All methods of a class
curl -X POST http://localhost:8080/api/graph/query \
-H "Content-Type: application/json" \
-d '{"query": "order-service:OrderService:methods"}'
# Methods with business logic
curl -X POST http://localhost:8080/api/graph/query \
-H "Content-Type: application/json" \
-d '{"query": "order-service:OrderService:methods:+logic"}'
# Single method detail
curl -X POST http://localhost:8080/api/graph/query \
-H "Content-Type: application/json" \
-d '{"query": "order-service:OrderController:method:createOrder"}'
# Outgoing dependencies
curl -X POST http://localhost:8080/api/graph/query \
-H "Content-Type: application/json" \
-d '{"query": "order-service:OrderService:dependencies"}'
# Incoming dependents (who depends on this class)
curl -X POST http://localhost:8080/api/graph/query \
-H "Content-Type: application/json" \
-d '{"query": "order-service:OrderService:dependents"}'存在性检查(?)
检查一个类是否有特定的方法。退货 exists: true/false 找到方法细节后。
# Does OrderController have a createOrder method?
curl -X POST http://localhost:8080/api/graph/query \
-H "Content-Type: application/json" \
-d '{"query": "order-service:OrderController:?createOrder"}'方法存在时的响应:
{
"resultType": "check",
"project": "order-service",
"count": 1,
"results": [
{
"className": "co.fanki.order.application.OrderController",
"check": "createOrder",
"exists": true,
"methodName": "createOrder",
"description": "Creates a new order for a customer",
"httpEndpoint": "POST /api/orders"
}
]
}方法不存在时的响应:
{
"resultType": "check",
"project": "order-service",
"count": 1,
"results": [
{
"className": "co.fanki.order.application.OrderController",
"check": "deleteOrder",
"exists": false
}
]
}快速查阅
| 查询 | 描述 |
|---|---|
proj:endpoints | 所有HTTP端点 |
proj:endpoints:+logic | 具有业务逻辑的端点 |
proj:classes | 所有课程 |
proj:classes:+dependencies | 与即将离任的deps一起上课 |
proj:classes:+dependents | 有新学员的课程 |
proj:classes:+methods | 带有方法摘要的类 |
proj:entrypoints | 入口点(控制器、监听器) |
proj:entrypoints:+logic | 具有业务逻辑的入口点 |
proj:UserService | 课程概述 |
proj:UserService:+logic | 类概述,方法中有逻辑 |
proj:UserService:methods | 类的所有方法 |
proj:UserService:methods:+logic | 具有业务逻辑的方法 |
proj:UserService:method:create | 单一方法细节 |
proj:UserService:dependencies | 传出依赖关系 |
proj:UserService:dependents | 即将到来的家属 |
proj:UserService:?create | 检查方法 create 存在 |
安装
需求
- Java 21+
- 梅文
- PostgreSQL 14+
- SSH密钥(用于私有存储库)
- 无烟煤API键
选项A:下载最新版本
从下载最新的稳定JAR 发布页面.
选项B:从源代码构建
mvn clean package -DskipTests配置
服务器是通过中引用的环境变量配置的 application.yml.
克劳德/法学硕士
| 变量 | 默认值 | 描述 |
|---|---|---|
ANTHROPIC_API_KEY | *(空)* | 用于Claude域分析的API密钥。 |
数据库(PostgreSQL)
| 变量 | 默认值 | 描述 |
|---|---|---|
DATABASE_URL | jdbc:postgresql://host:port/db?currentSchema=domain_mcp | JDBC URL,包括模式。 |
DATABASE_USERNAME | postgres | PostgreSQL用户名。 |
DATABASE_PASSWORD | postgres | PostgreSQL密码。 |
Git/存储库访问
| 变量 | 默认值 | 描述 |
|---|---|---|
GIT_SSH_KEY_PATH | *(空)* | 克隆存储库的SSH私钥路径。 |
GIT_CLONE_BASE_PATH | /tmp/domain-mcp-repos | Git存储库克隆和缓存的目录。 |
跑步
REST API(独立)
mvn spring-boot:run使用REST端点在端口8080上启动web服务器,用于管理项目和查询上下文。
码头工人
docker build -t domain-mcp-server .
docker run -p 8080:8080 domain-mcp-serverKubernetes
使用DB、SSH密钥、LLM密钥的env变量进行部署。
索引项目
在MCP工具返回有关代码的上下文之前,您需要通过REST API对存储库进行索引。建议的设置是将分析服务作为一个独立的进程(或容器)运行,访问Claude API和SSH密钥,然后将MCP服务器指向同一个PostgreSQL数据库进行只读查询。
Swagger用户界面
服务器运行后,可以在以下位置获得完整的REST API文档:
http://localhost:8080/swagger-ui/index.htmlREST API端点
| 端点 | 方法 | 描述 |
|---|---|---|
/api/projects/analyze | POST | 分析git存储库并索引所有类和方法 |
/api/projects | GET | 列出所有已分析的项目及其元数据 |
/api/projects/{id}/rebuild-graph | POST | 在不重新运行Claude富集的情况下重建依赖关系图 |
/api/context/class/{className} | GET | 通过完全限定名获取类上下文 |
/api/context/class?className= | GET | 备选类上下文端点(查询参数) |
/api/context/method?className=&methodName= | GET | 获取具有业务逻辑和依赖关系的方法上下文 |
/api/context/stack-trace | POST | 将堆栈跟踪与业务上下文相关联 |
/api/graph/query | POST | 使用以下命令查询内存中的项目图 图形查询DSL |
/health | GET | 健康检查 |
分析存储库
要为项目建立索引,请向分析端点发送POST请求:
curl -X POST http://localhost:8080/api/projects/analyze \
-H "Content-Type: application/json" \
-d '{
"repositoryUrl": "git@github.com:fanki/order-service.git",
"branch": "main",
"fixMissed": true
}'{
"success": true,
"projectId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"classesAnalyzed": 42,
"endpointsFound": 12,
"message": "Analysis complete"
}这 fixMissed 标志(默认 true)重新分析上次运行中失败的任何类。
重建依赖关系图
如果解析器已更新,或者您想在不重新运行Claude富集的情况下刷新结构图:
curl -X POST http://localhost:8080/api/projects/{projectId}/rebuild-graph{
"success": true,
"projectId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"message": "Graph rebuilt successfully"
}推荐架构
分析服务和MCP服务器共享相同的PostgreSQL数据库,但用途不同:
+-----------------------+
| Analysis Service |
| (REST API, port 8080)|
| ANTHROPIC_API_KEY |
| GIT_SSH_KEY_PATH |
+-----------+-----------+
|
| writes
v
+-----------------------+
| PostgreSQL |
| domain_mcp schema |
+-----------+-----------+
|
| reads
v
+-----------------------+
| MCP Server (stdio) |
| Claude Code plugin |
| No API key needed |
+-----------------------+- 分析服务:作为独立服务(或Docker容器)运行。需要
ANTHROPIC_API_KEY和GIT_SSH_KEY_PATH使用Claude克隆repos并分析代码。显示端口8080上的REST API。 - MCP服务器:作为Claude Code启动的stdio进程运行。只需要数据库凭据即可读取索引数据。不需要API密钥或SSH访问。
这种分离意味着您可以运行一次分析(或按计划运行),MCP服务器保持轻量级和快速。
克劳德代码MCP设置
服务器支持 MCP标准传输 与Claude Code直接集成。MCP服务器只需要数据库凭据即可读取索引数据,而不需要Anthropic API密钥或SSH密钥(请参阅 推荐架构).
1.构建JAR
mvn clean package -DskipTests2.确保PostgreSQL正在运行
MCP服务器连接到与REST API相同的数据库。确保PostgreSQL正在运行 domain_mcp 架构存在。
3.添加到克劳德代码
选项A:CLI(推荐)
claude mcp add --transport stdio domain-mcp-server \
-e DATABASE_URL=jdbc:postgresql://localhost:5432/domain_mcp?currentSchema=domain_mcp \
-e DATABASE_USERNAME=postgres \
-e DATABASE_PASSWORD=postgres \
-- java --enable-preview -Dspring.profiles.active=mcp \
-jar /absolute/path/to/domain-mcp-server-1.7.jar使用 --scope project 仅将其添加到当前项目中,或在用户范围配置中省略它。
选项B:手动JSON配置
将此添加到您的Claude Code MCP设置中(~/.claude/settings.json 或通过 /settings 克劳德代码):
{
"mcpServers": {
"domain-mcp-server": {
"command": "java",
"args": [
"--enable-preview",
"-Dspring.profiles.active=mcp",
"-jar",
"/absolute/path/to/domain-mcp-server-1.4.jar"
],
"env": {
"DATABASE_URL": "jdbc:postgresql://localhost:5432/domain_mcp?currentSchema=domain_mcp",
"DATABASE_USERNAME": "postgres",
"DATABASE_PASSWORD": "postgres"
}
}
}
}替换 /absolute/path/to/ 使用您机器上JAR的实际路径。只需要数据库凭据——MCP服务器从由 分析服务.
4.验证连接
重新启动克劳德代码。9个域mcp服务器工具(list_projects, search_project, get_class_context, get_method_context, get_stack_trace_context, get_class_dependencies, get_project_overview, get_service_api, graph_query)应该出现在您可用的工具中。
运作原理
- 这
mcpSpring配置文件激活stdio传输并将所有日志重定向到stderr - stdout专用于JSON-RPC消息
- REST端点在端口8080上仍然可用,用于通过HTTP填充数据
- 两种传输共享相同的数据库和服务层
与Datadog MCP服务器集成
与无缝协作 Datadog MCP服务器.
关联工作流程
在调查生产错误时,Claude会自动链接两个MCP服务器:
- 数据狗MCP
trace_list_error_traces--查找服务的错误跟踪 - 数据狗MCP
log_correlate--使用日志上下文获取完整堆栈跟踪 - 域MCP
get_stack_trace_context--用业务上下文丰富每个框架(代码的作用、存在的原因、依赖关系) - 如果帧缺少上下文,
list_projects/analyze_project首先对存储库进行索引 - 域MCP
get_class_context/get_method_context--深入探究特定的类或方法
这给了你 根本原因分析 它将运行时可观察性(Datadog)与领域知识(领域mcp服务器)相结合。
数据模型
存储在PostgreSQL中(domain_mcp 模式):
projects--具有状态、图形数据(JSON)和分析元数据的git存储库source_classes--使用FQCN、类型、描述、源文件提取类source_methods--提取具有业务逻辑、依赖关系、异常和HTTP端点的方法
健康检查
最小化 "ok" / "up" 探测的HTTP端点。
路线图
额外的语言解析器(Python、Kotlin),改进的跨服务链接,更好的LLM模式。
贡献
PR欢迎。
许可证
麻省理工学院
