@mcp-z/mcp-outlook 1.1.1 → 1.1.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 +9 -10
- package/dist/cjs/setup/http.js +27 -16
- package/dist/cjs/setup/http.js.map +1 -1
- package/dist/esm/setup/http.js +21 -10
- package/dist/esm/setup/http.js.map +1 -1
- package/package.json +2 -8
package/README.md
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# @mcp-z/mcp-outlook
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
Outlook MCP server for searching, reading, and sending Microsoft 365 mail.
|
|
3
|
+
MCP server for Outlook integration with OAuth authentication, message search, and batch operations
|
|
5
4
|
|
|
6
5
|
## Common uses
|
|
7
6
|
|
|
@@ -106,8 +105,7 @@ Example (http) - Create .mcp.json:
|
|
|
106
105
|
}
|
|
107
106
|
```
|
|
108
107
|
|
|
109
|
-
Local (default): omit REDIRECT_URI → ephemeral loopback.
|
|
110
|
-
Cloud: set REDIRECT_URI to your public /oauth/callback and expose the service publicly.
|
|
108
|
+
Local (default): omit REDIRECT_URI → ephemeral loopback. Cloud: set REDIRECT_URI to your public /oauth/callback and expose the service publicly.
|
|
111
109
|
|
|
112
110
|
Note: start block is a helper in "npx @mcp-z/cli up" for starting an http server from your .mpc.json. See [@mcp-z/cli](https://github.com/mcp-z/cli) for details.
|
|
113
111
|
|
|
@@ -132,8 +130,7 @@ Useful for headless or remote environments.
|
|
|
132
130
|
|
|
133
131
|
### DCR (self-hosted)
|
|
134
132
|
|
|
135
|
-
HTTP only. Requires a public base URL.
|
|
136
|
-
CSV export and `/files` are disabled in DCR mode; `resourceStoreUri` is ignored.
|
|
133
|
+
HTTP only. Requires a public base URL. CSV export and `/files` are disabled in DCR mode; `resourceStoreUri` is ignored.
|
|
137
134
|
|
|
138
135
|
```json
|
|
139
136
|
{
|
|
@@ -196,13 +193,11 @@ See `server.json` for all supported environment variables, CLI arguments, and de
|
|
|
196
193
|
|
|
197
194
|
## Storage backends
|
|
198
195
|
|
|
199
|
-
OAuth tokens (`TOKEN_STORE_URI`) and DCR registrations (`DCR_STORE_URI`) are stored through
|
|
200
|
-
[keyv-registry](https://www.npmjs.com/package/keyv-registry), which picks an adapter from the URI protocol.
|
|
196
|
+
OAuth tokens (`TOKEN_STORE_URI`) and DCR registrations (`DCR_STORE_URI`) are stored through [keyv-registry](https://www.npmjs.com/package/keyv-registry), which picks an adapter from the URI protocol.
|
|
201
197
|
|
|
202
198
|
`file://` (the default, under `~/.mcp-z/`) and `memory://` work with no extra setup.
|
|
203
199
|
|
|
204
|
-
Any other backend needs its adapter installed alongside this server. Adapters are resolved with
|
|
205
|
-
`require()`, so a globally installed server finds a globally installed adapter:
|
|
200
|
+
Any other backend needs its adapter installed alongside this server. Adapters are resolved with `require()`, so a globally installed server finds a globally installed adapter:
|
|
206
201
|
|
|
207
202
|
```bash
|
|
208
203
|
npm install -g @mcp-z/mcp-outlook @keyv/redis
|
|
@@ -211,3 +206,7 @@ TOKEN_STORE_URI=redis://localhost:6379 mcp-outlook
|
|
|
211
206
|
```
|
|
212
207
|
|
|
213
208
|
A protocol whose adapter is missing fails at startup naming the package to install.
|
|
209
|
+
|
|
210
|
+
### Documentation
|
|
211
|
+
|
|
212
|
+
[API Docs](https://mcp-z.github.io/mcp-outlook)
|
package/dist/cjs/setup/http.js
CHANGED
|
@@ -172,7 +172,7 @@ function _unsupported_iterable_to_array(o, minLen) {
|
|
|
172
172
|
}
|
|
173
173
|
function createHTTPServer(config, overrides) {
|
|
174
174
|
return _async_to_generator(function() {
|
|
175
|
-
var runtime, modules, layers, composed, logger, port, tools, filteredTools, prompts, mcpServer, app,
|
|
175
|
+
var runtime, modules, layers, composed, logger, port, tools, filteredTools, prompts, mcpServer, app, publicUrl, _ref, close, httpServer, fileRouter;
|
|
176
176
|
return _ts_generator(this, function(_state) {
|
|
177
177
|
switch(_state.label){
|
|
178
178
|
case 0:
|
|
@@ -204,12 +204,34 @@ function createHTTPServer(config, overrides) {
|
|
|
204
204
|
(0, _server.registerResources)(mcpServer, composed.resources);
|
|
205
205
|
(0, _server.registerPrompts)(mcpServer, prompts);
|
|
206
206
|
app = (0, _express.default)();
|
|
207
|
-
app.use((0, _cors.default)());
|
|
208
207
|
app.use(_express.default.json({
|
|
209
208
|
limit: '10mb'
|
|
210
209
|
}));
|
|
210
|
+
// Must mount '/mcp' before any permissive app-level cors(), or that layer answers its
|
|
211
|
+
// preflight first; pass baseUrl's origin/host below or a public deployment 403s itself.
|
|
212
|
+
publicUrl = config.baseUrl ? new URL(config.baseUrl) : undefined;
|
|
213
|
+
logger.info("Starting ".concat(config.name, " MCP server (http)"));
|
|
214
|
+
return [
|
|
215
|
+
4,
|
|
216
|
+
(0, _server.connectHttp)(mcpServer, {
|
|
217
|
+
logger: logger,
|
|
218
|
+
app: app,
|
|
219
|
+
port: port,
|
|
220
|
+
allowedOrigins: publicUrl ? [
|
|
221
|
+
publicUrl.origin
|
|
222
|
+
] : undefined,
|
|
223
|
+
allowedHosts: publicUrl ? [
|
|
224
|
+
publicUrl.host
|
|
225
|
+
] : undefined
|
|
226
|
+
})
|
|
227
|
+
];
|
|
228
|
+
case 2:
|
|
229
|
+
_ref = _state.sent(), close = _ref.close, httpServer = _ref.httpServer;
|
|
230
|
+
// The loopback OAuth callback, the file-export download, and the DCR discovery/
|
|
231
|
+
// registration endpoints are all meant to be reached from a browser on another
|
|
232
|
+
// origin. Keep cors() for them, scoped to their own routes - never in front of '/mcp'.
|
|
211
233
|
if (runtime.deps.oauthAdapters.loopbackRouter) {
|
|
212
|
-
app.use('/', runtime.deps.oauthAdapters.loopbackRouter);
|
|
234
|
+
app.use('/', (0, _cors.default)(), runtime.deps.oauthAdapters.loopbackRouter);
|
|
213
235
|
logger.info('Mounted loopback OAuth callback router');
|
|
214
236
|
}
|
|
215
237
|
if (config.auth !== 'dcr') {
|
|
@@ -219,23 +241,12 @@ function createHTTPServer(config, overrides) {
|
|
|
219
241
|
contentType: 'text/csv',
|
|
220
242
|
contentDisposition: 'attachment'
|
|
221
243
|
});
|
|
222
|
-
app.use('/files', fileRouter);
|
|
244
|
+
app.use('/files', (0, _cors.default)(), fileRouter);
|
|
223
245
|
}
|
|
224
246
|
if (runtime.deps.oauthAdapters.dcrRouter) {
|
|
225
|
-
app.use('/', runtime.deps.oauthAdapters.dcrRouter);
|
|
247
|
+
app.use('/', (0, _cors.default)(), runtime.deps.oauthAdapters.dcrRouter);
|
|
226
248
|
logger.info('Mounted DCR router with OAuth endpoints');
|
|
227
249
|
}
|
|
228
|
-
logger.info("Starting ".concat(config.name, " MCP server (http)"));
|
|
229
|
-
return [
|
|
230
|
-
4,
|
|
231
|
-
(0, _server.connectHttp)(mcpServer, {
|
|
232
|
-
logger: logger,
|
|
233
|
-
app: app,
|
|
234
|
-
port: port
|
|
235
|
-
})
|
|
236
|
-
];
|
|
237
|
-
case 2:
|
|
238
|
-
_ref = _state.sent(), close = _ref.close, httpServer = _ref.httpServer;
|
|
239
250
|
logger.info('http transport ready');
|
|
240
251
|
return [
|
|
241
252
|
2,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/setup/http.ts"],"sourcesContent":["import { composeMiddleware, connectHttp, createFileServingRouter, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport cors from 'cors';\nimport express from 'express';\nimport type { RuntimeOverrides, ServerConfig } from '../types.ts';\nimport { createDefaultRuntime } from './runtime.ts';\n\nexport async function createHTTPServer(config: ServerConfig, overrides?: RuntimeOverrides) {\n const runtime = await createDefaultRuntime(config, overrides);\n const modules = runtime.createDomainModules();\n const layers = runtime.middlewareFactories.map((factory) => factory(runtime.deps));\n const composed = composeMiddleware(modules, layers);\n const logger = runtime.deps.logger;\n const port = config.transport.port;\n if (!port) throw new Error('Port is required for HTTP transport');\n\n const tools = [...composed.tools, ...runtime.deps.oauthAdapters.accountTools];\n const filteredTools =\n config.auth === 'dcr'\n ? tools.filter((tool) => tool.name !== 'messages-export-csv') // No file storage in DCR (public cloud responsibility)\n : tools;\n const prompts = [...composed.prompts, ...runtime.deps.oauthAdapters.accountPrompts];\n\n const mcpServer = new McpServer({ name: config.name, version: config.version });\n registerTools(mcpServer, filteredTools);\n registerResources(mcpServer, composed.resources);\n registerPrompts(mcpServer, prompts);\n\n const app = express();\n app.use(
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/setup/http.ts"],"sourcesContent":["import { composeMiddleware, connectHttp, createFileServingRouter, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport cors from 'cors';\nimport express from 'express';\nimport type { RuntimeOverrides, ServerConfig } from '../types.ts';\nimport { createDefaultRuntime } from './runtime.ts';\n\nexport async function createHTTPServer(config: ServerConfig, overrides?: RuntimeOverrides) {\n const runtime = await createDefaultRuntime(config, overrides);\n const modules = runtime.createDomainModules();\n const layers = runtime.middlewareFactories.map((factory) => factory(runtime.deps));\n const composed = composeMiddleware(modules, layers);\n const logger = runtime.deps.logger;\n const port = config.transport.port;\n if (!port) throw new Error('Port is required for HTTP transport');\n\n const tools = [...composed.tools, ...runtime.deps.oauthAdapters.accountTools];\n const filteredTools =\n config.auth === 'dcr'\n ? tools.filter((tool) => tool.name !== 'messages-export-csv') // No file storage in DCR (public cloud responsibility)\n : tools;\n const prompts = [...composed.prompts, ...runtime.deps.oauthAdapters.accountPrompts];\n\n const mcpServer = new McpServer({ name: config.name, version: config.version });\n registerTools(mcpServer, filteredTools);\n registerResources(mcpServer, composed.resources);\n registerPrompts(mcpServer, prompts);\n\n const app = express();\n app.use(express.json({ limit: '10mb' }));\n\n // Must mount '/mcp' before any permissive app-level cors(), or that layer answers its\n // preflight first; pass baseUrl's origin/host below or a public deployment 403s itself.\n const publicUrl = config.baseUrl ? new URL(config.baseUrl) : undefined;\n logger.info(`Starting ${config.name} MCP server (http)`);\n const { close, httpServer } = await connectHttp(mcpServer, {\n logger,\n app,\n port,\n allowedOrigins: publicUrl ? [publicUrl.origin] : undefined,\n allowedHosts: publicUrl ? [publicUrl.host] : undefined,\n });\n\n // The loopback OAuth callback, the file-export download, and the DCR discovery/\n // registration endpoints are all meant to be reached from a browser on another\n // origin. Keep cors() for them, scoped to their own routes - never in front of '/mcp'.\n if (runtime.deps.oauthAdapters.loopbackRouter) {\n app.use('/', cors(), runtime.deps.oauthAdapters.loopbackRouter);\n logger.info('Mounted loopback OAuth callback router');\n }\n\n if (config.auth !== 'dcr') {\n const fileRouter = createFileServingRouter({ resourceStoreUri: config.resourceStoreUri }, { contentType: 'text/csv', contentDisposition: 'attachment' });\n app.use('/files', cors(), fileRouter);\n }\n\n if (runtime.deps.oauthAdapters.dcrRouter) {\n app.use('/', cors(), runtime.deps.oauthAdapters.dcrRouter);\n logger.info('Mounted DCR router with OAuth endpoints');\n }\n\n logger.info('http transport ready');\n\n return {\n httpServer,\n mcpServer,\n logger,\n close: async () => {\n await close();\n await runtime.close();\n },\n };\n}\n"],"names":["createHTTPServer","config","overrides","runtime","modules","layers","composed","logger","port","tools","filteredTools","prompts","mcpServer","app","publicUrl","close","httpServer","fileRouter","createDefaultRuntime","createDomainModules","middlewareFactories","map","factory","deps","composeMiddleware","transport","Error","oauthAdapters","accountTools","auth","filter","tool","name","accountPrompts","McpServer","version","registerTools","registerResources","resources","registerPrompts","express","use","json","limit","baseUrl","URL","undefined","info","connectHttp","allowedOrigins","origin","allowedHosts","host","loopbackRouter","cors","createFileServingRouter","resourceStoreUri","contentType","contentDisposition","dcrRouter"],"mappings":"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"}
|
package/dist/esm/setup/http.js
CHANGED
|
@@ -29,12 +29,29 @@ export async function createHTTPServer(config, overrides) {
|
|
|
29
29
|
registerResources(mcpServer, composed.resources);
|
|
30
30
|
registerPrompts(mcpServer, prompts);
|
|
31
31
|
const app = express();
|
|
32
|
-
app.use(cors());
|
|
33
32
|
app.use(express.json({
|
|
34
33
|
limit: '10mb'
|
|
35
34
|
}));
|
|
35
|
+
// Must mount '/mcp' before any permissive app-level cors(), or that layer answers its
|
|
36
|
+
// preflight first; pass baseUrl's origin/host below or a public deployment 403s itself.
|
|
37
|
+
const publicUrl = config.baseUrl ? new URL(config.baseUrl) : undefined;
|
|
38
|
+
logger.info(`Starting ${config.name} MCP server (http)`);
|
|
39
|
+
const { close, httpServer } = await connectHttp(mcpServer, {
|
|
40
|
+
logger,
|
|
41
|
+
app,
|
|
42
|
+
port,
|
|
43
|
+
allowedOrigins: publicUrl ? [
|
|
44
|
+
publicUrl.origin
|
|
45
|
+
] : undefined,
|
|
46
|
+
allowedHosts: publicUrl ? [
|
|
47
|
+
publicUrl.host
|
|
48
|
+
] : undefined
|
|
49
|
+
});
|
|
50
|
+
// The loopback OAuth callback, the file-export download, and the DCR discovery/
|
|
51
|
+
// registration endpoints are all meant to be reached from a browser on another
|
|
52
|
+
// origin. Keep cors() for them, scoped to their own routes - never in front of '/mcp'.
|
|
36
53
|
if (runtime.deps.oauthAdapters.loopbackRouter) {
|
|
37
|
-
app.use('/', runtime.deps.oauthAdapters.loopbackRouter);
|
|
54
|
+
app.use('/', cors(), runtime.deps.oauthAdapters.loopbackRouter);
|
|
38
55
|
logger.info('Mounted loopback OAuth callback router');
|
|
39
56
|
}
|
|
40
57
|
if (config.auth !== 'dcr') {
|
|
@@ -44,18 +61,12 @@ export async function createHTTPServer(config, overrides) {
|
|
|
44
61
|
contentType: 'text/csv',
|
|
45
62
|
contentDisposition: 'attachment'
|
|
46
63
|
});
|
|
47
|
-
app.use('/files', fileRouter);
|
|
64
|
+
app.use('/files', cors(), fileRouter);
|
|
48
65
|
}
|
|
49
66
|
if (runtime.deps.oauthAdapters.dcrRouter) {
|
|
50
|
-
app.use('/', runtime.deps.oauthAdapters.dcrRouter);
|
|
67
|
+
app.use('/', cors(), runtime.deps.oauthAdapters.dcrRouter);
|
|
51
68
|
logger.info('Mounted DCR router with OAuth endpoints');
|
|
52
69
|
}
|
|
53
|
-
logger.info(`Starting ${config.name} MCP server (http)`);
|
|
54
|
-
const { close, httpServer } = await connectHttp(mcpServer, {
|
|
55
|
-
logger,
|
|
56
|
-
app,
|
|
57
|
-
port
|
|
58
|
-
});
|
|
59
70
|
logger.info('http transport ready');
|
|
60
71
|
return {
|
|
61
72
|
httpServer,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/setup/http.ts"],"sourcesContent":["import { composeMiddleware, connectHttp, createFileServingRouter, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport cors from 'cors';\nimport express from 'express';\nimport type { RuntimeOverrides, ServerConfig } from '../types.ts';\nimport { createDefaultRuntime } from './runtime.ts';\n\nexport async function createHTTPServer(config: ServerConfig, overrides?: RuntimeOverrides) {\n const runtime = await createDefaultRuntime(config, overrides);\n const modules = runtime.createDomainModules();\n const layers = runtime.middlewareFactories.map((factory) => factory(runtime.deps));\n const composed = composeMiddleware(modules, layers);\n const logger = runtime.deps.logger;\n const port = config.transport.port;\n if (!port) throw new Error('Port is required for HTTP transport');\n\n const tools = [...composed.tools, ...runtime.deps.oauthAdapters.accountTools];\n const filteredTools =\n config.auth === 'dcr'\n ? tools.filter((tool) => tool.name !== 'messages-export-csv') // No file storage in DCR (public cloud responsibility)\n : tools;\n const prompts = [...composed.prompts, ...runtime.deps.oauthAdapters.accountPrompts];\n\n const mcpServer = new McpServer({ name: config.name, version: config.version });\n registerTools(mcpServer, filteredTools);\n registerResources(mcpServer, composed.resources);\n registerPrompts(mcpServer, prompts);\n\n const app = express();\n app.use(
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/setup/http.ts"],"sourcesContent":["import { composeMiddleware, connectHttp, createFileServingRouter, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport cors from 'cors';\nimport express from 'express';\nimport type { RuntimeOverrides, ServerConfig } from '../types.ts';\nimport { createDefaultRuntime } from './runtime.ts';\n\nexport async function createHTTPServer(config: ServerConfig, overrides?: RuntimeOverrides) {\n const runtime = await createDefaultRuntime(config, overrides);\n const modules = runtime.createDomainModules();\n const layers = runtime.middlewareFactories.map((factory) => factory(runtime.deps));\n const composed = composeMiddleware(modules, layers);\n const logger = runtime.deps.logger;\n const port = config.transport.port;\n if (!port) throw new Error('Port is required for HTTP transport');\n\n const tools = [...composed.tools, ...runtime.deps.oauthAdapters.accountTools];\n const filteredTools =\n config.auth === 'dcr'\n ? tools.filter((tool) => tool.name !== 'messages-export-csv') // No file storage in DCR (public cloud responsibility)\n : tools;\n const prompts = [...composed.prompts, ...runtime.deps.oauthAdapters.accountPrompts];\n\n const mcpServer = new McpServer({ name: config.name, version: config.version });\n registerTools(mcpServer, filteredTools);\n registerResources(mcpServer, composed.resources);\n registerPrompts(mcpServer, prompts);\n\n const app = express();\n app.use(express.json({ limit: '10mb' }));\n\n // Must mount '/mcp' before any permissive app-level cors(), or that layer answers its\n // preflight first; pass baseUrl's origin/host below or a public deployment 403s itself.\n const publicUrl = config.baseUrl ? new URL(config.baseUrl) : undefined;\n logger.info(`Starting ${config.name} MCP server (http)`);\n const { close, httpServer } = await connectHttp(mcpServer, {\n logger,\n app,\n port,\n allowedOrigins: publicUrl ? [publicUrl.origin] : undefined,\n allowedHosts: publicUrl ? [publicUrl.host] : undefined,\n });\n\n // The loopback OAuth callback, the file-export download, and the DCR discovery/\n // registration endpoints are all meant to be reached from a browser on another\n // origin. Keep cors() for them, scoped to their own routes - never in front of '/mcp'.\n if (runtime.deps.oauthAdapters.loopbackRouter) {\n app.use('/', cors(), runtime.deps.oauthAdapters.loopbackRouter);\n logger.info('Mounted loopback OAuth callback router');\n }\n\n if (config.auth !== 'dcr') {\n const fileRouter = createFileServingRouter({ resourceStoreUri: config.resourceStoreUri }, { contentType: 'text/csv', contentDisposition: 'attachment' });\n app.use('/files', cors(), fileRouter);\n }\n\n if (runtime.deps.oauthAdapters.dcrRouter) {\n app.use('/', cors(), runtime.deps.oauthAdapters.dcrRouter);\n logger.info('Mounted DCR router with OAuth endpoints');\n }\n\n logger.info('http transport ready');\n\n return {\n httpServer,\n mcpServer,\n logger,\n close: async () => {\n await close();\n await runtime.close();\n },\n };\n}\n"],"names":["composeMiddleware","connectHttp","createFileServingRouter","registerPrompts","registerResources","registerTools","McpServer","cors","express","createDefaultRuntime","createHTTPServer","config","overrides","runtime","modules","createDomainModules","layers","middlewareFactories","map","factory","deps","composed","logger","port","transport","Error","tools","oauthAdapters","accountTools","filteredTools","auth","filter","tool","name","prompts","accountPrompts","mcpServer","version","resources","app","use","json","limit","publicUrl","baseUrl","URL","undefined","info","close","httpServer","allowedOrigins","origin","allowedHosts","host","loopbackRouter","fileRouter","resourceStoreUri","contentType","contentDisposition","dcrRouter"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcp-z/mcp-outlook",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.3",
|
|
4
4
|
"description": "MCP server for Outlook integration with OAuth authentication, message search, and batch operations",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"outlook",
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
"@mcp-z/email": "^1.0.0",
|
|
72
72
|
"@mcp-z/oauth": "^1.0.5",
|
|
73
73
|
"@mcp-z/oauth-microsoft": "^1.0.9",
|
|
74
|
-
"@mcp-z/server": "^1.
|
|
74
|
+
"@mcp-z/server": "^1.2.0",
|
|
75
75
|
"@microsoft/microsoft-graph-client": "^3.0.0",
|
|
76
76
|
"@microsoft/microsoft-graph-types": "^2.0.0",
|
|
77
77
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
@@ -101,12 +101,6 @@
|
|
|
101
101
|
"engines": {
|
|
102
102
|
"node": ">=20"
|
|
103
103
|
},
|
|
104
|
-
"allowScripts": {
|
|
105
|
-
"node-filename-to-dist-paths": true,
|
|
106
|
-
"node-semvers": true,
|
|
107
|
-
"node-version-use": true,
|
|
108
|
-
"thread-sleep-compat": true
|
|
109
|
-
},
|
|
110
104
|
"mcpName": "io.github.mcp-z/mcp-outlook",
|
|
111
105
|
"tsds": {
|
|
112
106
|
"source": "src/index.ts"
|