绿色计算研究MCP服务器基准测试指南
概述
本指南提供了在MCP(模型上下文协议)服务器上进行基准测试实验的详细说明,以便为您的节能MCP架构调查论文生成经验数据。
______________________________________________________________________
目录
______________________________________________________________________
1.环境设置
1.1硬件要求文件
在基准测试之前,记录您的系统规格以确保可重复性:
# Get system information
systeminfo | Select-String "OS Name|OS Version|System Type|Total Physical Memory|Processor"
# Get CPU details
Get-WmiObject -Class Win32_Processor | Select-Object Name, NumberOfCores, NumberOfLogicalProcessors, MaxClockSpeed
# Get RAM details
Get-WmiObject -Class Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum
# Get disk type (SSD/HDD)
Get-PhysicalDisk | Select-Object MediaType, Size, FriendlyName1.2软件先决条件
安装Node.js(用于JavaScript MCP服务器)
# Using winget
winget install OpenJS.NodeJS.LTS
# Verify installation
node --version
npm --version安装Python(适用于Python MCP服务器)
# Using winget
winget install Python.Python.3.12
# Verify installation
python --version
pip --version安装Docker(用于容器化基准测试)
# Download Docker Desktop from https://www.docker.com/products/docker-desktop/
# Or using winget
winget install Docker.DockerDesktop
# Verify installation
docker --version安装UV(MCP的快速Python包管理器)
# Install UV
pip install uv
# Or using PowerShell
irm https://astral.sh/uv/install.ps1 | iex1.3 MCP SDK安装
# Create benchmark workspace
mkdir C:\MCP_Benchmarks
cd C:\MCP_Benchmarks
# Install MCP SDK for Python
pip install mcp
# Install MCP SDK for TypeScript/JavaScript
npm init -y
npm install @modelcontextprotocol/sdk1.4安装克劳德桌面(MCP主机)
下载地址:https://claude.ai/download
在以下位置配置MCP服务器: %APPDATA%\Claude\claude_desktop_config.json
______________________________________________________________________
2.基准情景
根据您的调查,以下是要进行基准测试的关键场景:
场景1:代币消费比较
目标: 衡量传统ReAct与渐进式披露模式中的代币使用情况
场景2:传输机制延迟
目标: 比较stdio、HTTP和SSE传输延迟
场景3:序列化开销
目标: 衡量JSON-RPC序列化成本与替代方案
场景4:缓存效率
目标: 量化缓存策略带来的性能改进
场景5:资源利用
目标: 测量不同服务器类型的CPU、内存和能耗
场景6:多服务器可扩展性
目标: 随着服务器数量的增加,测试性能下降
______________________________________________________________________
3.测量工具
3.1能源计量工具
Windows内置电源监控
# Enable energy estimation (requires admin)
powercfg /energy /duration 60
# View power usage
powercfg /batteryreport英特尔电源小工具(适用于英特尔CPU)
下载:https://www.intel.com/content/www/us/en/developer/articles/tool/power-gadget.html
HWiNFO64(综合硬件监控)
下载:https://www.hwinfo.com/download/
打开硬件监视器(CPU/GPU电源)
# Install via Chocolatey
choco install openhardwaremonitor3.2性能监控工具
自定义PowerShell监控脚本
# Save as: C:\MCP_Benchmarks\monitor.ps1
param(
[int]$DurationSeconds = 60,
[int]$IntervalMs = 1000,
[string]$OutputFile = "metrics.csv"
)
$metrics = @()
$endTime = (Get-Date).AddSeconds($DurationSeconds)
while ((Get-Date) -lt $endTime) {
$cpu = Get-Counter '\Processor(_Total)\% Processor Time' -ErrorAction SilentlyContinue
$mem = Get-Counter '\Memory\Available MBytes' -ErrorAction SilentlyContinue
$disk = Get-Counter '\PhysicalDisk(_Total)\Disk Bytes/sec' -ErrorAction SilentlyContinue
$metrics += [PSCustomObject]@{
Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss.fff"
CPU_Percent = [math]::Round($cpu.CounterSamples[0].CookedValue, 2)
Available_Memory_MB = [math]::Round($mem.CounterSamples[0].CookedValue, 2)
Disk_Bytes_Sec = [math]::Round($disk.CounterSamples[0].CookedValue, 2)
}
Start-Sleep -Milliseconds $IntervalMs
}
$metrics | Export-Csv -Path $OutputFile -NoTypeInformation
Write-Host "Metrics saved to $OutputFile"3.3网络监控
# Install Wireshark for detailed packet analysis
winget install WiresharkFoundation.Wireshark
# Or use built-in netstat for connection monitoring
netstat -an | findstr "ESTABLISHED"3.4过程特定监控
# Save as: C:\MCP_Benchmarks\process_monitor.ps1
param(
[string]$ProcessName,
[int]$DurationSeconds = 60,
[string]$OutputFile = "process_metrics.csv"
)
$metrics = @()
$endTime = (Get-Date).AddSeconds($DurationSeconds)
while ((Get-Date) -lt $endTime) {
$process = Get-Process -Name $ProcessName -ErrorAction SilentlyContinue
if ($process) {
$metrics += [PSCustomObject]@{
Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss.fff"
CPU_Time_Seconds = $process.CPU
Working_Set_MB = [math]::Round($process.WorkingSet64 / 1MB, 2)
Private_Memory_MB = [math]::Round($process.PrivateMemorySize64 / 1MB, 2)
Thread_Count = $process.Threads.Count
Handle_Count = $process.HandleCount
}
}
Start-Sleep -Milliseconds 500
}
$metrics | Export-Csv -Path $OutputFile -NoTypeInformation______________________________________________________________________
4.详细的基准测试程序
4.1基准1:代币消费分析
设置:创建测试MCP服务器
传统服务器(详细响应):
# Save as: C:\MCP_Benchmarks\servers\verbose_server.py
from mcp.server import Server
from mcp.types import Tool, TextContent
import mcp.server.stdio
import asyncio
import json
server = Server("verbose-server")
# Simulate large dataset
SAMPLE_DATA = [
{"id": i, "name": f"Item_{i}", "description": f"Description for item {i} " * 10,
"metadata": {"created": "2025-01-01", "modified": "2025-01-05", "tags": ["tag1", "tag2", "tag3"]}}
for i in range(100)
]
@server.list_tools()
async def list_tools():
return [
Tool(
name="get_all_data",
description="Returns ALL data items with full details",
inputSchema={"type": "object", "properties": {}}
)
]
@server.call_tool()
async def call_tool(name: str, arguments: dict):
if name == "get_all_data":
# Return everything (inefficient - high token count)
return [TextContent(type="text", text=json.dumps(SAMPLE_DATA, indent=2))]
async def main():
async with mcp.server.stdio.stdio_server() as (read_stream, write_stream):
await server.run(read_stream, write_stream)
if __name__ == "__main__":
asyncio.run(main())优化服务器(渐进式披露):
# Save as: C:\MCP_Benchmarks\servers\optimized_server.py
from mcp.server import Server
from mcp.types import Tool, TextContent
import mcp.server.stdio
import asyncio
import json
server = Server("optimized-server")
# Same dataset
SAMPLE_DATA = [
{"id": i, "name": f"Item_{i}", "description": f"Description for item {i} " * 10,
"metadata": {"created": "2025-01-01", "modified": "2025-01-05", "tags": ["tag1", "tag2", "tag3"]}}
for i in range(100)
]
@server.list_tools()
async def list_tools():
return [
Tool(
name="get_summary",
description="Returns summary statistics only",
inputSchema={"type": "object", "properties": {}}
),
Tool(
name="get_item",
description="Returns a specific item by ID",
inputSchema={
"type": "object",
"properties": {"id": {"type": "integer"}},
"required": ["id"]
}
),
Tool(
name="search_items",
description="Search items with filters, returns IDs only",
inputSchema={
"type": "object",
"properties": {
"query": {"type": "string"},
"limit": {"type": "integer", "default": 10}
}
}
)
]
@server.call_tool()
async def call_tool(name: str, arguments: dict):
if name == "get_summary":
# Return only summary (efficient - low token count)
summary = {
"total_items": len(SAMPLE_DATA),
"id_range": f"{SAMPLE_DATA[0]['id']}-{SAMPLE_DATA[-1]['id']}",
"sample_names": [d["name"] for d in SAMPLE_DATA[:3]]
}
return [TextContent(type="text", text=json.dumps(summary))]
elif name == "get_item":
item_id = arguments.get("id", 0)
item = next((d for d in SAMPLE_DATA if d["id"] == item_id), None)
return [TextContent(type="text", text=json.dumps(item) if item else "Not found")]
elif name == "search_items":
limit = arguments.get("limit", 10)
# Return only IDs
ids = [d["id"] for d in SAMPLE_DATA[:limit]]
return [TextContent(type="text", text=json.dumps({"matching_ids": ids}))]
async def main():
async with mcp.server.stdio.stdio_server() as (read_stream, write_stream):
await server.run(read_stream, write_stream)
if __name__ == "__main__":
asyncio.run(main())令牌计数脚本
# Save as: C:\MCP_Benchmarks\token_counter.py
import tiktoken
import json
def count_tokens(text: str, model: str = "cl100k_base") -> int:
"""Count tokens using tiktoken (GPT-4/Claude approximation)"""
encoding = tiktoken.get_encoding(model)
return len(encoding.encode(text))
def analyze_response(response_file: str):
with open(response_file, 'r') as f:
data = json.load(f)
text = json.dumps(data)
tokens = count_tokens(text)
print(f"Response size: {len(text)} characters")
print(f"Token count: {tokens}")
print(f"Estimated cost (at $0.01/1K tokens): ${tokens * 0.01 / 1000:.4f}")
return tokens
if __name__ == "__main__":
import sys
if len(sys.argv) > 1:
analyze_response(sys.argv[1])运行令牌基准测试
# Install tiktoken
pip install tiktoken
# Test verbose server response
python -c "
import json
data = [{'id': i, 'name': f'Item_{i}', 'description': f'Description for item {i} ' * 10} for i in range(100)]
with open('verbose_response.json', 'w') as f:
json.dump(data, f, indent=2)
"
# Test optimized server response
python -c "
import json
summary = {'total_items': 100, 'id_range': '0-99', 'sample_names': ['Item_0', 'Item_1', 'Item_2']}
with open('optimized_response.json', 'w') as f:
json.dump(summary, f)
"
# Count tokens
python token_counter.py verbose_response.json
python token_counter.py optimized_response.json4.2基准2:传输延迟比较
STDIO传输服务器
# Save as: C:\MCP_Benchmarks\servers\stdio_latency_server.py
from mcp.server import Server
from mcp.types import Tool, TextContent
import mcp.server.stdio
import asyncio
import time
server = Server("stdio-latency-test")
@server.list_tools()
async def list_tools():
return [
Tool(
name="ping",
description="Simple ping for latency measurement",
inputSchema={"type": "object", "properties": {"timestamp": {"type": "number"}}}
)
]
@server.call_tool()
async def call_tool(name: str, arguments: dict):
if name == "ping":
client_time = arguments.get("timestamp", 0)
server_time = time.time() * 1000
return [TextContent(type="text", text=f'{{"server_time": {server_time}, "client_time": {client_time}}}')]
async def main():
async with mcp.server.stdio.stdio_server() as (read_stream, write_stream):
await server.run(read_stream, write_stream)
if __name__ == "__main__":
asyncio.run(main())HTTP传输服务器
# Save as: C:\MCP_Benchmarks\servers\http_latency_server.py
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
import time
import uvicorn
app = FastAPI()
@app.post("/mcp/tools/ping")
async def ping(request: Request):
data = await request.json()
client_time = data.get("timestamp", 0)
server_time = time.time() * 1000
return JSONResponse({
"result": {
"server_time": server_time,
"client_time": client_time,
"processing_time_ms": server_time - client_time
}
})
@app.get("/mcp/tools")
async def list_tools():
return {"tools": [{"name": "ping", "description": "Latency test"}]}
if __name__ == "__main__":
uvicorn.run(app, host="127.0.0.1", port=8080)延迟基准客户端
# Save as: C:\MCP_Benchmarks\latency_benchmark.py
import asyncio
import aiohttp
import subprocess
import time
import statistics
import json
async def benchmark_http(url: str, iterations: int = 100):
"""Benchmark HTTP transport latency"""
latencies = []
async with aiohttp.ClientSession() as session:
for i in range(iterations):
start = time.perf_counter()
async with session.post(
f"{url}/mcp/tools/ping",
json={"timestamp": time.time() * 1000}
) as response:
await response.json()
end = time.perf_counter()
latencies.append((end - start) * 1000) # Convert to ms
return latencies
def benchmark_stdio(server_script: str, iterations: int = 100):
"""Benchmark STDIO transport latency"""
latencies = []
# Start server process
process = subprocess.Popen(
["python", server_script],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
for i in range(iterations):
start = time.perf_counter()
# Send JSON-RPC request
request = json.dumps({
"jsonrpc": "2.0",
"id": i,
"method": "tools/call",
"params": {"name": "ping", "arguments": {"timestamp": time.time() * 1000}}
}) + "\n"
process.stdin.write(request)
process.stdin.flush()
# Read response
response = process.stdout.readline()
end = time.perf_counter()
latencies.append((end - start) * 1000)
process.terminate()
return latencies
def analyze_latencies(latencies: list, name: str):
"""Analyze and report latency statistics"""
print(f"\n=== {name} Latency Analysis ===")
print(f"Iterations: {len(latencies)}")
print(f"Mean: {statistics.mean(latencies):.3f} ms")
print(f"Median: {statistics.median(latencies):.3f} ms")
print(f"Std Dev: {statistics.stdev(latencies):.3f} ms")
print(f"Min: {min(latencies):.3f} ms")
print(f"Max: {max(latencies):.3f} ms")
print(f"P95: {sorted(latencies)[int(len(latencies) * 0.95)]:.3f} ms")
print(f"P99: {sorted(latencies)[int(len(latencies) * 0.99)]:.3f} ms")
return {
"name": name,
"mean": statistics.mean(latencies),
"median": statistics.median(latencies),
"std": statistics.stdev(latencies),
"min": min(latencies),
"max": max(latencies),
"p95": sorted(latencies)[int(len(latencies) * 0.95)],
"p99": sorted(latencies)[int(len(latencies) * 0.99)]
}
async def main():
results = []
# Benchmark HTTP
print("Starting HTTP benchmark...")
http_latencies = await benchmark_http("http://127.0.0.1:8080", iterations=100)
results.append(analyze_latencies(http_latencies, "HTTP Transport"))
# Save results
with open("latency_results.json", "w") as f:
json.dump(results, f, indent=2)
print("\nResults saved to latency_results.json")
if __name__ == "__main__":
asyncio.run(main())4.3基准3:序列化开销
# Save as: C:\MCP_Benchmarks\serialization_benchmark.py
import json
import time
import statistics
import sys
# Optional: Install msgpack and protobuf for comparison
# pip install msgpack protobuf
def benchmark_json_serialization(data: dict, iterations: int = 10000):
"""Benchmark JSON serialization/deserialization"""
# Serialization
serialize_times = []
for _ in range(iterations):
start = time.perf_counter()
serialized = json.dumps(data)
serialize_times.append(time.perf_counter() - start)
# Deserialization
deserialize_times = []
json_str = json.dumps(data)
for _ in range(iterations):
start = time.perf_counter()
json.loads(json_str)
deserialize_times.append(time.perf_counter() - start)
return {
"format": "JSON",
"size_bytes": len(json_str.encode('utf-8')),
"serialize_mean_us": statistics.mean(serialize_times) * 1_000_000,
"deserialize_mean_us": statistics.mean(deserialize_times) * 1_000_000,
}
def benchmark_msgpack_serialization(data: dict, iterations: int = 10000):
"""Benchmark MessagePack serialization"""
try:
import msgpack
except ImportError:
return {"format": "MessagePack", "error": "Not installed"}
serialize_times = []
for _ in range(iterations):
start = time.perf_counter()
serialized = msgpack.packb(data)
serialize_times.append(time.perf_counter() - start)
deserialize_times = []
packed = msgpack.packb(data)
for _ in range(iterations):
start = time.perf_counter()
msgpack.unpackb(packed)
deserialize_times.append(time.perf_counter() - start)
return {
"format": "MessagePack",
"size_bytes": len(packed),
"serialize_mean_us": statistics.mean(serialize_times) * 1_000_000,
"deserialize_mean_us": statistics.mean(deserialize_times) * 1_000_000,
}
def create_test_payloads():
"""Create test payloads of varying complexity"""
# Small payload (simple tool call)
small = {
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {"name": "get_file", "arguments": {"path": "/test.txt"}}
}
# Medium payload (tool response with data)
medium = {
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{"type": "text", "text": "x" * 1000} # 1KB of text
],
"metadata": {
"tokens": 150,
"model": "claude-3",
"timestamp": "2025-01-05T12:00:00Z"
}
}
}
# Large payload (tool definitions)
large = {
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": [
{
"name": f"tool_{i}",
"description": f"Description for tool {i} " * 20,
"inputSchema": {
"type": "object",
"properties": {
f"param_{j}": {"type": "string", "description": f"Parameter {j}"}
for j in range(10)
}
}
}
for i in range(50) # 50 tools
]
}
}
return {"small": small, "medium": medium, "large": large}
def main():
payloads = create_test_payloads()
results = []
for size_name, payload in payloads.items():
print(f"\n=== Benchmarking {size_name.upper()} payload ===")
json_result = benchmark_json_serialization(payload)
json_result["payload_size"] = size_name
results.append(json_result)
print(f"JSON: {json_result['size_bytes']} bytes, "
f"serialize: {json_result['serialize_mean_us']:.2f}µs, "
f"deserialize: {json_result['deserialize_mean_us']:.2f}µs")
msgpack_result = benchmark_msgpack_serialization(payload)
if "error" not in msgpack_result:
msgpack_result["payload_size"] = size_name
results.append(msgpack_result)
print(f"MessagePack: {msgpack_result['size_bytes']} bytes, "
f"serialize: {msgpack_result['serialize_mean_us']:.2f}µs, "
f"deserialize: {msgpack_result['deserialize_mean_us']:.2f}µs")
# Calculate overhead
overhead = (json_result['size_bytes'] - msgpack_result['size_bytes']) / msgpack_result['size_bytes'] * 100
print(f"JSON overhead vs MessagePack: {overhead:.1f}%")
# Save results
with open("serialization_results.json", "w") as f:
json.dump(results, f, indent=2)
print("\nResults saved to serialization_results.json")
if __name__ == "__main__":
main()4.4基准4:缓存有效性
# Save as: C:\MCP_Benchmarks\caching_benchmark.py
import time
import statistics
import json
from functools import lru_cache
import hashlib
# Simulated expensive operation
def expensive_database_query(query: str) -> dict:
"""Simulate expensive database query (100ms)"""
time.sleep(0.1) # Simulate latency
return {
"query": query,
"results": [{"id": i, "data": f"result_{i}"} for i in range(10)],
"timestamp": time.time()
}
# In-memory cache implementation
class SimpleCache:
def __init__(self, ttl_seconds: int = 60):
self._cache = {}
self._ttl = ttl_seconds
def _hash_key(self, key: str) -> str:
return hashlib.md5(key.encode()).hexdigest()
def get(self, key: str):
hashed = self._hash_key(key)
if hashed in self._cache:
value, timestamp = self._cache[hashed]
if time.time() - timestamp dict:
"""Query with caching"""
cached_result = cache.get(query)
if cached_result:
return cached_result
result = expensive_database_query(query)
cache.set(query, result)
return result
def benchmark_without_cache(queries: list, iterations: int = 5):
"""Benchmark without caching"""
times = []
for _ in range(iterations):
for query in queries:
start = time.perf_counter()
expensive_database_query(query)
times.append(time.perf_counter() - start)
return times
def benchmark_with_cache(queries: list, iterations: int = 5):
"""Benchmark with caching"""
cache._cache.clear() # Clear cache
times = []
for iteration in range(iterations):
for query in queries:
start = time.perf_counter()
cached_query(query)
times.append(time.perf_counter() - start)
return times
def main():
# Test queries (some repeated to test cache hits)
queries = [
"SELECT * FROM users WHERE id = 1",
"SELECT * FROM users WHERE id = 2",
"SELECT * FROM users WHERE id = 1", # Repeat
"SELECT * FROM orders WHERE user_id = 1",
"SELECT * FROM users WHERE id = 1", # Repeat
"SELECT * FROM products WHERE category = 'electronics'",
"SELECT * FROM orders WHERE user_id = 1", # Repeat
]
print("=== Caching Effectiveness Benchmark ===\n")
# Benchmark without cache
print("Running without cache...")
no_cache_times = benchmark_without_cache(queries, iterations=3)
# Benchmark with cache
print("Running with cache...")
with_cache_times = benchmark_with_cache(queries, iterations=3)
# Analyze results
print("\n=== Results ===")
print(f"\nWithout Cache:")
print(f" Total time: {sum(no_cache_times)*1000:.2f} ms")
print(f" Mean per query: {statistics.mean(no_cache_times)*1000:.2f} ms")
print(f"\nWith Cache:")
print(f" Total time: {sum(with_cache_times)*1000:.2f} ms")
print(f" Mean per query: {statistics.mean(with_cache_times)*1000:.2f} ms")
# Calculate improvement
improvement = (sum(no_cache_times) - sum(with_cache_times)) / sum(no_cache_times) * 100
speedup = sum(no_cache_times) / sum(with_cache_times)
print(f"\n=== Improvement ===")
print(f" Time reduction: {improvement:.1f}%")
print(f" Speedup factor: {speedup:.1f}x")
# Cache statistics
unique_queries = len(set(queries))
total_queries = len(queries) * 3 # iterations
cache_hits = total_queries - unique_queries * 3
hit_rate = cache_hits / total_queries * 100
print(f"\n=== Cache Statistics ===")
print(f" Unique queries: {unique_queries}")
print(f" Total queries: {total_queries}")
print(f" Estimated cache hits: {cache_hits}")
print(f" Hit rate: {hit_rate:.1f}%")
# Save results
results = {
"without_cache": {
"total_ms": sum(no_cache_times) * 1000,
"mean_ms": statistics.mean(no_cache_times) * 1000
},
"with_cache": {
"total_ms": sum(with_cache_times) * 1000,
"mean_ms": statistics.mean(with_cache_times) * 1000
},
"improvement_percent": improvement,
"speedup_factor": speedup,
"cache_hit_rate": hit_rate
}
with open("caching_results.json", "w") as f:
json.dump(results, f, indent=2)
if __name__ == "__main__":
main()4.5基准5:能耗计量
# Save as: C:\MCP_Benchmarks\energy_benchmark.py
import subprocess
import time
import json
import os
import statistics
def get_cpu_power_estimate():
"""
Estimate CPU power using Windows Performance Counters
Note: For accurate measurements, use Intel Power Gadget or HWiNFO
"""
try:
result = subprocess.run(
['powershell', '-Command',
"(Get-Counter '\\Processor(_Total)\\% Processor Time').CounterSamples[0].CookedValue"],
capture_output=True, text=True, timeout=5
)
cpu_percent = float(result.stdout.strip())
# Rough estimate: Assume TDP of 65W, scale by usage
# This is a ROUGH estimate - use proper power monitoring tools for accuracy
tdp_watts = 65 # Adjust based on your CPU
estimated_power = (cpu_percent / 100) * tdp_watts
return cpu_percent, estimated_power
except Exception as e:
return None, None
def run_workload(workload_func, duration_seconds: int = 30):
"""Run a workload and measure power consumption"""
measurements = []
start_time = time.time()
end_time = start_time + duration_seconds
# Start workload in background
import threading
workload_running = True
def workload_thread():
while workload_running:
workload_func()
thread = threading.Thread(target=workload_thread)
thread.start()
# Collect measurements
while time.time() Protocol Hierarchy______________________________________________________________________
10.论文提交清单
- \[\]运行所有基准测试至少3次
- \[\]文件系统规范
- \[\]计算统计显著性(比较组的p值)
- \[\]生成出版物质量数据(300 DPI,PDF格式)
- \[\]用实证验证部分更新论文
- \[\]将基准方法添加到再现性附录中
- \[\]在你的论文中引用这种基准测试方法
- \[\]提供基准代码(GitHub存储库)
______________________________________________________________________
联系和支持
有关此基准测试指南的问题,请咨询:
- MCP SDK文档:https://modelcontextprotocol.io
- Python MCP:https://github.com/modelcontextprotocol/python-sdk
- TypeScript MCP:https://github.com/modelcontextprotocol/typescript-sdk
