219 lines
7.3 KiB
Go
219 lines
7.3 KiB
Go
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,
|
|
}
|
|
}
|