mcp

package
v0.0.0-...-69c762e Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 1, 2025 License: Apache-2.0 Imports: 12 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	InitializeResponse = mcp.InitializeResponse{
		ProtocolVersion: mcp.ProtocolVersion,
		Capabilities:    mcp.DefaultCapabilities,
		ServerInfo: mcp.ServerInfo{
			Name:    "chatlog",
			Version: "0.0.1",
		},
	}

	ToolContact = mcp.Tool{
		Name:        "query_contact",
		Description: "查询用户的联系人信息。可以通过姓名、备注名或ID进行查询,返回匹配的联系人列表。当用户询问某人的联系方式、想了解联系人信息或需要查找特定联系人时使用此工具。参数为空时,将返回联系人列表",
		InputSchema: mcp.ToolSchema{
			Type: "object",
			Properties: mcp.M{
				"keyword": mcp.M{
					"type":        "string",
					"description": "联系人的搜索关键词,可以是姓名、备注名或ID。",
				},
			},
			Required: []string{"keyword"},
		},
	}

	ToolChatRoom = mcp.Tool{
		Name:        "query_chat_room",
		Description: "查询用户参与的群聊信息。可以通过群名称、群ID或相关关键词进行查询,返回匹配的群聊列表。当用户询问群聊信息、想了解某个群的详情或需要查找特定群聊时使用此工具。",
		InputSchema: mcp.ToolSchema{
			Type: "object",
			Properties: mcp.M{
				"keyword": mcp.M{
					"type":        "string",
					"description": "群聊的搜索关键词,可以是群名称、群ID或相关描述",
				},
			},
			Required: []string{"keyword"},
		},
	}

	ToolRecentChat = mcp.Tool{
		Name:        "query_recent_chat",
		Description: "查询最近会话列表,包括个人聊天和群聊。当用户想了解最近的聊天记录、查看最近联系过的人或群组时使用此工具。不需要参数,直接返回最近的会话列表。",
		InputSchema: mcp.ToolSchema{
			Type:       "object",
			Properties: mcp.M{},
		},
	}

	ToolChatLog = mcp.Tool{
		Name: "chatlog",
		Description: `检索历史聊天记录,可根据时间、对话方、发送者和关键词等条件进行精确查询。当用户需要查找特定信息或想了解与某人/某群的历史交流时使用此工具。

【强制多步查询流程!】
当查询特定话题或特定发送者发言时,必须严格按照以下流程使用,任何偏离都会导致错误的结果:

步骤1: 初步定位相关消息
- 使用keyword参数查找特定话题
- 使用sender参数查找特定发送者的消息
- 使用较宽时间范围初步查询

步骤2: 【必须执行】针对每个关键结果点分别获取上下文
- 必须对步骤1返回的每个时间点T1, T2, T3...分别执行独立查询(时间范围接近的消息可以合并为一个查询)
- 每次独立查询必须移除keyword参数
- 每次独立查询必须移除sender参数
- 每次独立查询使用"Tn前后15-30分钟"的窄范围
- 每次独立查询仅保留talker参数

步骤3: 【必须执行】综合分析所有上下文
- 必须等待所有步骤2的查询结果返回后再进行分析
- 必须综合考虑所有上下文信息后再回答用户

【严格执行规则!】
- 禁止仅凭步骤1的结果直接回答用户
- 禁止在步骤2使用过大的时间范围一次性查询所有上下文
- 禁止跳过步骤2或步骤3
- 必须对每个关键结果点分别执行独立的上下文查询

【执行示例】
正确流程示例:
1. 步骤1: chatlog(time="2023-04-01~2023-04-30", talker="工作群", keyword="项目进度")
   返回结果: 4月5日、4月12日、4月20日有相关消息
2. 步骤2:
   - 查询1: chatlog(time="2023-04-05/09:30~2023-04-05/10:30", talker="工作群") // 注意没有keyword
   - 查询2: chatlog(time="2023-04-12/14:00~2023-04-12/15:00", talker="工作群") // 注意没有keyword
   - 查询3: chatlog(time="2023-04-20/16:00~2023-04-20/17:00", talker="工作群") // 注意没有keyword
3. 步骤3: 综合分析所有上下文后回答用户

错误流程示例:
- 仅执行步骤1后直接回答
- 步骤2使用time="2023-04-01~2023-04-30"一次性查询
- 步骤2仍然保留keyword或sender参数

【自我检查】回答用户前必须自问:
- 我是否对每个关键时间点都执行了独立的上下文查询?
- 我是否在上下文查询中移除了keyword和sender参数?
- 我是否分析了所有上下文后再回答?
- 如果上述任一问题答案为"否",则必须纠正流程

返回格式:"昵称(ID) 时间\n消息内容\n昵称(ID) 时间\n消息内容"
当查询多个Talker时,返回格式为:"昵称(ID)\n[TalkerName(Talker)] 时间\n消息内容"

重要提示:
1. 当用户询问特定时间段内的聊天记录时,必须使用正确的时间格式,特别是包含小时和分钟的查询
2. 对于"今天下午4点到5点聊了啥"这类查询,正确的时间参数格式应为"2023-04-18/16:00~2023-04-18/17:00"
3. 当用户询问具体群聊中某人的聊天记录时,使用"sender"参数
4. 当用户询问包含特定关键词的聊天记录时,使用"keyword"参数`,
		InputSchema: mcp.ToolSchema{
			Type: "object",
			Properties: mcp.M{
				"time": mcp.M{
					"type": "string",
					"description": `指定查询的时间点或时间范围,格式必须严格遵循以下规则:

【单一时间点格式】
- 精确到日:"2023-04-18"或"20230418"
- 精确到分钟(必须包含斜杠和冒号):"2023-04-18/14:30"或"20230418/14:30"(表示2023年4月18日14点30分)

【时间范围格式】(使用"~"分隔起止时间)
- 日期范围:"2023-04-01~2023-04-18"
- 同一天的时间段:"2023-04-18/14:30~2023-04-18/15:45"
  * 表示2023年4月18日14点30分到15点45分之间

【重要提示】包含小时分钟的格式必须使用斜杠和冒号:"/"和":"
正确示例:"2023-04-18/16:30"(4月18日下午4点30分)
错误示例:"2023-04-18 16:30"、"2023-04-18T16:30"

【其他支持的格式】
- 年份:"2023"
- 月份:"2023-04"或"202304"`,
				},
				"talker": mcp.M{
					"type": "string",
					"description": `指定对话方(联系人或群组)
- 可使用ID、昵称或备注名
- 多个对话方用","分隔,如:"张三,李四,工作群"
- 【重要】这是多步查询中唯一应保留的参数`,
				},
				"sender": mcp.M{
					"type": "string",
					"description": `指定群聊中的发送者
- 仅在查询群聊记录时有效
- 多个发送者用","分隔,如:"张三,李四"
- 可使用ID、昵称或备注名
【重要】查询特定发送者的消息时:
  1. 第一步:使用sender参数初步定位多个相关消息时间点
  2. 后续步骤:必须移除sender参数,分别查询每个时间点前后的完整对话
  3. 错误示例:对所有找到的消息一次性查询大范围上下文
  4. 正确示例:对每个时间点T分别执行查询"T前后15-30分钟"(不带sender)`,
				},
				"keyword": mcp.M{
					"type": "string",
					"description": `搜索内容中的关键词
- 支持正则表达式匹配
- 【重要】查询特定话题时:
  1. 第一步:使用keyword参数初步定位多个相关消息时间点
  2. 后续步骤:必须移除keyword参数,分别查询每个时间点前后的完整对话
  3. 错误示例:对所有找到的关键词消息一次性查询大范围上下文
  4. 正确示例:对每个时间点T分别执行查询"T前后15-30分钟"(不带keyword)`,
				},
			},
			Required: []string{"time", "talker"},
		},
	}

	ToolCurrentTime = mcp.Tool{
		Name: "current_time",
		Description: `获取当前系统时间,返回RFC3339格式的时间字符串(包含用户本地时区信息)。
使用场景:
- 当用户询问"总结今日聊天记录"、"本周都聊了啥"等当前时间问题
- 当用户提及"昨天"、"上周"、"本月"等相对时间概念,需要确定基准时间点
- 需要执行依赖当前时间的计算(如"上个月5号我们有开会吗")
返回示例:2025-04-18T21:29:00+08:00
注意:此工具不需要任何输入参数,直接调用即可获取当前时间。`,
		InputSchema: mcp.ToolSchema{
			Type:       "object",
			Properties: mcp.M{},
		},
	}

	ResourceRecentChat = mcp.Resource{
		Name:        "最近会话",
		URI:         "session://recent",
		Description: "获取最近的聊天会话列表",
	}

	ResourceTemplateContact = mcp.ResourceTemplate{
		Name:        "联系人信息",
		URITemplate: "contact://{username}",
		Description: "获取指定联系人的详细信息",
	}

	ResourceTemplateChatRoom = mcp.ResourceTemplate{
		Name:        "群聊信息",
		URITemplate: "chatroom://{roomid}",
		Description: "获取指定群聊的详细信息",
	}

	ResourceTemplateChatlog = mcp.ResourceTemplate{
		Name:        "聊天记录",
		URITemplate: "chatlog://{talker}/{timeframe}?limit,offset",
		Description: "获取与特定联系人或群聊的聊天记录",
	}
)

MCPTools 和资源定义

Functions

This section is empty.

Types

type Service

type Service struct {
	// contains filtered or unexported fields
}

func NewService

func NewService(ctx *ctx.Context, db *database.Service) *Service

func (*Service) GetMCP

func (s *Service) GetMCP() *mcp.MCP

GetMCP 获取底层MCP实例

func (*Service) HandleMessages

func (s *Service) HandleMessages(c *gin.Context)

func (*Service) HandleSSE

func (s *Service) HandleSSE(c *gin.Context)

func (*Service) Start

func (s *Service) Start() error

Start 启动MCP服务

func (*Service) Stop

func (s *Service) Stop() error

Stop 停止MCP服务

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL