利用키움 OPEN API(REST)的项目。
kiwoom_mcp/ # 项目根目录
├── __init__.py # 包初始化
├── main.py # 入口点(简洁明了)
├── server.py # 主 MCP 服务器类
├── pyproject.toml # 项目配置
├── README.md # 本文件
├── config/ # 配置管理
│ ├── __init__.py
│ ├── constants.py # API 常量和映射
│ └── settings.py # 配置类
├── models/ # 数据模型和类型
│ ├── __init__.py
│ ├── exceptions.py # 自定义异常
│ └── types.py # 请求/响应模型
├── kiwoom/ # Kiwoom API 客户端
│ ├── __init__.py
│ └── client.py # Kiwoom API 的 HTTP 客户端
├── handlers/ # MCP 工具处理器
│ ├── __init__.py
│ ├── base.py # 基础处理器类
│ ├── auth.py # 认证处理器
│ └── orders.py # 订单管理处理器
└── utils/ # 实用工具和助手
├── __init__.py
├── datetime_utils.py # 日期/时间实用工具
└── logging.py # 日志配置
set_credentials - 设置 API 凭据get_access_token - 从 Kiwoom 获取访问令牌set_access_token - 直接设置访问令牌check_token_status - 检查令牌状态和过期时间stock_buy_order - 下买单stock_sell_order - 下卖单get_trade_types - 获取可用的交易类型# Kiwoom API 配置
KIWOOM_APPKEY=your_app_key
KIWOOM_SECRETKEY=your_secret_key
KIWOOM_IS_MOCK=false
KIWOOM_ACCESS_TOKEN=your_token
KIWOOM_TOKEN_EXPIRES_DT=20241231235959
# 服务器配置
MCP_SERVER_NAME=kiwoom-stock-mcp
MCP_SERVER_VERSION=1.0.0
LOG_LEVEL=INFO
from config.settings import KiwoomConfig, ServerConfig
# 创建配置
kiwoom_config = KiwoomConfig(
appkey="your_app_key",
secretkey="your_secret_key",
is_mock=False
)
server_config = ServerConfig(
name="custom-server-name",
version="1.0.0",
log_level="DEBUG"
)
python main.py
export KIWOOM_APPKEY=your_app_key
export KIWOOM_SECRETKEY=your_secret_key
export KIWOOM_IS_MOCK=true
python main.py
handlers/ 中创建一个新的处理器:# handlers/portfolio.py
from .base import BaseHandler
from ..models.types import PortfolioRequest, PortfolioResponse
class PortfolioHandler(BaseHandler):
async def get_portfolio(self, arguments: Dict[str, Any]) -> List[types.TextContent]:
# 实现代码
return self.create_success_response("Portfolio retrieved")
server.py 中注册:# 在 KiwoomMCPServer.__init__() 中
self.portfolio_handler = PortfolioHandler(self.kiwoom_config)
# 在 _setup_handlers() 中
elif name == "get_portfolio":
return await self.portfolio_handler.get_portfolio(arguments)
config/constants.py 中添加常量:ENDPOINTS = {
"TOKEN": "/oauth2/token",
"STOCK_ORDER": "/api/dostk/ordr",
"PORTFOLIO": "/api/portfolio", # 新端点
}
kiwoom/client.py:def get_portfolio(self, access_token: str) -> PortfolioResponse:
# 实现代码
pass
models/types.py 中定义:@dataclass
class PortfolioRequest:
account_number: str
include_positions: bool = True
@dataclass
class PortfolioResponse:
success: bool
positions: List[Position]
total_value: float
旧的 489 行 main.py 已经被重构为:
此结构遵循 Python 最佳实践,并使代码库更加专业和可维护。