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 搜 runbook
  • oncall__current:当前值班人

Claude 排障时一个问题能调多个 tool,比手动翻 5 个 dashboard 快太多。

安全注意

MCP server 跑在本地,但有"代行权"。要:

  1. 白名单参数:CMDB 查询限制只能查自己有权限的主机
  2. 审计日志:每次 tool 调用记日志
  3. read-only 优先:写操作走人工确认
  4. 超时控制:MCP 调用别 hang 死

MCP vs 直接 Bash

为啥不直接让 Claude curl http://cmdb.internal/api/...

  • MCP 有 schema,Claude 知道参数怎么填
  • MCP 跨工具有标准,可以接入 Cursor、Continue 等
  • MCP 调用记录可以审计
  • 复杂请求(OAuth、签名)封装在 MCP 里

教训:MCP 是接入企业内部工具的最佳方式,比让 Agent 写一堆 curl 命令稳定 10 倍。

标签: none

添加新评论