Python#
STDIO#
1. 前置准备#
// 安装 uv
curl -LsSf https://astral.sh/uv/install.sh | sh
// 验证
uv
// 创建项目文件夹
uv init test
cd test
// 创建虚拟环境并激活
uv venv
source .venv/bin/activate
// 安装依赖
uv add "mcp[cli]" httpx
// 创建 server 文件
touch add.py
bash2. 编写脚本#
add.py
from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP
# Initialize FastMCP server
mcp = FastMCP("grafana")
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers together."""
return a + b
if __name__ == "__main__":
# Initialize and run the server
mcp.run(transport='stdio')
python3. 运行调试#
执行命令 mcp dev add.py
需要保证 node version >= 18
点击链接跳转调试页面
- 点击 Connect
- 按照下图顺序点击进行调试
可以看到执行了我们定义的 add 方法
如果只是调试,可以在安装 uv 和 node 后,直接运行 MCP inspector 调试
npx @modelcontextprotocol/inspector
Golang#
golang 基于 mcp-go ↗ 包
package main
import (
"context"
"errors"
"flag"
"fmt"
"log"
"github.com/mark3labs/mcp-go/mcp"
"github.com/mark3labs/mcp-go/server"
)
func main() {
var transport string
flag.StringVar(&transport, "t", "stdio", "Transport type (stdio or sse)")
flag.StringVar(
&transport,
"transport",
"stdio",
"Transport type (stdio or sse)",
)
flag.Parse()
// Create MCP server
s := server.NewMCPServer(
"Demo 🚀",
"1.0.0",
)
// Add tool
tool := mcp.NewTool("add",
mcp.WithDescription("Add two numbers"),
mcp.WithNumber("a",
mcp.Required(),
mcp.Description("First number"),
),
mcp.WithNumber("b",
mcp.Required(),
mcp.Description("Second number"),
),
)
// Add tool handler
s.AddTool(tool, addHandler)
switch transport {
case "stdio":
if err := server.ServeStdio(s); err != nil {
log.Fatalf("Server error: %v\n", err)
}
case "sse":
sse := server.NewSSEServer(s, server.WithBaseURL("http://localhost:8080"))
log.Printf("SSE server listening on :8080")
if err := sse.Start(":8080"); err != nil {
log.Fatalf("Server error: %v", err)
}
default:
log.Fatalf(
"Invalid transport type: %s. Must be 'stdio' or 'sse'",
transport,
)
}
}
func addHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
a, ok := request.Params.Arguments["a"].(float64)
if !ok {
return nil, errors.New("a must be a number")
}
b, ok := request.Params.Arguments["b"].(float64)
if !ok {
return nil, errors.New("b must be a number")
}
res := fmt.Sprintf("%g", a+b)
return mcp.NewToolResultText(res), nil
}
goSTDIO#
go build
- 生成二进制文件的路径就是运行路径
SSE#
go run main.go -t sse
参考链接