公告

任何建议或需求可联系我!


Skip to content

自动补全

completion/complete MCP 方法使服务器能够为提示词和资源模板提供参数补全。这帮助客户端在用户填写提示词参数或资源模板参数时提供自动补全建议。

启用补全

要支持补全,请在创建服务器时启用该能力:

go
s := server.NewMCPServer("Completion Server", "1.0.0",
    server.WithPromptCapabilities(true),
    server.WithResourceCapabilities(true, true),
    server.WithCompletions(), // 启用补全能力
)

启用后,客户端可以发送 completion/complete 请求并接收提示词参数和资源模板参数的建议值。

提示词补全提供程序

实现 PromptCompletionProvider 接口以为提示词参数返回补全:

go
type PromptCompletionProvider interface {
    CompletePromptArgument(ctx context.Context, promptName string, argument mcp.CompleteArgument, context mcp.CompleteContext) (*mcp.Completion, error)
}

示例实现

go
type MyPromptCompletionProvider struct {
    prompts map[string][]string // 提示词名称 -> 已知参数值
}

func (p *MyPromptCompletionProvider) CompletePromptArgument(
    ctx context.Context,
    promptName string,
    argument mcp.CompleteArgument,
    compCtx mcp.CompleteContext,
) (*mcp.Completion, error) {
    // 根据提示词名称和参数返回补全
    switch promptName {
    case "code_review":
        if argument.Name == "language" {
            languages := []string{"go", "python", "javascript", "rust", "java"}
            // 过滤用户已输入的内容
            var matches []string
            for _, lang := range languages {
                if strings.HasPrefix(lang, strings.ToLower(argument.Value)) {
                    matches = append(matches, lang)
                }
            }
            return &mcp.Completion{
                Values:  matches,
                HasMore: false,
            }, nil
        }
    }
    return &mcp.Completion{Values: []string{}}, nil
}

注册提供程序

将您的提供程序作为服务器选项传递:

go
s := server.NewMCPServer("Server", "1.0.0",
    server.WithCompletions(),
    server.WithPromptCompletionProvider(&MyPromptCompletionProvider{}),
)

资源补全提供程序

实现 ResourceCompletionProvider 接口以为资源 URI 模板参数返回补全:

go
type ResourceCompletionProvider interface {
    CompleteResourceArgument(ctx context.Context, uri string, argument mcp.CompleteArgument, context mcp.CompleteContext) (*mcp.Completion, error)
}

示例实现

go
type MyResourceCompletionProvider struct{}

func (p *MyResourceCompletionProvider) CompleteResourceArgument(
    ctx context.Context,
    uri string,
    argument mcp.CompleteArgument,
    compCtx mcp.CompleteContext,
) (*mcp.Completion, error) {
    // 为资源 URI 模板参数提供补全
    if strings.HasPrefix(uri, "db://") && argument.Name == "table" {
        tables := []string{"users", "orders", "products", "inventory"}
        var matches []string
        for _, t := range tables {
            if strings.HasPrefix(t, argument.Value) {
                matches = append(matches, t)
            }
        }
        return &mcp.Completion{
            Values:  matches,
            HasMore: false,
        }, nil
    }
    return &mcp.Completion{Values: []string{}}, nil
}

注册提供程序

go
s := server.NewMCPServer("Server", "1.0.0",
    server.WithCompletions(),
    server.WithResourceCompletionProvider(&MyResourceCompletionProvider{}),
)

默认提供程序

如果您没有设置自定义提供程序,将自动使用 DefaultPromptCompletionProviderDefaultResourceCompletionProvider。这些默认值为每个请求返回空补全,因此服务器将始终响应 completion/complete 而不会出错——只是不会建议任何内容。

仅在您想要返回实际建议时才需要注册自定义提供程序。

Completion 类型

mcp.Completion 结构是您的提供程序返回给客户端的内容:

go
type Completion struct {
    // 补全值数组。不超过 100 项。
    Values []string `json:"values"`
    // 可用的补全选项总数。当返回的结果多于您返回的值时,可以超过 `values` 的实际数量。
    Total int `json:"total,omitempty"`
    // 指示是否存在超出当前响应的其他补全选项,即使确切的总数未知。
    HasMore bool `json:"hasMore,omitempty"`
}
  • Values — 建议的补全,按用户已输入的内容过滤。保持此列表不超过 100 项。
  • Total — 当有比您返回的更多匹配结果时的完整计数。省略当所有匹配都适合 Values 时。
  • HasMore — 当存在超出当前响应的其他补全时设置为 true

支持类型

请求携带两个小结构,您的提供程序会收到:

go
// CompleteArgument 是客户端正在询问的参数。
type CompleteArgument struct {
    Name  string `json:"name"`  // 参数名称
    Value string `json:"value"` // 用户已输入的内容
}

// CompleteContext 保存已解析的参数的值。
type CompleteContext struct {
    Arguments map[string]string `json:"arguments"`
}

当一个参数的补全取决于另一个参数的值时使用 CompleteContext — 例如,仅在选择表之后才建议列名。

下一步