mcp-use 0.1.7 → 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.
Files changed (32) hide show
  1. package/README.md +196 -0
  2. package/dist/examples/ai_sdk_example.d.ts +23 -0
  3. package/dist/examples/ai_sdk_example.d.ts.map +1 -0
  4. package/dist/examples/ai_sdk_example.js +213 -0
  5. package/dist/examples/stream_example.d.ts +12 -0
  6. package/dist/examples/stream_example.d.ts.map +1 -0
  7. package/dist/examples/stream_example.js +198 -0
  8. package/dist/index.d.ts +2 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +2 -0
  11. package/dist/src/agents/mcp_agent.d.ts +9 -3
  12. package/dist/src/agents/mcp_agent.d.ts.map +1 -1
  13. package/dist/src/agents/mcp_agent.js +175 -42
  14. package/dist/src/agents/utils/ai_sdk.d.ts +22 -0
  15. package/dist/src/agents/utils/ai_sdk.d.ts.map +1 -0
  16. package/dist/src/agents/utils/ai_sdk.js +62 -0
  17. package/dist/src/agents/utils/index.d.ts +2 -0
  18. package/dist/src/agents/utils/index.d.ts.map +1 -0
  19. package/dist/src/agents/utils/index.js +1 -0
  20. package/dist/tests/ai_sdk_compatibility.test.d.ts +13 -0
  21. package/dist/tests/ai_sdk_compatibility.test.d.ts.map +1 -0
  22. package/dist/tests/ai_sdk_compatibility.test.js +214 -0
  23. package/dist/tests/stream_events.test.d.ts +2 -0
  24. package/dist/tests/stream_events.test.d.ts.map +1 -0
  25. package/dist/tests/stream_events.test.js +306 -0
  26. package/dist/tests/stream_events_simple.test.d.ts +7 -0
  27. package/dist/tests/stream_events_simple.test.d.ts.map +1 -0
  28. package/dist/tests/stream_events_simple.test.js +179 -0
  29. package/dist/vitest.config.d.ts +3 -0
  30. package/dist/vitest.config.d.ts.map +1 -0
  31. package/dist/vitest.config.js +21 -0
  32. 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,3 @@
1
+ declare const _default: import("vite").UserConfig;
2
+ export default _default;
3
+ //# sourceMappingURL=vitest.config.d.ts.map
@@ -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.7",
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}": [