使用说明
MCP AI服务器
用于车队运营的本地MCP服务器和AI工作区。通过HTTP上的模型上下文协议(MCP)公开工具,与OpenAI Apps SDK和任何MCP客户端兼容。集成的MCP AI Server客户端提供经过身份验证的聊天、提供商路由、仪表板和管理控件。
本地免费运行 --SQLite用于存储,免费的云AI模型,没有付费API,没有云依赖关系。
产品组合审查用户体验: 客户端根路由是一个公共概览,而不是登录墙。受保护的聊天和管理界面仍然需要身份验证。
实时部署状态: 此存储库当前没有经过验证的公共演示URL。如果GitHub主页或README链接指向一个无关的应用程序,请不要将其用于OpenAI MCP注册。
零充电模式: 此存储库首先是本地的。除非您明确批准托管平台更改和任何可能的计费风险,否则不要运行部署、链接、托管密钥或平台项目命令。
OpenAI平台说明: 将此服务器注册为OpenAI应用程序需要 公共HTTPS URL 和 域验证。服务器本身不需要任何运行成本,但您需要一种将其暴露在互联网上的方法(请参阅 暴露您的服务器 在......下面
特征
- MCP服务器 --通过JSON-RPC提供6个车队管理工具
- MCP AI服务器客户端 --类似ChatGPT的界面,包含10多种免费AI模型
- 智能路由器 --自动选择最快的可用提供商,自动回退速率限制
- SSE流媒体 --逐个令牌的即时响应
- 渐进式网络应用 --可从浏览器安装在任何设备/操作系统上
- 管理面板 -管理模型、API密钥和用户
- 仪表盘 --使用统计数据、提供者健康状况、令牌指标
快速开始
# 1. Server
cd server
cp ../.env.example ../.env # Edit: set MCP_API_KEY, JWT_SECRET, add AI provider keys
npm install
npm run build
npm start
# 2. Client (in a new terminal)
cd client
npm install
npm run dev
- 服务器:http://localhost:3030/health
- 客户:http://localhost:3001
- 首次注册→ 成为 所有者 (完全管理员权限)
人工智能提供商(所有免费等级)
| 提供者 | 型号 | 速度 | 获取密钥 |
|---|---|---|---|
| 赛博拉斯 | 骆驼3.3 70B | ~2000吨/秒 | 网站 cloud.cerebras.ai |
| 格罗克 | Llama 3.3 70B,3.1 8B,混音 | 即时 | console.groq.com/keys |
| 谷歌双子座 | 双子座2.0闪光,思维敏捷 | aistudio.google.com/apikey | |
| Together.ai | Llama 3.1 70B | 快 | api.together.xyz |
| 米斯特拉尔 | 米斯特拉尔小 | 快 | 安慰.米斯特拉尔.ai |
| 开放路由 | Llama 3.1 8B(免费) | 快速 | openrouter.ai/keys |
| SambaNova | 骆驼3.1 405B | 中号 | ambanova.ai云 |
添加密钥 .env 或在运行时通过 管理员→ API密钥。你不需要全部——路由器会自动从可用的提供商中选择。
端点
| 方法 | 路径 | 身份验证 | 描述 |
|---|---|---|---|
| 得到 | /health |
否 | 健康检查 |
| 职位 | /mcp |
x-api-key |
MCP JSON-RPC(工具/列表、工具/调用) |
| 得到 | /.well-known/mcp-verification.txt |
否 | OpenAI的域验证 |
| 职位 | /api/v1/auth/signup |
否 | 创建帐户 |
| 职位 | /api/v1/auth/login |
否 | 登录→ JWT |
| 得到 | /api/v1/auth/me |
JWT | 当前用户 |
| 职位 | /api/v1/chat/stream |
JWT | SSE流媒体聊天 |
| 得到 | /api/v1/chat/conversations |
JWT | 列出对话 |
| 得到 | /api/v1/models |
JWT | 可用的AI模型 |
| 得到 | /api/v1/providers/health |
JWT | 提供商状态 |
| 得到 | /api/v1/stats |
JWT | 使用统计 |
| * | /api/v1/admin/* |
JWT+管理员 | 用户、API密钥、审核日志 |
MCP工具
| 工具 | 说明 |
|---|---|
fleet_list_vehicles |
列出带有可选状态/位置过滤器的车辆 |
fleet_update_status |
更改车辆状态 |
wash_log_create |
记录洗车记录 |
sales_log_create |
记录销售交易 |
report_daily_summary |
每日关键绩效指标:车队计数、清洗、销售/收入 |
knowledge_search |
搜索。/知识/标记文件 |
环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
PORT |
3030 |
HTTP端口 |
MCP_API_KEY |
(空) | 生产时需要 AUTH_MODE=api_key |
AUTH_MODE |
api_key |
api_key 或 no_auth |
JWT_SECRET |
dev-secret... |
JWT签名密钥(必须在生产中更改) |
MCP_VERIFICATION_TOKEN |
(空) | OpenAI域验证令牌回退 |
DB_PATH |
./data/app.db |
SQLite数据库文件 |
LOG_LEVEL |
info |
debug, info, warn, error |
CLIENT_ORIGIN |
http://localhost:3001 |
客户端的CORS源 |
GROQ_API_KEY |
(空) | Groq供应商密钥 |
GEMINI_API_KEY |
(空) | 谷歌Gemini密钥 |
CEREBRAS_API_KEY |
(空) | 大脑钥匙 |
SAMBANOVA_API_KEY |
(空) | SambaNova钥匙 |
TOGETHER_API_KEY |
(空) | Together.ai密钥 |
OPENROUTER_API_KEY |
(空) | OpenRouter密钥 |
MISTRAL_API_KEY |
(空) | 西北风钥匙 |
认证
默认情况下,所有请求 /mcp 要求a x-api-key 标题匹配 MCP_API_KEY.
对于本地开发,set AUTH_MODE=no_auth 在 .env 跳过身份验证。
暴露您的服务器(公共HTTPS)
服务器运行在 http://localhost:3030 默认情况下。OpenAI MCP注册需要 公共HTTPS URL.
以下选项可能涉及托管平台状态或第三方帐户限制。在零费用模式下,保持服务器本地,未经明确批准不得运行这些命令。
| 选项 | 成本 | URL稳定性 | 最适合 |
|---|---|---|---|
| Vercel | 免费层可用 | 稳定 | 托管,无本地隧道进程 |
| Cloudflare隧道(快速) | 免费 | 重启时更改 | 快速本地测试 |
| Cloudflare隧道(已命名) | 免费 | 稳定 | 使用自己的域名进行自托管 |
选项A-Vercel(可选托管端点)
看 deploy/vercel.md.
您的OpenAI MCP URL将是: https://YOUR_APP.vercel.app/mcp.
重要提示:
- 使用您控制的规范公共生产别名。
- 不要为OpenAI使用特定于部署的别名或git别名,除非您有意在这些别名上禁用Vercel身份验证。
- 不要在零收费模式下创建或部署Vercel项目。
选项B——Cloudflare隧道(本地运行+公开)
brew install cloudflared
cloudflared tunnel --url http://localhost:3030
复制 https://*.trycloudflare.com 终端中打印的URL。
有关稳定的隧道域,请参见 ops/cloudflare/setup.md 和 ops/cloudflare/config.example.yml.
OpenAI平台设置
需要a 公共HTTPS URL (参见 暴露您的服务器 上文)。
- 集
MCP_API_KEY在.env(或使用AUTH_MODE=no_auth用于初始测试)。 - 选择一个部署路径:
- Vercel:从repo根目录部署 deploy/vercel.md
- Cloudflare隧道:启动服务器(
cd server && npm start)然后跑cloudflared tunnel --url http://localhost:3030
- 在OpenAI平台上→ App → MCP服务器 步骤:
- MCP服务器URL:
https://YOUR_PUBLIC_HOSTNAME/mcp - 认证:选择 自定义页眉 → 头球
x-api-key,价值:你的MCP_API_KEY。或选择 无身份验证 如果AUTH_MODE=no_auth. - 点击 扫描工具 --需要6个工具。
- MCP服务器URL:
- 域名验证:确认:
cd server && npm run set:verify-token -- "TOKEN_FROM_OPENAI"curl https://YOUR_PUBLIC_HOSTNAME/.well-known/mcp-verification.txt--必须以纯文本形式返回确切的标记。 点击 验证域名 在形式上。 - 继续完成剩余步骤(测试→ 截图→ 提交)。
带故障排除的完整表单字段参考: ops/openai-form-pack.md
数据库
带WAL模式的SQLite。桌子: vehicles, washes, sales, audit_log, users, conversations, messages, api_keys, prompt_templates, usage_log.
种子演示数据:
npm run seed
DB文件在中自动创建 ./data/ 第一次开始。
以macOS服务运行(launchd)
登录时自动启动,崩溃时自动重启。
安装
./ops/macos/install.sh
这将:
- 构建项目
- 安装LaunchAgent plist
~/Library/LaunchAgents/ - 立即启动服务
状态和日志
launchctl print gui/$(id -u)/com.mcp-ai-server.local
tail -f ~/Library/Logs/mcp-ai-server/out.log
tail -f ~/Library/Logs/mcp-ai-server/err.log
卸载
./ops/macos/uninstall.sh
盖子关闭/睡眠
当MacBook盖关闭时,macOS会休眠,网络也会关闭。服务器变成 不可达 --没有适用于电池的解决方法。
在交流电源上,您可以防止睡眠:
caffeinate -dimsu & # Temporary — kill the process to re-enable sleep
sudo pmset -c sleep 0 # Persistent — revert with: sudo pmset -c sleep 10
为了实现真正的24/7可用性,请在没有盖子的设备上运行(Mac Mini、Raspberry Pi、云VM)。
测试
服务器单元测试使用 测试:
cd server
npm test # single run
npm run test:watch # watch mode
客户皮棉:
cd client
npm run lint
冒烟测试
启动服务器,然后:
# In another terminal:
npm run smoke
这将验证:健康端点、MCP工具/列表、工具/调用、身份验证和验证文件。
故障排除
| 症状 | 修复 |
|---|---|
npm run build 失败 |
运行 npm install 第一。检查Node.js≥20。 |
| 端口3030正在使用 | 已设置 PORT=3031 在 .env,或终止旧进程 |
| 401开/mcp | 设置 x-api-key 标题,或使用 AUTH_MODE=no_auth |
401需要身份验证 *.vercel.app |
使用您控制的规范别名,或在项目设置中禁用生产部署URL/别名的Vercel身份验证 |
| 404 NOT_FOUND on Vercel | 确认root vercel.json + api/index.ts 存在,项目根目录为 . |
FUNCTION_INVOCATION_FAILED 在Vercel上 |
检查运行时日志并验证所需的环境变量(MCP_API_KEY, JWT_SECRET, AUTH_MODE, DB_PATH)设置正确 |
| 数据库锁定错误 | 只有一个服务器进程可以访问数据库。停止重复。 |
| launchd无法启动 | 检查 ~/Library/Logs/mcp-ai-server/err.log |
| 盖子关闭时服务器停止 | 请参阅上文“盖子关闭”部分 |
| OpenAI找不到工具 | 确保验证文件具有正确的令牌,URL可访问 |
项目结构
mcp-ai-server/
├── .editorconfig # Editor formatting rules
├── .env.example # Environment template
├── .gitignore
├── SECURITY.md # Security & code scanning policy
├── .github/workflows/
│ ├── ci.yml # CI: install → lint → test → build
│ └── codeql.yml # CodeQL Code Scanning workflow
├── knowledge/ # Markdown files for knowledge_search tool
│ └── policies.md
├── org/ # Org-wide templates
│ ├── _org_checklist.md # Onboarding checklist for new repos
│ └── reusable-codeql.yml # Reusable CodeQL workflow (workflow_call)
├── client/ # Next.js 14 web app (AI Chat Hub)
│ ├── package.json
│ ├── next.config.ts
│ ├── tailwind.config.ts
│ ├── public/
│ │ ├── manifest.json # PWA manifest
│ │ └── sw.js # Service worker
│ └── src/
│ ├── app/ # App Router pages
│ │ ├── layout.tsx # Root layout + meta
│ │ ├── login/ # Auth pages
│ │ ├── signup/
│ │ └── (app)/ # Protected pages
│ │ ├── chat/ # AI chat interface
│ │ ├── dashboard/# Usage stats
│ │ ├── admin/ # Model/user/key mgmt
│ │ ├── settings/ # User preferences
│ │ └── install/ # PWA install guide
│ ├── components/ # React components
│ ├── stores/ # Zustand state
│ ├── hooks/ # Custom hooks (PWA, etc.)
│ ├── lib/ # API client, utils
│ └── types/ # Shared TypeScript types
├── public/
│ └── .well-known/
│ └── mcp-verification.txt
├── ops/ # Deployment & operations
│ ├── cloudflare/ # Tunnel setup
│ ├── macos/ # launchd service
│ └── openai-form-pack.md # OpenAI registration guide
└── server/
├── package.json
├── tsconfig.json
└── src/
├── index.ts # Express entry point
├── config.ts # Env validation (Zod)
├── logger.ts # Structured JSON logger
├── smoke.ts # Smoke test script
├── api/
│ └── routes.ts # REST API (auth, models, admin, stats)
├── auth/
│ ├── middleware.ts # x-api-key + JWT guards
│ └── jwt.ts # JWT sign/verify + user CRUD
├── chat/
│ ├── routes.ts # Chat endpoints + SSE streaming
│ └── service.ts # Conversation/message CRUD
├── db/
│ ├── connection.ts # SQLite singleton
│ ├── schema.ts # All table definitions
│ └── seed.ts # Demo data
├── llm/
│ ├── router.ts # Smart AI router (auto-fallback)
│ ├── types.ts # LLM type definitions
│ └── providers/
│ ├── catalog.ts # Provider & model registry
│ ├── openai-compatible.ts # Groq/Cerebras/Together/etc.
│ └── gemini.ts # Google Gemini adapter
├── mcp/
│ ├── server.ts # MCP Server factory
│ └── routes.ts # POST /mcp Express router
└── tools/
├── registry.ts # Tool registration + Zod→JSON Schema
├── fleet.ts # fleet_list_vehicles, fleet_update_status
├── wash.ts # wash_log_create
├── sales.ts # sales_log_create
├── reports.ts # report_daily_summary
└── knowledge.ts # knowledge_search
验收清单
启动服务器后运行以下命令以确认一切正常:
# 1. Health check
curl -s http://localhost:3030/health | grep '"ok":true'
# 2. MCP tools/list (6 tools expected)
curl -s http://localhost:3030/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'x-api-key: YOUR_KEY' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' \
| grep -o '"name":"[^"]*"' | wc -l
# 3. Auth enforcement (expect 401)
curl -s -o /dev/null -w '%{http_code}' http://localhost:3030/mcp \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
# 4. Verification file (expect plain text token)
curl -i http://localhost:3030/.well-known/mcp-verification.txt
# 5. Smoke test (all-in-one)
cd server && MCP_API_KEY=YOUR_KEY npm run smoke
# 6. launchd status (if installed)
launchctl print gui/$(id -u)/com.mcp-ai-server.local
tail -5 ~/Library/Logs/mcp-ai-server/out.log
质量门和自动修复
太长,读不下去了
每个PR都要经过: 持续集成 (安装→ lint → test → 为服务器和客户端构建)+ CodeQL扫描 → 副驾驶自动修复 建议→ 合并前必须通过所需的状态检查。每周扫描会发现偏差。Sentry Copilot+Docker Copilot是可选的,但建议使用。
- CI工作流程: .github/works/ci.yml
代码扫描(CodeQL)
- 在每个PR和每周(星期一03:00 UTC)运行
- 工作流程: .github/works/codeql.yml
- 警报显示为PR注释和 安全→ 代码扫描警报
- 副驾驶自动修复 可以直接在警报上建议补丁——接受前务必进行审核
哨兵副驾驶室扩建
- 安装 GitHub Copilot的哨兵 来自VS代码市场
- 通过扩展设置连接到您的Sentry项目
- 在Copilot聊天中,使用:
@sentry What are the most recent unresolved errors?@sentry Suggest a fix for issue PROJ-1234@sentry Generate unit tests for the fix in commit abc123
Docker复制品
- 安装 Docker for GitHub Copilot 来自VS代码市场
- 使用以下提示:
@docker Optimize this Dockerfile for smaller image size@docker Add a healthcheck to my Compose service@docker Scan this image for vulnerabilities
分支保护(所需状态检查)
- 首选 设置→ 分支→ 分支保护规则 为了
main - 启用 合并前需要通过状态检查
- 添加必需的检查:
code-scanning,Server (install → build → test),Client (install → lint → build) - 启用 对管理员强制执行
GH CLI快捷方式:
gh api \
-X PUT \
-H "Accept: application/vnd.github+json" \
/repos/<OWNER>/<REPO>/branches/main/protection \
-f required_status_checks[strict]=true \
-f 'required_status_checks[contexts][]=code-scanning' \
-f 'required_status_checks[contexts][]=Server (install → build → test)' \
-f 'required_status_checks[contexts][]=Client (install → lint → build)' \
-f enforce_admins=true \
-f restrictions=
组织范围模板
- org/可重用代码库.yml --可重用的CodeQL工作流(
workflow_call) - org/org.checklist.md --新仓库入职检查表
将可重用的工作流放置在您的组织仓库中 <OWNER>/.github/.github/workflows/reusable-codeql.yml 并从每个仓库的CI调用它。
PWA安装
web客户端是 渐进式网络应用。要在任何设备上安装:
- 在浏览器中打开应用程序
- 引导到 安装 在侧边栏中
- 点击 安装应用程序 (或按照页面上显示的浏览器特定说明进行操作)
适用于:Chrome、Edge、Safari(iOS 16+)、安卓。已安装的应用程序脱机工作(缓存资产),并像本机应用程序一样启动。
许可证
麻省理工学院
作者
康斯坦丁诺斯·福斯科拉基斯 全栈工程师——希腊克里特岛伊拉克利翁 github/kostasuser01gr
投资组合定位
该项目从零开始演示了模型上下文协议(MCP)的实现——构建了一个兼容的服务器,该服务器通过JSON-RPC公开类型化的车队管理工具,与OpenAI Apps SDK集成,并提供了一个具有自动回退路由的多提供商AI聊天客户端。PWA客户端、SSE流、JWT安全管理面板和SQLite支持的持久性是本地优先部署模型的生产风格决策。自动选择最快的可用人工智能提供商并依靠速率限制的智能路由器反映了生产人工智能系统所需的可靠性思维。零付费云依赖使其可运行和可演示,而无需计费。
作为投资组合级本地第一MCP服务器和AI工作区构建。当前公共版本的预计实施工作:4-7个重点开发日。