@dobbyai/mcp-external 1.0.4 → 1.1.0

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 (163) hide show
  1. package/dist/__tests__/agent-mail-tools.test.d.ts +8 -0
  2. package/dist/__tests__/agent-mail-tools.test.d.ts.map +1 -0
  3. package/dist/__tests__/agent-mail-tools.test.js +262 -0
  4. package/dist/__tests__/agent-mail-tools.test.js.map +1 -0
  5. package/dist/__tests__/annotations.test.d.ts +8 -0
  6. package/dist/__tests__/annotations.test.d.ts.map +1 -0
  7. package/dist/__tests__/annotations.test.js +108 -0
  8. package/dist/__tests__/annotations.test.js.map +1 -0
  9. package/dist/__tests__/auth.test.d.ts +7 -0
  10. package/dist/__tests__/auth.test.d.ts.map +1 -0
  11. package/dist/__tests__/auth.test.js +116 -0
  12. package/dist/__tests__/auth.test.js.map +1 -0
  13. package/dist/__tests__/integration/protocol.test.d.ts +8 -0
  14. package/dist/__tests__/integration/protocol.test.d.ts.map +1 -0
  15. package/dist/__tests__/integration/protocol.test.js +104 -0
  16. package/dist/__tests__/integration/protocol.test.js.map +1 -0
  17. package/dist/__tests__/mcp-integrations.test.d.ts +8 -0
  18. package/dist/__tests__/mcp-integrations.test.d.ts.map +1 -0
  19. package/dist/__tests__/mcp-integrations.test.js +375 -0
  20. package/dist/__tests__/mcp-integrations.test.js.map +1 -0
  21. package/dist/__tests__/memory-graph-tools.test.d.ts +8 -0
  22. package/dist/__tests__/memory-graph-tools.test.d.ts.map +1 -0
  23. package/dist/__tests__/memory-graph-tools.test.js +265 -0
  24. package/dist/__tests__/memory-graph-tools.test.js.map +1 -0
  25. package/dist/__tests__/schedule-tools.test.d.ts +8 -0
  26. package/dist/__tests__/schedule-tools.test.d.ts.map +1 -0
  27. package/dist/__tests__/schedule-tools.test.js +290 -0
  28. package/dist/__tests__/schedule-tools.test.js.map +1 -0
  29. package/dist/__tests__/tiers.test.d.ts +7 -0
  30. package/dist/__tests__/tiers.test.d.ts.map +1 -0
  31. package/dist/__tests__/tiers.test.js +103 -0
  32. package/dist/__tests__/tiers.test.js.map +1 -0
  33. package/dist/__tests__/tools.test.d.ts +7 -0
  34. package/dist/__tests__/tools.test.d.ts.map +1 -0
  35. package/dist/__tests__/tools.test.js +143 -0
  36. package/dist/__tests__/tools.test.js.map +1 -0
  37. package/dist/__tests__/transport.test.d.ts +7 -0
  38. package/dist/__tests__/transport.test.d.ts.map +1 -0
  39. package/dist/__tests__/transport.test.js +55 -0
  40. package/dist/__tests__/transport.test.js.map +1 -0
  41. package/dist/__tests__/web-eval-tools.test.d.ts +8 -0
  42. package/dist/__tests__/web-eval-tools.test.d.ts.map +1 -0
  43. package/dist/__tests__/web-eval-tools.test.js +252 -0
  44. package/dist/__tests__/web-eval-tools.test.js.map +1 -0
  45. package/dist/__tests__/workflow-tools.test.d.ts +8 -0
  46. package/dist/__tests__/workflow-tools.test.d.ts.map +1 -0
  47. package/dist/__tests__/workflow-tools.test.js +268 -0
  48. package/dist/__tests__/workflow-tools.test.js.map +1 -0
  49. package/dist/auth/oauth-provider.d.ts +34 -0
  50. package/dist/auth/oauth-provider.d.ts.map +1 -0
  51. package/dist/auth/oauth-provider.js +75 -0
  52. package/dist/auth/oauth-provider.js.map +1 -0
  53. package/dist/auth/token-verifier.d.ts +40 -0
  54. package/dist/auth/token-verifier.d.ts.map +1 -0
  55. package/dist/auth/token-verifier.js +138 -0
  56. package/dist/auth/token-verifier.js.map +1 -0
  57. package/dist/http-server.d.ts +35 -0
  58. package/dist/http-server.d.ts.map +1 -0
  59. package/dist/http-server.js +175 -0
  60. package/dist/http-server.js.map +1 -0
  61. package/dist/index.js +113 -52
  62. package/dist/index.js.map +1 -1
  63. package/dist/lib/dobby-client.d.ts +50 -20
  64. package/dist/lib/dobby-client.d.ts.map +1 -1
  65. package/dist/lib/dobby-client.js +50 -0
  66. package/dist/lib/dobby-client.js.map +1 -1
  67. package/dist/tools/agent-mail.d.ts +153 -0
  68. package/dist/tools/agent-mail.d.ts.map +1 -0
  69. package/dist/tools/agent-mail.js +340 -0
  70. package/dist/tools/agent-mail.js.map +1 -0
  71. package/dist/tools/approvals.d.ts +24 -0
  72. package/dist/tools/approvals.d.ts.map +1 -1
  73. package/dist/tools/approvals.js +24 -0
  74. package/dist/tools/approvals.js.map +1 -1
  75. package/dist/tools/crew-builder.d.ts +24 -0
  76. package/dist/tools/crew-builder.d.ts.map +1 -1
  77. package/dist/tools/crew-builder.js +24 -0
  78. package/dist/tools/crew-builder.js.map +1 -1
  79. package/dist/tools/crewai.d.ts +24 -0
  80. package/dist/tools/crewai.d.ts.map +1 -1
  81. package/dist/tools/crewai.js +24 -0
  82. package/dist/tools/crewai.js.map +1 -1
  83. package/dist/tools/exa.d.ts +161 -0
  84. package/dist/tools/exa.d.ts.map +1 -0
  85. package/dist/tools/exa.js +228 -0
  86. package/dist/tools/exa.js.map +1 -0
  87. package/dist/tools/github-mcp.d.ts +303 -0
  88. package/dist/tools/github-mcp.d.ts.map +1 -0
  89. package/dist/tools/github-mcp.js +397 -0
  90. package/dist/tools/github-mcp.js.map +1 -0
  91. package/dist/tools/governance.d.ts +129 -0
  92. package/dist/tools/governance.d.ts.map +1 -0
  93. package/dist/tools/governance.js +171 -0
  94. package/dist/tools/governance.js.map +1 -0
  95. package/dist/tools/index.d.ts +3589 -159
  96. package/dist/tools/index.d.ts.map +1 -1
  97. package/dist/tools/index.js +250 -0
  98. package/dist/tools/index.js.map +1 -1
  99. package/dist/tools/jira.d.ts +60 -0
  100. package/dist/tools/jira.d.ts.map +1 -1
  101. package/dist/tools/jira.js +60 -0
  102. package/dist/tools/jira.js.map +1 -1
  103. package/dist/tools/knowledge-base.d.ts +144 -0
  104. package/dist/tools/knowledge-base.d.ts.map +1 -0
  105. package/dist/tools/knowledge-base.js +179 -0
  106. package/dist/tools/knowledge-base.js.map +1 -0
  107. package/dist/tools/mcp-metrics.d.ts +62 -0
  108. package/dist/tools/mcp-metrics.d.ts.map +1 -0
  109. package/dist/tools/mcp-metrics.js +270 -0
  110. package/dist/tools/mcp-metrics.js.map +1 -0
  111. package/dist/tools/mcp-tools.d.ts +12 -0
  112. package/dist/tools/mcp-tools.d.ts.map +1 -1
  113. package/dist/tools/mcp-tools.js +12 -0
  114. package/dist/tools/mcp-tools.js.map +1 -1
  115. package/dist/tools/mem0.d.ts +168 -0
  116. package/dist/tools/mem0.d.ts.map +1 -0
  117. package/dist/tools/mem0.js +255 -0
  118. package/dist/tools/mem0.js.map +1 -0
  119. package/dist/tools/memory-graph.d.ts +197 -0
  120. package/dist/tools/memory-graph.d.ts.map +1 -0
  121. package/dist/tools/memory-graph.js +545 -0
  122. package/dist/tools/memory-graph.js.map +1 -0
  123. package/dist/tools/messages.d.ts +12 -0
  124. package/dist/tools/messages.d.ts.map +1 -1
  125. package/dist/tools/messages.js +12 -0
  126. package/dist/tools/messages.js.map +1 -1
  127. package/dist/tools/moltbook.d.ts +564 -0
  128. package/dist/tools/moltbook.d.ts.map +1 -0
  129. package/dist/tools/moltbook.js +792 -0
  130. package/dist/tools/moltbook.js.map +1 -0
  131. package/dist/tools/ops.d.ts +219 -0
  132. package/dist/tools/ops.d.ts.map +1 -0
  133. package/dist/tools/ops.js +360 -0
  134. package/dist/tools/ops.js.map +1 -0
  135. package/dist/tools/schedules.d.ts +196 -0
  136. package/dist/tools/schedules.d.ts.map +1 -0
  137. package/dist/tools/schedules.js +264 -0
  138. package/dist/tools/schedules.js.map +1 -0
  139. package/dist/tools/services.d.ts +6 -0
  140. package/dist/tools/services.d.ts.map +1 -1
  141. package/dist/tools/services.js +6 -0
  142. package/dist/tools/services.js.map +1 -1
  143. package/dist/tools/tasks.d.ts +45 -0
  144. package/dist/tools/tasks.d.ts.map +1 -1
  145. package/dist/tools/tasks.js +49 -4
  146. package/dist/tools/tasks.js.map +1 -1
  147. package/dist/tools/tiers.d.ts +39 -0
  148. package/dist/tools/tiers.d.ts.map +1 -0
  149. package/dist/tools/tiers.js +138 -0
  150. package/dist/tools/tiers.js.map +1 -0
  151. package/dist/tools/unified-agents.d.ts +62 -0
  152. package/dist/tools/unified-agents.d.ts.map +1 -0
  153. package/dist/tools/unified-agents.js +147 -0
  154. package/dist/tools/unified-agents.js.map +1 -0
  155. package/dist/tools/web-eval.d.ts +172 -0
  156. package/dist/tools/web-eval.d.ts.map +1 -0
  157. package/dist/tools/web-eval.js +347 -0
  158. package/dist/tools/web-eval.js.map +1 -0
  159. package/dist/tools/workflow.d.ts +171 -0
  160. package/dist/tools/workflow.d.ts.map +1 -0
  161. package/dist/tools/workflow.js +518 -0
  162. package/dist/tools/workflow.js.map +1 -0
  163. package/package.json +8 -3
@@ -0,0 +1,8 @@
1
+ /**
2
+ * AgentMail MCP Tools Tests — Phase 5 + Session 3 updates
3
+ *
4
+ * Tests for agent notification system, inbox retrieval,
5
+ * digital identity management, dynamic registry, and markdown responses.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=agent-mail-tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-mail-tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/agent-mail-tools.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,262 @@
1
+ /**
2
+ * AgentMail MCP Tools Tests — Phase 5 + Session 3 updates
3
+ *
4
+ * Tests for agent notification system, inbox retrieval,
5
+ * digital identity management, dynamic registry, and markdown responses.
6
+ */
7
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
8
+ // Mock global fetch
9
+ const mockFetch = vi.fn();
10
+ vi.stubGlobal('fetch', mockFetch);
11
+ // Mock DobbyClient with request method and tenantId
12
+ const mockClient = {
13
+ apiUrl: 'http://localhost:3000',
14
+ apiKey: 'test-api-key',
15
+ tenantId: 'tenant_test123',
16
+ request: vi.fn(),
17
+ };
18
+ // ============================================
19
+ // Send Notification
20
+ // ============================================
21
+ describe('AgentMail: Send Notification', () => {
22
+ beforeEach(() => {
23
+ vi.resetAllMocks();
24
+ // Default: API unavailable for request (dynamic registry fallback)
25
+ mockClient.request.mockRejectedValue(new Error('Connection refused'));
26
+ });
27
+ it('sends notification and returns markdown response', async () => {
28
+ const { handleAgentMailSendNotification } = await import('../tools/agent-mail.js');
29
+ // API unavailable — local-only storage
30
+ mockFetch.mockRejectedValueOnce(new Error('Connection refused'));
31
+ const result = await handleAgentMailSendNotification(mockClient, {
32
+ to: 'dobby-backend-agent',
33
+ subject: 'Task completed',
34
+ body: 'The API endpoint has been implemented successfully.',
35
+ });
36
+ const text = result.content[0].text;
37
+ expect(text).toContain('## Notification Sent');
38
+ expect(text).toContain('**To:** dobby-backend-agent');
39
+ expect(text).toContain('**Type:** info');
40
+ expect(text).toContain('**Priority:** normal');
41
+ expect(text).toContain('**API Delivered:** No');
42
+ });
43
+ it('sends with custom type and priority', async () => {
44
+ const { handleAgentMailSendNotification } = await import('../tools/agent-mail.js');
45
+ mockFetch.mockRejectedValueOnce(new Error('Connection refused'));
46
+ const result = await handleAgentMailSendNotification(mockClient, {
47
+ to: 'team',
48
+ subject: 'Urgent: Security Vulnerability',
49
+ body: 'Critical security issue found in auth module.',
50
+ notification_type: 'alert',
51
+ priority: 'urgent',
52
+ task_id: 'task_abc123',
53
+ });
54
+ const text = result.content[0].text;
55
+ expect(text).toContain('**Type:** alert');
56
+ expect(text).toContain('**Priority:** urgent');
57
+ expect(text).toContain('**Task:** task_abc123');
58
+ });
59
+ it('delivers via API when available', async () => {
60
+ const { handleAgentMailSendNotification } = await import('../tools/agent-mail.js');
61
+ mockFetch.mockResolvedValueOnce({
62
+ ok: true,
63
+ json: () => Promise.resolve({ id: 'api_notif_123', delivered: true }),
64
+ });
65
+ const result = await handleAgentMailSendNotification(mockClient, {
66
+ to: 'dobby-frontend-agent',
67
+ subject: 'PR Ready for Review',
68
+ body: 'Please review the frontend changes.',
69
+ notification_type: 'approval_request',
70
+ });
71
+ const text = result.content[0].text;
72
+ expect(text).toContain('**API Delivered:** Yes');
73
+ // Verify API was called with correct endpoint
74
+ expect(mockFetch).toHaveBeenCalledWith('http://localhost:3000/api/v1/notifications', expect.objectContaining({
75
+ method: 'POST',
76
+ headers: expect.objectContaining({
77
+ 'X-API-Key': 'test-api-key',
78
+ }),
79
+ }));
80
+ });
81
+ it('includes email_requested flag', async () => {
82
+ const { handleAgentMailSendNotification } = await import('../tools/agent-mail.js');
83
+ mockFetch.mockRejectedValueOnce(new Error('Connection refused'));
84
+ const result = await handleAgentMailSendNotification(mockClient, {
85
+ to: 'user@example.com',
86
+ subject: 'Status Report',
87
+ body: 'Weekly status update.',
88
+ deliver_email: true,
89
+ });
90
+ const text = result.content[0].text;
91
+ expect(text).toContain('**Email Requested:** Yes');
92
+ });
93
+ });
94
+ // ============================================
95
+ // Get Inbox
96
+ // ============================================
97
+ describe('AgentMail: Get Inbox', () => {
98
+ beforeEach(() => {
99
+ vi.resetAllMocks();
100
+ mockClient.request.mockRejectedValue(new Error('Connection refused'));
101
+ });
102
+ it('returns inbox from API when available', async () => {
103
+ const { handleAgentMailGetInbox } = await import('../tools/agent-mail.js');
104
+ mockFetch.mockResolvedValueOnce({
105
+ ok: true,
106
+ json: () => Promise.resolve({
107
+ notifications: [
108
+ { id: 'notif_1', subject: 'Test', read: false },
109
+ ],
110
+ total: 1,
111
+ }),
112
+ });
113
+ const result = await handleAgentMailGetInbox(mockClient, {});
114
+ const data = JSON.parse(result.content[0].text);
115
+ expect(data.notifications).toBeDefined();
116
+ });
117
+ it('falls back to local store with markdown format when API unavailable', async () => {
118
+ const { handleAgentMailGetInbox } = await import('../tools/agent-mail.js');
119
+ // Both fetch (inbox API) and request (registry) fail
120
+ mockFetch.mockRejectedValueOnce(new Error('Connection refused'));
121
+ const result = await handleAgentMailGetInbox(mockClient, {
122
+ agent_id: 'dobby-backend-agent',
123
+ });
124
+ const text = result.content[0].text;
125
+ expect(text).toContain('## Inbox for');
126
+ expect(text).toContain('**Agent:** dobby-backend-agent');
127
+ expect(text).toContain('**Source:** local store');
128
+ });
129
+ it('respects limit parameter', async () => {
130
+ const { handleAgentMailGetInbox } = await import('../tools/agent-mail.js');
131
+ mockFetch.mockRejectedValueOnce(new Error('Connection refused'));
132
+ const result = await handleAgentMailGetInbox(mockClient, {
133
+ limit: 5,
134
+ });
135
+ // Should not error
136
+ expect(result.content[0].text).toContain('## Inbox for');
137
+ });
138
+ it('includes team notifications in inbox', async () => {
139
+ const { handleAgentMailSendNotification, handleAgentMailGetInbox } = await import('../tools/agent-mail.js');
140
+ // Send a team notification first
141
+ mockFetch.mockRejectedValue(new Error('Connection refused'));
142
+ await handleAgentMailSendNotification(mockClient, {
143
+ to: 'team',
144
+ subject: 'Team Update',
145
+ body: 'Important team update.',
146
+ notification_type: 'status_report',
147
+ });
148
+ // Check inbox for team — should see team notifications
149
+ const result = await handleAgentMailGetInbox(mockClient, {
150
+ agent_id: 'team',
151
+ unread_only: false,
152
+ });
153
+ const text = result.content[0].text;
154
+ expect(text).toContain('Team Update');
155
+ });
156
+ });
157
+ // ============================================
158
+ // Get Identity — Dynamic Registry
159
+ // ============================================
160
+ describe('AgentMail: Get Identity (Dynamic Registry)', () => {
161
+ beforeEach(() => {
162
+ vi.resetAllMocks();
163
+ });
164
+ it('returns identity from API when available', async () => {
165
+ const { handleAgentMailGetIdentity } = await import('../tools/agent-mail.js');
166
+ mockClient.request.mockResolvedValueOnce({
167
+ data: {
168
+ agents: [
169
+ {
170
+ agent_id: 'dobby-backend-agent',
171
+ display_name: 'Backend Pro',
172
+ role: 'Senior Backend Dev',
173
+ group: 'dev',
174
+ capabilities: ['code', 'api'],
175
+ },
176
+ ],
177
+ },
178
+ });
179
+ const result = await handleAgentMailGetIdentity(mockClient, {
180
+ agent_id: 'dobby-backend-agent',
181
+ });
182
+ const text = result.content[0].text;
183
+ expect(text).toContain('## Agent Identity: Backend Pro');
184
+ expect(text).toContain('**Agent ID:** dobby-backend-agent');
185
+ expect(text).toContain('**Role:** Senior Backend Dev');
186
+ expect(text).toContain('### Capabilities');
187
+ });
188
+ it('falls back to hardcoded defaults when API unavailable', async () => {
189
+ const { handleAgentMailGetIdentity } = await import('../tools/agent-mail.js');
190
+ // Force cache miss by using a fresh mock that always rejects
191
+ mockClient.request.mockRejectedValue(new Error('Connection refused'));
192
+ const result = await handleAgentMailGetIdentity(mockClient, {
193
+ agent_id: 'dobby-backend-agent',
194
+ });
195
+ expect(result.isError).toBeUndefined();
196
+ const text = result.content[0].text;
197
+ // May use cached API data or fallback — either way should have agent info
198
+ expect(text).toContain('**Agent ID:** dobby-backend-agent');
199
+ expect(text).toContain('### Capabilities');
200
+ });
201
+ it('returns error for unknown agent', async () => {
202
+ const { handleAgentMailGetIdentity } = await import('../tools/agent-mail.js');
203
+ mockClient.request.mockRejectedValueOnce(new Error('Connection refused'));
204
+ const result = await handleAgentMailGetIdentity(mockClient, {
205
+ agent_id: 'nonexistent-agent',
206
+ });
207
+ expect(result.isError).toBe(true);
208
+ const data = JSON.parse(result.content[0].text);
209
+ expect(data.error).toContain('Unknown agent');
210
+ expect(data.available_agents).toBeDefined();
211
+ expect(data.available_agents).toContain('dobby-backend-agent');
212
+ });
213
+ it('caches API results for 5 minutes', async () => {
214
+ const { handleAgentMailGetIdentity } = await import('../tools/agent-mail.js');
215
+ const apiResponse = {
216
+ data: {
217
+ agents: [
218
+ { agent_id: 'dobby-chief-agent', display_name: 'Chief Cached', role: 'Cached Role', group: 'chief' },
219
+ ],
220
+ },
221
+ };
222
+ mockClient.request.mockResolvedValue(apiResponse);
223
+ // First call — fetches from API
224
+ await handleAgentMailGetIdentity(mockClient, { agent_id: 'dobby-chief-agent' });
225
+ // Second call — should use cache (request not called again for registry)
226
+ const callCountAfterFirst = mockClient.request.mock.calls.length;
227
+ await handleAgentMailGetIdentity(mockClient, { agent_id: 'dobby-chief-agent' });
228
+ // Should NOT have made another request (cached)
229
+ expect(mockClient.request.mock.calls.length).toBe(callCountAfterFirst);
230
+ });
231
+ });
232
+ // ============================================
233
+ // Tool Registration
234
+ // ============================================
235
+ describe('AgentMail: Tool Registration', () => {
236
+ it('all agentmail tools are in allTools', async () => {
237
+ const { allTools } = await import('../tools/index.js');
238
+ expect(allTools.agentmail_send_notification).toBeDefined();
239
+ expect(allTools.agentmail_get_inbox).toBeDefined();
240
+ expect(allTools.agentmail_get_identity).toBeDefined();
241
+ });
242
+ it('agentmail tools have correct schemas', async () => {
243
+ const { agentMailTools } = await import('../tools/agent-mail.js');
244
+ for (const [name, tool] of Object.entries(agentMailTools)) {
245
+ expect(tool.name).toBe(name);
246
+ expect(tool.description).toBeTruthy();
247
+ expect(tool.inputSchema.type).toBe('object');
248
+ expect(tool.inputSchema.properties).toBeDefined();
249
+ }
250
+ });
251
+ it('agent_id field has pattern validation', async () => {
252
+ const { agentMailTools } = await import('../tools/agent-mail.js');
253
+ const identitySchema = agentMailTools.agentmail_get_identity.inputSchema;
254
+ expect(identitySchema.properties.agent_id.pattern).toBe('^[a-zA-Z0-9_-]+$');
255
+ });
256
+ it('total tool count includes phase 3-5 tools', async () => {
257
+ const { allTools } = await import('../tools/index.js');
258
+ const toolCount = Object.keys(allTools).length;
259
+ expect(toolCount).toBeGreaterThanOrEqual(65);
260
+ });
261
+ });
262
+ //# sourceMappingURL=agent-mail-tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-mail-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/agent-mail-tools.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tool Annotations Tests
3
+ *
4
+ * Verifies that all tools have proper MCP annotations
5
+ * (readOnlyHint, destructiveHint, openWorldHint).
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=annotations.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotations.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/annotations.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Tool Annotations Tests
3
+ *
4
+ * Verifies that all tools have proper MCP annotations
5
+ * (readOnlyHint, destructiveHint, openWorldHint).
6
+ */
7
+ import { describe, it, expect } from 'vitest';
8
+ import { allTools } from '../tools/index.js';
9
+ describe('Tool Annotations', () => {
10
+ const tools = Object.values(allTools);
11
+ it('all tools have annotations object', () => {
12
+ for (const tool of tools) {
13
+ expect(tool.annotations, `Tool "${tool.name}" missing annotations`).toBeDefined();
14
+ }
15
+ });
16
+ it('all annotations have required fields', () => {
17
+ for (const tool of tools) {
18
+ const ann = tool.annotations;
19
+ expect(ann.title, `Tool "${tool.name}" missing title`).toBeDefined();
20
+ expect(typeof ann.readOnlyHint, `Tool "${tool.name}" readOnlyHint not boolean`).toBe('boolean');
21
+ expect(typeof ann.destructiveHint, `Tool "${tool.name}" destructiveHint not boolean`).toBe('boolean');
22
+ expect(typeof ann.openWorldHint, `Tool "${tool.name}" openWorldHint not boolean`).toBe('boolean');
23
+ }
24
+ });
25
+ it('no tool is both readOnly and destructive', () => {
26
+ for (const tool of tools) {
27
+ const ann = tool.annotations;
28
+ if (ann.readOnlyHint && ann.destructiveHint) {
29
+ throw new Error(`Tool "${tool.name}" cannot be both readOnly and destructive`);
30
+ }
31
+ }
32
+ });
33
+ it('read-only tools are correctly classified', () => {
34
+ const expectedReadOnly = [
35
+ 'list_tasks', 'get_task', 'get_task_timeline',
36
+ 'get_messages',
37
+ 'get_pending_approvals',
38
+ 'list_services',
39
+ 'crewai_health', 'crewai_inputs', 'crewai_status',
40
+ 'crew_validate', 'crew_status', 'crew_list',
41
+ 'mcp_discover_tools',
42
+ 'jira_search_issues', 'jira_get_issue', 'jira_get_comments',
43
+ 'jira_get_transitions', 'jira_list_projects',
44
+ 'get_ops_health_summary', 'get_service_status', 'get_active_issues', 'get_ops_audit_log',
45
+ 'github_search_code', 'github_get_file', 'github_list_prs',
46
+ 'github_list_issues', 'github_get_workflow_runs',
47
+ 'mem0_search', 'mem0_list',
48
+ 'mcp_health_check', 'mcp_connection_info',
49
+ 'workflow_classify_task', 'workflow_agent_workload', 'workflow_assignment_rules',
50
+ 'webeval_run_tests', 'webeval_check_health', 'webeval_test_api_endpoint', 'webeval_coverage_report',
51
+ 'memory_graph_query', 'memory_graph_timeline', 'memory_graph_context',
52
+ 'agentmail_get_inbox', 'agentmail_get_identity',
53
+ 'list_schedules',
54
+ 'moltbook_get_profile', 'moltbook_get_home_feed', 'moltbook_get_posts',
55
+ 'moltbook_get_post', 'moltbook_get_comments', 'moltbook_search', 'moltbook_get_notifications',
56
+ 'list_all_agents',
57
+ 'export_policies', 'validate_policies',
58
+ ];
59
+ for (const name of expectedReadOnly) {
60
+ const tool = allTools[name];
61
+ expect(tool, `Tool "${name}" not found`).toBeDefined();
62
+ expect(tool.annotations?.readOnlyHint, `Tool "${name}" should be readOnly`).toBe(true);
63
+ }
64
+ });
65
+ it('destructive tools are correctly classified', () => {
66
+ const expectedDestructive = [
67
+ 'create_task', 'update_task', 'cancel_task',
68
+ 'send_message',
69
+ 'approve_task', 'reject_task', 'request_changes',
70
+ 'crewai_kickoff',
71
+ 'crew_kickoff',
72
+ 'jira_create_issue', 'jira_update_issue', 'jira_add_comment',
73
+ 'jira_transition_issue', 'jira_assign_issue',
74
+ 'acknowledge_ops_issue',
75
+ 'github_create_pr', 'github_create_issue',
76
+ 'mem0_store', 'mem0_delete',
77
+ 'workflow_auto_assign',
78
+ 'memory_graph_store',
79
+ 'agentmail_send_notification',
80
+ 'create_schedule', 'pause_schedule', 'delete_schedule',
81
+ 'moltbook_update_profile', 'moltbook_create_post', 'moltbook_create_comment',
82
+ 'moltbook_upvote_post', 'moltbook_downvote_post',
83
+ 'import_policies', 'apply_guardrail',
84
+ ];
85
+ for (const name of expectedDestructive) {
86
+ const tool = allTools[name];
87
+ expect(tool, `Tool "${name}" not found`).toBeDefined();
88
+ expect(tool.annotations?.destructiveHint, `Tool "${name}" should be destructive`).toBe(true);
89
+ }
90
+ });
91
+ it('openWorldHint is true only for external API tools', () => {
92
+ const expectedOpenWorld = [
93
+ 'exa_web_search', 'exa_find_similar', 'exa_get_contents',
94
+ 'mcp_call_tool',
95
+ ];
96
+ const openWorldSet = new Set(expectedOpenWorld);
97
+ for (const tool of tools) {
98
+ const ann = tool.annotations;
99
+ if (openWorldSet.has(tool.name)) {
100
+ expect(ann.openWorldHint, `Tool "${tool.name}" should have openWorldHint=true`).toBe(true);
101
+ }
102
+ else {
103
+ expect(ann.openWorldHint, `Tool "${tool.name}" should have openWorldHint=false`).toBe(false);
104
+ }
105
+ }
106
+ });
107
+ });
108
+ //# sourceMappingURL=annotations.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotations.test.js","sourceRoot":"","sources":["../../src/__tests__/annotations.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * MCP Auth Tests
3
+ *
4
+ * Tests for OAuth proxy provider and token verifier.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=auth.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/auth.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * MCP Auth Tests
3
+ *
4
+ * Tests for OAuth proxy provider and token verifier.
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ import { TokenVerifier } from '../auth/token-verifier.js';
8
+ import { createOAuthProvider } from '../auth/oauth-provider.js';
9
+ describe('TokenVerifier', () => {
10
+ let verifier;
11
+ beforeEach(() => {
12
+ verifier = new TokenVerifier('https://dobby-ai.com');
13
+ vi.restoreAllMocks();
14
+ });
15
+ afterEach(() => {
16
+ verifier.clearCache();
17
+ });
18
+ const validTokenResponse = {
19
+ active: true,
20
+ user_id: 'pu_user123',
21
+ org_id: 'org_abc',
22
+ tenant_id: 'tenant_xyz',
23
+ scope: 'mcp:read mcp:execute',
24
+ client_id: 'mcp_client1',
25
+ exp: Math.floor(Date.now() / 1000) + 3600,
26
+ };
27
+ it('validates a valid token against remote endpoint', async () => {
28
+ global.fetch = vi.fn().mockResolvedValue({
29
+ ok: true,
30
+ json: () => Promise.resolve(validTokenResponse),
31
+ });
32
+ const authInfo = await verifier.verifyAccessToken('dobby_at_valid_token');
33
+ expect(authInfo.token).toBe('dobby_at_valid_token');
34
+ expect(authInfo.clientId).toBe('mcp_client1');
35
+ expect(authInfo.scopes).toEqual(['mcp:read', 'mcp:execute']);
36
+ expect(authInfo.extra?.org_id).toBe('org_abc');
37
+ expect(authInfo.extra?.tenant_id).toBe('tenant_xyz');
38
+ });
39
+ it('caches token verification results', async () => {
40
+ global.fetch = vi.fn().mockResolvedValue({
41
+ ok: true,
42
+ json: () => Promise.resolve(validTokenResponse),
43
+ });
44
+ // First call hits remote
45
+ await verifier.verifyAccessToken('dobby_at_cached_token');
46
+ expect(fetch).toHaveBeenCalledTimes(1);
47
+ // Second call uses cache
48
+ await verifier.verifyAccessToken('dobby_at_cached_token');
49
+ expect(fetch).toHaveBeenCalledTimes(1);
50
+ });
51
+ it('throws on invalid/expired token (401)', async () => {
52
+ global.fetch = vi.fn().mockResolvedValue({
53
+ ok: false,
54
+ status: 401,
55
+ });
56
+ await expect(verifier.verifyAccessToken('dobby_at_bad'))
57
+ .rejects.toThrow('Invalid or expired access token');
58
+ });
59
+ it('throws on inactive token', async () => {
60
+ global.fetch = vi.fn().mockResolvedValue({
61
+ ok: true,
62
+ json: () => Promise.resolve({ active: false }),
63
+ });
64
+ await expect(verifier.verifyAccessToken('dobby_at_inactive'))
65
+ .rejects.toThrow('Token is not active');
66
+ });
67
+ it('throws when token missing org_id or tenant_id', async () => {
68
+ global.fetch = vi.fn().mockResolvedValue({
69
+ ok: true,
70
+ json: () => Promise.resolve({ active: true, user_id: 'u1' }),
71
+ });
72
+ await expect(verifier.verifyAccessToken('dobby_at_no_context'))
73
+ .rejects.toThrow('Token missing org_id or tenant_id');
74
+ });
75
+ it('evicts oldest entry when cache exceeds max size', async () => {
76
+ global.fetch = vi.fn().mockResolvedValue({
77
+ ok: true,
78
+ json: () => Promise.resolve(validTokenResponse),
79
+ });
80
+ // Fill cache beyond max (1000) — simplified test with a few entries
81
+ for (let i = 0; i < 5; i++) {
82
+ await verifier.verifyAccessToken(`dobby_at_token_${i}`);
83
+ }
84
+ expect(verifier.cacheSize).toBe(5);
85
+ });
86
+ it('calls correct introspection URL', async () => {
87
+ global.fetch = vi.fn().mockResolvedValue({
88
+ ok: true,
89
+ json: () => Promise.resolve(validTokenResponse),
90
+ });
91
+ await verifier.verifyAccessToken('dobby_at_url_test');
92
+ expect(fetch).toHaveBeenCalledWith('https://dobby-ai.com/oauth/token/introspect', expect.objectContaining({
93
+ method: 'POST',
94
+ headers: expect.objectContaining({
95
+ 'Authorization': 'Bearer dobby_at_url_test',
96
+ }),
97
+ }));
98
+ });
99
+ it('strips trailing slash from issuer URL', () => {
100
+ const v = new TokenVerifier('https://dobby-ai.com/');
101
+ // The verifier should store the URL without trailing slash
102
+ expect(v.issuerUrl).toBe('https://dobby-ai.com');
103
+ });
104
+ });
105
+ describe('createOAuthProvider', () => {
106
+ it('returns provider and tokenVerifier', () => {
107
+ const result = createOAuthProvider({
108
+ issuerUrl: 'https://dobby-ai.com',
109
+ mcpPublicUrl: 'https://mcp.dobby-ai.com',
110
+ });
111
+ expect(result.provider).toBeDefined();
112
+ expect(result.tokenVerifier).toBeDefined();
113
+ expect(result.tokenVerifier).toBeInstanceOf(TokenVerifier);
114
+ });
115
+ });
116
+ //# sourceMappingURL=auth.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../../src/__tests__/auth.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * MCP Protocol Compliance Tests
3
+ *
4
+ * Verifies JSON-RPC 2.0 compliance and MCP protocol adherence
5
+ * for the Dobby MCP server.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=protocol.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/protocol.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}