Solejay's Blog

Back

MCP开发指北Blur image

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
bash

2. 编写脚本#

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')
python

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

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
}
go

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