财务合同 MCP 实践
 作者:京东科技开发者
- 2025-05-12  北京
- 本文字数:1858 字 - 阅读完需:约 6 分钟 
作者:CHO 李航
一、背景:
随着 MCP 的普及,能否从业务角度,以 MCP 化的交互方式让业务简单通过自然语言描述进行对系统的操作,从而带来成本更低更便捷更快的体验。
二、实现功能:
1.根据合同状态或编号查询合同信息:
i. question: 请帮我查询待签署的合同
 
 ii. 通过 MCP client 进行 MCP 匹配调用
 
 iii. 用户确认后调用合同查询 MCP server
 
 1.实现业务合同延期处理:
i. 通过自然语言描述我希望延期的合同
 
 ii. 通过 MCP client 进行 MCP 匹配调用-如果不在上文中的合同列表内则大模型会先进行查询确保合同有效
 
 iii. 查询结束自动调用延期 MCP server
 
 iiii. 返回相应结果:已成功延期
 
 iiiii. 业务系统验证-成功🏅
三、代码实现
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";import { z } from "zod";const QUERY_CONTRACT = "xxxxxxx";const DELAY_CONTRACT = "xxxxxxx";
// Create server instanceconst server = new McpServer({    name: "contract",    version: "1.0.0",    capabilities: {        resources: {},        tools: {},    },});
// Helper function for making API requestsasync function makeRequest(url, params) {    const headers = {        "X-Requested-With": 'XMLHttpRequest',        "content-type": 'application/json',    };    try {        const response = await fetch(url, {            method: 'POST',            headers: headers,            body: JSON.stringify(params),            credentials: 'include',        });        if (!response.ok) {            throw new Error(`HTTP error! status: ${response.status}`);        }        return (await response.json());    }    catch (error) {        console.error("Error making Contract request:", error);        return null;    }}// Format alert datafunction formatAlert(feature) {    const props = feature;    return [        `合同号: ${props.contractNumber || "Unknown"}`,        `合同id: ${props.id || "Unknown"}`,        `版本号: ${props.version || "Unknown"}`,        `创建人: ${props.creator || "Unknown"}`,        `合同名称: ${props.name || "Unknown"}`,        `合同主体: ${props.ouName || "Unknown"}`,        `合同类型: ${props.typeName || "Unknown"}`,        `交易方: ${props.refPartiesName || "Unknown"}`,        `有效日期至: ${props.endTime || "Unknown"}`,        "---",    ].join("\n");}const statusDict = {    xx: xx};// Register toolsserver.tool("获取合同列表", "获取某种状态或某个合同的合同列表", {    state: z.string().describe("两或三字的合同状态 (e.g. xx, xx)"),    contractNumber: z.string().describe("合同号 (e.g. xxxxxxx,xxxxxxxx,xxxxxxx)"),}, async ({ state, contractNumber }) => {    const statusCode = statusDict[state];    const alertsData = await makeRequest(QUERY_CONTRACT, { status: statusCode, pageIndex: 1, pageSize: 10, searchSource: 0, contractNumber: contractNumber });     //         ......                省略业务逻辑        ......    //});server.tool("合同延期", "对指定合同进行延期操作", {    contractId: z.string().describe("合同id (e.g. 41556890,41556953)"),    contractNumber: z.string().describe("合同号 (e.g. PE2025A3709738,BEC2025A3709735)"),    version: z.string().describe("版本号 (e.g. 1,2)"),    endTime: z.string().describe("有效日期至 (e.g. 2023-08-15 12:00:00)"),}, async ({ contractId, contractNumber, version, endTime }) => {       const alertsData = await makeRequest(DELAY_CONTRACT, { endTime: newEndTime, version, contractNumber, contractId });    //         ......                省略业务逻辑        ......    //});
async function main() {    const transport = new StdioServerTransport();    await server.connect(transport);    console.error("Contract MCP Server running on stdio");}main().catch((error) => {    console.error("Fatal error in main():", error);    process.exit(1);});;
复制代码
 划线
评论
复制
发布于: 刚刚阅读数: 5
版权声明: 本文为 InfoQ 作者【京东科技开发者】的原创文章。
原文链接:【http://xie.infoq.cn/article/7495db49fd6acadc3e0d862f5】。文章转载请联系作者。

京东科技开发者
关注
拥抱技术,与开发者携手创造未来! 2018-11-20 加入
我们将持续为人工智能、大数据、云计算、物联网等相关领域的开发者,提供技术干货、行业技术内容、技术落地实践等文章内容。京东云开发者社区官方网站【https://developer.jdcloud.com/】,欢迎大家来玩







 
    
 
				 
				 
			


评论