support mcp client streamable http (#4650)
* support mcp streamable http * fix * fix * remove deps
This commit is contained in:
@@ -11,6 +11,7 @@ import {
|
||||
getMCPToolRuntimeNode,
|
||||
getMCPToolSetRuntimeNode
|
||||
} from '@fastgpt/global/core/app/mcpTools/utils';
|
||||
import { pushTrack } from '@fastgpt/service/common/middle/tracks/utils';
|
||||
|
||||
export type createMCPToolsQuery = {};
|
||||
|
||||
@@ -61,6 +62,13 @@ async function handler(
|
||||
}
|
||||
});
|
||||
|
||||
pushTrack.createApp({
|
||||
type: AppTypeEnum.toolSet,
|
||||
uid: userId,
|
||||
teamId,
|
||||
tmbId
|
||||
});
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
import { NextAPI } from '@/service/middleware/entry';
|
||||
import { ToolType } from '@fastgpt/global/core/app/type';
|
||||
import type { ApiRequestProps, ApiResponseType } from '@fastgpt/service/type/next';
|
||||
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
||||
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
|
||||
|
||||
export type getMCPToolsQuery = {};
|
||||
|
||||
export type getMCPToolsBody = { url: string };
|
||||
|
||||
export type getMCPToolsResponse = ToolType[];
|
||||
|
||||
async function handler(
|
||||
req: ApiRequestProps<getMCPToolsBody, getMCPToolsQuery>,
|
||||
res: ApiResponseType<getMCPToolsResponse[]>
|
||||
): Promise<getMCPToolsResponse> {
|
||||
const { url } = req.body;
|
||||
|
||||
const client = new Client({
|
||||
name: 'FastGPT-MCP-client',
|
||||
version: '1.0.0'
|
||||
});
|
||||
|
||||
const tools = await (async () => {
|
||||
try {
|
||||
const transport = new SSEClientTransport(new URL(url));
|
||||
await client.connect(transport);
|
||||
|
||||
const response = await client.listTools();
|
||||
|
||||
return response.tools || [];
|
||||
} catch (error) {
|
||||
console.error('Error fetching MCP tools:', error);
|
||||
return Promise.reject(error);
|
||||
} finally {
|
||||
await client.close();
|
||||
}
|
||||
})();
|
||||
|
||||
return tools as ToolType[];
|
||||
}
|
||||
|
||||
export default NextAPI(handler);
|
||||
@@ -1,45 +0,0 @@
|
||||
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
|
||||
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
||||
import { NextAPI } from '@/service/middleware/entry';
|
||||
import type { ApiRequestProps, ApiResponseType } from '@fastgpt/service/type/next';
|
||||
|
||||
export type RunToolTestQuery = {};
|
||||
export type RunToolTestBody = {
|
||||
params: Record<string, any>;
|
||||
url: string;
|
||||
toolName: string;
|
||||
};
|
||||
export type RunToolTestResponse = any;
|
||||
|
||||
async function handler(
|
||||
req: ApiRequestProps<RunToolTestBody, RunToolTestQuery>,
|
||||
res: ApiResponseType<RunToolTestResponse>
|
||||
): Promise<RunToolTestResponse> {
|
||||
const { params, url, toolName } = req.body;
|
||||
|
||||
const client = new Client({
|
||||
name: 'FastGPT-MCP-client',
|
||||
version: '1.0.0'
|
||||
});
|
||||
|
||||
const result = await (async () => {
|
||||
try {
|
||||
const transport = new SSEClientTransport(new URL(url));
|
||||
await client.connect(transport);
|
||||
|
||||
return await client.callTool({
|
||||
name: toolName,
|
||||
arguments: params
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Error running MCP tool test:', error);
|
||||
return Promise.reject(error);
|
||||
} finally {
|
||||
await client.close();
|
||||
}
|
||||
})();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
export default NextAPI(handler);
|
||||
28
projects/app/src/pages/api/support/mcp/client/getTools.ts
Normal file
28
projects/app/src/pages/api/support/mcp/client/getTools.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
import { NextAPI } from '@/service/middleware/entry';
|
||||
import { ToolType } from '@fastgpt/global/core/app/type';
|
||||
import type { ApiRequestProps, ApiResponseType } from '@fastgpt/service/type/next';
|
||||
import getMCPClient from '@fastgpt/service/core/app/mcp';
|
||||
|
||||
export type getMCPToolsQuery = {};
|
||||
|
||||
export type getMCPToolsBody = { url: string };
|
||||
|
||||
export type getMCPToolsResponse = ToolType[];
|
||||
|
||||
async function handler(
|
||||
req: ApiRequestProps<getMCPToolsBody, getMCPToolsQuery>,
|
||||
res: ApiResponseType<getMCPToolsResponse[]>
|
||||
): Promise<getMCPToolsResponse> {
|
||||
const { url } = req.body;
|
||||
|
||||
const mcpClient = getMCPClient({ url });
|
||||
|
||||
try {
|
||||
const tools = await mcpClient.getTools();
|
||||
return tools;
|
||||
} catch (error) {
|
||||
return Promise.reject(error);
|
||||
}
|
||||
}
|
||||
|
||||
export default NextAPI(handler);
|
||||
31
projects/app/src/pages/api/support/mcp/client/runTool.ts
Normal file
31
projects/app/src/pages/api/support/mcp/client/runTool.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
import { NextAPI } from '@/service/middleware/entry';
|
||||
import type { ApiRequestProps, ApiResponseType } from '@fastgpt/service/type/next';
|
||||
import getMCPClient from '@fastgpt/service/core/app/mcp';
|
||||
|
||||
export type RunMCPToolQuery = {};
|
||||
|
||||
export type RunMCPToolBody = {
|
||||
url: string;
|
||||
toolName: string;
|
||||
params: Record<string, any>;
|
||||
};
|
||||
|
||||
export type RunMCPToolResponse = any;
|
||||
|
||||
async function handler(
|
||||
req: ApiRequestProps<RunMCPToolBody, RunMCPToolQuery>,
|
||||
res: ApiResponseType<RunMCPToolResponse>
|
||||
): Promise<RunMCPToolResponse> {
|
||||
const { url, toolName, params } = req.body;
|
||||
|
||||
const mcpClient = getMCPClient({ url });
|
||||
|
||||
try {
|
||||
const result = await mcpClient.toolCall(toolName, params);
|
||||
return result;
|
||||
} catch (error) {
|
||||
return Promise.reject(error);
|
||||
}
|
||||
}
|
||||
|
||||
export default NextAPI(handler);
|
||||
Reference in New Issue
Block a user