工具的三要素
- name — Agent 调用时的标识
- description — 让模型知道何时调用
- input_schema — JSON schema 定义参数
一个最小例子(stdio MCP server)
import { Server } from '@modelcontextprotocol/sdk/server'
const server = new Server({ name: 'word-count', version: '0.1.0' })
server.setRequestHandler('tools/list', () => ({
tools: [{
name: 'word_count',
description: 'Count words in a string',
inputSchema: {
type: 'object',
properties: { text: { type: 'string' } },
required: ['text'],
},
}],
}))
server.setRequestHandler('tools/call', async (req) => {
const text = req.params.arguments.text as string
return { content: [{ type: 'text', text: String(text.split(/\s+/).length) }] }
})
server.connect(/* stdio */)生产化建议
- description 写得越具体越好 — 影响模型 routing
- 工具应该是单一职责,能组合多个比塞一个大的好
- 所有副作用要可幂等(Agent 可能重试)
- 为每个工具加 metrics — 看哪些常被调,哪些没人用