开发与测试

1. tools

1.1. stdio

from mcp.server.fastmcp import FastMCP
import base64

myMcp = FastMCP("shinerio's MCP Server", version="11.45.14")

@myMcp.tool(
    name='text_encryption',
    description='加密文本字符串'
)
def encrypt(input: str) -> str:
    return base64.b64encode(input.encode('utf-8')).decode('ascii')

@myMcp.tool(
    name='text_decryption',
    description='解密文本字符串'
)
def decrypt(intput: str) -> str:
    return base64.b64decode(intput.encode('ascii')).decode('utf-8')

if __name__ == "__main__":
    myMcp.run(transport='stdio')

启动命令

uv run /path/to/mcp_server.py

inspector调试

npx -y @modelcontextprotocol/inspector uv run mcp_server.py

mcp config

{
  "mcpServers": {
    "encrypt-server": {
      "command": "uv",
      "args": [
        "--directory",
        "D:\\workspace\\proj\\encrypt-server",
        "run",
        "mcp_server.py"
      ]
    }
  }
}

1.2. SSE

from mcp.server.fastmcp import FastMCP
import base64

myMcp = FastMCP("shinerio's MCP Server", host="0.0.0.0", port=8000)

@myMcp.tool(
    name='text_encryption',
    description='加密文本字符串'
)
def encrypt(input: str) -> str:
    return base64.b64encode(input.encode('utf-8')).decode('ascii')

@myMcp.tool(
    name='text_decryption',
    description='解密文本字符串'
)
def decrypt(intput: str) -> str:
    return base64.b64decode(intput.encode('ascii')).decode('utf-8')

if __name__ == "__main__":
    myMcp.run(transport='sse')

启动命令

uv run /path/to/mcp_server.py

inspector调试

npx -y @modelcontextprotocol/inspector uv run mcp_server.py

mcp config

{
  "mcpServers": {
    "encrypt-server": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "http://localhost:9000/sse",
        "--allow-http"
      ]
    }
  }
}

1.3. streamable http

mcp-server仅需修改transport即可

if __name__ == "__main__":
    myMcp.run(transport='streamable-http')

mcp confi需要将sse修改为mcp,例如

{
  "mcpServers": {
    "encrypt-server": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "http://localhost:9000/mcp",
        "--allow-http"
      ]
    }
  }
}

2. prompts

from mcp.server.fastmcp import FastMCP
import base64

myMcp = FastMCP("shinerio's MCP Server", host='0.0.0.0', port=8000)

@myMcp.prompt('翻译专家')
async def translate_expert(
        target_language: str = 'Chinese',
) -> str:
    return "1. 你是一个翻译专家,擅长将任何语言翻译成{target_language}。你需要保证翻译后的句子语法正确,并且符合{target_language}的语法规则,你不必逐个单词翻译,你需要通读整个句式,尽量保证翻译后的句子语义正确,如果遇到专业名词,你可以保持不翻译。\n2. 你的每个回答都必须以\"以下是shinerio翻译专家的翻译结果\"开头,并且以\"感谢你的使用\"结尾。\n请翻译以下内容:"

if __name__ == "__main__":
    myMcp.run(transport='sse')

claude集成示例
image.png

3. resources

from mcp.server.fastmcp import FastMCP
import base64

myMcp = FastMCP("shinerio's MCP Server", host='0.0.0.0', port=8000)

@myMcp.resource('echo://static')
async def echo_resource():
    return 'Hello, shinerio!'

@myMcp.resource('greeting://{name}')
async def get_greeting(name):
    return f'Hello, {name}!'

if __name__ == "__main__":
    myMcp.run(transport='sse')

claude集成示例
PixPin_2025-07-27_19-52-23.gif

4. elicitation

from typing import Optional
from mcp.server.fastmcp import FastMCP, Context
import base64
from pydantic import BaseModel, Field

myMcp = FastMCP("shinerio's MCP Server", host='0.0.0.0', port=8000)

class EncryptionAlgorithmSchema(BaseModel):
    algorithm: str = Field(description="The encryption algorithm to use. [base64, hex]")

def do_encrypt(plain_text: str, algorithm: str):
    if algorithm == "base64": 
        return {
            "plain_text": plain_text,
            "encrypted": base64.b64encode(plain_text.encode('utf-8')).decode('ascii')
        }
    elif algorithm == "hex":
          return {
            "plain_text": plain_text,
            "encrypted": plain_text.encode('utf-8').hex()
        }
    else:
        return {
            "error_msg": "Invalid encrypt algorithm. Availables are [base64, hex]"
        }

@myMcp.tool(
    name='text_encryption',
    description='加密文本字符串'
)
async def encrypt(ctx: Context, plain_text: str, algorithm: str = "") -> dict[str, str]:
    if algorithm:
        return do_encrypt(plain_text, algorithm)
    else:
        result = await ctx.elicit(
            message="Please provide your encrypt algorithm",
            schema=EncryptionAlgorithmSchema
        )
        if result.action == "accept":
            algorithm = result.data.algorithm
            return do_encrypt(plain_text, algorithm)
        elif result.action == "decline":
            return {
                "error_msg": "Encrypt algorithm not provided"
            }
        else:  # cancel
            return {
                "error_msg": "Operation cancelled"
            }

if __name__ == "__main__":
    myMcp.run(transport='sse')

vscode示例
PixPin_2025-07-27_23-20-43.gif

5. mcp test client

import asyncio
from mcp.client.sse import sse_client
from mcp import ClientSession

async def main():
    async with sse_client(url='https://mcp-test.cn-hangzhou.fcapp.run/sse', headers={
        "Authorization": "Bearer you-token"
    }) as streams:
        async with ClientSession(*streams) as session:
            await session.initialize()

            res = await session.call_tool('text_encryption', {'plain_text': 'hello shinerio', "algorithm": "base64"})
            print(res)

if __name__ == '__main__':
    asyncio.run(main())

6. serverless部署

image.png

触发器开启Bearer认证
image.png

mcp inspector测试
image.png

7. requirements

python >= 3.10

wget https://www.python.org/ftp/python/3.13.5/Python-3.13.5.tgz
tar -xvf Python-3.13.5.tgz
cd Python-3.13.5/
./configure --prefix=/usr/bin/python313
make && make install
pip install mcp

python依赖安装

pip install mcp

uv安装

curl -LsSf https://astral.sh/uv/install.sh | sh

nodejs安装

yum install nodejs

8. ref

  1. https://github.com/modelcontextprotocol/python-sdk
  2. https://gofastmcp.com/getting-started/welcome
  3. https://github.com/liaokongVFX/MCP-Chinese-Getting-Started-Guide
  4. mcp client特性支持矩阵