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
点击链接跳转调试页面
- 点击 Connect
- 按照下图顺序点击进行调试
可以看到执行了我们定义的 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
go build
- 生成二进制文件的路径就是运行路径
SSE
go run main.go -t sse
参考链接