108 lines
2.7 KiB
Python
108 lines
2.7 KiB
Python
#!/usr/bin/env python
|
||
"""
|
||
滴答清单 MCP 服务入口点
|
||
允许AI模型通过MCP协议访问和操作滴答清单待办事项
|
||
"""
|
||
|
||
import os
|
||
import sys
|
||
import argparse
|
||
import json
|
||
from pathlib import Path
|
||
import dotenv
|
||
from mcp_server import create_server
|
||
from tools.official_api import init_api
|
||
|
||
# 加载环境变量(支持 .env)
|
||
dotenv.load_dotenv()
|
||
|
||
def parse_args():
|
||
"""解析命令行参数"""
|
||
parser = argparse.ArgumentParser(
|
||
description="滴答清单 MCP 服务"
|
||
)
|
||
parser.add_argument(
|
||
"--install",
|
||
action="store_true",
|
||
help="安装到Claude Desktop或其他MCP客户端"
|
||
)
|
||
parser.add_argument(
|
||
"--token",
|
||
help="滴答清单访问令牌"
|
||
)
|
||
parser.add_argument(
|
||
"--email",
|
||
help="滴答清单账户邮箱"
|
||
)
|
||
parser.add_argument(
|
||
"--phone",
|
||
help="滴答清单账户手机号"
|
||
)
|
||
parser.add_argument(
|
||
"--password",
|
||
help="滴答清单账户密码"
|
||
)
|
||
# 统一 .env-only,不再支持 config 文件路径
|
||
parser.add_argument(
|
||
"--port",
|
||
type=int,
|
||
default=3000,
|
||
help="服务器端口号(用于SSE传输方式)"
|
||
)
|
||
parser.add_argument(
|
||
"--host",
|
||
default="127.0.0.1",
|
||
help="服务器主机(用于SSE传输方式)"
|
||
)
|
||
parser.add_argument(
|
||
"--sse",
|
||
action="store_true",
|
||
help="使用SSE传输方式而不是stdio"
|
||
)
|
||
|
||
return parser.parse_args()
|
||
|
||
def ensure_oauth_ready() -> bool:
|
||
"""
|
||
检查OAuth是否就绪(仅用于独立运行模式)
|
||
在集成模式下,token由外部传入,所以这个检查是可选的
|
||
"""
|
||
try:
|
||
if os.environ.get("DIDA_ACCESS_TOKEN"):
|
||
init_api()
|
||
# ✅ 检测到环境变量中的 OAuth token
|
||
return True
|
||
else:
|
||
# 未检测到 DIDA_ACCESS_TOKEN 环境变量
|
||
# 在集成模式下这是正常的,token将由调用方传递
|
||
return False
|
||
except Exception as e:
|
||
# OAuth初始化警告(在集成模式下正常)
|
||
return False
|
||
|
||
def main():
|
||
"""主函数"""
|
||
args = parse_args()
|
||
# OAuth检查不再是强制性的
|
||
ensure_oauth_ready()
|
||
|
||
# 创建MCP服务器
|
||
server = create_server({})
|
||
|
||
# 启动服务器
|
||
if args.install:
|
||
# 安装到Claude Desktop
|
||
# 正在安装到MCP客户端...
|
||
os.system("fastmcp install")
|
||
else:
|
||
# 直接运行
|
||
# 启动滴答清单MCP服务器
|
||
if args.sse:
|
||
# 使用SSE传输方式
|
||
server.run(transport="sse", host=args.host, port=args.port)
|
||
else:
|
||
# 使用默认stdio传输方式
|
||
server.run()
|
||
|
||
if __name__ == "__main__":
|
||
main() |