MCP Server 开发入门:让 Claude 调用你的内部服务
MCP(Model Context Protocol)是 Anthropic 推的标准,让 LLM 能调用外部工具。本文以一个内部 CMDB 查询为例。
MCP 是啥
简单理解:把你的服务暴露成 LLM 能直接调用的 tool。LLM 不需要写 HTTP 请求代码,直接 query_cmdb(host="...") 就行。
一个最小例子
写一个 MCP server 提供"查 CMDB 主机信息":
# server.py
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent
app = Server("cmdb")
@app.list_tools()
async def list_tools():
return [
Tool(
name="query_host",
description="按主机名查 CMDB 拿主机详细信息(IP、OS、负责人、机房)",
inputSchema={
"type": "object",
"properties": {
"hostname": {"type": "string", "description": "主机名"}
},
"required": ["hostname"]
}
)
]
@app.call_tool()
async def call_tool(name: str, arguments: dict):
if name == "query_host":
import httpx
resp = httpx.get(f"http://cmdb.internal/api/hosts/{arguments['hostname']}")
return [TextContent(type="text", text=resp.text)]
async def main():
async with stdio_server() as (r, w):
await app.run(r, w, app.create_initialization_options())
if __name__ == "__main__":
import asyncio
asyncio.run(main())
注册到 Claude Code
~/.claude/mcp.json:
{
"mcpServers": {
"cmdb": {
"command": "python",
"args": ["/path/to/server.py"]
}
}
}
重启 Claude Code,再说"查一下 prod-node1 的负责人",Claude 会自动调用 cmdb__query_host(hostname="prod-node1")。
进阶:让 MCP 提供 Resource
Tools 是"动作",Resources 是"数据集"。比如把整个 K8s 集群状态做成 resource:
@app.list_resources()
async def list_resources():
return [
Resource(
uri="k8s://cluster/pods",
name="K8s Pods",
mimeType="application/json"
)
]
@app.read_resource()
async def read_resource(uri: str):
if uri == "k8s://cluster/pods":
return [TextContent(type="text", text=subprocess.check_output(["kubectl","get","pods","-A","-o","json"]).decode())]
Claude 可以"读"这个 resource 而不需要每次都跑命令。
实际生产用法
我们公司 MCP server 提供:
cmdb__query_host:CMDB 查询monitor__query_metric:Prometheus 查询incident__list_recent:最近故障列表runbook__search:从 wiki 搜 runbookoncall__current:当前值班人
Claude 排障时一个问题能调多个 tool,比手动翻 5 个 dashboard 快太多。
安全注意
MCP server 跑在本地,但有"代行权"。要:
- 白名单参数:CMDB 查询限制只能查自己有权限的主机
- 审计日志:每次 tool 调用记日志
- read-only 优先:写操作走人工确认
- 超时控制:MCP 调用别 hang 死
MCP vs 直接 Bash
为啥不直接让 Claude curl http://cmdb.internal/api/...?
- MCP 有 schema,Claude 知道参数怎么填
- MCP 跨工具有标准,可以接入 Cursor、Continue 等
- MCP 调用记录可以审计
- 复杂请求(OAuth、签名)封装在 MCP 里
教训:MCP 是接入企业内部工具的最佳方式,比让 Agent 写一堆 curl 命令稳定 10 倍。