@mcp-z/mcp-outlook 1.0.3 → 1.0.4
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/dist/cjs/index.d.cts +5 -0
- package/dist/cjs/index.d.ts +5 -0
- package/dist/cjs/index.js +8 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/mcp/tools/categories-list.d.cts +11 -1
- package/dist/cjs/mcp/tools/categories-list.d.ts +11 -1
- package/dist/cjs/mcp/tools/categories-list.js +11 -3
- package/dist/cjs/mcp/tools/categories-list.js.map +1 -1
- package/dist/cjs/mcp/tools/labels-list.d.cts +11 -1
- package/dist/cjs/mcp/tools/labels-list.d.ts +11 -1
- package/dist/cjs/mcp/tools/labels-list.js +11 -3
- package/dist/cjs/mcp/tools/labels-list.js.map +1 -1
- package/dist/cjs/setup/oauth-microsoft.d.cts +8 -0
- package/dist/cjs/setup/oauth-microsoft.d.ts +8 -0
- package/dist/cjs/setup/oauth-microsoft.js.map +1 -1
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/mcp/tools/categories-list.d.ts +11 -1
- package/dist/esm/mcp/tools/categories-list.js +5 -1
- package/dist/esm/mcp/tools/categories-list.js.map +1 -1
- package/dist/esm/mcp/tools/labels-list.d.ts +11 -1
- package/dist/esm/mcp/tools/labels-list.js +6 -2
- package/dist/esm/mcp/tools/labels-list.js.map +1 -1
- package/dist/esm/setup/oauth-microsoft.d.ts +8 -0
- package/dist/esm/setup/oauth-microsoft.js.map +1 -1
- package/package.json +2 -2
package/dist/cjs/index.d.cts
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import type { ServerConfig } from './types.js';
|
|
2
2
|
export { MS_SCOPE } from './constants.js';
|
|
3
3
|
export * as mcp from './mcp/index.js';
|
|
4
|
+
export type { Input as CategoriesListInput } from './mcp/tools/categories-list.js';
|
|
5
|
+
export { inputSchema as categoriesListInputSchema } from './mcp/tools/categories-list.js';
|
|
6
|
+
export type { Input as LabelsListInput } from './mcp/tools/labels-list.js';
|
|
7
|
+
export { inputSchema as labelsListInputSchema } from './mcp/tools/labels-list.js';
|
|
4
8
|
export * as schemas from './schemas/index.js';
|
|
5
9
|
export * as setup from './setup/index.js';
|
|
10
|
+
export type { AuthMiddleware, OAuthAdapters, OAuthRuntimeDeps } from './setup/oauth-microsoft.js';
|
|
6
11
|
export * from './types.js';
|
|
7
12
|
export declare function startServer(config: ServerConfig): Promise<void>;
|
|
8
13
|
export default function main(): Promise<void>;
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import type { ServerConfig } from './types.js';
|
|
2
2
|
export { MS_SCOPE } from './constants.js';
|
|
3
3
|
export * as mcp from './mcp/index.js';
|
|
4
|
+
export type { Input as CategoriesListInput } from './mcp/tools/categories-list.js';
|
|
5
|
+
export { inputSchema as categoriesListInputSchema } from './mcp/tools/categories-list.js';
|
|
6
|
+
export type { Input as LabelsListInput } from './mcp/tools/labels-list.js';
|
|
7
|
+
export { inputSchema as labelsListInputSchema } from './mcp/tools/labels-list.js';
|
|
4
8
|
export * as schemas from './schemas/index.js';
|
|
5
9
|
export * as setup from './setup/index.js';
|
|
10
|
+
export type { AuthMiddleware, OAuthAdapters, OAuthRuntimeDeps } from './setup/oauth-microsoft.js';
|
|
6
11
|
export * from './types.js';
|
|
7
12
|
export declare function startServer(config: ServerConfig): Promise<void>;
|
|
8
13
|
export default function main(): Promise<void>;
|
package/dist/cjs/index.js
CHANGED
|
@@ -12,9 +12,15 @@ _export(exports, {
|
|
|
12
12
|
get MS_SCOPE () {
|
|
13
13
|
return _constantsts.MS_SCOPE;
|
|
14
14
|
},
|
|
15
|
+
get categoriesListInputSchema () {
|
|
16
|
+
return _categorieslistts.inputSchema;
|
|
17
|
+
},
|
|
15
18
|
get default () {
|
|
16
19
|
return main;
|
|
17
20
|
},
|
|
21
|
+
get labelsListInputSchema () {
|
|
22
|
+
return _labelslistts.inputSchema;
|
|
23
|
+
},
|
|
18
24
|
get mcp () {
|
|
19
25
|
return _indexts;
|
|
20
26
|
},
|
|
@@ -33,6 +39,8 @@ var _httpts = require("./setup/http.js");
|
|
|
33
39
|
var _stdiots = require("./setup/stdio.js");
|
|
34
40
|
var _constantsts = require("./constants.js");
|
|
35
41
|
var _indexts = /*#__PURE__*/ _interop_require_wildcard(require("./mcp/index.js"));
|
|
42
|
+
var _categorieslistts = require("./mcp/tools/categories-list.js");
|
|
43
|
+
var _labelslistts = require("./mcp/tools/labels-list.js");
|
|
36
44
|
var _indexts1 = /*#__PURE__*/ _interop_require_wildcard(require("./schemas/index.js"));
|
|
37
45
|
var _indexts2 = /*#__PURE__*/ _interop_require_wildcard(require("./setup/index.js"));
|
|
38
46
|
_export_star(require("./types.js"), exports);
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-outlook/src/index.ts"],"sourcesContent":["import { createConfig, handleVersionHelp } from './setup/config.ts';\nimport { createHTTPServer } from './setup/http.ts';\nimport { createStdioServer } from './setup/stdio.ts';\nimport type { ServerConfig } from './types.ts';\n\nexport { MS_SCOPE } from './constants.ts';\nexport * as mcp from './mcp/index.ts';\nexport * as schemas from './schemas/index.ts';\nexport * as setup from './setup/index.ts';\nexport * from './types.ts';\n\nexport async function startServer(config: ServerConfig): Promise<void> {\n const { logger, close } = config.transport.type === 'stdio' ? await createStdioServer(config) : await createHTTPServer(config);\n\n process.on('SIGINT', async () => {\n await close();\n process.exit(0);\n });\n\n logger.info(`Server started with ${config.transport.type} transport`);\n await new Promise(() => {});\n}\n\nexport default async function main(): Promise<void> {\n // Check for help/version flags FIRST, before config parsing\n const versionHelpResult = handleVersionHelp(process.argv);\n if (versionHelpResult.handled) {\n console.log(versionHelpResult.output);\n process.exit(0);\n }\n\n // Only parse config if no help/version flags\n const config = createConfig();\n await startServer(config);\n}\n\nif (process.argv[1] === new URL(import.meta.url).pathname) {\n main();\n}\n"],"names":["MS_SCOPE","main","mcp","schemas","setup","startServer","config","logger","close","transport","type","createStdioServer","createHTTPServer","process","on","exit","info","Promise","versionHelpResult","handleVersionHelp","argv","handled","console","log","output","createConfig","URL","pathname"],"mappings":";;;;;;;;;;;QAKSA;eAAAA,qBAAQ;;
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-outlook/src/index.ts"],"sourcesContent":["import { createConfig, handleVersionHelp } from './setup/config.ts';\nimport { createHTTPServer } from './setup/http.ts';\nimport { createStdioServer } from './setup/stdio.ts';\nimport type { ServerConfig } from './types.ts';\n\nexport { MS_SCOPE } from './constants.ts';\nexport * as mcp from './mcp/index.ts';\n// Export input schemas for documentation visibility\nexport type { Input as CategoriesListInput } from './mcp/tools/categories-list.ts';\nexport { inputSchema as categoriesListInputSchema } from './mcp/tools/categories-list.ts';\nexport type { Input as LabelsListInput } from './mcp/tools/labels-list.ts';\nexport { inputSchema as labelsListInputSchema } from './mcp/tools/labels-list.ts';\nexport * as schemas from './schemas/index.ts';\nexport * as setup from './setup/index.ts';\nexport type { AuthMiddleware, OAuthAdapters, OAuthRuntimeDeps } from './setup/oauth-microsoft.ts';\nexport * from './types.ts';\n\nexport async function startServer(config: ServerConfig): Promise<void> {\n const { logger, close } = config.transport.type === 'stdio' ? await createStdioServer(config) : await createHTTPServer(config);\n\n process.on('SIGINT', async () => {\n await close();\n process.exit(0);\n });\n\n logger.info(`Server started with ${config.transport.type} transport`);\n await new Promise(() => {});\n}\n\nexport default async function main(): Promise<void> {\n // Check for help/version flags FIRST, before config parsing\n const versionHelpResult = handleVersionHelp(process.argv);\n if (versionHelpResult.handled) {\n console.log(versionHelpResult.output);\n process.exit(0);\n }\n\n // Only parse config if no help/version flags\n const config = createConfig();\n await startServer(config);\n}\n\nif (process.argv[1] === new URL(import.meta.url).pathname) {\n main();\n}\n"],"names":["MS_SCOPE","categoriesListInputSchema","inputSchema","main","labelsListInputSchema","mcp","schemas","setup","startServer","config","logger","close","transport","type","createStdioServer","createHTTPServer","process","on","exit","info","Promise","versionHelpResult","handleVersionHelp","argv","handled","console","log","output","createConfig","URL","pathname"],"mappings":";;;;;;;;;;;QAKSA;eAAAA,qBAAQ;;QAIOC;eAAfC,6BAAW;;QAoBpB;eAA8BC;;QAlBNC;eAAfF,yBAAW;;QALRG;;;QAMAC;;;QACAC;;;QAIUC;eAAAA;;;wBAjB0B;sBACf;uBACC;2BAGT;+DACJ;gCAGoC;4BAEJ;gEAC5B;gEACF;qBAET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEP,SAAeA,YAAYC,MAAoB;;YAC1BA,MAAlBC,QAAQC;;;;yBAAUF,CAAAA,OAAOG,SAAS,CAACC,IAAI,KAAK,OAAM,GAAhCJ;;;;oBAAoC;;wBAAMK,IAAAA,0BAAiB,EAACL;;;2BAAxB;;;;;;oBAAkC;;wBAAMM,IAAAA,wBAAgB,EAACN;;;2BAAvB;;;oBAAtEA,aAAlBC,SAAkBD,KAAlBC,QAAQC,QAAUF,KAAVE;oBAEhBK,QAAQC,EAAE,CAAC,UAAU;;;;;wCACnB;;4CAAMN;;;wCAAN;wCACAK,QAAQE,IAAI,CAAC;;;;;;wBACf;;oBAEAR,OAAOS,IAAI,CAAC,AAAC,uBAA4C,OAAtBV,OAAOG,SAAS,CAACC,IAAI,EAAC;oBACzD;;wBAAM,IAAIO,QAAQ,YAAO;;;oBAAzB;;;;;;IACF;;AAEe,SAAejB;;YAEtBkB,mBAOAZ;;;;oBARN,4DAA4D;oBACtDY,oBAAoBC,IAAAA,2BAAiB,EAACN,QAAQO,IAAI;oBACxD,IAAIF,kBAAkBG,OAAO,EAAE;wBAC7BC,QAAQC,GAAG,CAACL,kBAAkBM,MAAM;wBACpCX,QAAQE,IAAI,CAAC;oBACf;oBAEA,6CAA6C;oBACvCT,SAASmB,IAAAA,sBAAY;oBAC3B;;wBAAMpB,YAAYC;;;oBAAlB;;;;;;IACF;;AAEA,IAAIO,QAAQO,IAAI,CAAC,EAAE,KAAK,IAAIM,IAAI,qDAAiBC,QAAQ,EAAE;IACzD3B;AACF"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';
|
|
2
2
|
import { type CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Input schema for the categories-list tool
|
|
6
|
+
*
|
|
7
|
+
* Defines the validation schema for input parameters.
|
|
8
|
+
*/
|
|
9
|
+
export declare const inputSchema: z.ZodObject<{}, z.core.$strip>;
|
|
5
10
|
declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
6
11
|
type: z.ZodLiteral<"success">;
|
|
7
12
|
items: z.ZodArray<z.ZodObject<{
|
|
@@ -41,6 +46,11 @@ declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
41
46
|
message: z.ZodString;
|
|
42
47
|
url: z.ZodOptional<z.ZodString>;
|
|
43
48
|
}, z.core.$strip>], "type">;
|
|
49
|
+
/**
|
|
50
|
+
* Input type for the categories-list tool
|
|
51
|
+
*
|
|
52
|
+
* Represents the input parameters for listing Outlook categories.
|
|
53
|
+
*/
|
|
44
54
|
export type Input = z.infer<typeof inputSchema>;
|
|
45
55
|
export type Output = z.infer<typeof outputSchema>;
|
|
46
56
|
declare function handler(_: Input, extra: EnrichedExtra): Promise<CallToolResult>;
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';
|
|
2
2
|
import { type CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Input schema for the categories-list tool
|
|
6
|
+
*
|
|
7
|
+
* Defines the validation schema for input parameters.
|
|
8
|
+
*/
|
|
9
|
+
export declare const inputSchema: z.ZodObject<{}, z.core.$strip>;
|
|
5
10
|
declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
6
11
|
type: z.ZodLiteral<"success">;
|
|
7
12
|
items: z.ZodArray<z.ZodObject<{
|
|
@@ -41,6 +46,11 @@ declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
41
46
|
message: z.ZodString;
|
|
42
47
|
url: z.ZodOptional<z.ZodString>;
|
|
43
48
|
}, z.core.$strip>], "type">;
|
|
49
|
+
/**
|
|
50
|
+
* Input type for the categories-list tool
|
|
51
|
+
*
|
|
52
|
+
* Represents the input parameters for listing Outlook categories.
|
|
53
|
+
*/
|
|
44
54
|
export type Input = z.infer<typeof inputSchema>;
|
|
45
55
|
export type Output = z.infer<typeof outputSchema>;
|
|
46
56
|
declare function handler(_: Input, extra: EnrichedExtra): Promise<CallToolResult>;
|
|
@@ -2,10 +2,18 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get default () {
|
|
8
13
|
return createTool;
|
|
14
|
+
},
|
|
15
|
+
get inputSchema () {
|
|
16
|
+
return inputSchema;
|
|
9
17
|
}
|
|
10
18
|
});
|
|
11
19
|
var _oauthmicrosoft = require("@mcp-z/oauth-microsoft");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-outlook/src/mcp/tools/categories-list.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport { schemas } from '@mcp-z/oauth-microsoft';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { ToolModule } from '@mcp-z/server';\nimport { Client } from '@microsoft/microsoft-graph-client';\nimport type * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\nimport { type CallToolResult, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { OutlookCategorySchema } from '../../schemas/index.ts';\n\
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-outlook/src/mcp/tools/categories-list.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport { schemas } from '@mcp-z/oauth-microsoft';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { ToolModule } from '@mcp-z/server';\nimport { Client } from '@microsoft/microsoft-graph-client';\nimport type * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\nimport { type CallToolResult, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { OutlookCategorySchema } from '../../schemas/index.ts';\n\n/**\n * Input schema for the categories-list tool\n *\n * Defines the validation schema for input parameters.\n */\nexport const inputSchema = z.object({});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n items: z.array(OutlookCategorySchema),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'List Outlook categories with colors and names.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\n/**\n * Input type for the categories-list tool\n *\n * Represents the input parameters for listing Outlook categories.\n */\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler(_: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('outlook.categories.list called');\n\n try {\n const graph = Client.initWithMiddleware({ authProvider: extra.authContext.auth });\n const started = Date.now();\n\n // Call Microsoft Graph API to get master categories\n const response = await graph.api('/me/outlook/masterCategories').get();\n const categories = Array.isArray(response.value) ? response.value : [];\n\n const durationMs = Date.now() - started;\n logger.info('outlook.categories.list returning', { categoriesCount: categories.length });\n logger.info('outlook.categories.list metrics', { durationMs });\n\n const result: Output = {\n type: 'success' as const,\n items: categories.map((category: MicrosoftGraph.OutlookCategory) => ({\n id: category.id || undefined,\n displayName: category.displayName || undefined,\n color: category.color || undefined,\n })),\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('outlook.categories.list error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error listing categories: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'categories-list',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","inputSchema","AuthRequiredBranchSchema","schemas","z","object","successBranchSchema","type","literal","items","array","OutlookCategorySchema","outputSchema","discriminatedUnion","config","description","result","handler","_","extra","logger","graph","started","response","categories","durationMs","error","message","info","Client","initWithMiddleware","authProvider","authContext","auth","Date","now","api","get","Array","isArray","value","categoriesCount","length","map","category","id","undefined","displayName","color","content","text","JSON","stringify","structuredContent","Error","String","McpError","ErrorCode","InternalError","stack","name"],"mappings":";;;;;;;;;;;QAwFA;eAAwBA;;QAvEXC;eAAAA;;;8BAhBW;oCAKD;qBAEkC;mBACvC;uBACoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAPtC,IAAM,AAAEC,2BAA6BC,uBAAO,CAApCD;AAcD,IAAMD,cAAcG,MAAC,CAACC,MAAM,CAAC,CAAC;AAErC,wBAAwB;AACxB,IAAMC,sBAAsBF,MAAC,CAACC,MAAM,CAAC;IACnCE,MAAMH,MAAC,CAACI,OAAO,CAAC;IAChBC,OAAOL,MAAC,CAACM,KAAK,CAACC,8BAAqB;AACtC;AAEA,2CAA2C;AAC3C,IAAMC,eAAeR,MAAC,CAACS,kBAAkB,CAAC,QAAQ;IAACP;IAAqBJ;CAAyB;AAEjG,IAAMY,SAAS;IACbC,aAAa;IACbd,aAAaA;IACbW,cAAcR,MAAC,CAACC,MAAM,CAAC;QACrBW,QAAQJ;IACV;AACF;AAUA,SAAeK,QAAQC,CAAQ,EAAEC,KAAoB;;YAC7CC,QAIEC,OACAC,SAGAC,UACAC,YAEAC,YAIAT,QAkBCU,OACDC;;;;oBAlCFP,SAASD,MAAMC,MAAM;oBAC3BA,OAAOQ,IAAI,CAAC;;;;;;;;;oBAGJP,QAAQQ,4BAAM,CAACC,kBAAkB,CAAC;wBAAEC,cAAcZ,MAAMa,WAAW,CAACC,IAAI;oBAAC;oBACzEX,UAAUY,KAAKC,GAAG;oBAGP;;wBAAMd,MAAMe,GAAG,CAAC,gCAAgCC,GAAG;;;oBAA9Dd,WAAW;oBACXC,aAAac,MAAMC,OAAO,CAAChB,SAASiB,KAAK,IAAIjB,SAASiB,KAAK;oBAE3Df,aAAaS,KAAKC,GAAG,KAAKb;oBAChCF,OAAOQ,IAAI,CAAC,qCAAqC;wBAAEa,iBAAiBjB,WAAWkB,MAAM;oBAAC;oBACtFtB,OAAOQ,IAAI,CAAC,mCAAmC;wBAAEH,YAAAA;oBAAW;oBAEtDT,SAAiB;wBACrBT,MAAM;wBACNE,OAAOe,WAAWmB,GAAG,CAAC,SAACC;mCAA8C;gCACnEC,IAAID,SAASC,EAAE,IAAIC;gCACnBC,aAAaH,SAASG,WAAW,IAAID;gCACrCE,OAAOJ,SAASI,KAAK,IAAIF;4BAC3B;;oBACF;oBAEA;;wBAAO;4BACLG,OAAO;gCACL;oCACE1C,MAAM;oCACN2C,MAAMC,KAAKC,SAAS,CAACpC;gCACvB;;4BAEFqC,mBAAmB;gCAAErC,QAAAA;4BAAO;wBAC9B;;;oBACOU;oBACDC,UAAUD,AAAK,YAALA,OAAiB4B,SAAQ5B,MAAMC,OAAO,GAAG4B,OAAO7B;oBAChEN,OAAOM,KAAK,CAAC,iCAAiC;wBAAEA,OAAOC;oBAAQ;oBAE/D,MAAM,IAAI6B,eAAQ,CAACC,gBAAS,CAACC,aAAa,EAAE,AAAC,6BAAoC,OAAR/B,UAAW;wBAClFgC,OAAOjC,AAAK,YAALA,OAAiB4B,SAAQ5B,MAAMiC,KAAK,GAAGb;oBAChD;;;;;;;IAEJ;;AAEe,SAAS9C;IACtB,OAAO;QACL4D,MAAM;QACN9C,QAAAA;QACAG,SAAAA;IACF;AACF"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';
|
|
2
2
|
import { type CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Input schema for the labels-list tool
|
|
6
|
+
*
|
|
7
|
+
* Defines the validation schema for input parameters.
|
|
8
|
+
*/
|
|
9
|
+
export declare const inputSchema: z.ZodObject<{}, z.core.$strip>;
|
|
5
10
|
declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
6
11
|
type: z.ZodLiteral<"success">;
|
|
7
12
|
items: z.ZodArray<z.ZodObject<{
|
|
@@ -41,6 +46,11 @@ declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
41
46
|
message: z.ZodString;
|
|
42
47
|
url: z.ZodOptional<z.ZodString>;
|
|
43
48
|
}, z.core.$strip>], "type">;
|
|
49
|
+
/**
|
|
50
|
+
* Input type for the labels-list tool
|
|
51
|
+
*
|
|
52
|
+
* Represents the input parameters for listing Outlook labels.
|
|
53
|
+
*/
|
|
44
54
|
export type Input = z.infer<typeof inputSchema>;
|
|
45
55
|
export type Output = z.infer<typeof outputSchema>;
|
|
46
56
|
declare function handler(_: Input, extra: EnrichedExtra): Promise<CallToolResult>;
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';
|
|
2
2
|
import { type CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Input schema for the labels-list tool
|
|
6
|
+
*
|
|
7
|
+
* Defines the validation schema for input parameters.
|
|
8
|
+
*/
|
|
9
|
+
export declare const inputSchema: z.ZodObject<{}, z.core.$strip>;
|
|
5
10
|
declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
6
11
|
type: z.ZodLiteral<"success">;
|
|
7
12
|
items: z.ZodArray<z.ZodObject<{
|
|
@@ -41,6 +46,11 @@ declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
41
46
|
message: z.ZodString;
|
|
42
47
|
url: z.ZodOptional<z.ZodString>;
|
|
43
48
|
}, z.core.$strip>], "type">;
|
|
49
|
+
/**
|
|
50
|
+
* Input type for the labels-list tool
|
|
51
|
+
*
|
|
52
|
+
* Represents the input parameters for listing Outlook labels.
|
|
53
|
+
*/
|
|
44
54
|
export type Input = z.infer<typeof inputSchema>;
|
|
45
55
|
export type Output = z.infer<typeof outputSchema>;
|
|
46
56
|
declare function handler(_: Input, extra: EnrichedExtra): Promise<CallToolResult>;
|
|
@@ -2,10 +2,18 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get default () {
|
|
8
13
|
return createTool;
|
|
14
|
+
},
|
|
15
|
+
get inputSchema () {
|
|
16
|
+
return inputSchema;
|
|
9
17
|
}
|
|
10
18
|
});
|
|
11
19
|
var _oauthmicrosoft = require("@mcp-z/oauth-microsoft");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-outlook/src/mcp/tools/labels-list.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport { schemas } from '@mcp-z/oauth-microsoft';\
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-outlook/src/mcp/tools/labels-list.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport { schemas } from '@mcp-z/oauth-microsoft';\nimport type { ToolModule } from '@mcp-z/server';\nimport { Client } from '@microsoft/microsoft-graph-client';\nimport type * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\nimport { type CallToolResult, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { OutlookCategorySchema } from '../../schemas/index.ts';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\n/**\n * Input schema for the labels-list tool\n *\n * Defines the validation schema for input parameters.\n */\nexport const inputSchema = z.object({});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n items: z.array(OutlookCategorySchema),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'List Outlook categories for label: query syntax. Case-sensitive.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\n/**\n * Input type for the labels-list tool\n *\n * Represents the input parameters for listing Outlook labels.\n */\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler(_: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('outlook.labels.list called');\n\n try {\n const graph = Client.initWithMiddleware({ authProvider: extra.authContext.auth });\n const started = Date.now();\n\n // Call Microsoft Graph API to get master categories (same as categories tool)\n const response = await graph.api('/me/outlook/masterCategories').get();\n const categories = Array.isArray(response.value) ? response.value : [];\n\n const durationMs = Date.now() - started;\n logger.info('outlook.labels.list returning', { labelsCount: categories.length });\n logger.info('outlook.labels.list metrics', { durationMs });\n\n const result: Output = {\n type: 'success' as const,\n items: categories.map((category: MicrosoftGraph.OutlookCategory) => ({\n id: category.id || undefined,\n displayName: category.displayName || undefined,\n color: category.color || undefined,\n })),\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('outlook.labels.list error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error listing labels: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'labels-list',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["createTool","inputSchema","AuthRequiredBranchSchema","schemas","z","object","successBranchSchema","type","literal","items","array","OutlookCategorySchema","outputSchema","discriminatedUnion","config","description","result","handler","_","extra","logger","graph","started","response","categories","durationMs","error","message","info","Client","initWithMiddleware","authProvider","authContext","auth","Date","now","api","get","Array","isArray","value","labelsCount","length","map","category","id","undefined","displayName","color","content","text","JSON","stringify","structuredContent","Error","String","McpError","ErrorCode","InternalError","stack","name"],"mappings":";;;;;;;;;;;QAuFA;eAAwBA;;QAvEXC;eAAAA;;;8BAfW;oCAED;qBAEkC;mBACvC;uBACoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEtC,IAAM,AAAEC,2BAA6BC,uBAAO,CAApCD;AAOD,IAAMD,cAAcG,MAAC,CAACC,MAAM,CAAC,CAAC;AAErC,wBAAwB;AACxB,IAAMC,sBAAsBF,MAAC,CAACC,MAAM,CAAC;IACnCE,MAAMH,MAAC,CAACI,OAAO,CAAC;IAChBC,OAAOL,MAAC,CAACM,KAAK,CAACC,8BAAqB;AACtC;AAEA,2CAA2C;AAC3C,IAAMC,eAAeR,MAAC,CAACS,kBAAkB,CAAC,QAAQ;IAACP;IAAqBJ;CAAyB;AAEjG,IAAMY,SAAS;IACbC,aAAa;IACbd,aAAaA;IACbW,cAAcR,MAAC,CAACC,MAAM,CAAC;QACrBW,QAAQJ;IACV;AACF;AAUA,SAAeK,QAAQC,CAAQ,EAAEC,KAAoB;;YAC7CC,QAIEC,OACAC,SAGAC,UACAC,YAEAC,YAIAT,QAkBCU,OACDC;;;;oBAlCFP,SAASD,MAAMC,MAAM;oBAC3BA,OAAOQ,IAAI,CAAC;;;;;;;;;oBAGJP,QAAQQ,4BAAM,CAACC,kBAAkB,CAAC;wBAAEC,cAAcZ,MAAMa,WAAW,CAACC,IAAI;oBAAC;oBACzEX,UAAUY,KAAKC,GAAG;oBAGP;;wBAAMd,MAAMe,GAAG,CAAC,gCAAgCC,GAAG;;;oBAA9Dd,WAAW;oBACXC,aAAac,MAAMC,OAAO,CAAChB,SAASiB,KAAK,IAAIjB,SAASiB,KAAK;oBAE3Df,aAAaS,KAAKC,GAAG,KAAKb;oBAChCF,OAAOQ,IAAI,CAAC,iCAAiC;wBAAEa,aAAajB,WAAWkB,MAAM;oBAAC;oBAC9EtB,OAAOQ,IAAI,CAAC,+BAA+B;wBAAEH,YAAAA;oBAAW;oBAElDT,SAAiB;wBACrBT,MAAM;wBACNE,OAAOe,WAAWmB,GAAG,CAAC,SAACC;mCAA8C;gCACnEC,IAAID,SAASC,EAAE,IAAIC;gCACnBC,aAAaH,SAASG,WAAW,IAAID;gCACrCE,OAAOJ,SAASI,KAAK,IAAIF;4BAC3B;;oBACF;oBAEA;;wBAAO;4BACLG,OAAO;gCACL;oCACE1C,MAAM;oCACN2C,MAAMC,KAAKC,SAAS,CAACpC;gCACvB;;4BAEFqC,mBAAmB;gCAAErC,QAAAA;4BAAO;wBAC9B;;;oBACOU;oBACDC,UAAUD,AAAK,YAALA,OAAiB4B,SAAQ5B,MAAMC,OAAO,GAAG4B,OAAO7B;oBAChEN,OAAOM,KAAK,CAAC,6BAA6B;wBAAEA,OAAOC;oBAAQ;oBAE3D,MAAM,IAAI6B,eAAQ,CAACC,gBAAS,CAACC,aAAa,EAAE,AAAC,yBAAgC,OAAR/B,UAAW;wBAC9EgC,OAAOjC,AAAK,YAALA,OAAiB4B,SAAQ5B,MAAMiC,KAAK,GAAGb;oBAChD;;;;;;;IAEJ;;AAEe,SAAS9C;IACtB,OAAO;QACL4D,MAAM;QACN9C,QAAAA;QACAG,SAAAA;IACF;AACF"}
|
|
@@ -6,6 +6,9 @@ import type { Keyv } from 'keyv';
|
|
|
6
6
|
import type { ServerConfig } from '../types.js';
|
|
7
7
|
/**
|
|
8
8
|
* Outlook OAuth runtime dependencies
|
|
9
|
+
*
|
|
10
|
+
* Contains the required dependencies for OAuth functionality including logger,
|
|
11
|
+
* token storage, and optional DCR store.
|
|
9
12
|
*/
|
|
10
13
|
export interface OAuthRuntimeDeps {
|
|
11
14
|
logger: Logger;
|
|
@@ -14,6 +17,8 @@ export interface OAuthRuntimeDeps {
|
|
|
14
17
|
}
|
|
15
18
|
/**
|
|
16
19
|
* Auth middleware wrapper with withToolAuth/withResourceAuth/withPromptAuth methods
|
|
20
|
+
*
|
|
21
|
+
* Provides authentication middleware methods for tools, resources, and prompts.
|
|
17
22
|
*/
|
|
18
23
|
export interface AuthMiddleware {
|
|
19
24
|
withToolAuth<T extends ToolModule>(module: T): T;
|
|
@@ -22,6 +27,9 @@ export interface AuthMiddleware {
|
|
|
22
27
|
}
|
|
23
28
|
/**
|
|
24
29
|
* Result of OAuth adapter creation
|
|
30
|
+
*
|
|
31
|
+
* Contains the primary OAuth adapter, middleware, auth adapter,
|
|
32
|
+
* account tools, prompts, and optional routers.
|
|
25
33
|
*/
|
|
26
34
|
export interface OAuthAdapters {
|
|
27
35
|
primary: LoopbackOAuthProvider | DeviceCodeProvider | DcrOAuthProvider;
|
|
@@ -6,6 +6,9 @@ import type { Keyv } from 'keyv';
|
|
|
6
6
|
import type { ServerConfig } from '../types.js';
|
|
7
7
|
/**
|
|
8
8
|
* Outlook OAuth runtime dependencies
|
|
9
|
+
*
|
|
10
|
+
* Contains the required dependencies for OAuth functionality including logger,
|
|
11
|
+
* token storage, and optional DCR store.
|
|
9
12
|
*/
|
|
10
13
|
export interface OAuthRuntimeDeps {
|
|
11
14
|
logger: Logger;
|
|
@@ -14,6 +17,8 @@ export interface OAuthRuntimeDeps {
|
|
|
14
17
|
}
|
|
15
18
|
/**
|
|
16
19
|
* Auth middleware wrapper with withToolAuth/withResourceAuth/withPromptAuth methods
|
|
20
|
+
*
|
|
21
|
+
* Provides authentication middleware methods for tools, resources, and prompts.
|
|
17
22
|
*/
|
|
18
23
|
export interface AuthMiddleware {
|
|
19
24
|
withToolAuth<T extends ToolModule>(module: T): T;
|
|
@@ -22,6 +27,9 @@ export interface AuthMiddleware {
|
|
|
22
27
|
}
|
|
23
28
|
/**
|
|
24
29
|
* Result of OAuth adapter creation
|
|
30
|
+
*
|
|
31
|
+
* Contains the primary OAuth adapter, middleware, auth adapter,
|
|
32
|
+
* account tools, prompts, and optional routers.
|
|
25
33
|
*/
|
|
26
34
|
export interface OAuthAdapters {
|
|
27
35
|
primary: LoopbackOAuthProvider | DeviceCodeProvider | DcrOAuthProvider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-outlook/src/setup/oauth-microsoft.ts"],"sourcesContent":["import { type AccountAuthProvider, AccountServer } from '@mcp-z/oauth';\nimport { createDcrRouter, createLoopbackCallbackRouter, DcrOAuthProvider, DeviceCodeProvider, LoopbackOAuthProvider } from '@mcp-z/oauth-microsoft';\nimport type { Logger, PromptModule, ToolModule } from '@mcp-z/server';\nimport type { Router } from 'express';\nimport type { Keyv } from 'keyv';\nimport { MS_SCOPE } from '../constants.ts';\nimport type { ServerConfig } from '../types.ts';\n\n/**\n * Outlook OAuth runtime dependencies\n */\nexport interface OAuthRuntimeDeps {\n logger: Logger;\n tokenStore: Keyv<unknown>;\n dcrStore?: Keyv<unknown>;\n}\n\n/**\n * Auth middleware wrapper with withToolAuth/withResourceAuth/withPromptAuth methods\n */\nexport interface AuthMiddleware {\n withToolAuth<T extends ToolModule>(module: T): T;\n withResourceAuth<T>(module: T): T;\n withPromptAuth<T>(module: T): T;\n}\n\n/**\n * Result of OAuth adapter creation\n */\nexport interface OAuthAdapters {\n primary: LoopbackOAuthProvider | DeviceCodeProvider | DcrOAuthProvider;\n middleware: AuthMiddleware;\n authAdapter: AccountAuthProvider;\n accountTools: ToolModule[];\n accountPrompts: PromptModule[];\n dcrRouter?: Router; // DCR OAuth endpoints (only for dcr mode)\n loopbackRouter?: Router;\n}\n\n/**\n * Create Outlook OAuth adapters based on transport configuration\n *\n * Returns primary adapter, pre-configured middleware, auth email provider,\n * and pre-selected account tools based on auth mode.\n * @param config - Outlook server configuration\n * @param deps - Runtime dependencies (logger, tokenStore, etc.)\n * @returns OAuth adapters with pre-configured middleware and account tools\n */\nexport async function createOAuthAdapters(config: ServerConfig, deps: OAuthRuntimeDeps, baseUrl?: string): Promise<OAuthAdapters> {\n const { logger, tokenStore, dcrStore } = deps;\n const oauthStaticConfig = {\n service: config.name,\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n scope: MS_SCOPE,\n tenantId: config.tenantId,\n auth: config.auth,\n headless: config.headless,\n redirectUri: config.transport.type === 'stdio' ? undefined : config.redirectUri,\n ...(baseUrl && { baseUrl }),\n };\n\n let primary: LoopbackOAuthProvider | DeviceCodeProvider | DcrOAuthProvider;\n\n // DCR mode - Dynamic Client Registration with HTTP-only support\n if (oauthStaticConfig.auth === 'dcr') {\n logger.debug('Creating DCR provider', { service: oauthStaticConfig.service });\n\n // DCR requires dcrStore and baseUrl\n if (!dcrStore) {\n throw new Error('DCR mode requires dcrStore to be configured');\n }\n if (!oauthStaticConfig.baseUrl) {\n throw new Error('DCR mode requires baseUrl to be configured');\n }\n\n // Create DcrOAuthProvider (stateless provider that receives tokens from verification context)\n primary = new DcrOAuthProvider({\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n tenantId: oauthStaticConfig.tenantId,\n scope: oauthStaticConfig.scope,\n verifyEndpoint: `${oauthStaticConfig.baseUrl}/oauth/verify`,\n logger,\n });\n\n // Create DCR OAuth router with authorization server endpoints\n const dcrRouter = createDcrRouter({\n store: dcrStore,\n issuerUrl: oauthStaticConfig.baseUrl,\n baseUrl: oauthStaticConfig.baseUrl,\n scopesSupported: oauthStaticConfig.scope.split(' '), // Convert space-separated scope to array\n clientConfig: {\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n tenantId: oauthStaticConfig.tenantId,\n },\n });\n\n // DCR uses bearer token authentication with middleware validation\n const middleware = primary.authMiddleware();\n\n // Create auth email provider (stateless, no token storage)\n const authAdapter: AccountAuthProvider = {\n getAccessToken: () => {\n throw new Error('DCR mode does not support getAccessToken - tokens are provided via bearer auth');\n },\n getUserEmail: () => {\n throw new Error('DCR mode does not support getUserEmail - tokens are provided via bearer auth');\n },\n };\n\n // No account management tools for DCR (multi-user management at client registration level)\n const accountTools: ToolModule[] = [];\n const accountPrompts: PromptModule[] = [];\n\n logger.info('DCR provider created for Outlook', {\n service: oauthStaticConfig.service,\n baseUrl: oauthStaticConfig.baseUrl,\n });\n\n return { primary, middleware: middleware as AuthMiddleware, authAdapter, accountTools, accountPrompts, dcrRouter };\n }\n\n // Device code mode - similar to service accounts (single static identity)\n if (oauthStaticConfig.auth === 'device-code') {\n logger.debug('Creating device code provider', { service: oauthStaticConfig.service });\n const deviceCodeProvider = new DeviceCodeProvider({\n service: oauthStaticConfig.service,\n clientId: oauthStaticConfig.clientId,\n tenantId: oauthStaticConfig.tenantId,\n scope: oauthStaticConfig.scope,\n logger,\n tokenStore,\n headless: oauthStaticConfig.headless,\n });\n primary = deviceCodeProvider;\n\n // Device code uses single-user middleware (no account management needed)\n const middleware = deviceCodeProvider.authMiddleware();\n\n // Create auth email provider\n const authAdapter: AccountAuthProvider = {\n getAccessToken: (accountId) => deviceCodeProvider.getAccessToken(accountId),\n getUserEmail: (accountId) => deviceCodeProvider.getUserEmail(accountId),\n };\n\n // No account management tools for device code (like service accounts)\n const accountTools: ToolModule[] = [];\n const accountPrompts: PromptModule[] = [];\n\n logger.info('Device code provider created for Outlook', {\n service: oauthStaticConfig.service,\n });\n\n return { primary, middleware: middleware as AuthMiddleware, authAdapter, accountTools, accountPrompts };\n }\n\n // Always create primary adapter for file-based OAuth (loopback mode)\n primary = new LoopbackOAuthProvider({\n service: oauthStaticConfig.service,\n clientId: oauthStaticConfig.clientId,\n clientSecret: oauthStaticConfig.clientSecret,\n scope: oauthStaticConfig.scope,\n tenantId: oauthStaticConfig.tenantId,\n headless: oauthStaticConfig.headless,\n logger,\n tokenStore,\n ...(oauthStaticConfig.redirectUri !== undefined && { redirectUri: oauthStaticConfig.redirectUri }),\n });\n\n // Create auth email provider (used by account management tools)\n const authAdapter: AccountAuthProvider = primary;\n\n // Select middleware AND account tools based on auth mode\n const middleware: ReturnType<LoopbackOAuthProvider['authMiddleware']> = primary.authMiddleware();\n\n // Loopback OAuth - multi-account mode\n const result = AccountServer.createLoopback({\n service: oauthStaticConfig.service,\n store: tokenStore,\n logger,\n auth: authAdapter,\n });\n const accountTools: ToolModule[] = result.tools as ToolModule[];\n const accountPrompts: PromptModule[] = result.prompts as PromptModule[];\n logger.debug('Loopback OAuth (multi-account mode)', { service: oauthStaticConfig.service });\n\n const loopbackRouter = oauthStaticConfig.redirectUri ? createLoopbackCallbackRouter(primary) : undefined;\n\n return { primary, middleware: middleware as AuthMiddleware, authAdapter, accountTools, accountPrompts, loopbackRouter };\n}\n"],"names":["createOAuthAdapters","config","deps","baseUrl","logger","tokenStore","dcrStore","oauthStaticConfig","primary","dcrRouter","middleware","authAdapter","accountTools","accountPrompts","deviceCodeProvider","result","loopbackRouter","service","name","clientId","clientSecret","scope","MS_SCOPE","tenantId","auth","headless","redirectUri","transport","type","undefined","debug","Error","DcrOAuthProvider","verifyEndpoint","createDcrRouter","store","issuerUrl","scopesSupported","split","clientConfig","authMiddleware","getAccessToken","getUserEmail","info","DeviceCodeProvider","accountId","LoopbackOAuthProvider","AccountServer","createLoopback","tools","prompts","createLoopbackCallbackRouter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-outlook/src/setup/oauth-microsoft.ts"],"sourcesContent":["import { type AccountAuthProvider, AccountServer } from '@mcp-z/oauth';\nimport { createDcrRouter, createLoopbackCallbackRouter, DcrOAuthProvider, DeviceCodeProvider, LoopbackOAuthProvider } from '@mcp-z/oauth-microsoft';\nimport type { Logger, PromptModule, ToolModule } from '@mcp-z/server';\nimport type { Router } from 'express';\nimport type { Keyv } from 'keyv';\nimport { MS_SCOPE } from '../constants.ts';\nimport type { ServerConfig } from '../types.ts';\n\n/**\n * Outlook OAuth runtime dependencies\n *\n * Contains the required dependencies for OAuth functionality including logger,\n * token storage, and optional DCR store.\n */\nexport interface OAuthRuntimeDeps {\n logger: Logger;\n tokenStore: Keyv<unknown>;\n dcrStore?: Keyv<unknown>;\n}\n\n/**\n * Auth middleware wrapper with withToolAuth/withResourceAuth/withPromptAuth methods\n *\n * Provides authentication middleware methods for tools, resources, and prompts.\n */\nexport interface AuthMiddleware {\n withToolAuth<T extends ToolModule>(module: T): T;\n withResourceAuth<T>(module: T): T;\n withPromptAuth<T>(module: T): T;\n}\n\n/**\n * Result of OAuth adapter creation\n *\n * Contains the primary OAuth adapter, middleware, auth adapter,\n * account tools, prompts, and optional routers.\n */\nexport interface OAuthAdapters {\n primary: LoopbackOAuthProvider | DeviceCodeProvider | DcrOAuthProvider;\n middleware: AuthMiddleware;\n authAdapter: AccountAuthProvider;\n accountTools: ToolModule[];\n accountPrompts: PromptModule[];\n dcrRouter?: Router; // DCR OAuth endpoints (only for dcr mode)\n loopbackRouter?: Router;\n}\n\n/**\n * Create Outlook OAuth adapters based on transport configuration\n *\n * Returns primary adapter, pre-configured middleware, auth email provider,\n * and pre-selected account tools based on auth mode.\n * @param config - Outlook server configuration\n * @param deps - Runtime dependencies (logger, tokenStore, etc.)\n * @returns OAuth adapters with pre-configured middleware and account tools\n */\nexport async function createOAuthAdapters(config: ServerConfig, deps: OAuthRuntimeDeps, baseUrl?: string): Promise<OAuthAdapters> {\n const { logger, tokenStore, dcrStore } = deps;\n const oauthStaticConfig = {\n service: config.name,\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n scope: MS_SCOPE,\n tenantId: config.tenantId,\n auth: config.auth,\n headless: config.headless,\n redirectUri: config.transport.type === 'stdio' ? undefined : config.redirectUri,\n ...(baseUrl && { baseUrl }),\n };\n\n let primary: LoopbackOAuthProvider | DeviceCodeProvider | DcrOAuthProvider;\n\n // DCR mode - Dynamic Client Registration with HTTP-only support\n if (oauthStaticConfig.auth === 'dcr') {\n logger.debug('Creating DCR provider', { service: oauthStaticConfig.service });\n\n // DCR requires dcrStore and baseUrl\n if (!dcrStore) {\n throw new Error('DCR mode requires dcrStore to be configured');\n }\n if (!oauthStaticConfig.baseUrl) {\n throw new Error('DCR mode requires baseUrl to be configured');\n }\n\n // Create DcrOAuthProvider (stateless provider that receives tokens from verification context)\n primary = new DcrOAuthProvider({\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n tenantId: oauthStaticConfig.tenantId,\n scope: oauthStaticConfig.scope,\n verifyEndpoint: `${oauthStaticConfig.baseUrl}/oauth/verify`,\n logger,\n });\n\n // Create DCR OAuth router with authorization server endpoints\n const dcrRouter = createDcrRouter({\n store: dcrStore,\n issuerUrl: oauthStaticConfig.baseUrl,\n baseUrl: oauthStaticConfig.baseUrl,\n scopesSupported: oauthStaticConfig.scope.split(' '), // Convert space-separated scope to array\n clientConfig: {\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n tenantId: oauthStaticConfig.tenantId,\n },\n });\n\n // DCR uses bearer token authentication with middleware validation\n const middleware = primary.authMiddleware();\n\n // Create auth email provider (stateless, no token storage)\n const authAdapter: AccountAuthProvider = {\n getAccessToken: () => {\n throw new Error('DCR mode does not support getAccessToken - tokens are provided via bearer auth');\n },\n getUserEmail: () => {\n throw new Error('DCR mode does not support getUserEmail - tokens are provided via bearer auth');\n },\n };\n\n // No account management tools for DCR (multi-user management at client registration level)\n const accountTools: ToolModule[] = [];\n const accountPrompts: PromptModule[] = [];\n\n logger.info('DCR provider created for Outlook', {\n service: oauthStaticConfig.service,\n baseUrl: oauthStaticConfig.baseUrl,\n });\n\n return { primary, middleware: middleware as AuthMiddleware, authAdapter, accountTools, accountPrompts, dcrRouter };\n }\n\n // Device code mode - similar to service accounts (single static identity)\n if (oauthStaticConfig.auth === 'device-code') {\n logger.debug('Creating device code provider', { service: oauthStaticConfig.service });\n const deviceCodeProvider = new DeviceCodeProvider({\n service: oauthStaticConfig.service,\n clientId: oauthStaticConfig.clientId,\n tenantId: oauthStaticConfig.tenantId,\n scope: oauthStaticConfig.scope,\n logger,\n tokenStore,\n headless: oauthStaticConfig.headless,\n });\n primary = deviceCodeProvider;\n\n // Device code uses single-user middleware (no account management needed)\n const middleware = deviceCodeProvider.authMiddleware();\n\n // Create auth email provider\n const authAdapter: AccountAuthProvider = {\n getAccessToken: (accountId) => deviceCodeProvider.getAccessToken(accountId),\n getUserEmail: (accountId) => deviceCodeProvider.getUserEmail(accountId),\n };\n\n // No account management tools for device code (like service accounts)\n const accountTools: ToolModule[] = [];\n const accountPrompts: PromptModule[] = [];\n\n logger.info('Device code provider created for Outlook', {\n service: oauthStaticConfig.service,\n });\n\n return { primary, middleware: middleware as AuthMiddleware, authAdapter, accountTools, accountPrompts };\n }\n\n // Always create primary adapter for file-based OAuth (loopback mode)\n primary = new LoopbackOAuthProvider({\n service: oauthStaticConfig.service,\n clientId: oauthStaticConfig.clientId,\n clientSecret: oauthStaticConfig.clientSecret,\n scope: oauthStaticConfig.scope,\n tenantId: oauthStaticConfig.tenantId,\n headless: oauthStaticConfig.headless,\n logger,\n tokenStore,\n ...(oauthStaticConfig.redirectUri !== undefined && { redirectUri: oauthStaticConfig.redirectUri }),\n });\n\n // Create auth email provider (used by account management tools)\n const authAdapter: AccountAuthProvider = primary;\n\n // Select middleware AND account tools based on auth mode\n const middleware: ReturnType<LoopbackOAuthProvider['authMiddleware']> = primary.authMiddleware();\n\n // Loopback OAuth - multi-account mode\n const result = AccountServer.createLoopback({\n service: oauthStaticConfig.service,\n store: tokenStore,\n logger,\n auth: authAdapter,\n });\n const accountTools: ToolModule[] = result.tools as ToolModule[];\n const accountPrompts: PromptModule[] = result.prompts as PromptModule[];\n logger.debug('Loopback OAuth (multi-account mode)', { service: oauthStaticConfig.service });\n\n const loopbackRouter = oauthStaticConfig.redirectUri ? createLoopbackCallbackRouter(primary) : undefined;\n\n return { primary, middleware: middleware as AuthMiddleware, authAdapter, accountTools, accountPrompts, loopbackRouter };\n}\n"],"names":["createOAuthAdapters","config","deps","baseUrl","logger","tokenStore","dcrStore","oauthStaticConfig","primary","dcrRouter","middleware","authAdapter","accountTools","accountPrompts","deviceCodeProvider","result","loopbackRouter","service","name","clientId","clientSecret","scope","MS_SCOPE","tenantId","auth","headless","redirectUri","transport","type","undefined","debug","Error","DcrOAuthProvider","verifyEndpoint","createDcrRouter","store","issuerUrl","scopesSupported","split","clientConfig","authMiddleware","getAccessToken","getUserEmail","info","DeviceCodeProvider","accountId","LoopbackOAuthProvider","AccountServer","createLoopback","tools","prompts","createLoopbackCallbackRouter"],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import type { ServerConfig } from './types.js';
|
|
2
2
|
export { MS_SCOPE } from './constants.js';
|
|
3
3
|
export * as mcp from './mcp/index.js';
|
|
4
|
+
export type { Input as CategoriesListInput } from './mcp/tools/categories-list.js';
|
|
5
|
+
export { inputSchema as categoriesListInputSchema } from './mcp/tools/categories-list.js';
|
|
6
|
+
export type { Input as LabelsListInput } from './mcp/tools/labels-list.js';
|
|
7
|
+
export { inputSchema as labelsListInputSchema } from './mcp/tools/labels-list.js';
|
|
4
8
|
export * as schemas from './schemas/index.js';
|
|
5
9
|
export * as setup from './setup/index.js';
|
|
10
|
+
export type { AuthMiddleware, OAuthAdapters, OAuthRuntimeDeps } from './setup/oauth-microsoft.js';
|
|
6
11
|
export * from './types.js';
|
|
7
12
|
export declare function startServer(config: ServerConfig): Promise<void>;
|
|
8
13
|
export default function main(): Promise<void>;
|
package/dist/esm/index.js
CHANGED
|
@@ -4,6 +4,8 @@ import { createStdioServer } from './setup/stdio.js';
|
|
|
4
4
|
export { MS_SCOPE } from './constants.js';
|
|
5
5
|
import * as _mcp from './mcp/index.js';
|
|
6
6
|
export { _mcp as mcp };
|
|
7
|
+
export { inputSchema as categoriesListInputSchema } from './mcp/tools/categories-list.js';
|
|
8
|
+
export { inputSchema as labelsListInputSchema } from './mcp/tools/labels-list.js';
|
|
7
9
|
import * as _schemas from './schemas/index.js';
|
|
8
10
|
export { _schemas as schemas };
|
|
9
11
|
import * as _setup from './setup/index.js';
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-outlook/src/index.ts"],"sourcesContent":["import { createConfig, handleVersionHelp } from './setup/config.ts';\nimport { createHTTPServer } from './setup/http.ts';\nimport { createStdioServer } from './setup/stdio.ts';\nimport type { ServerConfig } from './types.ts';\n\nexport { MS_SCOPE } from './constants.ts';\nexport * as mcp from './mcp/index.ts';\nexport * as schemas from './schemas/index.ts';\nexport * as setup from './setup/index.ts';\nexport * from './types.ts';\n\nexport async function startServer(config: ServerConfig): Promise<void> {\n const { logger, close } = config.transport.type === 'stdio' ? await createStdioServer(config) : await createHTTPServer(config);\n\n process.on('SIGINT', async () => {\n await close();\n process.exit(0);\n });\n\n logger.info(`Server started with ${config.transport.type} transport`);\n await new Promise(() => {});\n}\n\nexport default async function main(): Promise<void> {\n // Check for help/version flags FIRST, before config parsing\n const versionHelpResult = handleVersionHelp(process.argv);\n if (versionHelpResult.handled) {\n console.log(versionHelpResult.output);\n process.exit(0);\n }\n\n // Only parse config if no help/version flags\n const config = createConfig();\n await startServer(config);\n}\n\nif (process.argv[1] === new URL(import.meta.url).pathname) {\n main();\n}\n"],"names":["createConfig","handleVersionHelp","createHTTPServer","createStdioServer","MS_SCOPE","mcp","schemas","setup","startServer","config","logger","close","transport","type","process","on","exit","info","Promise","main","versionHelpResult","argv","handled","console","log","output","URL","url","pathname"],"mappings":"AAAA,SAASA,YAAY,EAAEC,iBAAiB,QAAQ,oBAAoB;AACpE,SAASC,gBAAgB,QAAQ,kBAAkB;AACnD,SAASC,iBAAiB,QAAQ,mBAAmB;AAGrD,SAASC,QAAQ,QAAQ,iBAAiB;AAC1C,sBAAqB,iBAAiB;AAAtC,SAAO,QAAKC,GAAG,GAAuB;
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-outlook/src/index.ts"],"sourcesContent":["import { createConfig, handleVersionHelp } from './setup/config.ts';\nimport { createHTTPServer } from './setup/http.ts';\nimport { createStdioServer } from './setup/stdio.ts';\nimport type { ServerConfig } from './types.ts';\n\nexport { MS_SCOPE } from './constants.ts';\nexport * as mcp from './mcp/index.ts';\n// Export input schemas for documentation visibility\nexport type { Input as CategoriesListInput } from './mcp/tools/categories-list.ts';\nexport { inputSchema as categoriesListInputSchema } from './mcp/tools/categories-list.ts';\nexport type { Input as LabelsListInput } from './mcp/tools/labels-list.ts';\nexport { inputSchema as labelsListInputSchema } from './mcp/tools/labels-list.ts';\nexport * as schemas from './schemas/index.ts';\nexport * as setup from './setup/index.ts';\nexport type { AuthMiddleware, OAuthAdapters, OAuthRuntimeDeps } from './setup/oauth-microsoft.ts';\nexport * from './types.ts';\n\nexport async function startServer(config: ServerConfig): Promise<void> {\n const { logger, close } = config.transport.type === 'stdio' ? await createStdioServer(config) : await createHTTPServer(config);\n\n process.on('SIGINT', async () => {\n await close();\n process.exit(0);\n });\n\n logger.info(`Server started with ${config.transport.type} transport`);\n await new Promise(() => {});\n}\n\nexport default async function main(): Promise<void> {\n // Check for help/version flags FIRST, before config parsing\n const versionHelpResult = handleVersionHelp(process.argv);\n if (versionHelpResult.handled) {\n console.log(versionHelpResult.output);\n process.exit(0);\n }\n\n // Only parse config if no help/version flags\n const config = createConfig();\n await startServer(config);\n}\n\nif (process.argv[1] === new URL(import.meta.url).pathname) {\n main();\n}\n"],"names":["createConfig","handleVersionHelp","createHTTPServer","createStdioServer","MS_SCOPE","mcp","inputSchema","categoriesListInputSchema","labelsListInputSchema","schemas","setup","startServer","config","logger","close","transport","type","process","on","exit","info","Promise","main","versionHelpResult","argv","handled","console","log","output","URL","url","pathname"],"mappings":"AAAA,SAASA,YAAY,EAAEC,iBAAiB,QAAQ,oBAAoB;AACpE,SAASC,gBAAgB,QAAQ,kBAAkB;AACnD,SAASC,iBAAiB,QAAQ,mBAAmB;AAGrD,SAASC,QAAQ,QAAQ,iBAAiB;AAC1C,sBAAqB,iBAAiB;AAAtC,SAAO,QAAKC,GAAG,GAAuB;AAGtC,SAASC,eAAeC,yBAAyB,QAAQ,iCAAiC;AAE1F,SAASD,eAAeE,qBAAqB,QAAQ,6BAA6B;AAClF,0BAAyB,qBAAqB;AAA9C,SAAO,YAAKC,OAAO,GAA2B;AAC9C,wBAAuB,mBAAmB;AAA1C,SAAO,UAAKC,KAAK,GAAyB;AAE1C,cAAc,aAAa;AAE3B,OAAO,eAAeC,YAAYC,MAAoB;IACpD,MAAM,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAGF,OAAOG,SAAS,CAACC,IAAI,KAAK,UAAU,MAAMb,kBAAkBS,UAAU,MAAMV,iBAAiBU;IAEvHK,QAAQC,EAAE,CAAC,UAAU;QACnB,MAAMJ;QACNG,QAAQE,IAAI,CAAC;IACf;IAEAN,OAAOO,IAAI,CAAC,CAAC,oBAAoB,EAAER,OAAOG,SAAS,CAACC,IAAI,CAAC,UAAU,CAAC;IACpE,MAAM,IAAIK,QAAQ,KAAO;AAC3B;AAEA,eAAe,eAAeC;IAC5B,4DAA4D;IAC5D,MAAMC,oBAAoBtB,kBAAkBgB,QAAQO,IAAI;IACxD,IAAID,kBAAkBE,OAAO,EAAE;QAC7BC,QAAQC,GAAG,CAACJ,kBAAkBK,MAAM;QACpCX,QAAQE,IAAI,CAAC;IACf;IAEA,6CAA6C;IAC7C,MAAMP,SAASZ;IACf,MAAMW,YAAYC;AACpB;AAEA,IAAIK,QAAQO,IAAI,CAAC,EAAE,KAAK,IAAIK,IAAI,YAAYC,GAAG,EAAEC,QAAQ,EAAE;IACzDT;AACF"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';
|
|
2
2
|
import { type CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Input schema for the categories-list tool
|
|
6
|
+
*
|
|
7
|
+
* Defines the validation schema for input parameters.
|
|
8
|
+
*/
|
|
9
|
+
export declare const inputSchema: z.ZodObject<{}, z.core.$strip>;
|
|
5
10
|
declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
6
11
|
type: z.ZodLiteral<"success">;
|
|
7
12
|
items: z.ZodArray<z.ZodObject<{
|
|
@@ -41,6 +46,11 @@ declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
41
46
|
message: z.ZodString;
|
|
42
47
|
url: z.ZodOptional<z.ZodString>;
|
|
43
48
|
}, z.core.$strip>], "type">;
|
|
49
|
+
/**
|
|
50
|
+
* Input type for the categories-list tool
|
|
51
|
+
*
|
|
52
|
+
* Represents the input parameters for listing Outlook categories.
|
|
53
|
+
*/
|
|
44
54
|
export type Input = z.infer<typeof inputSchema>;
|
|
45
55
|
export type Output = z.infer<typeof outputSchema>;
|
|
46
56
|
declare function handler(_: Input, extra: EnrichedExtra): Promise<CallToolResult>;
|
|
@@ -4,7 +4,11 @@ import { Client } from '@microsoft/microsoft-graph-client';
|
|
|
4
4
|
import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
import { OutlookCategorySchema } from '../../schemas/index.js';
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Input schema for the categories-list tool
|
|
9
|
+
*
|
|
10
|
+
* Defines the validation schema for input parameters.
|
|
11
|
+
*/ export const inputSchema = z.object({});
|
|
8
12
|
// Success branch schema
|
|
9
13
|
const successBranchSchema = z.object({
|
|
10
14
|
type: z.literal('success'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-outlook/src/mcp/tools/categories-list.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport { schemas } from '@mcp-z/oauth-microsoft';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { ToolModule } from '@mcp-z/server';\nimport { Client } from '@microsoft/microsoft-graph-client';\nimport type * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\nimport { type CallToolResult, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { OutlookCategorySchema } from '../../schemas/index.ts';\n\
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-outlook/src/mcp/tools/categories-list.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport { schemas } from '@mcp-z/oauth-microsoft';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\nimport type { ToolModule } from '@mcp-z/server';\nimport { Client } from '@microsoft/microsoft-graph-client';\nimport type * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\nimport { type CallToolResult, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { OutlookCategorySchema } from '../../schemas/index.ts';\n\n/**\n * Input schema for the categories-list tool\n *\n * Defines the validation schema for input parameters.\n */\nexport const inputSchema = z.object({});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n items: z.array(OutlookCategorySchema),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'List Outlook categories with colors and names.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\n/**\n * Input type for the categories-list tool\n *\n * Represents the input parameters for listing Outlook categories.\n */\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler(_: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('outlook.categories.list called');\n\n try {\n const graph = Client.initWithMiddleware({ authProvider: extra.authContext.auth });\n const started = Date.now();\n\n // Call Microsoft Graph API to get master categories\n const response = await graph.api('/me/outlook/masterCategories').get();\n const categories = Array.isArray(response.value) ? response.value : [];\n\n const durationMs = Date.now() - started;\n logger.info('outlook.categories.list returning', { categoriesCount: categories.length });\n logger.info('outlook.categories.list metrics', { durationMs });\n\n const result: Output = {\n type: 'success' as const,\n items: categories.map((category: MicrosoftGraph.OutlookCategory) => ({\n id: category.id || undefined,\n displayName: category.displayName || undefined,\n color: category.color || undefined,\n })),\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('outlook.categories.list error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error listing categories: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'categories-list',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["schemas","AuthRequiredBranchSchema","Client","ErrorCode","McpError","z","OutlookCategorySchema","inputSchema","object","successBranchSchema","type","literal","items","array","outputSchema","discriminatedUnion","config","description","result","handler","_","extra","logger","info","graph","initWithMiddleware","authProvider","authContext","auth","started","Date","now","response","api","get","categories","Array","isArray","value","durationMs","categoriesCount","length","map","category","id","undefined","displayName","color","content","text","JSON","stringify","structuredContent","error","message","Error","String","InternalError","stack","createTool","name"],"mappings":"AACA,SAASA,OAAO,QAAQ,yBAAyB;AAEjD,MAAM,EAAEC,wBAAwB,EAAE,GAAGD;AAGrC,SAASE,MAAM,QAAQ,oCAAoC;AAE3D,SAA8BC,SAAS,EAAEC,QAAQ,QAAQ,qCAAqC;AAC9F,SAASC,CAAC,QAAQ,MAAM;AACxB,SAASC,qBAAqB,QAAQ,yBAAyB;AAE/D;;;;CAIC,GACD,OAAO,MAAMC,cAAcF,EAAEG,MAAM,CAAC,CAAC,GAAG;AAExC,wBAAwB;AACxB,MAAMC,sBAAsBJ,EAAEG,MAAM,CAAC;IACnCE,MAAML,EAAEM,OAAO,CAAC;IAChBC,OAAOP,EAAEQ,KAAK,CAACP;AACjB;AAEA,2CAA2C;AAC3C,MAAMQ,eAAeT,EAAEU,kBAAkB,CAAC,QAAQ;IAACN;IAAqBR;CAAyB;AAEjG,MAAMe,SAAS;IACbC,aAAa;IACbV,aAAaA;IACbO,cAAcT,EAAEG,MAAM,CAAC;QACrBU,QAAQJ;IACV;AACF;AAUA,eAAeK,QAAQC,CAAQ,EAAEC,KAAoB;IACnD,MAAMC,SAASD,MAAMC,MAAM;IAC3BA,OAAOC,IAAI,CAAC;IAEZ,IAAI;QACF,MAAMC,QAAQtB,OAAOuB,kBAAkB,CAAC;YAAEC,cAAcL,MAAMM,WAAW,CAACC,IAAI;QAAC;QAC/E,MAAMC,UAAUC,KAAKC,GAAG;QAExB,oDAAoD;QACpD,MAAMC,WAAW,MAAMR,MAAMS,GAAG,CAAC,gCAAgCC,GAAG;QACpE,MAAMC,aAAaC,MAAMC,OAAO,CAACL,SAASM,KAAK,IAAIN,SAASM,KAAK,GAAG,EAAE;QAEtE,MAAMC,aAAaT,KAAKC,GAAG,KAAKF;QAChCP,OAAOC,IAAI,CAAC,qCAAqC;YAAEiB,iBAAiBL,WAAWM,MAAM;QAAC;QACtFnB,OAAOC,IAAI,CAAC,mCAAmC;YAAEgB;QAAW;QAE5D,MAAMrB,SAAiB;YACrBR,MAAM;YACNE,OAAOuB,WAAWO,GAAG,CAAC,CAACC,WAA8C,CAAA;oBACnEC,IAAID,SAASC,EAAE,IAAIC;oBACnBC,aAAaH,SAASG,WAAW,IAAID;oBACrCE,OAAOJ,SAASI,KAAK,IAAIF;gBAC3B,CAAA;QACF;QAEA,OAAO;YACLG,SAAS;gBACP;oBACEtC,MAAM;oBACNuC,MAAMC,KAAKC,SAAS,CAACjC;gBACvB;aACD;YACDkC,mBAAmB;gBAAElC;YAAO;QAC9B;IACF,EAAE,OAAOmC,OAAO;QACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;QAChE/B,OAAO+B,KAAK,CAAC,iCAAiC;YAAEA,OAAOC;QAAQ;QAE/D,MAAM,IAAIlD,SAASD,UAAUsD,aAAa,EAAE,CAAC,0BAA0B,EAAEH,SAAS,EAAE;YAClFI,OAAOL,iBAAiBE,QAAQF,MAAMK,KAAK,GAAGb;QAChD;IACF;AACF;AAEA,eAAe,SAASc;IACtB,OAAO;QACLC,MAAM;QACN5C;QACAG;IACF;AACF"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';
|
|
2
2
|
import { type CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Input schema for the labels-list tool
|
|
6
|
+
*
|
|
7
|
+
* Defines the validation schema for input parameters.
|
|
8
|
+
*/
|
|
9
|
+
export declare const inputSchema: z.ZodObject<{}, z.core.$strip>;
|
|
5
10
|
declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
6
11
|
type: z.ZodLiteral<"success">;
|
|
7
12
|
items: z.ZodArray<z.ZodObject<{
|
|
@@ -41,6 +46,11 @@ declare const outputSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
41
46
|
message: z.ZodString;
|
|
42
47
|
url: z.ZodOptional<z.ZodString>;
|
|
43
48
|
}, z.core.$strip>], "type">;
|
|
49
|
+
/**
|
|
50
|
+
* Input type for the labels-list tool
|
|
51
|
+
*
|
|
52
|
+
* Represents the input parameters for listing Outlook labels.
|
|
53
|
+
*/
|
|
44
54
|
export type Input = z.infer<typeof inputSchema>;
|
|
45
55
|
export type Output = z.infer<typeof outputSchema>;
|
|
46
56
|
declare function handler(_: Input, extra: EnrichedExtra): Promise<CallToolResult>;
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import { schemas } from '@mcp-z/oauth-microsoft';
|
|
2
|
-
const { AuthRequiredBranchSchema } = schemas;
|
|
3
2
|
import { Client } from '@microsoft/microsoft-graph-client';
|
|
4
3
|
import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
5
4
|
import { z } from 'zod';
|
|
6
5
|
import { OutlookCategorySchema } from '../../schemas/index.js';
|
|
7
|
-
const
|
|
6
|
+
const { AuthRequiredBranchSchema } = schemas;
|
|
7
|
+
/**
|
|
8
|
+
* Input schema for the labels-list tool
|
|
9
|
+
*
|
|
10
|
+
* Defines the validation schema for input parameters.
|
|
11
|
+
*/ export const inputSchema = z.object({});
|
|
8
12
|
// Success branch schema
|
|
9
13
|
const successBranchSchema = z.object({
|
|
10
14
|
type: z.literal('success'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-outlook/src/mcp/tools/labels-list.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport { schemas } from '@mcp-z/oauth-microsoft';\
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-outlook/src/mcp/tools/labels-list.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-microsoft';\nimport { schemas } from '@mcp-z/oauth-microsoft';\nimport type { ToolModule } from '@mcp-z/server';\nimport { Client } from '@microsoft/microsoft-graph-client';\nimport type * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\nimport { type CallToolResult, ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { OutlookCategorySchema } from '../../schemas/index.ts';\n\nconst { AuthRequiredBranchSchema } = schemas;\n\n/**\n * Input schema for the labels-list tool\n *\n * Defines the validation schema for input parameters.\n */\nexport const inputSchema = z.object({});\n\n// Success branch schema\nconst successBranchSchema = z.object({\n type: z.literal('success'),\n items: z.array(OutlookCategorySchema),\n});\n\n// Output schema with auth_required support\nconst outputSchema = z.discriminatedUnion('type', [successBranchSchema, AuthRequiredBranchSchema]);\n\nconst config = {\n description: 'List Outlook categories for label: query syntax. Case-sensitive.',\n inputSchema: inputSchema,\n outputSchema: z.object({\n result: outputSchema,\n }),\n} as const;\n\n/**\n * Input type for the labels-list tool\n *\n * Represents the input parameters for listing Outlook labels.\n */\nexport type Input = z.infer<typeof inputSchema>;\nexport type Output = z.infer<typeof outputSchema>;\n\nasync function handler(_: Input, extra: EnrichedExtra): Promise<CallToolResult> {\n const logger = extra.logger;\n logger.info('outlook.labels.list called');\n\n try {\n const graph = Client.initWithMiddleware({ authProvider: extra.authContext.auth });\n const started = Date.now();\n\n // Call Microsoft Graph API to get master categories (same as categories tool)\n const response = await graph.api('/me/outlook/masterCategories').get();\n const categories = Array.isArray(response.value) ? response.value : [];\n\n const durationMs = Date.now() - started;\n logger.info('outlook.labels.list returning', { labelsCount: categories.length });\n logger.info('outlook.labels.list metrics', { durationMs });\n\n const result: Output = {\n type: 'success' as const,\n items: categories.map((category: MicrosoftGraph.OutlookCategory) => ({\n id: category.id || undefined,\n displayName: category.displayName || undefined,\n color: category.color || undefined,\n })),\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(result),\n },\n ],\n structuredContent: { result },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('outlook.labels.list error', { error: message });\n\n throw new McpError(ErrorCode.InternalError, `Error listing labels: ${message}`, {\n stack: error instanceof Error ? error.stack : undefined,\n });\n }\n}\n\nexport default function createTool() {\n return {\n name: 'labels-list',\n config,\n handler,\n } satisfies ToolModule;\n}\n"],"names":["schemas","Client","ErrorCode","McpError","z","OutlookCategorySchema","AuthRequiredBranchSchema","inputSchema","object","successBranchSchema","type","literal","items","array","outputSchema","discriminatedUnion","config","description","result","handler","_","extra","logger","info","graph","initWithMiddleware","authProvider","authContext","auth","started","Date","now","response","api","get","categories","Array","isArray","value","durationMs","labelsCount","length","map","category","id","undefined","displayName","color","content","text","JSON","stringify","structuredContent","error","message","Error","String","InternalError","stack","createTool","name"],"mappings":"AACA,SAASA,OAAO,QAAQ,yBAAyB;AAEjD,SAASC,MAAM,QAAQ,oCAAoC;AAE3D,SAA8BC,SAAS,EAAEC,QAAQ,QAAQ,qCAAqC;AAC9F,SAASC,CAAC,QAAQ,MAAM;AACxB,SAASC,qBAAqB,QAAQ,yBAAyB;AAE/D,MAAM,EAAEC,wBAAwB,EAAE,GAAGN;AAErC;;;;CAIC,GACD,OAAO,MAAMO,cAAcH,EAAEI,MAAM,CAAC,CAAC,GAAG;AAExC,wBAAwB;AACxB,MAAMC,sBAAsBL,EAAEI,MAAM,CAAC;IACnCE,MAAMN,EAAEO,OAAO,CAAC;IAChBC,OAAOR,EAAES,KAAK,CAACR;AACjB;AAEA,2CAA2C;AAC3C,MAAMS,eAAeV,EAAEW,kBAAkB,CAAC,QAAQ;IAACN;IAAqBH;CAAyB;AAEjG,MAAMU,SAAS;IACbC,aAAa;IACbV,aAAaA;IACbO,cAAcV,EAAEI,MAAM,CAAC;QACrBU,QAAQJ;IACV;AACF;AAUA,eAAeK,QAAQC,CAAQ,EAAEC,KAAoB;IACnD,MAAMC,SAASD,MAAMC,MAAM;IAC3BA,OAAOC,IAAI,CAAC;IAEZ,IAAI;QACF,MAAMC,QAAQvB,OAAOwB,kBAAkB,CAAC;YAAEC,cAAcL,MAAMM,WAAW,CAACC,IAAI;QAAC;QAC/E,MAAMC,UAAUC,KAAKC,GAAG;QAExB,8EAA8E;QAC9E,MAAMC,WAAW,MAAMR,MAAMS,GAAG,CAAC,gCAAgCC,GAAG;QACpE,MAAMC,aAAaC,MAAMC,OAAO,CAACL,SAASM,KAAK,IAAIN,SAASM,KAAK,GAAG,EAAE;QAEtE,MAAMC,aAAaT,KAAKC,GAAG,KAAKF;QAChCP,OAAOC,IAAI,CAAC,iCAAiC;YAAEiB,aAAaL,WAAWM,MAAM;QAAC;QAC9EnB,OAAOC,IAAI,CAAC,+BAA+B;YAAEgB;QAAW;QAExD,MAAMrB,SAAiB;YACrBR,MAAM;YACNE,OAAOuB,WAAWO,GAAG,CAAC,CAACC,WAA8C,CAAA;oBACnEC,IAAID,SAASC,EAAE,IAAIC;oBACnBC,aAAaH,SAASG,WAAW,IAAID;oBACrCE,OAAOJ,SAASI,KAAK,IAAIF;gBAC3B,CAAA;QACF;QAEA,OAAO;YACLG,SAAS;gBACP;oBACEtC,MAAM;oBACNuC,MAAMC,KAAKC,SAAS,CAACjC;gBACvB;aACD;YACDkC,mBAAmB;gBAAElC;YAAO;QAC9B;IACF,EAAE,OAAOmC,OAAO;QACd,MAAMC,UAAUD,iBAAiBE,QAAQF,MAAMC,OAAO,GAAGE,OAAOH;QAChE/B,OAAO+B,KAAK,CAAC,6BAA6B;YAAEA,OAAOC;QAAQ;QAE3D,MAAM,IAAInD,SAASD,UAAUuD,aAAa,EAAE,CAAC,sBAAsB,EAAEH,SAAS,EAAE;YAC9EI,OAAOL,iBAAiBE,QAAQF,MAAMK,KAAK,GAAGb;QAChD;IACF;AACF;AAEA,eAAe,SAASc;IACtB,OAAO;QACLC,MAAM;QACN5C;QACAG;IACF;AACF"}
|
|
@@ -6,6 +6,9 @@ import type { Keyv } from 'keyv';
|
|
|
6
6
|
import type { ServerConfig } from '../types.js';
|
|
7
7
|
/**
|
|
8
8
|
* Outlook OAuth runtime dependencies
|
|
9
|
+
*
|
|
10
|
+
* Contains the required dependencies for OAuth functionality including logger,
|
|
11
|
+
* token storage, and optional DCR store.
|
|
9
12
|
*/
|
|
10
13
|
export interface OAuthRuntimeDeps {
|
|
11
14
|
logger: Logger;
|
|
@@ -14,6 +17,8 @@ export interface OAuthRuntimeDeps {
|
|
|
14
17
|
}
|
|
15
18
|
/**
|
|
16
19
|
* Auth middleware wrapper with withToolAuth/withResourceAuth/withPromptAuth methods
|
|
20
|
+
*
|
|
21
|
+
* Provides authentication middleware methods for tools, resources, and prompts.
|
|
17
22
|
*/
|
|
18
23
|
export interface AuthMiddleware {
|
|
19
24
|
withToolAuth<T extends ToolModule>(module: T): T;
|
|
@@ -22,6 +27,9 @@ export interface AuthMiddleware {
|
|
|
22
27
|
}
|
|
23
28
|
/**
|
|
24
29
|
* Result of OAuth adapter creation
|
|
30
|
+
*
|
|
31
|
+
* Contains the primary OAuth adapter, middleware, auth adapter,
|
|
32
|
+
* account tools, prompts, and optional routers.
|
|
25
33
|
*/
|
|
26
34
|
export interface OAuthAdapters {
|
|
27
35
|
primary: LoopbackOAuthProvider | DeviceCodeProvider | DcrOAuthProvider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-outlook/src/setup/oauth-microsoft.ts"],"sourcesContent":["import { type AccountAuthProvider, AccountServer } from '@mcp-z/oauth';\nimport { createDcrRouter, createLoopbackCallbackRouter, DcrOAuthProvider, DeviceCodeProvider, LoopbackOAuthProvider } from '@mcp-z/oauth-microsoft';\nimport type { Logger, PromptModule, ToolModule } from '@mcp-z/server';\nimport type { Router } from 'express';\nimport type { Keyv } from 'keyv';\nimport { MS_SCOPE } from '../constants.ts';\nimport type { ServerConfig } from '../types.ts';\n\n/**\n * Outlook OAuth runtime dependencies\n */\nexport interface OAuthRuntimeDeps {\n logger: Logger;\n tokenStore: Keyv<unknown>;\n dcrStore?: Keyv<unknown>;\n}\n\n/**\n * Auth middleware wrapper with withToolAuth/withResourceAuth/withPromptAuth methods\n */\nexport interface AuthMiddleware {\n withToolAuth<T extends ToolModule>(module: T): T;\n withResourceAuth<T>(module: T): T;\n withPromptAuth<T>(module: T): T;\n}\n\n/**\n * Result of OAuth adapter creation\n */\nexport interface OAuthAdapters {\n primary: LoopbackOAuthProvider | DeviceCodeProvider | DcrOAuthProvider;\n middleware: AuthMiddleware;\n authAdapter: AccountAuthProvider;\n accountTools: ToolModule[];\n accountPrompts: PromptModule[];\n dcrRouter?: Router; // DCR OAuth endpoints (only for dcr mode)\n loopbackRouter?: Router;\n}\n\n/**\n * Create Outlook OAuth adapters based on transport configuration\n *\n * Returns primary adapter, pre-configured middleware, auth email provider,\n * and pre-selected account tools based on auth mode.\n * @param config - Outlook server configuration\n * @param deps - Runtime dependencies (logger, tokenStore, etc.)\n * @returns OAuth adapters with pre-configured middleware and account tools\n */\nexport async function createOAuthAdapters(config: ServerConfig, deps: OAuthRuntimeDeps, baseUrl?: string): Promise<OAuthAdapters> {\n const { logger, tokenStore, dcrStore } = deps;\n const oauthStaticConfig = {\n service: config.name,\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n scope: MS_SCOPE,\n tenantId: config.tenantId,\n auth: config.auth,\n headless: config.headless,\n redirectUri: config.transport.type === 'stdio' ? undefined : config.redirectUri,\n ...(baseUrl && { baseUrl }),\n };\n\n let primary: LoopbackOAuthProvider | DeviceCodeProvider | DcrOAuthProvider;\n\n // DCR mode - Dynamic Client Registration with HTTP-only support\n if (oauthStaticConfig.auth === 'dcr') {\n logger.debug('Creating DCR provider', { service: oauthStaticConfig.service });\n\n // DCR requires dcrStore and baseUrl\n if (!dcrStore) {\n throw new Error('DCR mode requires dcrStore to be configured');\n }\n if (!oauthStaticConfig.baseUrl) {\n throw new Error('DCR mode requires baseUrl to be configured');\n }\n\n // Create DcrOAuthProvider (stateless provider that receives tokens from verification context)\n primary = new DcrOAuthProvider({\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n tenantId: oauthStaticConfig.tenantId,\n scope: oauthStaticConfig.scope,\n verifyEndpoint: `${oauthStaticConfig.baseUrl}/oauth/verify`,\n logger,\n });\n\n // Create DCR OAuth router with authorization server endpoints\n const dcrRouter = createDcrRouter({\n store: dcrStore,\n issuerUrl: oauthStaticConfig.baseUrl,\n baseUrl: oauthStaticConfig.baseUrl,\n scopesSupported: oauthStaticConfig.scope.split(' '), // Convert space-separated scope to array\n clientConfig: {\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n tenantId: oauthStaticConfig.tenantId,\n },\n });\n\n // DCR uses bearer token authentication with middleware validation\n const middleware = primary.authMiddleware();\n\n // Create auth email provider (stateless, no token storage)\n const authAdapter: AccountAuthProvider = {\n getAccessToken: () => {\n throw new Error('DCR mode does not support getAccessToken - tokens are provided via bearer auth');\n },\n getUserEmail: () => {\n throw new Error('DCR mode does not support getUserEmail - tokens are provided via bearer auth');\n },\n };\n\n // No account management tools for DCR (multi-user management at client registration level)\n const accountTools: ToolModule[] = [];\n const accountPrompts: PromptModule[] = [];\n\n logger.info('DCR provider created for Outlook', {\n service: oauthStaticConfig.service,\n baseUrl: oauthStaticConfig.baseUrl,\n });\n\n return { primary, middleware: middleware as AuthMiddleware, authAdapter, accountTools, accountPrompts, dcrRouter };\n }\n\n // Device code mode - similar to service accounts (single static identity)\n if (oauthStaticConfig.auth === 'device-code') {\n logger.debug('Creating device code provider', { service: oauthStaticConfig.service });\n const deviceCodeProvider = new DeviceCodeProvider({\n service: oauthStaticConfig.service,\n clientId: oauthStaticConfig.clientId,\n tenantId: oauthStaticConfig.tenantId,\n scope: oauthStaticConfig.scope,\n logger,\n tokenStore,\n headless: oauthStaticConfig.headless,\n });\n primary = deviceCodeProvider;\n\n // Device code uses single-user middleware (no account management needed)\n const middleware = deviceCodeProvider.authMiddleware();\n\n // Create auth email provider\n const authAdapter: AccountAuthProvider = {\n getAccessToken: (accountId) => deviceCodeProvider.getAccessToken(accountId),\n getUserEmail: (accountId) => deviceCodeProvider.getUserEmail(accountId),\n };\n\n // No account management tools for device code (like service accounts)\n const accountTools: ToolModule[] = [];\n const accountPrompts: PromptModule[] = [];\n\n logger.info('Device code provider created for Outlook', {\n service: oauthStaticConfig.service,\n });\n\n return { primary, middleware: middleware as AuthMiddleware, authAdapter, accountTools, accountPrompts };\n }\n\n // Always create primary adapter for file-based OAuth (loopback mode)\n primary = new LoopbackOAuthProvider({\n service: oauthStaticConfig.service,\n clientId: oauthStaticConfig.clientId,\n clientSecret: oauthStaticConfig.clientSecret,\n scope: oauthStaticConfig.scope,\n tenantId: oauthStaticConfig.tenantId,\n headless: oauthStaticConfig.headless,\n logger,\n tokenStore,\n ...(oauthStaticConfig.redirectUri !== undefined && { redirectUri: oauthStaticConfig.redirectUri }),\n });\n\n // Create auth email provider (used by account management tools)\n const authAdapter: AccountAuthProvider = primary;\n\n // Select middleware AND account tools based on auth mode\n const middleware: ReturnType<LoopbackOAuthProvider['authMiddleware']> = primary.authMiddleware();\n\n // Loopback OAuth - multi-account mode\n const result = AccountServer.createLoopback({\n service: oauthStaticConfig.service,\n store: tokenStore,\n logger,\n auth: authAdapter,\n });\n const accountTools: ToolModule[] = result.tools as ToolModule[];\n const accountPrompts: PromptModule[] = result.prompts as PromptModule[];\n logger.debug('Loopback OAuth (multi-account mode)', { service: oauthStaticConfig.service });\n\n const loopbackRouter = oauthStaticConfig.redirectUri ? createLoopbackCallbackRouter(primary) : undefined;\n\n return { primary, middleware: middleware as AuthMiddleware, authAdapter, accountTools, accountPrompts, loopbackRouter };\n}\n"],"names":["AccountServer","createDcrRouter","createLoopbackCallbackRouter","DcrOAuthProvider","DeviceCodeProvider","LoopbackOAuthProvider","MS_SCOPE","createOAuthAdapters","config","deps","baseUrl","logger","tokenStore","dcrStore","oauthStaticConfig","service","name","clientId","clientSecret","scope","tenantId","auth","headless","redirectUri","transport","type","undefined","primary","debug","Error","verifyEndpoint","dcrRouter","store","issuerUrl","scopesSupported","split","clientConfig","middleware","authMiddleware","authAdapter","getAccessToken","getUserEmail","accountTools","accountPrompts","info","deviceCodeProvider","accountId","result","createLoopback","tools","prompts","loopbackRouter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-outlook/src/setup/oauth-microsoft.ts"],"sourcesContent":["import { type AccountAuthProvider, AccountServer } from '@mcp-z/oauth';\nimport { createDcrRouter, createLoopbackCallbackRouter, DcrOAuthProvider, DeviceCodeProvider, LoopbackOAuthProvider } from '@mcp-z/oauth-microsoft';\nimport type { Logger, PromptModule, ToolModule } from '@mcp-z/server';\nimport type { Router } from 'express';\nimport type { Keyv } from 'keyv';\nimport { MS_SCOPE } from '../constants.ts';\nimport type { ServerConfig } from '../types.ts';\n\n/**\n * Outlook OAuth runtime dependencies\n *\n * Contains the required dependencies for OAuth functionality including logger,\n * token storage, and optional DCR store.\n */\nexport interface OAuthRuntimeDeps {\n logger: Logger;\n tokenStore: Keyv<unknown>;\n dcrStore?: Keyv<unknown>;\n}\n\n/**\n * Auth middleware wrapper with withToolAuth/withResourceAuth/withPromptAuth methods\n *\n * Provides authentication middleware methods for tools, resources, and prompts.\n */\nexport interface AuthMiddleware {\n withToolAuth<T extends ToolModule>(module: T): T;\n withResourceAuth<T>(module: T): T;\n withPromptAuth<T>(module: T): T;\n}\n\n/**\n * Result of OAuth adapter creation\n *\n * Contains the primary OAuth adapter, middleware, auth adapter,\n * account tools, prompts, and optional routers.\n */\nexport interface OAuthAdapters {\n primary: LoopbackOAuthProvider | DeviceCodeProvider | DcrOAuthProvider;\n middleware: AuthMiddleware;\n authAdapter: AccountAuthProvider;\n accountTools: ToolModule[];\n accountPrompts: PromptModule[];\n dcrRouter?: Router; // DCR OAuth endpoints (only for dcr mode)\n loopbackRouter?: Router;\n}\n\n/**\n * Create Outlook OAuth adapters based on transport configuration\n *\n * Returns primary adapter, pre-configured middleware, auth email provider,\n * and pre-selected account tools based on auth mode.\n * @param config - Outlook server configuration\n * @param deps - Runtime dependencies (logger, tokenStore, etc.)\n * @returns OAuth adapters with pre-configured middleware and account tools\n */\nexport async function createOAuthAdapters(config: ServerConfig, deps: OAuthRuntimeDeps, baseUrl?: string): Promise<OAuthAdapters> {\n const { logger, tokenStore, dcrStore } = deps;\n const oauthStaticConfig = {\n service: config.name,\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n scope: MS_SCOPE,\n tenantId: config.tenantId,\n auth: config.auth,\n headless: config.headless,\n redirectUri: config.transport.type === 'stdio' ? undefined : config.redirectUri,\n ...(baseUrl && { baseUrl }),\n };\n\n let primary: LoopbackOAuthProvider | DeviceCodeProvider | DcrOAuthProvider;\n\n // DCR mode - Dynamic Client Registration with HTTP-only support\n if (oauthStaticConfig.auth === 'dcr') {\n logger.debug('Creating DCR provider', { service: oauthStaticConfig.service });\n\n // DCR requires dcrStore and baseUrl\n if (!dcrStore) {\n throw new Error('DCR mode requires dcrStore to be configured');\n }\n if (!oauthStaticConfig.baseUrl) {\n throw new Error('DCR mode requires baseUrl to be configured');\n }\n\n // Create DcrOAuthProvider (stateless provider that receives tokens from verification context)\n primary = new DcrOAuthProvider({\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n tenantId: oauthStaticConfig.tenantId,\n scope: oauthStaticConfig.scope,\n verifyEndpoint: `${oauthStaticConfig.baseUrl}/oauth/verify`,\n logger,\n });\n\n // Create DCR OAuth router with authorization server endpoints\n const dcrRouter = createDcrRouter({\n store: dcrStore,\n issuerUrl: oauthStaticConfig.baseUrl,\n baseUrl: oauthStaticConfig.baseUrl,\n scopesSupported: oauthStaticConfig.scope.split(' '), // Convert space-separated scope to array\n clientConfig: {\n clientId: oauthStaticConfig.clientId,\n ...(oauthStaticConfig.clientSecret && { clientSecret: oauthStaticConfig.clientSecret }),\n tenantId: oauthStaticConfig.tenantId,\n },\n });\n\n // DCR uses bearer token authentication with middleware validation\n const middleware = primary.authMiddleware();\n\n // Create auth email provider (stateless, no token storage)\n const authAdapter: AccountAuthProvider = {\n getAccessToken: () => {\n throw new Error('DCR mode does not support getAccessToken - tokens are provided via bearer auth');\n },\n getUserEmail: () => {\n throw new Error('DCR mode does not support getUserEmail - tokens are provided via bearer auth');\n },\n };\n\n // No account management tools for DCR (multi-user management at client registration level)\n const accountTools: ToolModule[] = [];\n const accountPrompts: PromptModule[] = [];\n\n logger.info('DCR provider created for Outlook', {\n service: oauthStaticConfig.service,\n baseUrl: oauthStaticConfig.baseUrl,\n });\n\n return { primary, middleware: middleware as AuthMiddleware, authAdapter, accountTools, accountPrompts, dcrRouter };\n }\n\n // Device code mode - similar to service accounts (single static identity)\n if (oauthStaticConfig.auth === 'device-code') {\n logger.debug('Creating device code provider', { service: oauthStaticConfig.service });\n const deviceCodeProvider = new DeviceCodeProvider({\n service: oauthStaticConfig.service,\n clientId: oauthStaticConfig.clientId,\n tenantId: oauthStaticConfig.tenantId,\n scope: oauthStaticConfig.scope,\n logger,\n tokenStore,\n headless: oauthStaticConfig.headless,\n });\n primary = deviceCodeProvider;\n\n // Device code uses single-user middleware (no account management needed)\n const middleware = deviceCodeProvider.authMiddleware();\n\n // Create auth email provider\n const authAdapter: AccountAuthProvider = {\n getAccessToken: (accountId) => deviceCodeProvider.getAccessToken(accountId),\n getUserEmail: (accountId) => deviceCodeProvider.getUserEmail(accountId),\n };\n\n // No account management tools for device code (like service accounts)\n const accountTools: ToolModule[] = [];\n const accountPrompts: PromptModule[] = [];\n\n logger.info('Device code provider created for Outlook', {\n service: oauthStaticConfig.service,\n });\n\n return { primary, middleware: middleware as AuthMiddleware, authAdapter, accountTools, accountPrompts };\n }\n\n // Always create primary adapter for file-based OAuth (loopback mode)\n primary = new LoopbackOAuthProvider({\n service: oauthStaticConfig.service,\n clientId: oauthStaticConfig.clientId,\n clientSecret: oauthStaticConfig.clientSecret,\n scope: oauthStaticConfig.scope,\n tenantId: oauthStaticConfig.tenantId,\n headless: oauthStaticConfig.headless,\n logger,\n tokenStore,\n ...(oauthStaticConfig.redirectUri !== undefined && { redirectUri: oauthStaticConfig.redirectUri }),\n });\n\n // Create auth email provider (used by account management tools)\n const authAdapter: AccountAuthProvider = primary;\n\n // Select middleware AND account tools based on auth mode\n const middleware: ReturnType<LoopbackOAuthProvider['authMiddleware']> = primary.authMiddleware();\n\n // Loopback OAuth - multi-account mode\n const result = AccountServer.createLoopback({\n service: oauthStaticConfig.service,\n store: tokenStore,\n logger,\n auth: authAdapter,\n });\n const accountTools: ToolModule[] = result.tools as ToolModule[];\n const accountPrompts: PromptModule[] = result.prompts as PromptModule[];\n logger.debug('Loopback OAuth (multi-account mode)', { service: oauthStaticConfig.service });\n\n const loopbackRouter = oauthStaticConfig.redirectUri ? createLoopbackCallbackRouter(primary) : undefined;\n\n return { primary, middleware: middleware as AuthMiddleware, authAdapter, accountTools, accountPrompts, loopbackRouter };\n}\n"],"names":["AccountServer","createDcrRouter","createLoopbackCallbackRouter","DcrOAuthProvider","DeviceCodeProvider","LoopbackOAuthProvider","MS_SCOPE","createOAuthAdapters","config","deps","baseUrl","logger","tokenStore","dcrStore","oauthStaticConfig","service","name","clientId","clientSecret","scope","tenantId","auth","headless","redirectUri","transport","type","undefined","primary","debug","Error","verifyEndpoint","dcrRouter","store","issuerUrl","scopesSupported","split","clientConfig","middleware","authMiddleware","authAdapter","getAccessToken","getUserEmail","accountTools","accountPrompts","info","deviceCodeProvider","accountId","result","createLoopback","tools","prompts","loopbackRouter"],"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.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "MCP server for Outlook integration with OAuth authentication, message search, and batch operations",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"outlook",
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
"cors": "^2.0.0",
|
|
83
83
|
"csv-stringify": "^6.6.0",
|
|
84
84
|
"express": "^5.0.0",
|
|
85
|
-
"keyv-registry": "^0.
|
|
85
|
+
"keyv-registry": "^0.4.0",
|
|
86
86
|
"module-root-sync": "^2.0.0",
|
|
87
87
|
"pino": "^10.0.0",
|
|
88
88
|
"zod": "^4.0.0"
|