MCP开发指北

Posted by Solejay on Wed, Apr 23, 2025

Python

STDIO

1. 前置准备

 1// 安装 uv
 2curl -LsSf https://astral.sh/uv/install.sh | sh
 3
 4// 验证
 5uv
 6
 7// 创建项目文件夹
 8uv init test
 9cd test
10
11// 创建虚拟环境并激活
12uv venv
13source .venv/bin/activate
14
15// 安装依赖
16uv add "mcp[cli]" httpx
17
18// 创建 server 文件
19touch add.py

2. 编写脚本

add.py

 1from typing import Any
 2import httpx
 3from mcp.server.fastmcp import FastMCP
 4
 5# Initialize FastMCP server
 6mcp = FastMCP("grafana")
 7
 8@mcp.tool()
 9def add(a: int, b: int) -> int:
10    """Add two numbers together."""
11    return a + b
12
13if __name__ == "__main__":
14    # Initialize and run the server
15    mcp.run(transport='stdio')

3. 运行调试

执行命令 mcp dev add.py

需要保证 node version >= 18

1745228559756_q0w4lepr29

点击链接跳转调试页面

  1. 点击 Connect

1745228695408_zjvfkz0n6q

  1. 按照下图顺序点击进行调试

1745229137020_vktjeo5gxi

可以看到执行了我们定义的 add 方法

如果只是调试,可以在安装 uv 和 node 后,直接运行 MCP inspector 调试

npx @modelcontextprotocol/inspector

Golang

golang 基于 mcp-go

 1package main
 2
 3import (
 4	"context"
 5	"errors"
 6	"flag"
 7	"fmt"
 8	"log"
 9
10	"github.com/mark3labs/mcp-go/mcp"
11	"github.com/mark3labs/mcp-go/server"
12)
13
14func main() {
15	var transport string
16	flag.StringVar(&transport, "t", "stdio", "Transport type (stdio or sse)")
17	flag.StringVar(
18		&transport,
19		"transport",
20		"stdio",
21		"Transport type (stdio or sse)",
22	)
23	flag.Parse()
24
25	// Create MCP server
26	s := server.NewMCPServer(
27		"Demo 🚀",
28		"1.0.0",
29	)
30	// Add tool
31	tool := mcp.NewTool("add",
32		mcp.WithDescription("Add two numbers"),
33		mcp.WithNumber("a",
34			mcp.Required(),
35			mcp.Description("First number"),
36		),
37		mcp.WithNumber("b",
38			mcp.Required(),
39			mcp.Description("Second number"),
40		),
41	)
42	// Add tool handler
43	s.AddTool(tool, addHandler)
44
45	switch transport {
46	case "stdio":
47		if err := server.ServeStdio(s); err != nil {
48			log.Fatalf("Server error: %v\n", err)
49		}
50	case "sse":
51		sse := server.NewSSEServer(s, server.WithBaseURL("http://localhost:8080"))
52		log.Printf("SSE server listening on :8080")
53		if err := sse.Start(":8080"); err != nil {
54			log.Fatalf("Server error: %v", err)
55		}
56	default:
57		log.Fatalf(
58			"Invalid transport type: %s. Must be 'stdio' or 'sse'",
59			transport,
60		)
61	}
62}
63
64func addHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
65	a, ok := request.Params.Arguments["a"].(float64)
66	if !ok {
67		return nil, errors.New("a must be a number")
68	}
69	b, ok := request.Params.Arguments["b"].(float64)
70	if !ok {
71		return nil, errors.New("b must be a number")
72	}
73	res := fmt.Sprintf("%g", a+b)
74	return mcp.NewToolResultText(res), nil
75}

STDIO

  1. go build
  2. 生成二进制文件的路径就是运行路径

1745393535464_n282hyvnyt

SSE

go run main.go -t sse

1745393186242_c9t0a0wd3f

参考链接

MCP Server 开发实战指南(Python 版)

官方 Python SDK 文档

如何使用Golang开发MCP服务器:从mcp-go到mcp-k8s实践

mcp-go examples