基于Anthropic的“think”工具研究的最小MCP服务器
该项目实现了一个最小的消息控制协议(MCP)服务器,提供给Claude AI模型使用“think”工具的能力。基于Anthropic于2025年3月20日发布的研究成果,此实现使Claude在涉及多步骤工具使用的复杂推理任务中表现更好。
“think”工具赋予Claude在达到最终答案的过程中包含额外思考步骤的能力,这个步骤有其独立的空间。与扩展思考(在响应生成之前发生)不同,“think”工具允许Claude在响应生成过程中暂停,考虑是否拥有继续所需的全部信息。
关键优势:
该服务器按照以下规范实现了“think”工具:
{
"name": "think",
"description": "使用工具进行思考。它不会获取新信息或更改数据库,只是将思考过程追加到日志中。当需要复杂的推理或一些缓存记忆时使用。",
"input_schema": {
"type": "object",
"properties": {
"thought": {
"type": "string",
"description": "要思考的想法。"
}
},
"required": ["thought"]
}
}
根据Anthropic的研究,此工具在以下情况下最为有益:
为了获得最佳效果,在您的提示中明确指示何时以及如何使用“think”工具。考虑提供特定领域的示例,展示:
复杂的指导最好放在系统提示中,而不是工具描述本身。
该服务器使用模型上下文协议(MCP)与Claude和其他AI助手通信。它:
安装依赖项:
npm install
构建服务器:
npm run build
开发模式下自动重建:
npm run watch
由于MCP服务器通过标准I/O通信,调试可能具有挑战性。我们建议使用MCP Inspector:
npm run inspector
Inspector会提供一个URL,以便您可以在浏览器中访问调试工具。
要通过Smithery自动安装think-mcp-server用于Claude Desktop:
npx -y @smithery/cli install @marcopesani/think-mcp-server --client claude
npm install -g think-mcp-server
在以下位置添加服务器配置:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%/Claude/claude_desktop_config.json{
"mcpServers": {
"think": {
"command": "npx",
"args": ["-y", "think-mcp-server"]
}
}
}
{
"mcpServers": {
"github.com/marcopesani/think-mcp-server": {
"command": "npx",
"args": ["-y", "think-mcp-server"],
"disabled": false,
"autoApprove": ["think"]
}
}
}
额外的Cline配置选项:
disabled:设为false启用服务器autoApprove:不需要每次使用时显式批准的工具列表npx -y think-mcp-server
您也可以使用Docker运行服务器。首先构建镜像:
docker build -t think-mcp-server .
然后运行容器:
docker run -it think-mcp-server
对于开发,您可能希望将源代码挂载为卷:
docker run -v $(pwd):/app think-mcp-server
这里是一个专注于TypeScript开发的示例提示,帮助Claude有效地利用“think”工具:
## 使用think工具进行TypeScript开发
在实现任何TypeScript代码或回答技术问题之前,使用think工具来:
- 分析可能相关的类型定义和接口
- 检查潜在的类型错误或边缘情况
- 推理泛型和类型约束
- 验证TypeScript特性的正确使用
这是一个使用think工具进行TypeScript特定推理的例子:
<think_tool_typescript_example>
用户想要在React TypeScript中实现一个通用的状态管理钩子
- 需求分析:
* 需要处理任何数据类型(泛型类型)
* 必须在整个状态生命周期中保存类型信息
* 应该提供类型安全的更新方法
* 需要考虑不可变性模式
- 需要考虑的类型约束:
* T应该扩展对象,还是允许原始类型?
* 更新时Partial<T>是否合适?
?我们应该使用Record<string, unknown>作为回退吗?
- 实现注意事项:
* 使用useState<T>作为基础
* 添加保持泛型的类型化setter方法
* 考虑回调模式进行原子更新
* 检查与React的钩子规则的兼容性
- 方法:
1. 定义钩子返回值的泛型接口
2. 使用适当的泛型类型实现useState
3. 创建维护类型安全的类型化更新方法
4. 添加JSDoc注释以改善开发者体验
5. 返回带有适当类型方法的不可变状态
</think_tool_typescript_example>
在帮助解决TypeScript挑战时:
1. 首先分析类型系统的影响
2. 考虑TypeScript特有的边缘情况
3. 推理类型缩小和扩大
4. 检查与TypeScript编译器版本的兼容性
5. 考虑类型推断和显式类型注解
Anthropic的评估显示,在使用“think”工具时有显著改进:
本实现基于Anthropic的研究文章《“think”工具:使Claude能够在复杂工具使用情境中停下来思考》(发布于2025年3月20日)。