mcp-use 0.1.6 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +196 -0
- package/dist/examples/ai_sdk_example.d.ts +23 -0
- package/dist/examples/ai_sdk_example.d.ts.map +1 -0
- package/dist/examples/ai_sdk_example.js +213 -0
- package/dist/examples/stream_example.d.ts +12 -0
- package/dist/examples/stream_example.d.ts.map +1 -0
- package/dist/examples/stream_example.js +198 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/src/agents/mcp_agent.d.ts +9 -3
- package/dist/src/agents/mcp_agent.d.ts.map +1 -1
- package/dist/src/agents/mcp_agent.js +175 -42
- package/dist/src/agents/utils/ai_sdk.d.ts +22 -0
- package/dist/src/agents/utils/ai_sdk.d.ts.map +1 -0
- package/dist/src/agents/utils/ai_sdk.js +62 -0
- package/dist/src/agents/utils/index.d.ts +2 -0
- package/dist/src/agents/utils/index.d.ts.map +1 -0
- package/dist/src/agents/utils/index.js +1 -0
- package/dist/tests/ai_sdk_compatibility.test.d.ts +13 -0
- package/dist/tests/ai_sdk_compatibility.test.d.ts.map +1 -0
- package/dist/tests/ai_sdk_compatibility.test.js +214 -0
- package/dist/tests/stream_events.test.d.ts +2 -0
- package/dist/tests/stream_events.test.d.ts.map +1 -0
- package/dist/tests/stream_events.test.js +306 -0
- package/dist/tests/stream_events_simple.test.d.ts +7 -0
- package/dist/tests/stream_events_simple.test.d.ts.map +1 -0
- package/dist/tests/stream_events_simple.test.js +179 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +21 -0
- package/package.json +14 -4
@@ -0,0 +1,179 @@
|
|
1
|
+
/**
|
2
|
+
* Simple tests for MCPAgent streamEvents() method
|
3
|
+
*
|
4
|
+
* These tests verify the basic functionality of streamEvents() using minimal mocking
|
5
|
+
*/
|
6
|
+
import { describe, expect, it } from 'vitest';
|
7
|
+
describe('test MCPAgent streamEvents() - Core Functionality', () => {
|
8
|
+
it('should be a generator function that yields StreamEvent objects', async () => {
|
9
|
+
// Mock a simple agent-like object with streamEvents method
|
10
|
+
const mockAgent = {
|
11
|
+
async *streamEvents(query) {
|
12
|
+
// Simulate typical event sequence
|
13
|
+
yield {
|
14
|
+
event: 'on_chain_start',
|
15
|
+
name: 'AgentExecutor',
|
16
|
+
data: { input: { input: query } },
|
17
|
+
};
|
18
|
+
yield {
|
19
|
+
event: 'on_chat_model_stream',
|
20
|
+
name: 'ChatAnthropic',
|
21
|
+
data: { chunk: { content: 'Hello' } },
|
22
|
+
};
|
23
|
+
yield {
|
24
|
+
event: 'on_chat_model_stream',
|
25
|
+
name: 'ChatAnthropic',
|
26
|
+
data: { chunk: { content: ' world!' } },
|
27
|
+
};
|
28
|
+
yield {
|
29
|
+
event: 'on_tool_start',
|
30
|
+
name: 'test_tool',
|
31
|
+
data: { input: { query: 'test' } },
|
32
|
+
};
|
33
|
+
yield {
|
34
|
+
event: 'on_tool_end',
|
35
|
+
name: 'test_tool',
|
36
|
+
data: { output: 'Tool result' },
|
37
|
+
};
|
38
|
+
yield {
|
39
|
+
event: 'on_chain_end',
|
40
|
+
name: 'AgentExecutor',
|
41
|
+
data: { output: 'Hello world!' },
|
42
|
+
};
|
43
|
+
},
|
44
|
+
};
|
45
|
+
const events = [];
|
46
|
+
const tokens = [];
|
47
|
+
const toolEvents = [];
|
48
|
+
// Collect all events
|
49
|
+
for await (const event of mockAgent.streamEvents('test query')) {
|
50
|
+
events.push(event);
|
51
|
+
// Collect tokens
|
52
|
+
if (event.event === 'on_chat_model_stream' && event.data?.chunk?.content) {
|
53
|
+
tokens.push(event.data.chunk.content);
|
54
|
+
}
|
55
|
+
// Collect tool events
|
56
|
+
if (event.event.includes('tool')) {
|
57
|
+
toolEvents.push(event);
|
58
|
+
}
|
59
|
+
}
|
60
|
+
// Verify we got the expected number of events
|
61
|
+
expect(events).toHaveLength(6);
|
62
|
+
// Verify event structure
|
63
|
+
events.forEach((event) => {
|
64
|
+
expect(event).toHaveProperty('event');
|
65
|
+
expect(event).toHaveProperty('name');
|
66
|
+
expect(event).toHaveProperty('data');
|
67
|
+
});
|
68
|
+
// Verify token streaming works
|
69
|
+
expect(tokens).toEqual(['Hello', ' world!']);
|
70
|
+
// Verify tool events
|
71
|
+
expect(toolEvents).toHaveLength(2);
|
72
|
+
expect(toolEvents[0].event).toBe('on_tool_start');
|
73
|
+
expect(toolEvents[1].event).toBe('on_tool_end');
|
74
|
+
// Verify event types are correct
|
75
|
+
expect(events[0].event).toBe('on_chain_start');
|
76
|
+
expect(events[1].event).toBe('on_chat_model_stream');
|
77
|
+
expect(events[2].event).toBe('on_chat_model_stream');
|
78
|
+
expect(events[3].event).toBe('on_tool_start');
|
79
|
+
expect(events[4].event).toBe('on_tool_end');
|
80
|
+
expect(events[5].event).toBe('on_chain_end');
|
81
|
+
});
|
82
|
+
it('should handle different event types correctly', async () => {
|
83
|
+
const mockAgent = {
|
84
|
+
async *streamEvents() {
|
85
|
+
// Test different event types
|
86
|
+
const eventTypes = [
|
87
|
+
'on_chain_start',
|
88
|
+
'on_llm_start',
|
89
|
+
'on_llm_stream',
|
90
|
+
'on_llm_end',
|
91
|
+
'on_tool_start',
|
92
|
+
'on_tool_stream',
|
93
|
+
'on_tool_end',
|
94
|
+
'on_retriever_start',
|
95
|
+
'on_retriever_end',
|
96
|
+
'on_parser_start',
|
97
|
+
'on_parser_end',
|
98
|
+
'on_chain_end',
|
99
|
+
];
|
100
|
+
for (const eventType of eventTypes) {
|
101
|
+
yield {
|
102
|
+
event: eventType,
|
103
|
+
name: 'TestComponent',
|
104
|
+
data: { test: true },
|
105
|
+
run_id: 'test-run-id',
|
106
|
+
metadata: {},
|
107
|
+
};
|
108
|
+
}
|
109
|
+
},
|
110
|
+
};
|
111
|
+
const events = [];
|
112
|
+
for await (const event of mockAgent.streamEvents()) {
|
113
|
+
events.push(event);
|
114
|
+
}
|
115
|
+
expect(events).toHaveLength(12);
|
116
|
+
// Verify we got all the different event types
|
117
|
+
const receivedEventTypes = events.map(e => e.event);
|
118
|
+
expect(receivedEventTypes).toContain('on_chain_start');
|
119
|
+
expect(receivedEventTypes).toContain('on_llm_stream');
|
120
|
+
expect(receivedEventTypes).toContain('on_tool_start');
|
121
|
+
expect(receivedEventTypes).toContain('on_tool_end');
|
122
|
+
expect(receivedEventTypes).toContain('on_chain_end');
|
123
|
+
});
|
124
|
+
it('should work with empty event streams', async () => {
|
125
|
+
const mockAgent = {
|
126
|
+
async *streamEvents() {
|
127
|
+
// Empty generator
|
128
|
+
},
|
129
|
+
};
|
130
|
+
const events = [];
|
131
|
+
for await (const event of mockAgent.streamEvents()) {
|
132
|
+
events.push(event);
|
133
|
+
}
|
134
|
+
expect(events).toHaveLength(0);
|
135
|
+
});
|
136
|
+
it('should handle streaming token reconstruction', async () => {
|
137
|
+
const mockAgent = {
|
138
|
+
async *streamEvents() {
|
139
|
+
const tokens = ['The', ' quick', ' brown', ' fox', ' jumps', ' over', ' the', ' lazy', ' dog.'];
|
140
|
+
for (const token of tokens) {
|
141
|
+
yield {
|
142
|
+
event: 'on_chat_model_stream',
|
143
|
+
name: 'ChatModel',
|
144
|
+
data: { chunk: { content: token } },
|
145
|
+
};
|
146
|
+
}
|
147
|
+
},
|
148
|
+
};
|
149
|
+
let reconstructedText = '';
|
150
|
+
const tokenCount = { count: 0 };
|
151
|
+
for await (const event of mockAgent.streamEvents()) {
|
152
|
+
if (event.event === 'on_chat_model_stream' && event.data?.chunk?.content) {
|
153
|
+
reconstructedText += event.data.chunk.content;
|
154
|
+
tokenCount.count++;
|
155
|
+
}
|
156
|
+
}
|
157
|
+
expect(reconstructedText).toBe('The quick brown fox jumps over the lazy dog.');
|
158
|
+
expect(tokenCount.count).toBe(9);
|
159
|
+
});
|
160
|
+
});
|
161
|
+
describe('streamEvent type verification', () => {
|
162
|
+
it('should have correct StreamEvent interface', () => {
|
163
|
+
const sampleEvent = {
|
164
|
+
event: 'on_chat_model_stream',
|
165
|
+
name: 'TestModel',
|
166
|
+
data: {
|
167
|
+
chunk: { content: 'test' },
|
168
|
+
input: { query: 'test' },
|
169
|
+
output: 'result',
|
170
|
+
},
|
171
|
+
run_id: 'test-run-id',
|
172
|
+
metadata: {},
|
173
|
+
};
|
174
|
+
expect(sampleEvent.event).toBe('on_chat_model_stream');
|
175
|
+
expect(sampleEvent.name).toBe('TestModel');
|
176
|
+
expect(sampleEvent.data).toBeDefined();
|
177
|
+
expect(sampleEvent.data.chunk?.content).toBe('test');
|
178
|
+
});
|
179
|
+
});
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"vitest.config.d.ts","sourceRoot":"","sources":["../vitest.config.ts"],"names":[],"mappings":";AAEA,wBAmBE"}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import { defineConfig } from 'vitest/config';
|
2
|
+
export default defineConfig({
|
3
|
+
test: {
|
4
|
+
globals: true,
|
5
|
+
environment: 'node',
|
6
|
+
include: ['tests/**/*.test.ts'],
|
7
|
+
exclude: ['node_modules/**', 'dist/**'],
|
8
|
+
coverage: {
|
9
|
+
provider: 'v8',
|
10
|
+
include: ['src/**/*.ts'],
|
11
|
+
exclude: ['src/**/*.d.ts', 'src/**/index.ts'],
|
12
|
+
},
|
13
|
+
testTimeout: 30000,
|
14
|
+
hookTimeout: 30000,
|
15
|
+
},
|
16
|
+
resolve: {
|
17
|
+
alias: {
|
18
|
+
'@': './src',
|
19
|
+
},
|
20
|
+
},
|
21
|
+
});
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "mcp-use",
|
3
3
|
"type": "module",
|
4
|
-
"version": "0.1.
|
4
|
+
"version": "0.1.8",
|
5
5
|
"packageManager": "pnpm@10.6.1",
|
6
6
|
"description": "A utility library for integrating Model Context Protocol (MCP) with LangChain, Zod, and related tools. Provides helpers for schema conversion, event streaming, and SDK usage.",
|
7
7
|
"author": "Zane",
|
@@ -46,11 +46,15 @@
|
|
46
46
|
},
|
47
47
|
"scripts": {
|
48
48
|
"build": "rm -rf dist && tsc",
|
49
|
+
"lint": "eslint",
|
50
|
+
"lint:fix": "eslint --fix",
|
51
|
+
"test": "vitest",
|
52
|
+
"test:run": "vitest run",
|
53
|
+
"test:simple": "vitest run tests/stream_events_simple.test.ts",
|
54
|
+
"test:integration": "vitest run tests/stream_events.test.ts",
|
49
55
|
"watch": "tsc --watch",
|
50
56
|
"start": "node dist/index.js",
|
51
57
|
"prepublishOnly": "npm run build",
|
52
|
-
"lint": "eslint",
|
53
|
-
"lint:fix": "eslint --fix",
|
54
58
|
"fmt": "eslint --fix",
|
55
59
|
"release": "npm version patch --tag-version-prefix=v && git push --follow-tags",
|
56
60
|
"release:minor": "npm version minor --tag-version-prefix=v && git push --follow-tags",
|
@@ -59,6 +63,9 @@
|
|
59
63
|
"example:airbnb": "npm run build && node dist/examples/airbnb_use.js",
|
60
64
|
"example:browser": "npm run build && node dist/examples/browser_use.js",
|
61
65
|
"example:chat": "npm run build && node dist/examples/chat_example.js",
|
66
|
+
"example:stream": "npm run build && node dist/examples/stream_example.js",
|
67
|
+
"example:stream_events": "npm run build && node dist/examples/stream_events_example.js",
|
68
|
+
"example:ai_sdk": "npm run build && node dist/examples/ai_sdk_example.js",
|
62
69
|
"example:filesystem": "npm run build && node dist/examples/filesystem_use.js",
|
63
70
|
"example:http": "npm run build && node dist/examples/http_example.js",
|
64
71
|
"example:everything": "npm run build && node dist/examples/mcp_everything.js",
|
@@ -75,6 +82,7 @@
|
|
75
82
|
"@langchain/openai": "^0.5.15",
|
76
83
|
"@modelcontextprotocol/sdk": "1.12.1",
|
77
84
|
"@scarf/scarf": "^1.4.0",
|
85
|
+
"ai": "^4.3.19",
|
78
86
|
"dotenv": "^16.5.0",
|
79
87
|
"eventsource": "^3.0.6",
|
80
88
|
"fastembed": "^1.14.4",
|
@@ -90,13 +98,15 @@
|
|
90
98
|
"devDependencies": {
|
91
99
|
"@antfu/eslint-config": "^4.13.2",
|
92
100
|
"@types/lodash-es": "^4.17.12",
|
101
|
+
"@types/node": "^20.19.8",
|
93
102
|
"@types/ws": "^8.18.1",
|
94
103
|
"eslint": "^9.28.0",
|
95
104
|
"eslint-plugin-format": "^1.0.1",
|
96
105
|
"husky": "^9.1.7",
|
97
106
|
"lint-staged": "^15.2.11",
|
98
107
|
"shx": "^0.4.0",
|
99
|
-
"typescript": "^5.8.3"
|
108
|
+
"typescript": "^5.8.3",
|
109
|
+
"vitest": "^2.1.9"
|
100
110
|
},
|
101
111
|
"lint-staged": {
|
102
112
|
"*.{js,ts}": [
|