Skip to content

MCP 基础

Model Context Protocol(MCP)是一套让 AI 应用以统一方式发现和调用外部工具、资源与提示模板的开放协议。它解决的是接入边界,不替你解决权限、安全和业务正确性。

角色与原语

  • Host 管理用户会话、模型和整体权限。
  • Client 负责与一个 Server 建立协议连接。
  • Server 暴露工具、资源和提示模板。
  • Tool 执行动作,Resource 提供可读取数据,Prompt 提供可复用模板。

调用链

text
initialize
  -> 能力协商
  -> tools/list 或 resources/list
  -> tools/call
  -> 返回结构化结果
  -> Host 将结果交给模型

工具描述应包含名称、用途、输入 schema、错误语义和副作用说明。工具返回值也应区分文本、结构化数据和用户可见资源。

最小 Go Server 思路

下面是协议实现的结构示意,实际项目应使用对应版本的官方 SDK 或经过验证的实现:

go
type SearchInput struct {
    Query string `json:"query"`
}

func Search(ctx context.Context, input SearchInput) (any, error) {
    if strings.TrimSpace(input.Query) == "" {
        return nil, errors.New("query is required")
    }
    return index.Search(ctx, input.Query)
}

不要把任意 Shell 暴露成一个名为 run 的万能工具。拆成 go_testread_filesearch_symbol 等边界清楚的工具,并对每个输入做校验。

stdio 适用场景

stdio 适合本机单用户工具:

  • Server 与 Host 在同一台机器;
  • 进程由 Host 启动和回收;
  • 不需要远程共享;
  • 权限可以继承本地工作区边界。

日志不要写入协议标准输出,否则会破坏 JSON-RPC 消息;把诊断日志写到 stderr 或独立文件。

JSON-RPC 错误

把错误分为:

  • 参数校验失败:调用者可以修正输入;
  • 权限失败:需要审批或换身份;
  • 业务失败:外部系统拒绝或状态不满足;
  • 临时失败:可以在预算内重试;
  • 内部错误:需要记录 trace id 并人工排查。

练习

  1. 设计一个只读 search_symbol Tool 的输入和输出 schema。
  2. 解释为什么 MCP Server 的日志不能随意写 stdout。
  3. 为一个会修改代码的 Tool 写出三条权限和审计要求。

参考资料

🚀 学习遇到瓶颈?想进大厂?

看完这篇技术文章,如果还是觉得不够系统,或者想在实战中快速提升?
王中阳的就业陪跑训练营,提供定制化学习路线 + 企业级实战项目 + 简历优化 + 模拟面试。