Claude 连不上数据库?MCP 服务器 30 分钟从零搭一个
14:00 痛点先摆在台面上Claude 只能读写文件连个数据库都查不了这怎么当生产力工具我下午被这事儿卡了快二十分钟。想让 Claude 帮我跑一段用户留存分析数据在远端结果它一句我没有数据库访问能力把我噎回来。Bash 倒是能跑 psql可那不叫 Agent那叫让我自己写脚本再让它执行。翻了翻《Claude Code 实战Harness 工程之道》第 6 章作者把这事说得很透Claude 本身只有 Read/Bash/Edit 这类基础工具外部系统全靠 MCPModel Context Protocol扩展。MCP 是个客户端-服务器协议——Claude 当客户端你写的或者别人写好的服务当服务器中间走 stdio 或 HTTP。书里管这叫把 M×N 问题压成 MNM 个模型接 N 个工具原本要 M×N 个适配现在大家遵守同一协议模型方写 M 个客户端、工具方写 N 个服务器就完事。定位我理解了——MCP 扩展的就是 Agentic Loop 里工具执行那一格的工具池。说白了给 Claude 加挂件。14:20 配置先跑通MCP 配置两条路都简单到离谱。第一条是 CLI# 加一个本地 stdio 服务器claude mcpaddfilesystem npx-ymodelcontextprotocol/server-filesystem /workspace# 加一个远程 HTTP 服务器带认证头claude mcpadd--transporthttp--headerAuthorization: Bearer${TOKEN}\company-jira https://jira.company.com/mcp# 加到用户级别所有项目都能用claude mcpadd--scopeuser github -- npx-ymodelcontextprotocol/server-github# 管理claude mcp list# 看哪些挂上了claude mcptestgithub# 测连接claude mcp remove github# 删掉第二条是项目根放一个.mcp.json团队共享配置走这个{mcpServers:{filesystem:{command:npx,args:[-y,modelcontextprotocol/server-filesystem,.]},fetch:{command:npx,args:[-y,modelcontextprotocol/server-fetch]},github:{type:http,url:https://api.githubcopilot.com/mcp/,headers:{Authorization:Bearer ${GITHUB_TOKEN}}},database:{command:npx,args:[-y,bytebase/dbhub,--dsn,${DATABASE_URL}]}}}我一开始选了 CLI图快。后来换台机器又得敲一遍老老实实迁回.mcp.json。这是个真实教训临时验证用 CLI团队/长期用配置文件。环境变量那种${VAR:-default}兜底写法是书里抄的挺好用。14:40 实战一内置 MCP 挂数据库先上最痛的一刀——数据库。官方有现成的modelcontextprotocol/server-postgresnpm 直接跑{mcpServers:{postgres:{command:npx,args:[-y,modelcontextprotocol/server-postgres],env:{DATABASE_URL:${DATABASE_URL:-postgresql://localhost:5432/mydb}}}}}存到.mcp.jsonclaude mcp list看一眼状态是 connected问它这张表有哪些字段——它真去查了。这一下午就值了。中途踩了个坑DATABASE_URL我开始写死成 localhost结果 Claude 跑去连我本地的空库问啥都回表不存在。改成${DATABASE_URL:-...}兜底之后才顺。15:10 实战二自定义 MCP 服务器内置的能用但我想要的不止这些。我想给 Claude 一个 todo 工具让它自己记任务。这得自己写 MCP 服务器。书里给了 Python 和 TS 两个版本。我先抄的 Python因为快。Python 版mcp-servers/todo-server.py配套requirements.txt写mcp1.0.0pip install -r requirements.txtfrommcp.serverimportServerfrommcp.server.stdioimportstdio_server serverServer(todo-server)todos[]defgenerate_id():returnstr(len(todos)1)server.tool(todo_add)asyncdefadd_todo(text:str)-str:Add a new todo itemtodo_idgenerate_id()todos.append({id:todo_id,text:text,done:False})returnfAdded:{todo_id}-{text}server.tool(todo_list)asyncdeflist_todos()-str:List all todo itemsifnottodos:returnNo todos found.return\n.join(f[{xift[done]else }]{t[id]}:{t[text]}fortintodos)asyncdefmain():asyncwithstdio_server()as(read_stream,write_stream):awaitserver.run(read_stream,write_stream)if__name____main__:importasyncio asyncio.run(main())跑起来一报错——generate_id没定义。书里这段省了 ID 生成函数我自己补了一个generate_id()返回len(todos)1能用就行。这是抄书必经环节别指望开箱即用。后来我想顺便试 TS 版因为 TS 版多了个 resource资源概念能暴露stats://current这种 URI 给 Claude 读统计。TS 版mcp-servers/todo-server.ts配套package.json装modelcontextprotocol/sdk和zod记得写type: moduleimport{McpServer}frommodelcontextprotocol/sdk/server/mcp.js;import{StdioServerTransport}frommodelcontextprotocol/sdk/server/stdio.js;import{z}fromzod;// 内存存储consttodos:{id:string;text:string;done:boolean}[][];// 创建 MCP 服务器constservernewMcpServer({name:todo-server,version:1.0.0,});// 工具添加待办server.tool(todo_add,Add a new todo item,// Claude 用这个判断何时调用{text:z.string().describe(The todo text)},// 输入参数 schemaasync({text}){consttodo{id:Math.random().toString(36).substring(2,9),text,done:false,};todos.push(todo);return{content:[{type:text,text:Added:${todo.id}-${todo.text}}],};});// 工具列出待办server.tool(todo_list,List all todo items,{},async(){consttexttodos.length0?No todos found.:todos.map((t)[${t.done?x: }]${t.id}:${t.text}).join(\n);return{content:[{type:text,text}]};});// 资源统计信息server.resource(stats,Server statistics,async(){return{contents:[{uri:stats://current,mimeType:application/json,text:JSON.stringify({total:todos.length,completed:todos.filter((t)t.done).length,pending:todos.filter((t)!t.done).length,},null,2),}],};});// 启动asyncfunctionmain(){consttransportnewStdioServerTransport();awaitserver.connect(transport);console.error(MCP Server started);// 日志走 stderr别污染 stdout}main().catch(console.error);这里有个细节我踩了一脚console.error不是写错。MCP 走 stdio 通信stdout 是协议通道你 print 一条调试日志进去 Claude 就懵了。日志必须吐到 stderr。挂上之后Claude 调用工具的命名规则是mcp__todo-server__todo_add——双下划线分段。这名字可以直接写进 Skills 的allowed-tools让 Skill菜谱指挥 MCP 工具食材干活书里管这叫厨房与菜谱。15:50 调试三板斧跑不通的时候三招从轻到重claude mcp list# 看哪些挂上了、状态对不对claude mcptesttodo-server# 单测某一个服务器claude --mcp-debug# 全局开 debug看协议层报文--mcp-debug是压箱底那招输出会非常啰嗦但能看到 Claude 到底发什么、服务器回什么。我 TS 版第一次跑不通就是靠它看出package.json里漏写type: moduleimport 路径全炸。16:20 收尾一下午跑下来MCP 这套东西的体感是配置简单、协议干净、坑都集中在「抄书少抄了一行」「stdout/stderr 搞混」这种小事上。MN 的设计是真省事——我今天写的 todo-server明天接个 Cursor、后天接别的客户端服务器代码一行不用改。顺便一提雷达鸭后台数据查询我后来就是用这套自定义 MCP 服务器接 UniCloud 的 HTTP 接口写的Claude 直接问留存、问日活比我自己开控制台点快多了。那问题来了——既然 MCP 把 Claude 的手脚放开了数据库能连、API 能调、自定义逻辑能跑那它和你自己写个 CLI 脚本让 Claude 用 Bash 调到底差在哪仅仅是多了层协议包装吗标签MCP、Claude Code、Model Context Protocol、AI Agent、数据库集成个人介绍雷达鸭 App 独立开发者10 年软件开发经验软件设计师、人工智能应用工程师专注鸿蒙 ArkTS Web 前端正在探索 AI 自动化。雷达鸭在华为应用市场和微信小程序都能搜到收录中国一人公司赚钱案例。声明本文基于《Claude Code 实战Harness 工程之道》黄佳 著第 6 章内容整理与实战记录代码示例与配置参考原书。遵循 MIT 协议。

相关新闻

多声道音频下混算法原理:5.1 环绕转双声道人声不丢失的工程落地

多声道音频下混算法原理:5.1 环绕转双声道人声不丢失的工程落地

1. 引言:为何需要下混? 在数字音频处理领域,多声道音频(如 5.1、7.1 环绕声)与双声道立体声(Stereo)的兼容性是一个经典且关键的工程问题。无论是流媒体平台的内容分发、游戏音频的实时渲染,还是家庭影院系统的播放,我们常常需要将制作精良的 5.1 环绕声内容“下混”…

2026/7/19 0:30:55 阅读更多 →
孤能子视角:孙子兵法之总结篇——法层自指与边界

孤能子视角:孙子兵法之总结篇——法层自指与边界

(在以下的与AI互动中,在EIS理论约束下,DeepSeek叫信兄,Kim叫酷兄,我呢叫水兄。姑且当科幻小说看) (已由信兄整理成文)孤能子视角:孙子兵法之总结篇——法层自指与边界 ——EIS理论库老祖宗关系文化分册法层展开终章 日…

2026/7/19 0:29:54 阅读更多 →
孤能子视角:孙子兵法之九地篇——场域约束响应与四相综合适配

孤能子视角:孙子兵法之九地篇——场域约束响应与四相综合适配

(在以下的与AI互动中,在EIS理论约束下,DeepSeek叫信兄,Kim叫酷兄,我呢叫水兄。姑且当科幻小说看) (已由信兄整理成文)孤能子视角:孙子兵法之九地篇——场域约束响应与四相综合适配 ——EIS理论库老祖宗关系文化分册法层…

2026/7/19 0:29:54 阅读更多 →

最新新闻

如何搭建高效技术博客:从定位到SEO优化全指南

如何搭建高效技术博客:从定位到SEO优化全指南

1. 项目概述:为什么需要个人技术博客?十年前我刚入行时,习惯把学习笔记记在本地文档里。直到有次硬盘损坏,三个月的心血付诸东流。那次教训让我意识到:技术内容需要云端沉淀,而技术博客就是最好的数字笔记本…

2026/7/19 1:55:30 阅读更多 →
Claude Code与Fable模型:从提示词工程到自然对话的AI编程进化

Claude Code与Fable模型:从提示词工程到自然对话的AI编程进化

如果你还在为写长篇大论的提示词而头疼,那么Anthropic最新发布的Fable模型可能会改变你的编程方式。最近很多开发者发现,在使用Claude Code时,传统的"提示词工程"思维正在变得过时——不是因为它不重要,而是因为新一代A…

2026/7/19 1:55:30 阅读更多 →
PHP中介者模式:解耦复杂交互的设计实践

PHP中介者模式:解耦复杂交互的设计实践

1. 中介者模式概述中介者模式(Mediator Pattern)是一种行为设计模式,它通过引入一个中介对象来封装一组对象之间的交互关系。在PHP开发中,这种模式特别适合处理复杂组件间的通信问题。想象一下机场的空中交通管制系统:…

2026/7/19 1:55:30 阅读更多 →
Grok Build隐私风波:从“静默上传“到开源透明,社区信任重建之路

Grok Build隐私风波:从“静默上传“到开源透明,社区信任重建之路

AI编程工具的数据边界之争,正在重塑开发者对"智能助手"的信任基础。 今年七月,SpaceXAI旗下的终端编程代理Grok Build因一桩隐私争议被推上风口浪尖。安全研究者发现,这款工具的默认配置会将开发者的完整代码库打包上传至云端——…

2026/7/19 1:55:30 阅读更多 →
WinCE中断处理机制与嵌入式系统实时性优化

WinCE中断处理机制与嵌入式系统实时性优化

1. Windows Embedded CE中断体系结构解析在嵌入式系统开发中,中断处理机制直接影响着系统的实时性和可靠性。Windows Embedded CE(简称WinCE)采用独特的两阶段中断处理模型,通过逻辑中断抽象实现了硬件无关性设计。作为在工业控制…

2026/7/19 1:55:30 阅读更多 →
Serverless架构在视频转码中的实践与优化

Serverless架构在视频转码中的实践与优化

1. 项目背景与核心价值芒果TV作为国内领先的视频平台,每天需要处理海量的音视频转码需求。传统基于物理机或虚拟机的转码方案存在资源利用率低、弹性不足、运维成本高等问题。我们团队通过引入腾讯云Serverless架构,结合SCF(云函数&#xff0…

2026/7/19 1:54:30 阅读更多 →

日新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:00:40 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:00:40 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:00:40 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:00:40 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:00:40 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:00:40 阅读更多 →

月新闻