oas-execute-mcp
oas-execute-mcp
一个MCP服务器,在语言模型与经纪商订单之间设置了一道安全层。
模型调用order_submit。在请求到达经纪商之前,它会经过六项独立的检查,任何一项都可以拒绝它——在写入路径上则是七项,因为止损规则约束的是修改而非开仓。每一次尝试——无论允许还是拒绝——都会被追加到审计日志中,并附上原因。经纪商本身位于一个可切换的后端之后,因此同一套工具接口可以在磁盘上的模拟器或实时的MetaTrader 5终端上运行,而模型无需知道具体是哪个。
专为这样一个智能体构建:它在自己的通道上,无需每笔交易人工审批,即可向一个10万美元的自营公司评估账户提交订单——而一个错误规模的订单并非失败的测试。
存在的原因
赋予一个智能体能够花钱的工具,其有趣之处并不在于顺利路径。而在于:
当工具部分成功时返回的内容——订单已成交但止损未附加;
超时落在何处——经纪商从未回应,你不知道它是否成交;
如何阻止一个失败被其上层报告为成功。
因此,这里的设计规则是:模型自己对所发生事情的描述永远不被信任。每次调用都会从经纪商重新读取持仓状态。拒绝是明确的、数量有限,并且直接位于执行路径上,而不是在提示词中作为旁注。
Related MCP server: mt5-mcp
安全层
七项检查,每项都能独立拒绝,所有检查都附带机器可读的原因记录在日志中。其中六项位于order_submit与经纪商之间;check_sl_widen_block管理修改,因此它永远不会看到开仓:
检查项 | 拒绝条件 |
| 磁盘上存在一个紧急停止开关文件。立即触发,无需重启。 |
| 订单到达速度超过配置的上限。 |
| 上游决策记录已过期——旧审批不能用于新订单。 |
| 数量、方向或品种与经纪商报告的不一致。 |
| 止损修改会使止损远离价格。 |
| 本次会话的手动覆盖次数超过允许的数量。 |
| 账户净值已越过配置的下限。 |
审计追加在每次路径的检查之后运行,无论允许还是拒绝——它是记录,而非检查:一次没有留下痕迹的拒绝被视为系统故障。
safety.py将这些检查分组为run_entry_safety_gates、run_modify_safety_gates和run_close_safety_gates,因此平仓永远不会被本应只管理开仓的规则阻止——这是安全系统将你困在它本应保护的持仓中的故障模式。
工具接口
七个工具:order_submit · order_modify · order_close · close_all · position_list · account_info · health_check。
架构
model tool call
│
▼
server.py ── MCP stdio server, tool schemas + dispatch
│
▼
safety.py ── 7 gates, audit log, kill switch ◄── refuses here, before the broker
│
▼
backends/ ── swappable
├── stub.py on-disk simulation, no broker, deterministic
└── mt5_demo.py file bridge → MetaTrader 5 (Wine/macOS) via an MQL5 EA
localhost HTTP listener, shared-secret token on the firing routeMQL5专家顾问(oas_execute_mcp/mql5/OAS_Bridge.mq5)轮询一个本地主机端点并在终端侧执行。backends/base.py是接口;添加一个经纪商意味着实现它,后端之上的任何内容都不需要更改。
安装
pip install -e ".[dev]"将你的MCP客户端指向它:
{
"mcpServers": {
"oas-execute": {
"command": "/path/to/.venv/bin/python",
"args": ["-m", "oas_execute_mcp.server"],
"cwd": "/path/to/parent-of-this-package"
}
}
}后端选择和路径通过环境变量设置:
变量 | 默认值 | 用途 |
|
|
|
|
| 状态、审计日志、账户记录 |
| MT5在Wine下的默认路径 | MT5 |
它默认使用stub。你需要主动选择将其指向一个经纪商。
此仓库中不包含任何凭证,也不应包含。 MT5后端跟随已登录的终端;它读取的账户记录是文档性质的(登录名和服务器名称),不携带密码,并且应位于版本控制之外。
测试
PYTHONPATH=. python3 tests/test_smoke.py # full submit → modify → close cycle + failure modes
for t in tests/test_*.py; do PYTHONPATH=. python3 "$t"; done # the whole suite
python3 -m pytest tests/ -q # same suite, if you would rather type this九个测试文件,在干净的检出状态下全部通过。每个文件都是一个独立的检查器:它在模块作用域运行断言,并在失败时以非零退出,因此测试套件只需要一个解释器。tests/suite_test.py以子进程方式驱动相同的脚本,因此pytest也是一个可用的入口点——它是一个桥接,而非第二套测试,并且不存在只有某个运行器才能看到的测试版本。它们涵盖了针对stub的提交/修改/平仓周期、止损锚定及在收费成交后的重新推导、桥接客户端模式握手、报价和持仓路由,以及阻止一个错误形状的负载被当作空持仓列表消费的关卡——这是一个真实事件,其中超时返回了{"positions": []},而下游读取器相信了它。
当测试对象缺失时,两个测试会跳过而非通过。 它们测试的是此服务器的消费者,因此需要宿主项目(OAS_HOST_REPO、OAS_RECONCILE_CMD)。一个在被检查内容缺失时静默变绿的检查,比没有检查更糟糕。
状态与限制
stub后端是完整且确定性的。mt5_demo已在生产环境中使用,针对在macOS上通过Wine运行的MetaTrader 5终端。check_rate_limit已实现,但未在测试台上执行——测试台模拟的是经纪商超时和紧急停止开关触发,而非速率限制响应。之所以说明这一点,是因为“已实现”与“已测试”之间的区别正是此仓库的全部主题。MT5桥接是针对macOS/Wine环境设计的。原生Windows安装需要设置
OAS_MT5_COMMON_FILES,且未经我本人测试。设计为单终端:监听器是单个端口上的单例,第二个服务器进程会检测到第一个并将其转发,而不是竞争绑定。
许可证
MIT — 参见 LICENSE。
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- MIT
- AlicenseAqualityAmaintenanceAn MCP server that lets an AI agent read your MetaTrader 5 account and place trades over the Model Context Protocol, with a configurable human approval gate.154MIT
- Alicense-qualityCmaintenanceA local-first MCP server that bridges AI coding agents with MetaTrader 5 for inspection, market data, MQL5 development, compiling, Strategy Tester review, workspace sync, logs, audit trails, demo trading, and carefully gated live trading.MIT
- FlicenseBqualityCmaintenanceAn MCP trading server over a paper broker with a deterministic risk layer that enforces limits before orders reach the handler, ensuring safe AI agent trading.7
Related MCP Connectors
MCP server exposing the Backtest360 engine API as tools for AI agents.
MCP server for Gainium — manage trading bots, deals, and balances via AI assistants
MCP server for AI dialogue using various LLM models via AceDataCloud
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/zorionarrillaga/oas-execute-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server