@clavex/mcp-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +107 -0
  2. package/dist/client.d.ts +38 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +121 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/helpers.d.ts +14 -0
  7. package/dist/helpers.d.ts.map +1 -0
  8. package/dist/helpers.js +44 -0
  9. package/dist/helpers.js.map +1 -0
  10. package/dist/index.d.ts +24 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +59 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/tools/access_reviews.d.ts +3 -0
  15. package/dist/tools/access_reviews.d.ts.map +1 -0
  16. package/dist/tools/access_reviews.js +131 -0
  17. package/dist/tools/access_reviews.js.map +1 -0
  18. package/dist/tools/ai.d.ts +3 -0
  19. package/dist/tools/ai.d.ts.map +1 -0
  20. package/dist/tools/ai.js +443 -0
  21. package/dist/tools/ai.js.map +1 -0
  22. package/dist/tools/ciba.d.ts +3 -0
  23. package/dist/tools/ciba.d.ts.map +1 -0
  24. package/dist/tools/ciba.js +85 -0
  25. package/dist/tools/ciba.js.map +1 -0
  26. package/dist/tools/clients.d.ts +3 -0
  27. package/dist/tools/clients.d.ts.map +1 -0
  28. package/dist/tools/clients.js +124 -0
  29. package/dist/tools/clients.js.map +1 -0
  30. package/dist/tools/developer.d.ts +3 -0
  31. package/dist/tools/developer.d.ts.map +1 -0
  32. package/dist/tools/developer.js +580 -0
  33. package/dist/tools/developer.js.map +1 -0
  34. package/dist/tools/fga.d.ts +3 -0
  35. package/dist/tools/fga.d.ts.map +1 -0
  36. package/dist/tools/fga.js +126 -0
  37. package/dist/tools/fga.js.map +1 -0
  38. package/dist/tools/groups.d.ts +3 -0
  39. package/dist/tools/groups.d.ts.map +1 -0
  40. package/dist/tools/groups.js +135 -0
  41. package/dist/tools/groups.js.map +1 -0
  42. package/dist/tools/idps.d.ts +3 -0
  43. package/dist/tools/idps.d.ts.map +1 -0
  44. package/dist/tools/idps.js +98 -0
  45. package/dist/tools/idps.js.map +1 -0
  46. package/dist/tools/orgs.d.ts +3 -0
  47. package/dist/tools/orgs.d.ts.map +1 -0
  48. package/dist/tools/orgs.js +90 -0
  49. package/dist/tools/orgs.js.map +1 -0
  50. package/dist/tools/pam.d.ts +3 -0
  51. package/dist/tools/pam.d.ts.map +1 -0
  52. package/dist/tools/pam.js +238 -0
  53. package/dist/tools/pam.js.map +1 -0
  54. package/dist/tools/policies.d.ts +3 -0
  55. package/dist/tools/policies.d.ts.map +1 -0
  56. package/dist/tools/policies.js +173 -0
  57. package/dist/tools/policies.js.map +1 -0
  58. package/dist/tools/ssf.d.ts +3 -0
  59. package/dist/tools/ssf.d.ts.map +1 -0
  60. package/dist/tools/ssf.js +65 -0
  61. package/dist/tools/ssf.js.map +1 -0
  62. package/dist/tools/users.d.ts +3 -0
  63. package/dist/tools/users.d.ts.map +1 -0
  64. package/dist/tools/users.js +144 -0
  65. package/dist/tools/users.js.map +1 -0
  66. package/package.json +48 -0
  67. package/src/client.ts +148 -0
  68. package/src/helpers.ts +45 -0
  69. package/src/index.ts +63 -0
  70. package/src/tools/access_reviews.ts +163 -0
  71. package/src/tools/ai.ts +581 -0
  72. package/src/tools/ciba.ts +109 -0
  73. package/src/tools/clients.ts +168 -0
  74. package/src/tools/developer.ts +661 -0
  75. package/src/tools/fga.ts +148 -0
  76. package/src/tools/groups.ts +200 -0
  77. package/src/tools/idps.ts +137 -0
  78. package/src/tools/orgs.ts +119 -0
  79. package/src/tools/pam.ts +285 -0
  80. package/src/tools/policies.ts +233 -0
  81. package/src/tools/ssf.ts +82 -0
  82. package/src/tools/users.ts +202 -0
  83. package/tsconfig.json +18 -0
package/README.md ADDED
@@ -0,0 +1,107 @@
1
+ # @clavex/mcp-server
2
+
3
+ MCP server for the [Clavex Identity Platform](https://clavex.eu), enabling Claude (and any MCP-compatible AI client) to manage organizations, users, OIDC clients, identity providers, and auth policies via natural language.
4
+
5
+ ## Tools (~30 total)
6
+
7
+ | Domain | Tools |
8
+ |--------|-------|
9
+ | **Organizations** | `clavex_list_orgs`, `clavex_get_org`, `clavex_create_org`, `clavex_update_org` |
10
+ | **Users** | `clavex_list_users`, `clavex_get_user`, `clavex_create_user`, `clavex_update_user`, `clavex_delete_user`, `clavex_send_password_reset`, `clavex_list_user_roles` |
11
+ | **Groups & Roles** | `clavex_list_groups`, `clavex_create_group`, `clavex_list_group_members`, `clavex_add_group_member`, `clavex_remove_group_member`, `clavex_list_roles`, `clavex_assign_role`, `clavex_unassign_role` |
12
+ | **OIDC Clients** | `clavex_list_clients`, `clavex_get_client`, `clavex_create_client`, `clavex_update_client`, `clavex_rotate_client_secret` |
13
+ | **Identity Providers** | `clavex_list_idps`, `clavex_get_idp` |
14
+ | **Webhooks** | `clavex_list_webhooks`, `clavex_create_webhook`, `clavex_delete_webhook` |
15
+ | **Auth Policies** | `clavex_list_policies`, `clavex_create_policy`, `clavex_delete_policy`, `clavex_simulate_policy` |
16
+ | **API Keys** | `clavex_list_api_keys`, `clavex_create_api_key`, `clavex_delete_api_key` |
17
+ | **Usage** | `clavex_get_usage` |
18
+
19
+ ## Setup
20
+
21
+ ### 1. Build
22
+
23
+ ```bash
24
+ cd sdk/mcp
25
+ npm install
26
+ npm run build
27
+ ```
28
+
29
+ ### 2. Configure Claude Desktop
30
+
31
+ Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
32
+
33
+ ```json
34
+ {
35
+ "mcpServers": {
36
+ "clavex": {
37
+ "command": "node",
38
+ "args": ["/path/to/clavex/sdk/mcp/dist/index.js"],
39
+ "env": {
40
+ "CLAVEX_BASE_URL": "https://auth.example.com",
41
+ "CLAVEX_TOKEN": "your-admin-jwt-token"
42
+ }
43
+ }
44
+ }
45
+ }
46
+ ```
47
+
48
+ Or use email + password auto-login:
49
+
50
+ ```json
51
+ {
52
+ "mcpServers": {
53
+ "clavex": {
54
+ "command": "node",
55
+ "args": ["/path/to/clavex/sdk/mcp/dist/index.js"],
56
+ "env": {
57
+ "CLAVEX_BASE_URL": "https://auth.example.com",
58
+ "CLAVEX_EMAIL": "admin@example.com",
59
+ "CLAVEX_PASSWORD": "your-password"
60
+ }
61
+ }
62
+ }
63
+ }
64
+ ```
65
+
66
+ ### 3. Configure Claude API (claude.ai Projects)
67
+
68
+ In your project's MCP settings, point to this server with the same env variables.
69
+
70
+ ## Environment Variables
71
+
72
+ | Variable | Required | Description |
73
+ |----------|----------|-------------|
74
+ | `CLAVEX_BASE_URL` | ✅ | Clavex server URL, e.g. `https://auth.example.com` |
75
+ | `CLAVEX_TOKEN` | One of these | Pre-acquired JWT bearer token |
76
+ | `CLAVEX_EMAIL` | One of these | Admin email for password-based login |
77
+ | `CLAVEX_PASSWORD` | with EMAIL | Admin password |
78
+ | `CLAVEX_ORG_SLUG` | optional | Org slug (omit for superadmin login) |
79
+
80
+ ## Example Prompts
81
+
82
+ ```
83
+ Create a new organization for Acme Corp with slug "acme" and domain acme.com
84
+
85
+ Register Grafana as an OIDC client in the acme org with redirect URI https://grafana.acme.com/login/generic_oauth
86
+
87
+ Add alice@acme.com to the acme org and put her in the Admins group
88
+
89
+ Block all logins from Russia and China for the acme organization
90
+
91
+ Show me all active users in org <id>
92
+
93
+ Simulate what would happen if a user from IP 1.2.3.4 (country: RU) tried to log into org <id>
94
+ ```
95
+
96
+ ## Testing
97
+
98
+ ```bash
99
+ # Inspect available tools
100
+ npx @modelcontextprotocol/inspector node dist/index.js
101
+ ```
102
+
103
+ ## Security Notes
104
+
105
+ - **Never** commit `CLAVEX_TOKEN` or credentials to source control — use environment variables or secrets managers.
106
+ - The `clavex_delete_user`, `clavex_delete_webhook`, and `clavex_delete_api_key` tools are marked `destructiveHint: true` — Claude will prompt for confirmation before executing them.
107
+ - `client_secret` and API key secrets are returned only once at creation time and only over the MCP tool response (which is shown to you in the chat) — they are never logged.
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Clavex API client used by all MCP tools.
3
+ * Reads credentials from environment variables:
4
+ *
5
+ * CLAVEX_BASE_URL — required, e.g. https://auth.example.com
6
+ * CLAVEX_TOKEN — pre-acquired JWT bearer token (preferred)
7
+ *
8
+ * — or —
9
+ *
10
+ * CLAVEX_EMAIL — admin email (auto-login on first call)
11
+ * CLAVEX_PASSWORD — admin password
12
+ * CLAVEX_ORG_SLUG — org slug (omit for superadmin)
13
+ */
14
+ export declare class ClavexAPIError extends Error {
15
+ readonly status: number;
16
+ readonly body: unknown;
17
+ constructor(status: number, body: unknown, message: string);
18
+ }
19
+ export declare class ClavexClient {
20
+ private readonly baseURL;
21
+ private token;
22
+ private loginPromise;
23
+ private readonly email;
24
+ private readonly password;
25
+ private readonly orgSlug;
26
+ constructor();
27
+ private ensureToken;
28
+ private doLogin;
29
+ request<T>(method: string, path: string, body?: unknown, auth?: boolean): Promise<T>;
30
+ get<T>(path: string): Promise<T>;
31
+ post<T>(path: string, body?: unknown): Promise<T>;
32
+ patch<T>(path: string, body: unknown): Promise<T>;
33
+ put<T>(path: string, body?: unknown): Promise<T>;
34
+ del<T>(path: string): Promise<T>;
35
+ orgPath(orgID: string, suffix: string): string;
36
+ }
37
+ export declare function getClient(): ClavexClient;
38
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,qBAAa,cAAe,SAAQ,KAAK;aAErB,MAAM,EAAE,MAAM;aACd,IAAI,EAAE,OAAO;gBADb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EAC7B,OAAO,EAAE,MAAM;CAKlB;AAMD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,YAAY,CAA8B;IAGlD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;;YAY/B,WAAW;YAkBX,OAAO;IAUf,OAAO,CAAC,CAAC,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,IAAI,UAAO,GACV,OAAO,CAAC,CAAC,CAAC;IAsCb,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAGhC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAGjD,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAGjD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAGhD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;CAG/C;AAKD,wBAAgB,SAAS,IAAI,YAAY,CAGxC"}
package/dist/client.js ADDED
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Clavex API client used by all MCP tools.
3
+ * Reads credentials from environment variables:
4
+ *
5
+ * CLAVEX_BASE_URL — required, e.g. https://auth.example.com
6
+ * CLAVEX_TOKEN — pre-acquired JWT bearer token (preferred)
7
+ *
8
+ * — or —
9
+ *
10
+ * CLAVEX_EMAIL — admin email (auto-login on first call)
11
+ * CLAVEX_PASSWORD — admin password
12
+ * CLAVEX_ORG_SLUG — org slug (omit for superadmin)
13
+ */
14
+ export class ClavexAPIError extends Error {
15
+ status;
16
+ body;
17
+ constructor(status, body, message) {
18
+ super(message);
19
+ this.status = status;
20
+ this.body = body;
21
+ this.name = "ClavexAPIError";
22
+ }
23
+ }
24
+ export class ClavexClient {
25
+ baseURL;
26
+ token;
27
+ loginPromise = null;
28
+ // Credential fields for auto-login
29
+ email;
30
+ password;
31
+ orgSlug;
32
+ constructor() {
33
+ const base = process.env.CLAVEX_BASE_URL;
34
+ if (!base)
35
+ throw new Error("CLAVEX_BASE_URL environment variable is required");
36
+ this.baseURL = base.replace(/\/+$/, "");
37
+ this.token = process.env.CLAVEX_TOKEN;
38
+ this.email = process.env.CLAVEX_EMAIL;
39
+ this.password = process.env.CLAVEX_PASSWORD;
40
+ this.orgSlug = process.env.CLAVEX_ORG_SLUG;
41
+ }
42
+ async ensureToken() {
43
+ if (this.token)
44
+ return;
45
+ if (!this.email || !this.password) {
46
+ throw new Error("Authentication required: set CLAVEX_TOKEN or CLAVEX_EMAIL + CLAVEX_PASSWORD");
47
+ }
48
+ if (!this.loginPromise) {
49
+ this.loginPromise = this.doLogin().then(() => {
50
+ this.loginPromise = null;
51
+ }).catch((e) => {
52
+ this.loginPromise = null;
53
+ throw e;
54
+ });
55
+ }
56
+ await this.loginPromise;
57
+ }
58
+ async doLogin() {
59
+ const resp = await this.request("POST", "/api/v1/auth/login", { org_slug: this.orgSlug, email: this.email, password: this.password }, false);
60
+ this.token = resp.token;
61
+ }
62
+ async request(method, path, body, auth = true) {
63
+ if (auth)
64
+ await this.ensureToken();
65
+ const headers = {
66
+ "Content-Type": "application/json",
67
+ Accept: "application/json",
68
+ };
69
+ if (auth && this.token) {
70
+ headers["Authorization"] = `Bearer ${this.token}`;
71
+ }
72
+ const res = await fetch(this.baseURL + path, {
73
+ method,
74
+ headers,
75
+ body: body !== undefined ? JSON.stringify(body) : undefined,
76
+ });
77
+ if (res.status === 204)
78
+ return undefined;
79
+ let resBody;
80
+ const ct = res.headers.get("content-type") ?? "";
81
+ if (ct.includes("application/json")) {
82
+ resBody = await res.json();
83
+ }
84
+ else {
85
+ resBody = await res.text();
86
+ }
87
+ if (!res.ok) {
88
+ const msg = typeof resBody === "object" && resBody !== null && "error" in resBody
89
+ ? String(resBody.error)
90
+ : String(resBody);
91
+ throw new ClavexAPIError(res.status, resBody, `${method} ${path} → ${res.status}: ${msg}`);
92
+ }
93
+ return resBody;
94
+ }
95
+ get(path) {
96
+ return this.request("GET", path);
97
+ }
98
+ post(path, body) {
99
+ return this.request("POST", path, body);
100
+ }
101
+ patch(path, body) {
102
+ return this.request("PATCH", path, body);
103
+ }
104
+ put(path, body) {
105
+ return this.request("PUT", path, body);
106
+ }
107
+ del(path) {
108
+ return this.request("DELETE", path);
109
+ }
110
+ orgPath(orgID, suffix) {
111
+ return `/api/v1/organizations/${orgID}${suffix}`;
112
+ }
113
+ }
114
+ // Singleton — created lazily on first tool call
115
+ let _client = null;
116
+ export function getClient() {
117
+ if (!_client)
118
+ _client = new ClavexClient();
119
+ return _client;
120
+ }
121
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAErB;IACA;IAFlB,YACkB,MAAc,EACd,IAAa,EAC7B,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAS;QAI7B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAMD,MAAM,OAAO,YAAY;IACN,OAAO,CAAS;IACzB,KAAK,CAAqB;IAC1B,YAAY,GAAyB,IAAI,CAAC;IAElD,mCAAmC;IAClB,KAAK,CAAqB;IAC1B,QAAQ,CAAqB;IAC7B,OAAO,CAAqB;IAE7C;QACE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QACzC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAC/E,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC7C,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC3C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YAC3B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;gBACb,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBACzB,MAAM,CAAC,CAAC;YACV,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAC7B,MAAM,EACN,oBAAoB,EACpB,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EACtE,KAAK,CACN,CAAC;QACF,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,OAAO,CACX,MAAc,EACd,IAAY,EACZ,IAAc,EACd,IAAI,GAAG,IAAI;QAEX,IAAI,IAAI;YAAE,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnC,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,kBAAkB;SAC3B,CAAC;QACF,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACvB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC;QACpD,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE;YAC3C,MAAM;YACN,OAAO;YACP,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC5D,CAAC,CAAC;QAEH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,SAAyB,CAAC;QAEzD,IAAI,OAAgB,CAAC;QACrB,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QACjD,IAAI,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACpC,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,GAAG,GACP,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,IAAI,OAAO;gBACnE,CAAC,CAAC,MAAM,CAAE,OAAmC,CAAC,KAAK,CAAC;gBACpD,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,IAAI,MAAM,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC;QAC7F,CAAC;QAED,OAAO,OAAY,CAAC;IACtB,CAAC;IAED,GAAG,CAAI,IAAY;QACjB,OAAO,IAAI,CAAC,OAAO,CAAI,KAAK,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,CAAI,IAAY,EAAE,IAAc;QAClC,OAAO,IAAI,CAAC,OAAO,CAAI,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IACD,KAAK,CAAI,IAAY,EAAE,IAAa;QAClC,OAAO,IAAI,CAAC,OAAO,CAAI,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,GAAG,CAAI,IAAY,EAAE,IAAc;QACjC,OAAO,IAAI,CAAC,OAAO,CAAI,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;IACD,GAAG,CAAI,IAAY;QACjB,OAAO,IAAI,CAAC,OAAO,CAAI,QAAQ,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,CAAC,KAAa,EAAE,MAAc;QACnC,OAAO,yBAAyB,KAAK,GAAG,MAAM,EAAE,CAAC;IACnD,CAAC;CACF;AAED,gDAAgD;AAChD,IAAI,OAAO,GAAwB,IAAI,CAAC;AAExC,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC,OAAO;QAAE,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;IAC3C,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Wraps a tool handler so API errors become user-facing error messages
3
+ * instead of crashing the MCP server.
4
+ */
5
+ export declare function handleError<T>(fn: () => Promise<T>): Promise<{
6
+ content: Array<{
7
+ type: "text";
8
+ text: string;
9
+ }>;
10
+ isError?: boolean;
11
+ }>;
12
+ /** Format an array of objects as a readable Markdown table. */
13
+ export declare function mdTable(rows: Record<string, unknown>[], cols?: string[]): string;
14
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAwBhF;AAED,+DAA+D;AAC/D,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAShF"}
@@ -0,0 +1,44 @@
1
+ import { ClavexAPIError } from "./client.js";
2
+ /**
3
+ * Wraps a tool handler so API errors become user-facing error messages
4
+ * instead of crashing the MCP server.
5
+ */
6
+ export async function handleError(fn) {
7
+ try {
8
+ const result = await fn();
9
+ return {
10
+ content: [{ type: "text", text: typeof result === "string" ? result : JSON.stringify(result, null, 2) }],
11
+ };
12
+ }
13
+ catch (err) {
14
+ if (err instanceof ClavexAPIError) {
15
+ return {
16
+ content: [{ type: "text", text: `Error ${err.status}: ${err.message}` }],
17
+ isError: true,
18
+ };
19
+ }
20
+ if (err instanceof Error) {
21
+ return {
22
+ content: [{ type: "text", text: `Error: ${err.message}` }],
23
+ isError: true,
24
+ };
25
+ }
26
+ return {
27
+ content: [{ type: "text", text: `Unknown error: ${String(err)}` }],
28
+ isError: true,
29
+ };
30
+ }
31
+ }
32
+ /** Format an array of objects as a readable Markdown table. */
33
+ export function mdTable(rows, cols) {
34
+ if (!rows.length)
35
+ return "_No results._";
36
+ const keys = cols ?? Object.keys(rows[0]);
37
+ const header = `| ${keys.join(" | ")} |`;
38
+ const sep = `| ${keys.map(() => "---").join(" | ")} |`;
39
+ const body = rows
40
+ .map((r) => `| ${keys.map((k) => String(r[k] ?? "—")).join(" | ")} |`)
41
+ .join("\n");
42
+ return [header, sep, body].join("\n");
43
+ }
44
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,EAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;QAC1B,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SACzG,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;YAClC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;gBACxE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QACD,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC1D,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QACD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YAClE,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,OAAO,CAAC,IAA+B,EAAE,IAAe;IACtE,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,eAAe,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzC,MAAM,GAAG,GAAM,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IAC1D,MAAM,IAAI,GAAK,IAAI;SAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;SACrE,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Clavex MCP Server — entry point
4
+ *
5
+ * Exposes ~30 tools for managing Clavex via natural language through Claude.
6
+ * Uses stdio transport (compatible with Claude Desktop, Claude API, MCP Inspector).
7
+ *
8
+ * Configuration via environment variables:
9
+ *
10
+ * CLAVEX_BASE_URL — required, e.g. https://auth.example.com
11
+ * CLAVEX_TOKEN — pre-acquired JWT bearer token (preferred)
12
+ *
13
+ * — or —
14
+ *
15
+ * CLAVEX_EMAIL — admin email (auto-login on first call)
16
+ * CLAVEX_PASSWORD — admin password
17
+ * CLAVEX_ORG_SLUG — org slug (omit for superadmin login)
18
+ *
19
+ * Usage:
20
+ * node dist/index.js
21
+ * npx @clavex/mcp-server
22
+ */
23
+ export {};
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;GAoBG"}
package/dist/index.js ADDED
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Clavex MCP Server — entry point
4
+ *
5
+ * Exposes ~30 tools for managing Clavex via natural language through Claude.
6
+ * Uses stdio transport (compatible with Claude Desktop, Claude API, MCP Inspector).
7
+ *
8
+ * Configuration via environment variables:
9
+ *
10
+ * CLAVEX_BASE_URL — required, e.g. https://auth.example.com
11
+ * CLAVEX_TOKEN — pre-acquired JWT bearer token (preferred)
12
+ *
13
+ * — or —
14
+ *
15
+ * CLAVEX_EMAIL — admin email (auto-login on first call)
16
+ * CLAVEX_PASSWORD — admin password
17
+ * CLAVEX_ORG_SLUG — org slug (omit for superadmin login)
18
+ *
19
+ * Usage:
20
+ * node dist/index.js
21
+ * npx @clavex/mcp-server
22
+ */
23
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
24
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
25
+ import { registerOrgTools } from "./tools/orgs.js";
26
+ import { registerUserTools } from "./tools/users.js";
27
+ import { registerGroupTools } from "./tools/groups.js";
28
+ import { registerClientTools } from "./tools/clients.js";
29
+ import { registerIDPTools } from "./tools/idps.js";
30
+ import { registerPolicyTools } from "./tools/policies.js";
31
+ import { registerCIBATools } from "./tools/ciba.js";
32
+ import { registerFGATools } from "./tools/fga.js";
33
+ import { registerAccessReviewTools } from "./tools/access_reviews.js";
34
+ import { registerSSFTools } from "./tools/ssf.js";
35
+ import { registerAITools } from "./tools/ai.js";
36
+ import { registerPAMTools } from "./tools/pam.js";
37
+ import { registerDeveloperTools } from "./tools/developer.js";
38
+ const server = new McpServer({
39
+ name: "clavex-mcp-server",
40
+ version: "1.2.0",
41
+ });
42
+ // Register all tool domains
43
+ registerOrgTools(server);
44
+ registerUserTools(server);
45
+ registerGroupTools(server);
46
+ registerClientTools(server);
47
+ registerIDPTools(server);
48
+ registerPolicyTools(server);
49
+ registerCIBATools(server);
50
+ registerFGATools(server);
51
+ registerAccessReviewTools(server);
52
+ registerSSFTools(server);
53
+ registerAITools(server);
54
+ registerPAMTools(server);
55
+ registerDeveloperTools(server);
56
+ // Connect via stdio (Claude Desktop / Claude API compatible)
57
+ const transport = new StdioServerTransport();
58
+ await server.connect(transport);
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,gBAAgB,EAAE,MAAe,iBAAiB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAc,kBAAkB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAa,mBAAmB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAY,oBAAoB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAe,iBAAiB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAY,qBAAqB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAc,iBAAiB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAe,gBAAgB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAe,gBAAgB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAgB,eAAe,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAe,gBAAgB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAS,sBAAsB,CAAC;AAEjE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,mBAAmB;IACzB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,4BAA4B;AAC5B,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACzB,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC1B,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC3B,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACzB,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC1B,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACzB,yBAAyB,CAAC,MAAM,CAAC,CAAC;AAClC,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACzB,eAAe,CAAC,MAAM,CAAC,CAAC;AACxB,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACzB,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAE/B,6DAA6D;AAC7D,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerAccessReviewTools(server: McpServer): void;
3
+ //# sourceMappingURL=access_reviews.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access_reviews.d.ts","sourceRoot":"","sources":["../../src/tools/access_reviews.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6JjE"}
@@ -0,0 +1,131 @@
1
+ import { z } from "zod";
2
+ import { getClient } from "../client.js";
3
+ import { handleError, mdTable } from "../helpers.js";
4
+ export function registerAccessReviewTools(server) {
5
+ // ── List access review campaigns ───────────────────────────────────────────
6
+ server.registerTool("clavex_list_access_reviews", {
7
+ title: "List Access Review Campaigns",
8
+ description: `List access review (access certification) campaigns for an organization.
9
+
10
+ Access reviews are periodic or triggered campaigns where managers certify whether
11
+ users should retain their roles and permissions (JML — Joiner/Mover/Leaver compliance).
12
+
13
+ Returns: id, name, status (pending/active/completed/cancelled), starts_at, ends_at, item counts.
14
+
15
+ Status values:
16
+ "pending" — scheduled, not yet started
17
+ "active" — in progress, items are awaiting reviewer decisions
18
+ "completed" — all items decided
19
+ "cancelled" — cancelled before completion
20
+
21
+ Use when:
22
+ "show access review campaigns for org <id>"
23
+ "what reviews are currently active?"
24
+ "mostrami le campagne di access review"`,
25
+ inputSchema: {
26
+ org_id: z.string().uuid().describe("Organization UUID"),
27
+ },
28
+ annotations: { readOnlyHint: true, destructiveHint: false },
29
+ }, async ({ org_id }) => handleError(async () => {
30
+ const campaigns = await getClient().get(getClient().orgPath(org_id, "/access-reviews"));
31
+ if (!Array.isArray(campaigns) || campaigns.length === 0) {
32
+ return "_No access review campaigns found._";
33
+ }
34
+ return mdTable(campaigns, ["id", "name", "status", "starts_at", "ends_at"]);
35
+ }));
36
+ // ── Create access review campaign ──────────────────────────────────────────
37
+ server.registerTool("clavex_create_access_review", {
38
+ title: "Create Access Review Campaign",
39
+ description: `Create a new access review (certification) campaign for an organization.
40
+
41
+ A campaign generates one review item per (user, role) assignment in the org.
42
+ Items are sent to reviewers who decide keep/revoke for each assignment.
43
+
44
+ Args:
45
+ - org_id: Organization UUID
46
+ - name: Campaign name — e.g. "Q2 2026 Quarterly Access Review" or "Annual HR Certification"
47
+ - starts_at: ISO 8601 datetime when the campaign begins (e.g. "2026-06-01T00:00:00Z")
48
+ - ends_at: ISO 8601 datetime when the campaign expires — unreviewed items auto-revoke
49
+ - description (optional): Human-readable purpose of this campaign
50
+
51
+ Returns: Created campaign JSON including the campaign_id.
52
+
53
+ Use when:
54
+ "create a quarterly access review for org <id> starting June 1"
55
+ "lancia la campagna di access review trimestrale"
56
+ "schedule annual certification"`,
57
+ inputSchema: {
58
+ org_id: z.string().uuid().describe("Organization UUID"),
59
+ name: z.string().describe("Campaign name, e.g. 'Q2 2026 Quarterly Review'"),
60
+ starts_at: z.string().describe("ISO 8601 start datetime, e.g. '2026-06-01T00:00:00Z'"),
61
+ ends_at: z.string().describe("ISO 8601 end/deadline datetime"),
62
+ description: z.string().optional().describe("Optional description of this review's scope"),
63
+ },
64
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
65
+ }, async ({ org_id, name, starts_at, ends_at, description }) => handleError(async () => {
66
+ const campaign = await getClient().post(getClient().orgPath(org_id, "/access-reviews"), { name, starts_at, ends_at, description });
67
+ return `Access review campaign created:\n\n${JSON.stringify(campaign, null, 2)}`;
68
+ }));
69
+ // ── Launch access review campaign ─────────────────────────────────────────
70
+ server.registerTool("clavex_launch_review", {
71
+ title: "Launch Access Review Campaign",
72
+ description: `Immediately launch (activate) an access review campaign, generating review items and sending notifications to reviewers.
73
+
74
+ This moves the campaign from "pending" to "active" without waiting for the scheduled starts_at.
75
+ Use this to trigger an unscheduled or emergency review.
76
+
77
+ After launching:
78
+ - One review item is created per (user, role) assignment in the org
79
+ - Reviewer notification emails are sent
80
+ - The worker processes items on a 15-minute tick
81
+
82
+ Args:
83
+ - org_id: Organization UUID
84
+ - campaign_id: UUID of the campaign to launch (use clavex_list_access_reviews to find it)
85
+
86
+ Returns: Launched campaign JSON.
87
+
88
+ Use when:
89
+ "lancia la campagna di access review trimestrale"
90
+ "launch access review <campaign_id> now"
91
+ "activate the pending access certification"`,
92
+ inputSchema: {
93
+ org_id: z.string().uuid().describe("Organization UUID"),
94
+ campaign_id: z.string().uuid().describe("Campaign UUID to launch"),
95
+ },
96
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
97
+ }, async ({ org_id, campaign_id }) => handleError(async () => {
98
+ const campaign = await getClient().post(getClient().orgPath(org_id, `/access-reviews/${campaign_id}/launch`));
99
+ return `Campaign launched successfully:\n\n${JSON.stringify(campaign, null, 2)}`;
100
+ }));
101
+ // ── Get campaign items ────────────────────────────────────────────────────
102
+ server.registerTool("clavex_get_review_items", {
103
+ title: "Get Access Review Items",
104
+ description: `Get all items (user-role pairs) in an access review campaign along with their status.
105
+
106
+ Each item represents one (user, role) assignment awaiting a keep/revoke decision.
107
+
108
+ Returns: user_id, user_email, role_id, role_name, reviewer_email, decision, decided_at.
109
+
110
+ Decision values:
111
+ null — not yet reviewed
112
+ "keep" — reviewer confirmed access should be retained
113
+ "revoke" — reviewer decided access should be removed (processed by the worker)
114
+
115
+ Use when:
116
+ "show items for campaign <id>"
117
+ "how many reviews are still pending?"
118
+ "quali utenti sono in attesa di revisione?"`,
119
+ inputSchema: {
120
+ org_id: z.string().uuid().describe("Organization UUID"),
121
+ campaign_id: z.string().uuid().describe("Campaign UUID"),
122
+ },
123
+ annotations: { readOnlyHint: true, destructiveHint: false },
124
+ }, async ({ org_id, campaign_id }) => handleError(async () => {
125
+ const items = await getClient().get(getClient().orgPath(org_id, `/access-reviews/${campaign_id}/items`));
126
+ if (!Array.isArray(items) || items.length === 0)
127
+ return "_No items found for this campaign._";
128
+ return mdTable(items, ["id", "user_email", "role_name", "reviewer_email", "decision", "decided_at"]);
129
+ }));
130
+ }
131
+ //# sourceMappingURL=access_reviews.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access_reviews.js","sourceRoot":"","sources":["../../src/tools/access_reviews.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerAITools(server: McpServer): void;
3
+ //# sourceMappingURL=ai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/tools/ai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8jBvD"}