MCP

2026-09-21 01:17 Monday16594min
CC BY 4.0(除特别声明和转载)

MCP 是 Codex 连接外部世界的标准化协议,它让模型能够访问第三方文档或与开发者工具(如浏览器、Figma)交互。

  • 原理:MCP 使用 JSON-RPC over stdio 作为通信机制,核心抽象是“命名方法调用 + 结构化结果”。Codex 作为MCP Host(主机),连接到各个 MCP Server(服务器)。
  • 服务器定义:一个 MCP 服务器会定义模型可调用的工具、工具的输入/输出模式、认证授权要求以及结构化结果等。它提供了实时信息和受控操作,而 Skill 则提供了围绕这些工具的工作流指导。

目录结构

MCP 的目录结构可以从三个层面来理解:MCP 服务器自身源码的项目结构、Codex 中 MCP 配置文件的存放位置,以及插件中 MCP 配置的组织方式。

MCP 服务器项目结构(源码层面)

如果你要自己开发一个 MCP 服务器,推荐的目录结构取决于语言和技术栈。

基础 Python 服务器(适合简单工具)

使用官方脚手架生成的基础结构非常简洁:

my-server/  
├── server.py # 主服务器文件,包含工具定义和启动逻辑  
├── pyproject.toml # 项目配置和依赖声明  
├── .gitignore # Git 忽略规则  
└── README.md # 项目说明文档

server.py 中定义工具的核心模式:

from mcp.server.fastmcp import FastMCP  
mcp = FastMCP("my-server")  
@mcp.tool()  
async def example_tool(text: str) -> str:  
    """一个处理文本的示例工具。"""  
    return f"Processed: {text}"  
if __name__ == "__main__":  
    mcp.run()

进阶 Python 服务器(生产级)

AWS Labs 的 MCP 服务器设计指南推荐以下结构,强调单一职责和明确的入口点:

mcp-server-project/  
├── README.md  
├── pyproject.toml  
├── awslabs/ # 源码根目录(命名空间)  
│ └── your_mcp_server/  
│ ├── __init__.py # 版本元数据  
│ ├── models.py # 数据模型和校验逻辑  
│ ├── server.py # MCP 服务器实现 + main() 入口  
│ └── consts.py # 常量定义  
└── tests/ # 测试目录

关键规范:不要创建单独的 main.py,入口点函数 main() 应定义在 server.py 内部,并在 pyproject.toml 中注册:

[project.scripts]  
"awslabs.your-mcp-server" = "awslabs.your_mcp_server.server:main"

TypeScript 服务器(模块化分工)

TypeScript 模板将工具、资源和提示模板按功能拆分到独立目录:

mcp-server-template/
├── src/
│   ├── index.ts              # 主入口,服务器启动和注册
│   ├── tools/                # 工具实现(模型可调用的函数)
│   │   └── example.ts
│   ├── resources/            # 资源实现(模型可访问的数据)
│   │   └── example.ts
│   └── prompts/              # 提示模板(可复用的提示结构)
│       └── example.ts
├── dist/                     # 编译输出(自动生成)
├── package.json
├── tsconfig.json
└── CLAUDE.md                 # 给编码代理的项目说明

生产级三层架构(复杂服务器)

对于需要处理认证、多租户、审计等企业级需求的服务器,推荐三层分离的架构:

service-name-mcp/  
├── src/  
│ ├── transport/ # 第一层:传输与协议  
│ │ ├── stdio.ts # STDIO 传输  
│ │ ├── http.ts # HTTP + SSE 传输  
│ │ └── session.ts # 会话管理  
│ ├── protocol/ # 第二层:MCP 协议  
│ │ ├── mcp-server.ts # MCP 服务器主实现  
│ │ ├── tool-registry.ts # 工具注册与分发  
│ │ ├── resource-registry.ts  
│ │ └── prompt-registry.ts  
│ └── business/ # 第三层:业务逻辑  
│ ├── services/ # 核心业务服务  
│ ├── clients/ # 外部 API 客户端  
│ └── transformers/ # 数据转换工具  
├── auth/ # 认证与授权  
├── security/ # 安全工具(限流、脱敏)  
├── audit/ # 审计日志  
└── observability/ # 监控与追踪

核心原则:传输层不包含业务逻辑,协议层只负责工具注册和分发,业务层完全独立于 MCP 协议,可单独测试。

Codex 中 MCP 配置的目录位置

Codex 不使用 .mcp.json 作为主配置文件,而是将 MCP 服务器配置统一存放在 config.toml 中。

全局配置

~/.codex/config.toml 是 Codex 的总控配置文件,MCP 服务器在此注册:

[mcp_servers.context7]
command = "npx"
args = ["-y", "@upstash/context7-mcp"]

[mcp_servers.my-http-server]
url = "https://example.com/mcp"
bearer_token_env_var = "MY_API_TOKEN"

项目级配置(仅限受信任项目)

在受信任的项目中,可以创建 .codex/config.toml 来限定 MCP 服务器的作用范围:

<项目根>/
├── .codex/
│   └── config.toml      # 项目专属的 MCP 服务器配置
├── src/
└── ...

CLI 管理命令

也可以完全通过 CLI 命令管理,无需手动编辑文件:

# 添加 STDIO 服务器

codex mcp add context7 -- npx -y @upstash/context7-mcp

# 添加带环境变量的服务器

codex mcp add my-server --env API_KEY=xxx -- npx -y my-mcp-server

# 在 TUI 中查看活跃的 MCP 服务器

/mcp

插件中 MCP 配置的目录结构

当 MCP 服务器需要随插件分发时,使用 .mcp.json 文件,该文件位于插件根目录(不在 .codex-plugin/ 内部)。

插件目录布局

docs-helper/                      # 插件根目录
├── .codex-plugin/
│   └── plugin.json               # 插件清单,声明 MCP 配置路径
├── .mcp.json                     # MCP 服务器定义(根目录)
└── skills/
    └── docs-search/
        └── SKILL.md

plugin.json 中的引用

{
  "name": "docs-helper",
  "version": "1.0.0",
  "description": "Find answers in OpenAI developer documentation.",
  "skills": "./skills/",
  "mcpServers": "./.mcp.json"
}

路径规则:从插件根目录解析,必须以 ./ 开头,不能包含 ..,必须停留在插件内部。

.mcp.json 的内容

插件中的 .mcp.json 使用 mcpServers 包装器,与 Codex 全局配置中的 [mcp_servers] 表结构不同:

{
  "mcpServers": {
    "openai_docs": {
      "type": "http",
      "url": "https://developers.openai.com/mcp"
    }
  }
}

支持两种传输类型:

类型配置字段说明
stdiocommand、args、env本地进程,Codex 启动命令来运行
httpurl远程 HTTP 端点
BuyMeACola