mirror of
https://github.com/mayswind/ezbookkeeping.git
synced 2026-05-16 07:57:33 +08:00
add mcp (Model Context Protocol) support
This commit is contained in:
@@ -0,0 +1,218 @@
|
||||
package mcp
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
|
||||
"github.com/invopop/jsonschema"
|
||||
)
|
||||
|
||||
// MCPProtocolVersion defines the type for Model Context Protocol (MCP) version
|
||||
type MCPProtocolVersion string
|
||||
|
||||
// MCP Protocol Versions
|
||||
const (
|
||||
MCPProtocolVersion20250618 MCPProtocolVersion = "2025-06-18"
|
||||
MCPProtocolVersion20250326 MCPProtocolVersion = "2025-03-26"
|
||||
MCPProtocolVersion20241105 MCPProtocolVersion = "2024-11-05"
|
||||
)
|
||||
|
||||
// LatestSupportedMCPVersion defines the latest supported version of Model Context Protocol (MCP)
|
||||
const LatestSupportedMCPVersion = MCPProtocolVersion20250618
|
||||
|
||||
// SupportedMCPVersion defines a map of supported MCP versions
|
||||
var SupportedMCPVersion = map[MCPProtocolVersion]bool{
|
||||
MCPProtocolVersion20250618: true,
|
||||
MCPProtocolVersion20250326: true,
|
||||
MCPProtocolVersion20241105: true,
|
||||
}
|
||||
|
||||
// MCPInitializeRequest defines the request structure for initializing the MCP connection
|
||||
type MCPInitializeRequest struct {
|
||||
ProtocolVersion string `json:"protocolVersion"`
|
||||
ClientInfo *MCPImplementation `json:"clientInfo"`
|
||||
}
|
||||
|
||||
// MCPInitializeResponse defines the response structure for the MCP initialization request
|
||||
type MCPInitializeResponse struct {
|
||||
ProtocolVersion string `json:"protocolVersion"`
|
||||
Capabilities *MCPCapabilities `json:"capabilities"`
|
||||
ServerInfo *MCPImplementation `json:"serverInfo"`
|
||||
}
|
||||
|
||||
// MCPCapabilities defines the capabilities of the MCP server
|
||||
type MCPCapabilities struct {
|
||||
Resources *MCPResourceCapabilities `json:"resources,omitempty"`
|
||||
Tools *MCPToolCapabilities `json:"tools,omitempty"`
|
||||
Prompts *MCPPromptCapabilities `json:"prompts,omitempty"`
|
||||
}
|
||||
|
||||
// MCPImplementation defines the client/server information structure sent in the MCP initialization request/response
|
||||
type MCPImplementation struct {
|
||||
Name string `json:"name"`
|
||||
Title string `json:"title,omitempty"`
|
||||
Version string `json:"version"`
|
||||
}
|
||||
|
||||
// MCPResourceCapabilities defines the capabilities related to resources in the MCP
|
||||
type MCPResourceCapabilities struct {
|
||||
Subscribe bool `json:"subscribe"`
|
||||
ListChanged bool `json:"listChanged"`
|
||||
}
|
||||
|
||||
// MCPToolCapabilities defines the capabilities related to tools in the MCP
|
||||
type MCPToolCapabilities struct {
|
||||
ListChanged bool `json:"listChanged"`
|
||||
}
|
||||
|
||||
// MCPPromptCapabilities defines the capabilities related to prompts in the MCP
|
||||
type MCPPromptCapabilities struct {
|
||||
ListChanged bool `json:"listChanged"`
|
||||
}
|
||||
|
||||
// MCPListResourcesResponse defines the response structure for listing resources in the MCP
|
||||
type MCPListResourcesResponse struct {
|
||||
Resources []*MCPResource `json:"resources"`
|
||||
NextCursor string `json:"nextCursor,omitempty"`
|
||||
}
|
||||
|
||||
// MCPResource defines the structure of a resource in the MCP
|
||||
type MCPResource struct {
|
||||
URI string `json:"uri"`
|
||||
Name string `json:"name"`
|
||||
Size int `json:"size,omitempty"`
|
||||
MimeType string `json:"mimeType,omitempty"`
|
||||
Title string `json:"title,omitempty"`
|
||||
Description string `json:"description,omitempty"`
|
||||
}
|
||||
|
||||
// MCPReadResourceRequest defines the request structure for reading a resource in the MCP
|
||||
type MCPReadResourceRequest struct {
|
||||
URI string `json:"uri"`
|
||||
}
|
||||
|
||||
// MCPReadResourceResponse defines the response structure for reading a resource in the MCP
|
||||
type MCPReadResourceResponse[T MCPTextResourceContents | MCPBlobResourceContents] struct {
|
||||
Contents []*T `json:"contents"`
|
||||
}
|
||||
|
||||
// MCPTextResourceContents defines the text contents structure of a resource in the MCP
|
||||
type MCPTextResourceContents struct {
|
||||
URI string `json:"uri"`
|
||||
Text string `json:"text"`
|
||||
MimeType string `json:"mimeType,omitempty"`
|
||||
}
|
||||
|
||||
// MCPBlobResourceContents defines the blob contents structure of a resource in the MCP
|
||||
type MCPBlobResourceContents struct {
|
||||
URI string `json:"uri"`
|
||||
Blob string `json:"blob"` // Base64 encoded content of the resource
|
||||
MimeType string `json:"mimeType,omitempty"`
|
||||
}
|
||||
|
||||
// MCPListToolsResponse defines the response structure for listing tools in the MCP
|
||||
type MCPListToolsResponse struct {
|
||||
Tools []*MCPTool `json:"tools"`
|
||||
NextCursor string `json:"nextCursor,omitempty"`
|
||||
}
|
||||
|
||||
// MCPTool defines the structure of a tool in the MCP
|
||||
type MCPTool struct {
|
||||
Name string `json:"name"`
|
||||
InputSchema *jsonschema.Schema `json:"inputSchema"`
|
||||
OutputSchema *jsonschema.Schema `json:"outputSchema"`
|
||||
Title string `json:"title,omitempty"`
|
||||
Description string `json:"description,omitempty"`
|
||||
}
|
||||
|
||||
// MCPCallToolRequest defines the request structure for listing tools in the MCP
|
||||
type MCPCallToolRequest struct {
|
||||
Name string `json:"name"`
|
||||
Arguments json.RawMessage `json:"arguments,omitempty"`
|
||||
}
|
||||
|
||||
// MCPCallToolResponse defines the response structure for calling a tool in the MCP
|
||||
type MCPCallToolResponse[T MCPTextContent | MCPImageContent | MCPAudioContent | MCPResourceLink | MCPEmbeddedResource] struct {
|
||||
Content []*T `json:"content"`
|
||||
IsError bool `json:"isError,omitempty"`
|
||||
}
|
||||
|
||||
// MCPTextContent defines the text content structure used in MCP
|
||||
type MCPTextContent struct {
|
||||
Type string `json:"type"`
|
||||
Text string `json:"text"`
|
||||
}
|
||||
|
||||
// MCPImageContent defines the image content structure used in MCP
|
||||
type MCPImageContent struct {
|
||||
Type string `json:"type"`
|
||||
MimeType string `json:"mimeType"`
|
||||
Data string `json:"data"` // Base64 encoded content for binary data
|
||||
}
|
||||
|
||||
// MCPAudioContent defines the audio content structure used in MCP
|
||||
type MCPAudioContent struct {
|
||||
Type string `json:"type"`
|
||||
MimeType string `json:"mimeType"`
|
||||
Data string `json:"data"` // Base64 encoded content for binary data
|
||||
}
|
||||
|
||||
// MCPResourceLink defines the resource link content structure used in MCP
|
||||
type MCPResourceLink struct {
|
||||
URI string `json:"uri"`
|
||||
Type string `json:"type"`
|
||||
Name string `json:"name"`
|
||||
Size int `json:"size,omitempty"`
|
||||
MimeType string `json:"mimeType,omitempty"`
|
||||
Title string `json:"title,omitempty"`
|
||||
Description string `json:"description,omitempty"`
|
||||
}
|
||||
|
||||
// MCPEmbeddedResource defines the embedded resource content structure used in MCP
|
||||
type MCPEmbeddedResource struct {
|
||||
Type string `json:"type"`
|
||||
Resource any `json:"resource"`
|
||||
}
|
||||
|
||||
// NewMCPTextContent creates a new instance of MCPTextContent with the given text
|
||||
func NewMCPTextContent(text string) *MCPTextContent {
|
||||
return &MCPTextContent{
|
||||
Type: "text",
|
||||
Text: text,
|
||||
}
|
||||
}
|
||||
|
||||
// NewMCPImageContent creates a new instance of MCPImageContent with the given data and MIME type
|
||||
func NewMCPImageContent(data []byte, mimeType string) *MCPImageContent {
|
||||
return &MCPImageContent{
|
||||
Type: "image",
|
||||
MimeType: mimeType,
|
||||
Data: base64.StdEncoding.EncodeToString(data),
|
||||
}
|
||||
}
|
||||
|
||||
// NewMCPAudioContent creates a new instance of MCPAudioContent with the given data and MIME type
|
||||
func NewMCPAudioContent(data []byte, mimeType string) *MCPAudioContent {
|
||||
return &MCPAudioContent{
|
||||
Type: "audio",
|
||||
MimeType: mimeType,
|
||||
Data: base64.StdEncoding.EncodeToString(data),
|
||||
}
|
||||
}
|
||||
|
||||
// NewMCPResourceLink creates a new instance of MCPResourceLink with the given parameters
|
||||
func NewMCPResourceLink(uri string, name string) *MCPResourceLink {
|
||||
return &MCPResourceLink{
|
||||
URI: uri,
|
||||
Type: "resource_link",
|
||||
Name: name,
|
||||
}
|
||||
}
|
||||
|
||||
// NewMCPEmbeddedResource creates a new instance of MCPEmbeddedResource with the given resource
|
||||
func NewMCPEmbeddedResource[T MCPTextResourceContents | MCPBlobResourceContents](resource *T) *MCPEmbeddedResource {
|
||||
return &MCPEmbeddedResource{
|
||||
Type: "resource",
|
||||
Resource: resource,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user