"""多维表格应用工具"""
import lark_oapi as lark
from lark_oapi.api.bitable.v1 import (
App,
CreateAppRequest,
CopyAppRequest,
CopyAppRequestBody,
CreateAppTableRequest,
CreateAppTableRequestBody,
)
from mcp.server.fastmcp import FastMCP
from yuppie_mcp_feishu.client import get_client
from yuppie_mcp_feishu.exceptions import handle_feishu_error
def _create_bitable_app_impl(name: str, folder_token: str = ""):
"""
创建多维表格应用(实现)
参数:
name: 多维表格名称
folder_token: (可选) 文件夹token,指定创建位置
返回:
应用响应对象
"""
client = get_client()
request = (
CreateAppRequest.builder()
.request_body(App.builder().name(name).folder_token(folder_token).build())
.build()
)
return client.bitable.v1.app.create(request)
def _copy_bitable_app_impl(app_token: str, name: str, folder_token: str = ""):
"""
复制多维表格应用(实现)
参数:
app_token: 要复制的多维表格token
name: 新多维表格的名称
folder_token: (可选) 文件夹token,指定创建位置
返回:
应用响应对象
"""
client = get_client()
request = (
CopyAppRequest.builder()
.app_token(app_token)
.request_body(
CopyAppRequestBody.builder().name(name).folder_token(folder_token).build()
)
.build()
)
return client.bitable.v1.app.copy(request)
def _create_bitable_table_impl(
app_token: str,
table_name: str,
fields: list = None,
):
"""
创建数据表(实现)
参数:
app_token: 多维表格的app_token
table_name: 数据表名称
fields: (可选) 字段定义列表,每个字段为dict格式
返回:
数据表响应对象
"""
from lark_oapi.api.bitable.v1.model import AppTable
client = get_client()
# 构建AppTable对象
table_builder = AppTable.builder().name(table_name)
table = table_builder.build()
# 设置字段定义(如果提供)
if fields:
table.fields = fields
# 构建请求
request = (
CreateAppTableRequest.builder()
.app_token(app_token)
.request_body(CreateAppTableRequestBody.builder().table(table).build())
.build()
)
return client.bitable.v1.app_table.create(request)
# 导出函数供测试使用
def create_bitable_app(name: str, folder_token: str = "") -> str:
"""创建多维表格应用"""
response = _create_bitable_app_impl(name, folder_token)
return lark.JSON.marshal(response.data, indent=4)
def copy_bitable_app(app_token: str, name: str, folder_token: str = "") -> str:
"""复制多维表格应用"""
response = _copy_bitable_app_impl(app_token, name, folder_token)
return lark.JSON.marshal(response.data, indent=4)
def create_bitable_table(
app_token: str,
table_name: str,
fields: list = None,
) -> str:
"""
创建数据表
参数:
app_token: 多维表格的app_token
table_name: 数据表名称
fields: (可选) 字段定义列表
返回:
JSON格式的数据表信息
"""
response = _create_bitable_table_impl(app_token, table_name, fields)
if not response.success():
error_data = {"success": False, "code": response.code, "msg": response.msg}
return lark.JSON.marshal(error_data, indent=4)
return lark.JSON.marshal(response.data, indent=4)
def register_bitable_app_tools(mcp: FastMCP):
"""注册多维表格应用工具"""
@mcp.tool()
@handle_feishu_error
def create_bitable_app_tool(name: str, folder_token: str = ""):
"""
创建多维表格应用
参数:
name: 多维表格名称
folder_token: (可选) 文件夹token,指定创建位置
返回:
JSON格式的应用信息,包含app_token等
"""
return _create_bitable_app_impl(name, folder_token)
@mcp.tool()
@handle_feishu_error
def copy_bitable_app_tool(app_token: str, name: str, folder_token: str = ""):
"""
复制多维表格应用
参数:
app_token: 要复制的多维表格token
name: 新多维表格的名称
folder_token: (可选) 文件夹token,指定创建位置
返回:
JSON格式的应用信息
"""
return _copy_bitable_app_impl(app_token, name, folder_token)
@mcp.tool()
@handle_feishu_error
def create_bitable_table_tool(
app_token: str,
table_name: str,
fields: list = None,
):
"""
创建数据表
参数:
app_token: 多维表格的app_token
table_name: 数据表名称
fields: (可选) 字段定义列表,每个字段为dict格式
示例: [{"field_name": "姓名", "type": 1, "is_primary": true}]
注意: 字段类型请参考飞书官方文档
返回:
JSON格式的数据表信息,包含table_id等
"""
return _create_bitable_table_impl(app_token, table_name, fields)
__all__ = [
"create_bitable_app",
"copy_bitable_app",
"create_bitable_table",
"register_bitable_app_tools",
]