作者: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 instance
const server = new McpServer({
name: "contract",
version: "1.0.0",
capabilities: {
resources: {},
tools: {},
},
});
// Helper function for making API requests
async 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 data
function 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 tools
server.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);
});
;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。