@softeria/ms-365-mcp-server 0.4.1 → 0.4.3
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 +25 -3
- package/bin/modules/simplified-openapi.mjs +7 -0
- package/dist/auth.js +1 -0
- package/dist/cli.js +7 -2
- package/dist/endpoints.json +9 -1
- package/dist/generated/client.js +7339 -7295
- package/dist/graph-tools.js +5 -2
- package/dist/server.js +4 -1
- package/package.json +3 -2
- package/src/endpoints.json +9 -1
- package/src/generated/README.md +6 -1
- package/.github/workflows/build.yml +0 -34
- package/.github/workflows/npm-publish.yml +0 -32
- package/.prettierrc +0 -7
- package/src/auth-tools.ts +0 -89
- package/src/auth.ts +0 -267
- package/src/cli.ts +0 -33
- package/src/generated/client.ts +0 -24916
- package/src/graph-client.ts +0 -328
- package/src/graph-tools.ts +0 -174
- package/src/index.ts +0 -46
- package/src/logger.ts +0 -43
- package/src/server.ts +0 -46
- package/src/version.ts +0 -9
- package/test/auth-tools.test.ts +0 -97
- package/test/cli.test.ts +0 -45
- package/test/graph-api.test.ts +0 -89
- package/test/test-hack.ts +0 -17
- package/tsconfig.json +0 -16
- package/vitest.config.js +0 -8
package/test/auth-tools.test.ts
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi, beforeEach } from 'vitest';
|
|
2
|
-
|
|
3
|
-
vi.mock('zod', () => {
|
|
4
|
-
const mockZod = {
|
|
5
|
-
boolean: () => ({
|
|
6
|
-
default: () => ({
|
|
7
|
-
describe: () => 'mocked-zod-boolean',
|
|
8
|
-
}),
|
|
9
|
-
}),
|
|
10
|
-
object: () => ({
|
|
11
|
-
strict: () => 'mocked-zod-object',
|
|
12
|
-
}),
|
|
13
|
-
};
|
|
14
|
-
return { z: mockZod };
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
import { registerAuthTools } from '../src/auth-tools.js';
|
|
18
|
-
|
|
19
|
-
describe('Auth Tools', () => {
|
|
20
|
-
let server: any;
|
|
21
|
-
let authManager: any;
|
|
22
|
-
let loginTool: any;
|
|
23
|
-
|
|
24
|
-
beforeEach(() => {
|
|
25
|
-
loginTool = vi.fn();
|
|
26
|
-
|
|
27
|
-
server = {
|
|
28
|
-
tool: vi.fn((name, schema, handler) => {
|
|
29
|
-
if (name === 'login') {
|
|
30
|
-
loginTool = handler;
|
|
31
|
-
}
|
|
32
|
-
}),
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
authManager = {
|
|
36
|
-
testLogin: vi.fn(),
|
|
37
|
-
acquireTokenByDeviceCode: vi.fn(),
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
registerAuthTools(server, authManager);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
describe('login tool', () => {
|
|
44
|
-
it('should check if already logged in when force=false', async () => {
|
|
45
|
-
authManager.testLogin.mockResolvedValue({
|
|
46
|
-
success: true,
|
|
47
|
-
userData: { displayName: 'Test User' },
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
const result = await loginTool({ force: false });
|
|
51
|
-
|
|
52
|
-
expect(authManager.testLogin).toHaveBeenCalled();
|
|
53
|
-
expect(authManager.acquireTokenByDeviceCode).not.toHaveBeenCalled();
|
|
54
|
-
expect(result.content[0].text).toContain('Already logged in');
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it('should force login when force=true even if already logged in', async () => {
|
|
58
|
-
authManager.testLogin.mockResolvedValue({
|
|
59
|
-
success: true,
|
|
60
|
-
userData: { displayName: 'Test User' },
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
authManager.acquireTokenByDeviceCode.mockImplementation(
|
|
64
|
-
(callback: (text: string) => void) => {
|
|
65
|
-
callback('Login instructions');
|
|
66
|
-
return Promise.resolve();
|
|
67
|
-
}
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
const result = await loginTool({ force: true });
|
|
71
|
-
|
|
72
|
-
expect(authManager.testLogin).not.toHaveBeenCalled();
|
|
73
|
-
expect(authManager.acquireTokenByDeviceCode).toHaveBeenCalled();
|
|
74
|
-
expect(result.content[0].text).toBe('Login instructions');
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it('should proceed with login when not already logged in', async () => {
|
|
78
|
-
authManager.testLogin.mockResolvedValue({
|
|
79
|
-
success: false,
|
|
80
|
-
message: 'Not logged in',
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
authManager.acquireTokenByDeviceCode.mockImplementation(
|
|
84
|
-
(callback: (text: string) => void) => {
|
|
85
|
-
callback('Login instructions');
|
|
86
|
-
return Promise.resolve();
|
|
87
|
-
}
|
|
88
|
-
);
|
|
89
|
-
|
|
90
|
-
const result = await loginTool({ force: false });
|
|
91
|
-
|
|
92
|
-
expect(authManager.testLogin).toHaveBeenCalled();
|
|
93
|
-
expect(authManager.acquireTokenByDeviceCode).toHaveBeenCalled();
|
|
94
|
-
expect(result.content[0].text).toBe('Login instructions');
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
});
|
package/test/cli.test.ts
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { parseArgs } from '../src/cli.js';
|
|
3
|
-
|
|
4
|
-
vi.mock('commander', () => {
|
|
5
|
-
const mockCommand = {
|
|
6
|
-
name: vi.fn().mockReturnThis(),
|
|
7
|
-
description: vi.fn().mockReturnThis(),
|
|
8
|
-
version: vi.fn().mockReturnThis(),
|
|
9
|
-
option: vi.fn().mockReturnThis(),
|
|
10
|
-
parse: vi.fn(),
|
|
11
|
-
opts: vi.fn().mockReturnValue({ file: 'test.xlsx' }),
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
return {
|
|
15
|
-
Command: vi.fn(() => mockCommand),
|
|
16
|
-
};
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
vi.mock('../src/auth.js', () => {
|
|
20
|
-
return {
|
|
21
|
-
default: vi.fn().mockImplementation(() => ({
|
|
22
|
-
getToken: vi.fn().mockResolvedValue('mock-token'),
|
|
23
|
-
logout: vi.fn().mockResolvedValue(true),
|
|
24
|
-
})),
|
|
25
|
-
};
|
|
26
|
-
});
|
|
27
|
-
vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
|
|
28
|
-
const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => {});
|
|
29
|
-
|
|
30
|
-
describe('CLI Module', () => {
|
|
31
|
-
beforeEach(() => {
|
|
32
|
-
vi.clearAllMocks();
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
afterEach(() => {
|
|
36
|
-
vi.resetAllMocks();
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
describe('parseArgs', () => {
|
|
40
|
-
it('should return command options', () => {
|
|
41
|
-
const result = parseArgs();
|
|
42
|
-
expect(result).toEqual({ file: 'test.xlsx' });
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
});
|
package/test/graph-api.test.ts
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
-
|
|
3
|
-
global.fetch = vi.fn();
|
|
4
|
-
|
|
5
|
-
describe('Graph API Functions', () => {
|
|
6
|
-
beforeEach(() => {
|
|
7
|
-
vi.clearAllMocks();
|
|
8
|
-
(global.fetch as jest.Mock).mockImplementation(async () => ({
|
|
9
|
-
ok: true,
|
|
10
|
-
status: 200,
|
|
11
|
-
json: async () => ({ value: 'test data' }),
|
|
12
|
-
text: async () => 'Error text',
|
|
13
|
-
}));
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
afterEach(() => {
|
|
17
|
-
vi.resetAllMocks();
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
describe('createSession', () => {
|
|
21
|
-
async function createSession(filePath: string, token: string): Promise<string | null> {
|
|
22
|
-
try {
|
|
23
|
-
const response = await fetch(
|
|
24
|
-
`https://graph.microsoft.com/v1.0/me/drive/root:${filePath}:/workbook/createSession`,
|
|
25
|
-
{
|
|
26
|
-
method: 'POST',
|
|
27
|
-
headers: {
|
|
28
|
-
Authorization: `Bearer ${token}`,
|
|
29
|
-
'Content-Type': 'application/json',
|
|
30
|
-
},
|
|
31
|
-
body: JSON.stringify({ persistChanges: true }),
|
|
32
|
-
}
|
|
33
|
-
);
|
|
34
|
-
|
|
35
|
-
if (!response.ok) {
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const result = await response.json();
|
|
40
|
-
return result.id;
|
|
41
|
-
} catch (error) {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
it('should create a session successfully', async () => {
|
|
47
|
-
(global.fetch as jest.Mock).mockImplementationOnce(async () => ({
|
|
48
|
-
ok: true,
|
|
49
|
-
status: 200,
|
|
50
|
-
json: async () => ({ id: 'session-123' }),
|
|
51
|
-
}));
|
|
52
|
-
|
|
53
|
-
const result = await createSession('/test.xlsx', 'mock-token');
|
|
54
|
-
|
|
55
|
-
expect(result).toBe('session-123');
|
|
56
|
-
expect(global.fetch).toHaveBeenCalledWith(
|
|
57
|
-
'https://graph.microsoft.com/v1.0/me/drive/root:/test.xlsx:/workbook/createSession',
|
|
58
|
-
expect.objectContaining({
|
|
59
|
-
method: 'POST',
|
|
60
|
-
headers: expect.objectContaining({
|
|
61
|
-
Authorization: 'Bearer mock-token',
|
|
62
|
-
}),
|
|
63
|
-
})
|
|
64
|
-
);
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
it('should return null if session creation fails', async () => {
|
|
68
|
-
(global.fetch as jest.Mock).mockImplementationOnce(async () => ({
|
|
69
|
-
ok: false,
|
|
70
|
-
status: 400,
|
|
71
|
-
text: async () => 'Bad request',
|
|
72
|
-
}));
|
|
73
|
-
|
|
74
|
-
const result = await createSession('/test.xlsx', 'mock-token');
|
|
75
|
-
|
|
76
|
-
expect(result).toBeNull();
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
it('should return null if an error is thrown', async () => {
|
|
80
|
-
(global.fetch as jest.Mock).mockImplementationOnce(() => {
|
|
81
|
-
throw new Error('Network error');
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
const result = await createSession('/test.xlsx', 'mock-token');
|
|
85
|
-
|
|
86
|
-
expect(result).toBeNull();
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
});
|
package/test/test-hack.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { Endpoint } from './src/generated/endpoint-types.js';
|
|
2
|
-
import { Zodios } from './src/generated/hack.js';
|
|
3
|
-
|
|
4
|
-
const testEndpoint: Endpoint = {
|
|
5
|
-
method: 'get',
|
|
6
|
-
path: '/me/mailFolders/{mailFolder-id}/messages',
|
|
7
|
-
alias: 'test-endpoint',
|
|
8
|
-
description: 'Test endpoint',
|
|
9
|
-
requestFormat: 'json',
|
|
10
|
-
parameters: [],
|
|
11
|
-
response: {} as any,
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
const zodios = new Zodios([testEndpoint]);
|
|
15
|
-
|
|
16
|
-
console.log('Parameters after processing:');
|
|
17
|
-
console.log(JSON.stringify(zodios.endpoints[0].parameters, null, 2));
|
package/tsconfig.json
DELETED