2025年11月

官方资料https://www.npmjs.com/package/dotenv
dotenv本质上是一个非常简单的库, 仅仅用来从.env文件中加载环境变量, 其中存储和代码无关的内容或者不能放在代码中的内容 ,尤其是api_key等安全密钥等. .env文件通过.gitignore忽略.
用来替代windows中的set some_var=value和linux中的export some_var=value

运行

很简单的运行方式:

require('dotenv').config()
console.log(process.env) // remove this after you've confirmed it is working

除此之外, 还可以通过命令行运行而不需要加到代码中

 node -r dotenv/config your_script.js

.env文件定义

.env文件的定义方式, 如果值中包括 #, `,\n`转义字符,回车换行等, 需要加双引号, 否则可以使用不加双引号的简写方式.

S3_BUCKET="YOURS3BUCKET"
SECRET_KEY="YOURSECRETKEYGOESHERE"
PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----
...
Kh9NV...
...
-----END RSA PRIVATE KEY-----"
PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nKh9NV...\n-----END RSA PRIVATE KEY-----\n"
# This is a comment
SECRET_KEY=YOURSECRETKEYGOESHERE # comment
SECRET_HASH="something-with-a-#-hash"

官方协议文档: https://modelcontextprotocol.io/docs
分为数据层data layer和传输层transport layer

data layer

使用 JSONRPC2.0作为通讯协议, 包括生命周期管理和原语.

生命周期管理

MCP是有状态的协议, 所以需要生命周期管理, 目的是客户端和服务器协商彼此支持的能力(原语).

原语 primitives

包括服务器暴露的原语和客户端暴露的原语, 以及跨领域功能原语.

服务器原语包括:

- 工具 Tools 资源 Resources 提示词 Prompts
控制者 大模型 应用 用户
工具 tools

包括 tools/listtools/call
示例:

{
  name: "searchFlights",
  description: "Search for available flights",
  inputSchema: {
    type: "object",
    properties: {
      origin: { type: "string", description: "Departure city" },
      destination: { type: "string", description: "Arrival city" },
      date: { type: "string", format: "date", description: "Travel date" }
    },
    required: ["origin", "destination", "date"]
  }
}

工具调用在必要时通过User Interaction Model用户交互模型让用户确认.

资源 resources

每个资源都有一个唯一的 URI(例如, file:///path/to/document.md ),并声明其 MIME 类型以进行适当的内容处理。
资源支持两种发现模式:

  • 直接资源Direct Resources- 指向特定数据的固定 URI。示例: calendar://events/2024 - 返回 2024 年的日历可用性
  • 资源模板Resource Templates - 带参数的动态 URI,用于灵活查询。如: travel://activities/{city}/{category} - 按城市和类别返回活动, 或者: travel://activities/barcelona/museums - 返回巴塞罗那的所有博物馆
    操作包括: resources/list, resources/templates/list, resources/read, resources/subscribe
    资源模板示例:
    
    {
    "uriTemplate": "weather://forecast/{city}/{date}",
    "name": "weather-forecast",
    "title": "Weather Forecast",
    "description": "Get weather forecast for any city and date",
    "mimeType": "application/json"
    }

{
"uriTemplate": "travel://flights/{origin}/{destination}",
"name": "flight-search",
"title": "Flight Search",
"description": "Search available flights between cities",
"mimeType": "application/json"
}

支持参数补全和用户交互模型.

Prompts 提示系统

提示提供可重用的模板。它们允许 MCP 服务器作者为特定领域提供参数化提示,或展示如何最佳使用 MCP 服务器。
支持方法: prompts/list, prompts/get
示例:

{
  "name": "plan-vacation",
  "title": "Plan a vacation",
  "description": "Guide through vacation planning process",
  "arguments": [
    { "name": "destination", "type": "string", "required": true },
    { "name": "duration", "type": "number", "description": "days" },
    { "name": "budget", "type": "number", "required": false },
    { "name": "interests", "type": "array", "items": { "type": "string" } }
  ]
}
#### 客户端原语包括: 
##### 采样 `sampling/complete`
采样允许服务器通过客户端请求 LLM 补全而不需要重复内建对LLM的调用,从而实现代理式工作流程。这种方法将客户端置于对用户权限和安全措施的完全控制之下。

##### 提取 `elicitation/requestInput`
提取使服务器能够在交互过程中请求特定信息,为服务器按需收集信息提供了一种结构化方式。
提示是结构化的模板,定义了预期的输入和交互模式。它们由用户控制,需要显式调用而非自动触发。提示可以感知上下文,引用可用的资源和工具以创建全面的流程。类似于资源,提示支持参数完成,以帮助用户发现有效的参数值。
支持方法: `prompts/list` 和 `prompts/get`

##### 根 Roots
根允许客户端指定服务器应关注的目录,通过协调机制传达预期范围。主要用作AI操作文件服务.
结构样式:
```json
{
  "uri": "file:///Users/agent/travel-planning",
  "name": "Travel Planning Workspace"
}
日志 logging

跨领域的功能原语 utility primitives

前有1个

  • Tasks 支持延迟结果获取和状态跟踪

transport layer

支持 stdio和treamable HTTP两种传输机制. 使用 HTTP POST 进行客户端到服务器的消息传递,并可选使用 Server-Sent Events 实现流式功能. 该传输支持远程服务器通信,并支持标准 HTTP 认证方法,包括授权令牌、API 密钥和自定义头信息。MCP 推荐使用 OAuth 获取认证令牌。

MCP协议使用JSONRPC作为底层数据层的传输协议. 这是一个及其简单明了的协议, 官方定义在这儿: https://www.jsonrpc.org/specification

简单说明:

  • JSONRPC是客户端向服务器发起一个请求Request, 服务器返回一个响应Response.
  • 客户端发起的请求有id时, 服务器必须响应并带上id, 如果客户端发起的请求没有id, 则这个请求是一个"通知", 服务器不需要响应.
  • 服务器的响应中必须有id, 如果这个id是null, 则说明客户端给的id有问题
    request格式:
    {
    "jsonrpc": "2.0",  // 必选, 值必须是"2.0"
    "method": "subtract", // 必选, 值为string
    "params": [42, 23],  // 可选, 按具体method的要求
    "id": 1 // 要返回值时必选, 不要返回值是必须省略
    }

    response 成功时格式:

    {
    "jsonrpc": "2.0", // 必选, 值必须是"2.0"
    "result": 19, // 成功时必须有, 失败时必须没有
    "id": 1 // 必须有, 与客户端request中一致
    }

    response 失败时格式

    {
    "jsonrpc": "2.0", 
    "error": { // 失败时必须有, 成功时必须没有
      "code": -32601, // 必选, 为整数. 其中从-32768 到-32000 范围内的错误代码被保留用于预定义错误
      "message": "Method not found" // 必选, 为string, 一句话描述错误.
    }, 
    "id": "1" // 必选, 解析不了client发来的id时候返回null
    }

    更多示例请看官方文档. https://www.jsonrpc.org/specification

一个阳光明媚的清晨,小猫从睡梦中醒了过来,迷迷糊糊的睁开了眼睛。忽然他发现一只蝴蝶停在房间的墙上。蝴蝶长得很漂亮,身上闪着五颜六色的光。
小猫说:“蝴蝶蝴蝶,你真漂亮!你是从哪里来的呀?”
蝴蝶说:“我是从那边的大森林飞过来的。”
小猫说:“我知道,那是古代的魔法大森林!你一定会魔法吧?”
蝴蝶说:“那边有上千年的魔法还有我刚学的新魔法你要不要一起试试呀?”
小猫说:“好呀好呀那我们一起去大森林玩吧!”
蝴蝶说:“那好我带你去。”蝴蝶在空中转了一个八字,身体变大了数倍,让小猫骑在他的背上,一下就飞到了空中。
时间好像倒流了数亿年,他们来到了远古时代的大森林。这里长着各种小猫没有见过的奇花异草。有高耸入云的大树,还有长得像蚂蚁一样大小的小鸟。
蝴蝶看着小鸟,看好像有点害怕。蝴蝶说:“不用害怕这里的日常就是这样的。”
小猫说:“你带我参观一下吧!”
小猫仔细的瞧了瞧森林里的植物和动物,蝴蝶一边飞一边给他介绍这里真的很漂亮又好神奇,很快一天就过去了。
天很快就黑了。“我们回去吧!”说完小猫和蝴蝶就在一处大榕树下告别了。

看了最新一期的罗永浩的十字路口与刘谦的访谈,有感几点:
1、刘谦说努力没那么重要,运气占90%。他说出这个我就相信他说的话都是真的。与我运势学相通。很巧,这和马斯克说的努力10次成功一次的比例概率一模一样。
2、刘谦就此得出第2点结论:享受创造的过程而不是追求成功的结果。因为成功的结果可能性在10%以内,甚至现实往往还要更低得多。并且把这一点放在了孩子的教育上。与此同时他又说了两个例外,一个是不善交际的他做街头魔术必须要与各色人等交谈,另一个是直播带货,这两天对他来说言语方面成长很多。
3、外表和包装真的非常重要,尤其对一个刚刚起步的个体来说。刘谦说他花1万多人民币买套西装,在网站不发达的时候自己做网站还包装出好几个虚拟工作人员来伪装自己的一人公司。而且这个习惯一直持续到现在,他的外在形象包括香水发型衣服全部要自己操办不放心交给别人。这让我想到迈克尔杰克逊、乔布斯都是极其注重外观的。我看不上的那些 html css动画却真的是产品非常重要的一部分。
4、刘谦反复讲了好多次让他的观众感受哇哦一刻,甚至这一刻可以在他的一生中反复跟别人去诉说,变成一个人生的重要经历。然后魔术师为了这一刻苦练多年、准备良久。不能给别人留下这一刻就绝不出手。我想这一刻就是人生的幸福体验。人生留在脑子里值得回味的幸福体验其实很少,无论做任何一个职业,如果能给别人留下一刻的幸福体验并且记住一生那其实是非常了不起、非常有意义的事情。我觉得这可能才是艺术的定义:给别人留下铭刻一生的体验。一个产品如果能做到这一点那他就是个艺术品。

微信小程序云函数超时的问题。微信小程序,云函数有几个超时的问题。其中1个是访问cloud api的时候,这个是可以在云函数端cloud.init的时候设置。但是还有1个调用云函数超时的问题。每次调用函数运行的最长时间不能超过3秒钟。如果超过,则会返回超时。 1般情况下,只有几100毫秒就可以完成云函数的调用,但是如果调用第3方api的时候,就可能因为第3方api处理时间过长导致超时。
让ai给我找了很多办法去延长这个超市时间,但似乎都无法延长。最后只有不使用await调用,直接进行返回,才能避免。