@structured-world/gitlab-mcp 6.45.1 → 6.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  A [Model Context Protocol](https://modelcontextprotocol.io) server that connects AI agents to the GitLab API — 44 tools across 18 entity types with CQRS architecture, OAuth 2.1, and multiple transport modes.
6
6
 
7
- [![Install in Claude Desktop](https://img.shields.io/badge/Claude_Desktop-Install_Extension-F97316?style=for-the-badge)](https://gitlab-mcp.sw.foundation/downloads/gitlab-mcp-6.45.1.mcpb)
7
+ [![Install in Claude Desktop](https://img.shields.io/badge/Claude_Desktop-Install_Extension-F97316?style=for-the-badge)](https://gitlab-mcp.sw.foundation/downloads/gitlab-mcp-6.46.0.mcpb)
8
8
  [![Install in VS Code](https://img.shields.io/badge/VS_Code-Install_MCP_Server-007ACC?style=for-the-badge&logo=visualstudiocode&logoColor=white)](vscode:mcp/install?%7B%22name%22%3A%22gitlab-mcp%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40structured-world%2Fgitlab-mcp%22%5D%7D)
9
9
  [![Install in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Install_MCP_Server-24bfa5?style=for-the-badge&logo=visualstudiocode&logoColor=white)](vscode-insiders:mcp/install?%7B%22name%22%3A%22gitlab-mcp%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40structured-world%2Fgitlab-mcp%22%5D%7D)
10
10
 
@@ -1,5 +1,5 @@
1
- import { ListPresetsInput, ListProfilesInput, ManageContextInput, ResetContextInput, SetScopeInput, ShowContextInput, SwitchPresetInput, SwitchProfileInput } from "./schema";
2
- import { PresetInfo, ProfileInfo, ResetResult, SessionContext, SetScopeResult, SwitchResult } from "./types";
1
+ import { ListPresetsInput, ListProfilesInput, ManageContextInput, ResetContextInput, SetScopeInput, ShowContextInput, SwitchPresetInput, SwitchProfileInput, WhoamiInput } from "./schema";
2
+ import { PresetInfo, ProfileInfo, ResetResult, SessionContext, SetScopeResult, SwitchResult, WhoamiResult } from "./types";
3
3
  export declare function handleShowContext(_input: ShowContextInput): Promise<SessionContext>;
4
4
  export declare function handleListPresets(_input: ListPresetsInput): Promise<PresetInfo[]>;
5
5
  export declare function handleListProfiles(_input: ListProfilesInput): Promise<ProfileInfo[]>;
@@ -7,4 +7,5 @@ export declare function handleSwitchPreset(input: SwitchPresetInput): Promise<Sw
7
7
  export declare function handleSwitchProfile(input: SwitchProfileInput): Promise<SwitchResult>;
8
8
  export declare function handleSetScope(input: SetScopeInput): Promise<SetScopeResult>;
9
9
  export declare function handleResetContext(_input: ResetContextInput): Promise<ResetResult>;
10
- export declare function handleManageContext(input: ManageContextInput): Promise<SessionContext | PresetInfo[] | ProfileInfo[] | SwitchResult | SetScopeResult | ResetResult>;
10
+ export declare function handleWhoami(_input: WhoamiInput): Promise<WhoamiResult>;
11
+ export declare function handleManageContext(input: ManageContextInput): Promise<SessionContext | PresetInfo[] | ProfileInfo[] | SwitchResult | SetScopeResult | ResetResult | WhoamiResult>;
@@ -7,8 +7,10 @@ exports.handleSwitchPreset = handleSwitchPreset;
7
7
  exports.handleSwitchProfile = handleSwitchProfile;
8
8
  exports.handleSetScope = handleSetScope;
9
9
  exports.handleResetContext = handleResetContext;
10
+ exports.handleWhoami = handleWhoami;
10
11
  exports.handleManageContext = handleManageContext;
11
12
  const context_manager_1 = require("./context-manager");
13
+ const whoami_1 = require("./whoami");
12
14
  async function handleShowContext(_input) {
13
15
  const manager = (0, context_manager_1.getContextManager)();
14
16
  return manager.getContext();
@@ -37,6 +39,9 @@ async function handleResetContext(_input) {
37
39
  const manager = (0, context_manager_1.getContextManager)();
38
40
  return manager.reset();
39
41
  }
42
+ async function handleWhoami(_input) {
43
+ return (0, whoami_1.executeWhoami)();
44
+ }
40
45
  async function handleManageContext(input) {
41
46
  switch (input.action) {
42
47
  case "show":
@@ -53,6 +58,8 @@ async function handleManageContext(input) {
53
58
  return handleSetScope(input);
54
59
  case "reset":
55
60
  return handleResetContext(input);
61
+ case "whoami":
62
+ return handleWhoami(input);
56
63
  default:
57
64
  throw new Error(`Unknown action: ${input.action}`);
58
65
  }
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../../../src/entities/context/handlers.ts"],"names":[],"mappings":";;AA6BA,8CAGC;AAKD,8CAGC;AAKD,gDAGC;AAKD,gDAGC;AAKD,kDAGC;AAKD,wCAGC;AAKD,gDAGC;AAKD,kDAwBC;AAvGD,uDAAsD;AAuB/C,KAAK,UAAU,iBAAiB,CAAC,MAAwB;IAC9D,MAAM,OAAO,GAAG,IAAA,mCAAiB,GAAE,CAAC;IACpC,OAAO,OAAO,CAAC,UAAU,EAAE,CAAC;AAC9B,CAAC;AAKM,KAAK,UAAU,iBAAiB,CAAC,MAAwB;IAC9D,MAAM,OAAO,GAAG,IAAA,mCAAiB,GAAE,CAAC;IACpC,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC;AAC/B,CAAC;AAKM,KAAK,UAAU,kBAAkB,CAAC,MAAyB;IAChE,MAAM,OAAO,GAAG,IAAA,mCAAiB,GAAE,CAAC;IACpC,OAAO,OAAO,CAAC,YAAY,EAAE,CAAC;AAChC,CAAC;AAKM,KAAK,UAAU,kBAAkB,CAAC,KAAwB;IAC/D,MAAM,OAAO,GAAG,IAAA,mCAAiB,GAAE,CAAC;IACpC,OAAO,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC;AAKM,KAAK,UAAU,mBAAmB,CAAC,KAAyB;IACjE,MAAM,OAAO,GAAG,IAAA,mCAAiB,GAAE,CAAC;IACpC,OAAO,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC9C,CAAC;AAKM,KAAK,UAAU,cAAc,CAAC,KAAoB;IACvD,MAAM,OAAO,GAAG,IAAA,mCAAiB,GAAE,CAAC;IACpC,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;AACnE,CAAC;AAKM,KAAK,UAAU,kBAAkB,CAAC,MAAyB;IAChE,MAAM,OAAO,GAAG,IAAA,mCAAiB,GAAE,CAAC;IACpC,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC;AAKM,KAAK,UAAU,mBAAmB,CACvC,KAAyB;IAIzB,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;QACrB,KAAK,MAAM;YACT,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAClC,KAAK,cAAc;YACjB,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAClC,KAAK,eAAe;YAClB,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACnC,KAAK,eAAe;YAClB,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACnC,KAAK,gBAAgB;YACnB,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACpC,KAAK,WAAW;YACd,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;QAC/B,KAAK,OAAO;YACV,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAEnC;YACE,MAAM,IAAI,KAAK,CAAC,mBAAoB,KAA4B,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../../../src/entities/context/handlers.ts"],"names":[],"mappings":";;AAgCA,8CAGC;AAKD,8CAGC;AAKD,gDAGC;AAKD,gDAGC;AAKD,kDAGC;AAKD,wCAGC;AAKD,gDAGC;AAKD,oCAEC;AAKD,kDAgCC;AAzHD,uDAAsD;AAqBtD,qCAAyC;AAKlC,KAAK,UAAU,iBAAiB,CAAC,MAAwB;IAC9D,MAAM,OAAO,GAAG,IAAA,mCAAiB,GAAE,CAAC;IACpC,OAAO,OAAO,CAAC,UAAU,EAAE,CAAC;AAC9B,CAAC;AAKM,KAAK,UAAU,iBAAiB,CAAC,MAAwB;IAC9D,MAAM,OAAO,GAAG,IAAA,mCAAiB,GAAE,CAAC;IACpC,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC;AAC/B,CAAC;AAKM,KAAK,UAAU,kBAAkB,CAAC,MAAyB;IAChE,MAAM,OAAO,GAAG,IAAA,mCAAiB,GAAE,CAAC;IACpC,OAAO,OAAO,CAAC,YAAY,EAAE,CAAC;AAChC,CAAC;AAKM,KAAK,UAAU,kBAAkB,CAAC,KAAwB;IAC/D,MAAM,OAAO,GAAG,IAAA,mCAAiB,GAAE,CAAC;IACpC,OAAO,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC;AAKM,KAAK,UAAU,mBAAmB,CAAC,KAAyB;IACjE,MAAM,OAAO,GAAG,IAAA,mCAAiB,GAAE,CAAC;IACpC,OAAO,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC9C,CAAC;AAKM,KAAK,UAAU,cAAc,CAAC,KAAoB;IACvD,MAAM,OAAO,GAAG,IAAA,mCAAiB,GAAE,CAAC;IACpC,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;AACnE,CAAC;AAKM,KAAK,UAAU,kBAAkB,CAAC,MAAyB;IAChE,MAAM,OAAO,GAAG,IAAA,mCAAiB,GAAE,CAAC;IACpC,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC;AAKM,KAAK,UAAU,YAAY,CAAC,MAAmB;IACpD,OAAO,IAAA,sBAAa,GAAE,CAAC;AACzB,CAAC;AAKM,KAAK,UAAU,mBAAmB,CACvC,KAAyB;IAUzB,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;QACrB,KAAK,MAAM;YACT,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAClC,KAAK,cAAc;YACjB,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAClC,KAAK,eAAe;YAClB,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACnC,KAAK,eAAe;YAClB,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACnC,KAAK,gBAAgB;YACnB,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACpC,KAAK,WAAW;YACd,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;QAC/B,KAAK,OAAO;YACV,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACnC,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;QAE7B;YACE,MAAM,IAAI,KAAK,CAAC,mBAAoB,KAA4B,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC"}
@@ -45,7 +45,7 @@ exports.contextToolRegistry = new Map([
45
45
  "manage_context",
46
46
  {
47
47
  name: "manage_context",
48
- description: "View and manage runtime session configuration. Actions: show (current host/preset/scope/mode), list_presets (available tool configurations), list_profiles (OAuth users), switch_preset (change active preset), switch_profile (change OAuth user), set_scope (restrict to namespace), reset (restore initial state).",
48
+ description: "View and manage runtime session configuration. Actions: show (current host/preset/scope/mode), list_presets (available tool configurations), list_profiles (OAuth users), whoami (token introspection with live refresh - detects permission changes and updates available tools), switch_preset (change active preset), switch_profile (change OAuth user), set_scope (restrict to namespace), reset (restore initial state). Use whoami to diagnose access issues and verify token permissions.",
49
49
  inputSchema: z.toJSONSchema(schema_1.ManageContextSchema),
50
50
  handler: async (args) => {
51
51
  const input = schema_1.ManageContextSchema.parse(args);
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/entities/context/registry.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CA,kEAEC;AAKD,8DAEC;AAMD,0DAEC;AAzDD,uCAAyB;AAEzB,qCAA+C;AAC/C,yCAAiD;AAcpC,QAAA,mBAAmB,GAAiB,IAAI,GAAG,CAAiC;IACvF;QACE,gBAAgB;QAChB;YACE,IAAI,EAAE,gBAAgB;YACtB,WAAW,EACT,uTAAuT;YACzT,WAAW,EAAE,CAAC,CAAC,YAAY,CAAC,4BAAmB,CAAC;YAEhD,OAAO,EAAE,KAAK,EAAE,IAAa,EAAE,EAAE;gBAC/B,MAAM,KAAK,GAAG,4BAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9C,OAAO,IAAA,8BAAmB,EAAC,KAAK,CAAC,CAAC;YACpC,CAAC;SACF;KACF;CACF,CAAC,CAAC;AAQH,SAAgB,2BAA2B;IACzC,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAC5B,CAAC;AAKD,SAAgB,yBAAyB;IACvC,OAAO,KAAK,CAAC,IAAI,CAAC,2BAAmB,CAAC,MAAM,EAAE,CAAC,CAAC;AAClD,CAAC;AAMD,SAAgB,uBAAuB,CAAC,gBAAyB,KAAK;IACpE,OAAO,yBAAyB,EAAE,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/entities/context/registry.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA,kEAEC;AAKD,8DAEC;AAMD,0DAEC;AA1DD,uCAAyB;AAEzB,qCAA+C;AAC/C,yCAAiD;AAepC,QAAA,mBAAmB,GAAiB,IAAI,GAAG,CAAiC;IACvF;QACE,gBAAgB;QAChB;YACE,IAAI,EAAE,gBAAgB;YACtB,WAAW,EACT,meAAme;YACre,WAAW,EAAE,CAAC,CAAC,YAAY,CAAC,4BAAmB,CAAC;YAEhD,OAAO,EAAE,KAAK,EAAE,IAAa,EAAE,EAAE;gBAC/B,MAAM,KAAK,GAAG,4BAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9C,OAAO,IAAA,8BAAmB,EAAC,KAAK,CAAC,CAAC;YACpC,CAAC;SACF;KACF;CACF,CAAC,CAAC;AAQH,SAAgB,2BAA2B;IACzC,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAC5B,CAAC;AAKD,SAAgB,yBAAyB;IACvC,OAAO,KAAK,CAAC,IAAI,CAAC,2BAAmB,CAAC,MAAM,EAAE,CAAC,CAAC;AAClD,CAAC;AAMD,SAAgB,uBAAuB,CAAC,gBAAyB,KAAK;IACpE,OAAO,yBAAyB,EAAE,CAAC;AACrC,CAAC"}
@@ -24,6 +24,9 @@ declare const SetScopeSchema: z.ZodObject<{
24
24
  declare const ResetContextSchema: z.ZodObject<{
25
25
  action: z.ZodLiteral<"reset">;
26
26
  }, z.core.$strip>;
27
+ declare const WhoamiSchema: z.ZodObject<{
28
+ action: z.ZodLiteral<"whoami">;
29
+ }, z.core.$strip>;
27
30
  export declare const ManageContextSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
28
31
  action: z.ZodLiteral<"show">;
29
32
  }, z.core.$strip>, z.ZodObject<{
@@ -42,6 +45,8 @@ export declare const ManageContextSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
42
45
  includeSubgroups: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
43
46
  }, z.core.$strip>, z.ZodObject<{
44
47
  action: z.ZodLiteral<"reset">;
48
+ }, z.core.$strip>, z.ZodObject<{
49
+ action: z.ZodLiteral<"whoami">;
45
50
  }, z.core.$strip>], "action">;
46
51
  export type ManageContextInput = z.infer<typeof ManageContextSchema>;
47
52
  export type ShowContextInput = z.infer<typeof ShowContextSchema>;
@@ -51,4 +56,5 @@ export type SwitchPresetInput = z.infer<typeof SwitchPresetSchema>;
51
56
  export type SwitchProfileInput = z.infer<typeof SwitchProfileSchema>;
52
57
  export type SetScopeInput = z.infer<typeof SetScopeSchema>;
53
58
  export type ResetContextInput = z.infer<typeof ResetContextSchema>;
59
+ export type WhoamiInput = z.infer<typeof WhoamiSchema>;
54
60
  export {};
@@ -40,6 +40,14 @@ const SetScopeSchema = zod_1.z.object({
40
40
  const ResetContextSchema = zod_1.z.object({
41
41
  action: zod_1.z.literal("reset").describe("Reset context to initial state from session start"),
42
42
  });
43
+ const WhoamiSchema = zod_1.z.object({
44
+ action: zod_1.z
45
+ .literal("whoami")
46
+ .describe("Get authentication status, token capabilities, and server configuration. " +
47
+ "Re-introspects token to detect permission changes - if scopes changed, " +
48
+ "automatically refreshes available tools (scopesRefreshed=true in response). " +
49
+ "Use to diagnose access issues or verify new token permissions are active."),
50
+ });
43
51
  exports.ManageContextSchema = zod_1.z.discriminatedUnion("action", [
44
52
  ShowContextSchema,
45
53
  ListPresetsSchema,
@@ -48,5 +56,6 @@ exports.ManageContextSchema = zod_1.z.discriminatedUnion("action", [
48
56
  SwitchProfileSchema,
49
57
  SetScopeSchema,
50
58
  ResetContextSchema,
59
+ WhoamiSchema,
51
60
  ]);
52
61
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../src/entities/context/schema.ts"],"names":[],"mappings":";;;AAaA,6BAAwB;AASxB,MAAM,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;IACjC,MAAM,EAAE,OAAC;SACN,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CAAC,iEAAiE,CAAC;CAC/E,CAAC,CAAC;AAKH,MAAM,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;IACjC,MAAM,EAAE,OAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,8CAA8C,CAAC;CAC3F,CAAC,CAAC;AAKH,MAAM,kBAAkB,GAAG,OAAC,CAAC,MAAM,CAAC;IAClC,MAAM,EAAE,OAAC;SACN,OAAO,CAAC,eAAe,CAAC;SACxB,QAAQ,CAAC,0DAA0D,CAAC;CACxE,CAAC,CAAC;AAKH,MAAM,kBAAkB,GAAG,OAAC,CAAC,MAAM,CAAC;IAClC,MAAM,EAAE,OAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IACzF,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;CACrE,CAAC,CAAC;AAKH,MAAM,mBAAmB,GAAG,OAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,OAAC;SACN,OAAO,CAAC,gBAAgB,CAAC;SACzB,QAAQ,CAAC,uDAAuD,CAAC;IACpE,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;CACvE,CAAC,CAAC;AAKH,MAAM,cAAc,GAAG,OAAC,CAAC,MAAM,CAAC;IAC9B,MAAM,EAAE,OAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,iDAAiD,CAAC;IAC1F,SAAS,EAAE,OAAC;SACT,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,8EAA8E,CAAC;IAC3F,gBAAgB,EAAE,OAAC;SAChB,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,yDAAyD,CAAC;CACvE,CAAC,CAAC;AAKH,MAAM,kBAAkB,GAAG,OAAC,CAAC,MAAM,CAAC;IAClC,MAAM,EAAE,OAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,mDAAmD,CAAC;CACzF,CAAC,CAAC;AASU,QAAA,mBAAmB,GAAG,OAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE;IAChE,iBAAiB;IACjB,iBAAiB;IACjB,kBAAkB;IAClB,kBAAkB;IAClB,mBAAmB;IACnB,cAAc;IACd,kBAAkB;CACnB,CAAC,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../src/entities/context/schema.ts"],"names":[],"mappings":";;;AAcA,6BAAwB;AASxB,MAAM,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;IACjC,MAAM,EAAE,OAAC;SACN,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CAAC,iEAAiE,CAAC;CAC/E,CAAC,CAAC;AAKH,MAAM,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;IACjC,MAAM,EAAE,OAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,8CAA8C,CAAC;CAC3F,CAAC,CAAC;AAKH,MAAM,kBAAkB,GAAG,OAAC,CAAC,MAAM,CAAC;IAClC,MAAM,EAAE,OAAC;SACN,OAAO,CAAC,eAAe,CAAC;SACxB,QAAQ,CAAC,0DAA0D,CAAC;CACxE,CAAC,CAAC;AAKH,MAAM,kBAAkB,GAAG,OAAC,CAAC,MAAM,CAAC;IAClC,MAAM,EAAE,OAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IACzF,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;CACrE,CAAC,CAAC;AAKH,MAAM,mBAAmB,GAAG,OAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,OAAC;SACN,OAAO,CAAC,gBAAgB,CAAC;SACzB,QAAQ,CAAC,uDAAuD,CAAC;IACpE,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;CACvE,CAAC,CAAC;AAKH,MAAM,cAAc,GAAG,OAAC,CAAC,MAAM,CAAC;IAC9B,MAAM,EAAE,OAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,iDAAiD,CAAC;IAC1F,SAAS,EAAE,OAAC;SACT,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,8EAA8E,CAAC;IAC3F,gBAAgB,EAAE,OAAC;SAChB,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,yDAAyD,CAAC;CACvE,CAAC,CAAC;AAKH,MAAM,kBAAkB,GAAG,OAAC,CAAC,MAAM,CAAC;IAClC,MAAM,EAAE,OAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,mDAAmD,CAAC;CACzF,CAAC,CAAC;AAQH,MAAM,YAAY,GAAG,OAAC,CAAC,MAAM,CAAC;IAC5B,MAAM,EAAE,OAAC;SACN,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CACP,2EAA2E;QACzE,yEAAyE;QACzE,8EAA8E;QAC9E,2EAA2E,CAC9E;CACJ,CAAC,CAAC;AASU,QAAA,mBAAmB,GAAG,OAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE;IAChE,iBAAiB;IACjB,iBAAiB;IACjB,kBAAkB;IAClB,kBAAkB;IAClB,mBAAmB;IACnB,cAAc;IACd,kBAAkB;IAClB,YAAY;CACb,CAAC,CAAC"}
@@ -47,3 +47,66 @@ export interface ContextState {
47
47
  initialState?: ContextState;
48
48
  }
49
49
  export type { ProfileInfo };
50
+ export type WhoamiTokenType = "personal_access_token" | "project_access_token" | "group_access_token" | "oauth" | "unknown";
51
+ export interface WhoamiUserInfo {
52
+ id: number;
53
+ username: string;
54
+ name: string;
55
+ email?: string;
56
+ avatarUrl?: string;
57
+ isAdmin?: boolean;
58
+ state: "active" | "blocked" | "deactivated";
59
+ }
60
+ export interface WhoamiTokenInfo {
61
+ type: WhoamiTokenType;
62
+ name: string | null;
63
+ scopes: string[];
64
+ expiresAt: string | null;
65
+ daysUntilExpiry: number | null;
66
+ isValid: boolean;
67
+ hasGraphQLAccess: boolean;
68
+ hasWriteAccess: boolean;
69
+ }
70
+ export interface WhoamiServerInfo {
71
+ host: string;
72
+ apiUrl: string;
73
+ version: string;
74
+ tier: "free" | "premium" | "ultimate" | "unknown";
75
+ edition: "EE" | "CE" | "unknown";
76
+ readOnlyMode: boolean;
77
+ oauthEnabled: boolean;
78
+ }
79
+ export interface WhoamiCapabilities {
80
+ canBrowse: boolean;
81
+ canManage: boolean;
82
+ canAccessGraphQL: boolean;
83
+ availableToolCount: number;
84
+ totalToolCount: number;
85
+ filteredByScopes: number;
86
+ filteredByReadOnly: number;
87
+ filteredByTier: number;
88
+ filteredByDeniedRegex: number;
89
+ filteredByActionDenial: number;
90
+ }
91
+ export type WhoamiRecommendationAction = "create_new_token" | "add_scope" | "enable_oauth" | "contact_admin" | "renew_token";
92
+ export interface WhoamiRecommendation {
93
+ action: WhoamiRecommendationAction;
94
+ message: string;
95
+ url?: string;
96
+ priority: "high" | "medium" | "low";
97
+ }
98
+ export interface WhoamiContextInfo {
99
+ activePreset: string | null;
100
+ activeProfile: string | null;
101
+ scope: RuntimeScope | null;
102
+ }
103
+ export interface WhoamiResult {
104
+ user: WhoamiUserInfo | null;
105
+ token: WhoamiTokenInfo | null;
106
+ server: WhoamiServerInfo;
107
+ capabilities: WhoamiCapabilities;
108
+ context: WhoamiContextInfo;
109
+ warnings: string[];
110
+ recommendations: WhoamiRecommendation[];
111
+ scopesRefreshed: boolean;
112
+ }
@@ -0,0 +1,2 @@
1
+ import { WhoamiResult } from "./types";
2
+ export declare function executeWhoami(): Promise<WhoamiResult>;
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeWhoami = executeWhoami;
4
+ const config_1 = require("../../config");
5
+ const logger_1 = require("../../logger");
6
+ const index_js_1 = require("../../oauth/index.js");
7
+ const ConnectionManager_1 = require("../../services/ConnectionManager");
8
+ const TokenScopeDetector_1 = require("../../services/TokenScopeDetector");
9
+ const registry_manager_1 = require("../../registry-manager");
10
+ const server_1 = require("../../server");
11
+ const fetch_1 = require("../../utils/fetch");
12
+ const context_manager_1 = require("./context-manager");
13
+ function getHost() {
14
+ try {
15
+ const url = new URL(config_1.GITLAB_BASE_URL);
16
+ return url.hostname;
17
+ }
18
+ catch {
19
+ return config_1.GITLAB_BASE_URL;
20
+ }
21
+ }
22
+ async function fetchCurrentUser() {
23
+ try {
24
+ const response = await (0, fetch_1.enhancedFetch)(`${config_1.GITLAB_BASE_URL}/api/v4/user`, {
25
+ retry: false,
26
+ });
27
+ if (!response.ok) {
28
+ logger_1.logger.debug({ status: response.status }, "Failed to fetch current user");
29
+ return null;
30
+ }
31
+ const data = (await response.json());
32
+ return {
33
+ id: data.id,
34
+ username: data.username,
35
+ name: data.name,
36
+ email: data.email,
37
+ avatarUrl: data.avatar_url,
38
+ isAdmin: data.is_admin,
39
+ state: data.state,
40
+ };
41
+ }
42
+ catch (error) {
43
+ logger_1.logger.debug({ error: error instanceof Error ? error.message : String(error) }, "Error fetching current user");
44
+ return null;
45
+ }
46
+ }
47
+ function buildTokenInfo() {
48
+ try {
49
+ const connectionManager = ConnectionManager_1.ConnectionManager.getInstance();
50
+ const tokenScopeInfo = connectionManager.getTokenScopeInfo();
51
+ if (!tokenScopeInfo) {
52
+ if ((0, index_js_1.isOAuthEnabled)()) {
53
+ return {
54
+ type: "oauth",
55
+ name: null,
56
+ scopes: [],
57
+ expiresAt: null,
58
+ daysUntilExpiry: null,
59
+ isValid: true,
60
+ hasGraphQLAccess: true,
61
+ hasWriteAccess: true,
62
+ };
63
+ }
64
+ return null;
65
+ }
66
+ return {
67
+ type: tokenScopeInfo.tokenType,
68
+ name: tokenScopeInfo.name,
69
+ scopes: tokenScopeInfo.scopes,
70
+ expiresAt: tokenScopeInfo.expiresAt,
71
+ daysUntilExpiry: tokenScopeInfo.daysUntilExpiry,
72
+ isValid: tokenScopeInfo.active,
73
+ hasGraphQLAccess: tokenScopeInfo.hasGraphQLAccess,
74
+ hasWriteAccess: tokenScopeInfo.hasWriteAccess,
75
+ };
76
+ }
77
+ catch {
78
+ return null;
79
+ }
80
+ }
81
+ function buildServerInfo() {
82
+ let version = "unknown";
83
+ let tier = "unknown";
84
+ const edition = "unknown";
85
+ try {
86
+ const connectionManager = ConnectionManager_1.ConnectionManager.getInstance();
87
+ const instanceInfo = connectionManager.getInstanceInfo();
88
+ version = instanceInfo.version;
89
+ tier = instanceInfo.tier;
90
+ }
91
+ catch {
92
+ }
93
+ return {
94
+ host: getHost(),
95
+ apiUrl: config_1.GITLAB_BASE_URL,
96
+ version,
97
+ tier,
98
+ edition,
99
+ readOnlyMode: config_1.GITLAB_READ_ONLY_MODE,
100
+ oauthEnabled: (0, index_js_1.isOAuthEnabled)(),
101
+ };
102
+ }
103
+ function buildCapabilities(tokenInfo) {
104
+ const registryManager = registry_manager_1.RegistryManager.getInstance();
105
+ const filterStats = registryManager.getFilterStats();
106
+ const canBrowse = tokenInfo === null ||
107
+ tokenInfo.scopes.length === 0 ||
108
+ tokenInfo.scopes.some(s => ["api", "read_api", "read_user"].includes(s));
109
+ const canManage = tokenInfo?.hasWriteAccess ?? false;
110
+ const canAccessGraphQL = tokenInfo?.hasGraphQLAccess ?? false;
111
+ return {
112
+ canBrowse,
113
+ canManage,
114
+ canAccessGraphQL,
115
+ availableToolCount: filterStats.available,
116
+ totalToolCount: filterStats.total,
117
+ filteredByScopes: filterStats.filteredByScopes,
118
+ filteredByReadOnly: filterStats.filteredByReadOnly,
119
+ filteredByTier: filterStats.filteredByTier,
120
+ filteredByDeniedRegex: filterStats.filteredByDeniedRegex,
121
+ filteredByActionDenial: filterStats.filteredByActionDenial,
122
+ };
123
+ }
124
+ function buildContextInfo() {
125
+ const contextManager = (0, context_manager_1.getContextManager)();
126
+ const context = contextManager.getContext();
127
+ return {
128
+ activePreset: context.presetName ?? null,
129
+ activeProfile: context.profileName ?? null,
130
+ scope: context.scope ?? null,
131
+ };
132
+ }
133
+ function generateWarnings(tokenInfo, capabilities) {
134
+ const warnings = [];
135
+ if (tokenInfo && tokenInfo.daysUntilExpiry !== null) {
136
+ const days = tokenInfo.daysUntilExpiry;
137
+ if (days < 0) {
138
+ warnings.push(`Token has expired (${Math.abs(days)} days ago)`);
139
+ }
140
+ else if (days === 0) {
141
+ warnings.push("Token expires today!");
142
+ }
143
+ else if (days <= 7) {
144
+ warnings.push(`Token expires in ${days} day(s)`);
145
+ }
146
+ }
147
+ if (tokenInfo && !tokenInfo.isValid) {
148
+ warnings.push("Token is invalid or revoked - authentication may fail");
149
+ }
150
+ if (capabilities.filteredByScopes > 0) {
151
+ const pct = Math.round((capabilities.filteredByScopes / capabilities.totalToolCount) * 100);
152
+ warnings.push(`Limited token scopes: ${capabilities.availableToolCount} of ${capabilities.totalToolCount} tools available (${pct}% filtered)`);
153
+ if (!capabilities.canAccessGraphQL) {
154
+ warnings.push("No GraphQL access - project/MR/issue operations unavailable");
155
+ }
156
+ if (!capabilities.canManage) {
157
+ warnings.push("No write access - all manage_* operations blocked");
158
+ }
159
+ }
160
+ if (capabilities.filteredByReadOnly > 0) {
161
+ warnings.push(`Read-only mode enabled: ${capabilities.filteredByReadOnly} write tools disabled`);
162
+ }
163
+ if (capabilities.filteredByTier > 0) {
164
+ warnings.push(`GitLab tier restrictions: ${capabilities.filteredByTier} tools unavailable for current tier`);
165
+ }
166
+ if (capabilities.filteredByDeniedRegex > 0) {
167
+ warnings.push(`Tool access restrictions: ${capabilities.filteredByDeniedRegex} tools blocked by configuration`);
168
+ }
169
+ return warnings;
170
+ }
171
+ function generateRecommendations(tokenInfo, capabilities, serverInfo) {
172
+ const recommendations = [];
173
+ if (tokenInfo && tokenInfo.daysUntilExpiry !== null && tokenInfo.daysUntilExpiry < 0) {
174
+ recommendations.push({
175
+ action: "renew_token",
176
+ message: "Your token has expired. Create a new token to restore access.",
177
+ url: (0, TokenScopeDetector_1.getTokenCreationUrl)(config_1.GITLAB_BASE_URL, ["api", "read_user"]),
178
+ priority: "high",
179
+ });
180
+ }
181
+ if (tokenInfo &&
182
+ tokenInfo.daysUntilExpiry !== null &&
183
+ tokenInfo.daysUntilExpiry >= 0 &&
184
+ tokenInfo.daysUntilExpiry <= 7) {
185
+ recommendations.push({
186
+ action: "renew_token",
187
+ message: `Your token expires in ${tokenInfo.daysUntilExpiry} day(s). Renew soon to avoid service interruption.`,
188
+ url: (0, TokenScopeDetector_1.getTokenCreationUrl)(config_1.GITLAB_BASE_URL, ["api", "read_user"]),
189
+ priority: "medium",
190
+ });
191
+ }
192
+ const needsNewToken = capabilities.filteredByScopes > 0 && !capabilities.canManage;
193
+ if (needsNewToken) {
194
+ recommendations.push({
195
+ action: "create_new_token",
196
+ message: "Create a token with 'api' scope for full GitLab functionality",
197
+ url: (0, TokenScopeDetector_1.getTokenCreationUrl)(config_1.GITLAB_BASE_URL, ["api", "read_user"]),
198
+ priority: "high",
199
+ });
200
+ }
201
+ if (!needsNewToken &&
202
+ !capabilities.canAccessGraphQL &&
203
+ tokenInfo &&
204
+ tokenInfo.scopes.length > 0) {
205
+ recommendations.push({
206
+ action: "add_scope",
207
+ message: "Add 'api' or 'read_api' scope to enable project, issue, and MR operations",
208
+ url: (0, TokenScopeDetector_1.getTokenCreationUrl)(config_1.GITLAB_BASE_URL, ["api", "read_user"]),
209
+ priority: "high",
210
+ });
211
+ }
212
+ if (capabilities.filteredByTier > 0 && serverInfo.tier === "free") {
213
+ recommendations.push({
214
+ action: "contact_admin",
215
+ message: "Some features require GitLab Premium or Ultimate. Contact your administrator for tier upgrade.",
216
+ priority: "low",
217
+ });
218
+ }
219
+ return recommendations;
220
+ }
221
+ async function executeWhoami() {
222
+ let scopesRefreshed = false;
223
+ try {
224
+ const connectionManager = ConnectionManager_1.ConnectionManager.getInstance();
225
+ scopesRefreshed = await connectionManager.refreshTokenScopes();
226
+ if (scopesRefreshed) {
227
+ logger_1.logger.info("Token scopes changed - refreshing tool registry");
228
+ registry_manager_1.RegistryManager.getInstance().refreshCache();
229
+ await (0, server_1.sendToolsListChangedNotification)();
230
+ }
231
+ }
232
+ catch (error) {
233
+ logger_1.logger.debug({ error: error instanceof Error ? error.message : String(error) }, "Failed to refresh token scopes");
234
+ }
235
+ const [userInfo, tokenInfo] = await Promise.all([
236
+ fetchCurrentUser(),
237
+ Promise.resolve(buildTokenInfo()),
238
+ ]);
239
+ const serverInfo = buildServerInfo();
240
+ const capabilities = buildCapabilities(tokenInfo);
241
+ const contextInfo = buildContextInfo();
242
+ const warnings = generateWarnings(tokenInfo, capabilities);
243
+ const recommendations = generateRecommendations(tokenInfo, capabilities, serverInfo);
244
+ logger_1.logger.debug({
245
+ hasUser: userInfo !== null,
246
+ hasToken: tokenInfo !== null,
247
+ availableTools: capabilities.availableToolCount,
248
+ warnings: warnings.length,
249
+ recommendations: recommendations.length,
250
+ scopesRefreshed,
251
+ }, "Whoami executed");
252
+ return {
253
+ user: userInfo,
254
+ token: tokenInfo,
255
+ server: serverInfo,
256
+ capabilities,
257
+ context: contextInfo,
258
+ warnings,
259
+ recommendations,
260
+ scopesRefreshed,
261
+ };
262
+ }
263
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../../src/entities/context/whoami.ts"],"names":[],"mappings":"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"}
@@ -23,5 +23,15 @@ declare class RegistryManager {
23
23
  getAllToolDefinitionsUnfiltered(): EnhancedToolDefinition[];
24
24
  hasToolHandler(toolName: string): boolean;
25
25
  getAvailableToolNames(): string[];
26
+ getFilterStats(): FilterStats;
27
+ }
28
+ export interface FilterStats {
29
+ available: number;
30
+ total: number;
31
+ filteredByScopes: number;
32
+ filteredByReadOnly: number;
33
+ filteredByTier: number;
34
+ filteredByDeniedRegex: number;
35
+ filteredByActionDenial: number;
26
36
  }
27
37
  export { RegistryManager };
@@ -423,6 +423,65 @@ class RegistryManager {
423
423
  this.toolNamesCache ??= Array.from(this.toolLookupCache.keys());
424
424
  return this.toolNamesCache;
425
425
  }
426
+ getFilterStats() {
427
+ let totalTools = 0;
428
+ for (const registry of this.registries.values()) {
429
+ totalTools += registry.size;
430
+ }
431
+ const availableTools = this.toolLookupCache.size;
432
+ let filteredByReadOnly = 0;
433
+ let filteredByDeniedRegex = 0;
434
+ let filteredByScopes = 0;
435
+ let filteredByTier = 0;
436
+ let filteredByActionDenial = 0;
437
+ let tokenScopes;
438
+ try {
439
+ const scopeInfo = ConnectionManager_1.ConnectionManager.getInstance().getTokenScopeInfo();
440
+ if (scopeInfo) {
441
+ tokenScopes = scopeInfo.scopes;
442
+ }
443
+ }
444
+ catch {
445
+ }
446
+ for (const registry of this.registries.values()) {
447
+ for (const [toolName, tool] of registry) {
448
+ if (this.toolLookupCache.has(toolName)) {
449
+ continue;
450
+ }
451
+ if (config_1.GITLAB_READ_ONLY_MODE && !this.getReadOnlyTools().includes(toolName)) {
452
+ filteredByReadOnly++;
453
+ continue;
454
+ }
455
+ if (config_1.GITLAB_DENIED_TOOLS_REGEX?.test(toolName)) {
456
+ filteredByDeniedRegex++;
457
+ continue;
458
+ }
459
+ if (tokenScopes && !(0, TokenScopeDetector_1.isToolAvailableForScopes)(toolName, tokenScopes)) {
460
+ filteredByScopes++;
461
+ continue;
462
+ }
463
+ if (!ToolAvailability_1.ToolAvailability.isToolAvailable(toolName)) {
464
+ filteredByTier++;
465
+ continue;
466
+ }
467
+ const allActions = (0, schema_utils_1.extractActionsFromSchema)(tool.inputSchema);
468
+ if (allActions.length > 0 && (0, schema_utils_1.shouldRemoveTool)(toolName, allActions)) {
469
+ filteredByActionDenial++;
470
+ continue;
471
+ }
472
+ filteredByTier++;
473
+ }
474
+ }
475
+ return {
476
+ available: availableTools,
477
+ total: totalTools,
478
+ filteredByScopes,
479
+ filteredByReadOnly,
480
+ filteredByTier,
481
+ filteredByDeniedRegex,
482
+ filteredByActionDenial,
483
+ };
484
+ }
426
485
  }
427
486
  exports.RegistryManager = RegistryManager;
428
487
  //# sourceMappingURL=registry-manager.js.map