install-mcpcat-typescript
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseInstalling MCPCat Analytics SDK
安装MCPCat Analytics SDK
Overview
概述
MCPCat is a one-line analytics integration for MCP servers. Call to capture tool usage patterns, user intent, and session data. All MCPCat debug output goes to (never stdout/stderr, so STDIO transport is preserved).
mcpcat.track(server, projectId)~/mcpcat.logMCPCat是针对MCP服务器的一行代码分析集成工具。调用即可捕获工具使用模式、用户意图和会话数据。所有MCPCat调试输出都会写入(绝不会输出到stdout/stderr,因此STDIO传输得以保留)。
mcpcat.track(server, projectId)~/mcpcat.logWhen to Use
适用场景
- User wants to add analytics or usage tracking to their MCP server
- User mentions "mcpcat", "MCPCat", or MCP server observability
- User wants to understand how their MCP tools are being used
- 用户希望为其MCP服务器添加分析或使用追踪功能
- 用户提及“mcpcat”、“MCPCat”或MCP服务器可观测性
- 用户希望了解其MCP工具的使用情况
Quick Reference
快速参考
| Item | Value |
|---|---|
| Package | |
| Import | |
| Core call | |
| Peer dep | |
| MCPCat log file | |
| Project ID env var | |
| Debug env var | |
| Defaults | All features enabled (context injection, tracing, report-missing tool) |
| 项目 | 值 |
|---|---|
| 包 | |
| 导入方式 | |
| 核心调用 | |
| 对等依赖 | |
| MCPCat日志文件 | |
| 项目ID环境变量 | |
| 调试环境变量 | |
| 默认配置 | 所有功能启用(上下文注入、追踪、缺失工具报告) |
Implementation Checklist
实施检查清单
Follow these steps in order. Do NOT skip or reorder.
请按顺序执行以下步骤,请勿跳过或调整顺序。
0. Get the MCPCat project ID
0. 获取MCPCat项目ID
If the user did not provide a MCPCat project ID (a string like from mcpcat.io), ASK them for it before proceeding. Say something like:
"proj_abc123xyz""To set up MCPCat, I'll need your project ID from mcpcat.io. It looks like. Do you have one? You can create a free account at https://mcpcat.io to get one."proj_abc123xyz
- If they provide one: hardcode it as the default in the env var fallback, e.g.
process.env.MCPCAT_PROJECT_ID ?? "proj_their_id" - Do NOT skip this step or assume a project ID
如果用户未提供MCPCat项目ID(格式为,来自mcpcat.io),请先向用户索要该ID再继续。可以这样说:
"proj_abc123xyz""要设置MCPCat,我需要您来自mcpcat.io的项目ID,格式类似。您有这个ID吗?您可以在https://mcpcat.io创建免费账户来获取。"proj_abc123xyz
- 如果用户提供了ID:将其作为环境变量回退的默认值硬编码,例如
process.env.MCPCAT_PROJECT_ID ?? "proj_their_id" - 请勿跳过此步骤或默认项目ID存在
1. Read the user's existing MCP server code
1. 阅读用户现有MCP服务器代码
Before making ANY changes, read the server file(s) and identify these three landmarks:
- Server creation: (high-level) or
new McpServer(...)(low-level)new Server(...) - Tool registrations: ,
server.registerTool(...), orserver.tool(...)server.setRequestHandler(CallToolRequestSchema, ...) - Transport connection: — usually inside an async
server.connect(transport)functionmain()
在进行任何修改之前,先阅读服务器文件并确定以下三个关键部分:
- 服务器创建:(高层级)或
new McpServer(...)(低层级)new Server(...) - 工具注册:、
server.registerTool(...)或server.tool(...)server.setRequestHandler(CallToolRequestSchema, ...) - 传输连接:—— 通常位于异步
server.connect(transport)函数内main()
2. Check peer dependency
2. 检查对等依赖
Look at and verify version is . If older, tell the user they must upgrade first.
package.json@modelcontextprotocol/sdk>= 1.11查看并验证版本是否。如果版本较低,请告知用户必须先升级。
package.json@modelcontextprotocol/sdk>= 1.113. Install the mcpcat package
3. 安装mcpcat包
Detect the package manager and install:
| Indicator | Command |
|---|---|
| |
| |
| |
| |
| Otherwise | Check the project's README and other |
检测包管理器并执行安装:
| 标识文件 | 命令 |
|---|---|
| |
| |
| |
| |
| 其他情况 | 查看项目README及其他 |
4. Add the import
4. 添加导入语句
Add near the top of the server file, alongside existing MCP SDK imports:
typescript
import * as mcpcat from "mcpcat";Use the namespace import (), not named import ().
import * as mcpcatimport { track }在服务器文件顶部靠近现有MCP SDK导入的位置添加:
typescript
import * as mcpcat from "mcpcat";请使用命名空间导入(),而非命名导入()。
import * as mcpcatimport { track }5. Add the track() call
5. 添加track()调用
CRITICAL: The function signature is:
track()typescript
mcpcat.track(server, projectId, options?)- 1st arg: The MCP server instance (both and
McpServerwork)Server - 2nd arg: Project ID string (e.g. )
"proj_abc123xyz" - 3rd arg: Options object (optional — all defaults are good, do NOT pass unless customizing)
WRONG: — this passes an options object as the 2nd arg.
RIGHT: — projectId is the 2nd positional argument.
track(server, { projectId })track(server, projectId)Placement: Insert AFTER server creation and BEFORE . Place it at the module level alongside tool registrations, NOT inside the async function.
server.connect(transport)main()Always call track() with the project ID from the env var, falling back to the user's hardcoded ID:
typescript
mcpcat.track(server, process.env.MCPCAT_PROJECT_ID ?? "proj_their_id");关键注意:函数签名为:
track()typescript
mcpcat.track(server, projectId, options?)- 第一个参数:MCP服务器实例(和
McpServer均可)Server - 第二个参数:项目ID 字符串(例如)
"proj_abc123xyz" - 第三个参数:选项对象(可选——默认配置已足够,除非需要自定义否则请勿传递)
错误写法: —— 将选项对象作为第二个参数传递
正确写法: —— projectId是第二个位置参数
track(server, { projectId })track(server, projectId)放置位置:在服务器创建之后、之前插入。将其放在模块级别与工具注册代码一起,而非异步函数内部。
server.connect(transport)main()务必调用track(),使用环境变量中的项目ID,回退到用户提供的硬编码ID:
typescript
mcpcat.track(server, process.env.MCPCAT_PROJECT_ID ?? "proj_abc123xyz");6. Add debug logging
6. 添加调试日志
MCPCat writes all its internal debug output to . Add a single stderr line (controlled by env var) so the user knows tracking is active:
~/mcpcat.logtypescript
if (process.env.MCPCAT_DEBUG_MODE) {
console.error("[mcpcat] Analytics enabled. Debug log: ~/mcpcat.log");
}Use , NEVER — stdout is the MCP protocol channel for STDIO transport.
console.errorconsole.logKeep it to this single line. Do NOT create a debug utility function or add multiple debug log points.
MCPC会将所有内部调试输出写入。添加一行stderr输出(由环境变量控制),让用户知晓追踪已激活:
~/mcpcat.logtypescript
if (process.env.MCPCAT_DEBUG_MODE) {
console.error("[mcpcat] Analytics enabled. Debug log: ~/mcpcat.log");
}请使用,切勿使用——stdout是MCP协议的STDIO传输通道。
console.errorconsole.log仅保留这一行代码,请勿创建调试工具函数或添加多个调试日志点。
7. Verify
7. 验证
After making changes, confirm:
- Server still starts and responds to tool calls
- exists and contains initialization entries
~/mcpcat.log - No MCPCat output appears on stdout
修改完成后,请确认:
- 服务器仍能正常启动并响应工具调用
- 已存在且包含初始化条目
~/mcpcat.log - 没有MCPCat输出出现在stdout中
Before and After
修改前后对比
BEFORE
修改前
typescript
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const server = new McpServer({ name: "my-server", version: "1.0.0" });
server.registerTool("greet", {
description: "Greets a user",
inputSchema: { name: { type: "string" } },
}, async (args) => ({
content: [{ type: "text", text: "Hello, " + args.name + "!" }],
}));
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
}
main().catch(console.error);typescript
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const server = new McpServer({ name: "my-server", version: "1.0.0" });
server.registerTool("greet", {
description: "Greets a user",
inputSchema: { name: { type: "string" } },
}, async (args) => ({
content: [{ type: "text", text: "Hello, " + args.name + "!" }],
}));
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
}
main().catch(console.error);AFTER
修改后
typescript
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import * as mcpcat from "mcpcat";
const server = new McpServer({ name: "my-server", version: "1.0.0" });
server.registerTool("greet", {
description: "Greets a user",
inputSchema: { name: { type: "string" } },
}, async (args) => ({
content: [{ type: "text", text: "Hello, " + args.name + "!" }],
}));
mcpcat.track(server, process.env.MCPCAT_PROJECT_ID ?? "proj_abc123xyz");
if (process.env.MCPCAT_DEBUG_MODE) {
console.error("[mcpcat] Analytics enabled. Debug log: ~/mcpcat.log");
}
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
}
main().catch(console.error);Changes: one import, one call, one debug log block.
track()typescript
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import * as mcpcat from "mcpcat";
const server = new McpServer({ name: "my-server", version: "1.0.0" });
server.registerTool("greet", {
description: "Greets a user",
inputSchema: { name: { type: "string" } },
}, async (args) => ({
content: [{ type: "text", text: "Hello, " + args.name + "!" }],
}));
mcpcat.track(server, process.env.MCPCAT_PROJECT_ID ?? "proj_abc123xyz");
if (process.env.MCPCAT_DEBUG_MODE) {
console.error("[mcpcat] Analytics enabled. Debug log: ~/mcpcat.log");
}
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
}
main().catch(console.error);修改内容:新增一个导入语句、一个调用、一个调试日志块。
track()Low-Level Server Pattern
低层级服务器模式
For servers using the class directly:
Servertypescript
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import * as mcpcat from "mcpcat";
const server = new Server(
{ name: "my-server", version: "1.0.0" },
{ capabilities: { tools: {} } }
);
// ... setRequestHandler calls ...
mcpcat.track(server, process.env.MCPCAT_PROJECT_ID ?? "proj_abc123xyz");
if (process.env.MCPCAT_DEBUG_MODE) {
console.error("[mcpcat] Analytics enabled. Debug log: ~/mcpcat.log");
}
// Then connect transport as usual对于直接使用类的服务器:
Servertypescript
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import * as mcpcat from "mcpcat";
const server = new Server(
{ name: "my-server", version: "1.0.0" },
{ capabilities: { tools: {} } }
);
// ... setRequestHandler 调用 ...
mcpcat.track(server, process.env.MCPCAT_PROJECT_ID ?? "proj_abc123xyz");
if (process.env.MCPCAT_DEBUG_MODE) {
console.error("[mcpcat] Analytics enabled. Debug log: ~/mcpcat.log");
}
// 然后按常规方式连接传输通道Common Mistakes
常见错误
| Mistake | Why it fails | Fix |
|---|---|---|
| Options object passed as 2nd arg instead of projectId string | |
| Skips tracking if env var is unset, defeating the hardcoded fallback | Always call |
| Transport starts before MCPCat intercepts handlers | Move |
| MCPCat detects and skips, but indicates logic error | Call |
| Breaks STDIO transport (stdout is the MCP channel) | Use |
| Creating a debugLog utility | Over-engineers a one-liner | Single |
| Expecting console output from MCPCat | MCPCat logs to file, not console | Check |
| MCPCat requires >= 1.11 | Upgrade: |
| 错误做法 | 失败原因 | 修复方案 |
|---|---|---|
| 将选项对象作为第二个参数传递,而非projectId字符串 | |
| 如果环境变量未设置则跳过追踪,导致硬编码回退失效 | 务必调用 |
在 | 传输通道在MCPCat拦截处理程序之前启动 | 将 |
调用两次 | MCPCat会检测到并跳过,但表明存在逻辑错误 | 每个服务器仅调用一次 |
使用 | 破坏STDIO传输(stdout是MCP通道) | 使用 |
| 创建debugLog工具函数 | 对单行代码过度设计 | 仅保留 |
| 期望从MCPCat获取控制台输出 | MCPCat日志写入文件而非控制台 | 查看 |
| MCPCat要求版本 >= 1.11 | 升级: |