@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
@@ -0,0 +1,126 @@
1
+ import { z } from "zod";
2
+ import { getClient } from "../client.js";
3
+ import { handleError } from "../helpers.js";
4
+ export function registerFGATools(server) {
5
+ // ── Check relationship ─────────────────────────────────────────────────────
6
+ server.registerTool("clavex_fga_check", {
7
+ title: "FGA Relationship Check",
8
+ description: `Check whether a user has a specific relationship to an object in the Fine-Grained Authorization (FGA) store.
9
+
10
+ Uses Google Zanzibar–style ReBAC (Relationship-Based Access Control) via OpenFGA.
11
+
12
+ Args:
13
+ - org_id: Organization UUID (must have a provisioned FGA store)
14
+ - user: Subject identifier, e.g. "user:alice-uuid" or "team:engineering"
15
+ - relation: Relation to check, e.g. "can_read", "owner", "member", "viewer"
16
+ - object: Object identifier, e.g. "document:budget-2025", "project:phoenix"
17
+
18
+ Returns: { allowed: true|false }
19
+
20
+ Use when:
21
+ "can user alice read document budget-2025?"
22
+ "does team:engineering have owner access on project:phoenix?"
23
+ "verifica se l'utente <id> può approvare il documento <id>"`,
24
+ inputSchema: {
25
+ org_id: z.string().uuid().describe("Organization UUID"),
26
+ user: z.string().describe("Subject — e.g. 'user:alice-uuid' or 'team:engineering'"),
27
+ relation: z.string().describe("Relation to check — e.g. 'can_read', 'owner', 'member'"),
28
+ object: z.string().describe("Object — e.g. 'document:budget-2025'"),
29
+ },
30
+ annotations: { readOnlyHint: true, destructiveHint: false },
31
+ }, async ({ org_id, user, relation, object }) => handleError(async () => {
32
+ const result = await getClient().post(getClient().orgPath(org_id, "/fga/check"), { user, relation, object });
33
+ const verdict = result.allowed ? "✅ **ALLOWED**" : "❌ **DENIED**";
34
+ return `${verdict}\n\n\`${user}\` **${relation}** \`${object}\` → \`allowed: ${result.allowed}\``;
35
+ }));
36
+ // ── Write relationship tuple ────────────────────────────────────────────────
37
+ server.registerTool("clavex_fga_write_tuple", {
38
+ title: "FGA Write Relationship Tuple",
39
+ description: `Create or delete a relationship tuple in the FGA store.
40
+
41
+ Tuples express facts like "user:alice is owner of document:budget-2025".
42
+ Creating a tuple grants the relationship; deleting it removes the permission.
43
+
44
+ Args:
45
+ - org_id: Organization UUID
46
+ - user: Subject — e.g. "user:alice-uuid", "team:engineering"
47
+ - relation: Relation — e.g. "owner", "viewer", "member", "can_approve"
48
+ - object: Object — e.g. "document:budget-2025", "project:phoenix"
49
+ - delete: Pass true to remove the relationship (default: false = create)
50
+
51
+ Returns: Confirmation message.
52
+
53
+ Use when:
54
+ "grant user alice viewer access to document:budget-2025"
55
+ "add team:engineering as member of project:phoenix"
56
+ "revoke bob's owner access on document:payroll"
57
+ "concedi a <user> il ruolo <relation> su <object>"`,
58
+ inputSchema: {
59
+ org_id: z.string().uuid().describe("Organization UUID"),
60
+ user: z.string().describe("Subject — e.g. 'user:alice-uuid'"),
61
+ relation: z.string().describe("Relation — e.g. 'owner', 'viewer', 'member'"),
62
+ object: z.string().describe("Object — e.g. 'document:budget-2025'"),
63
+ delete: z.boolean().default(false).describe("Set true to REMOVE the relationship (default: false = create)"),
64
+ },
65
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
66
+ }, async ({ org_id, user, relation, object, delete: del }) => handleError(async () => {
67
+ const body = del
68
+ ? { deletes: [{ user, relation, object }] }
69
+ : { writes: [{ user, relation, object }] };
70
+ await getClient().post(getClient().orgPath(org_id, "/fga/write"), body);
71
+ const action = del ? "deleted" : "created";
72
+ return `Relationship tuple ${action}: \`${user}\` **${relation}** \`${object}\``;
73
+ }));
74
+ // ── Read relationship tuples ───────────────────────────────────────────────
75
+ server.registerTool("clavex_fga_read_tuples", {
76
+ title: "FGA Read Relationship Tuples",
77
+ description: `Read relationship tuples from the FGA store, optionally filtered by user, relation, and/or object.
78
+
79
+ All three filters are optional — pass only the ones you want to filter on (partial match).
80
+
81
+ Args:
82
+ - org_id: Organization UUID
83
+ - user (optional): Filter by subject — e.g. "user:alice-uuid"
84
+ - relation (optional): Filter by relation — e.g. "owner"
85
+ - object (optional): Filter by object type or instance — e.g. "document:" or "document:budget-2025"
86
+ - page_size (optional): Max results per page (default: 50)
87
+
88
+ Returns: Table of matching tuples.
89
+
90
+ Use when:
91
+ "list all tuples for user alice"
92
+ "what permissions does team:engineering have?"
93
+ "show all owners of document:payroll"
94
+ "elenca i diritti dell'utente <id>"`,
95
+ inputSchema: {
96
+ org_id: z.string().uuid().describe("Organization UUID"),
97
+ user: z.string().optional().describe("Filter by subject (partial match ok)"),
98
+ relation: z.string().optional().describe("Filter by relation"),
99
+ object: z.string().optional().describe("Filter by object or object type prefix"),
100
+ page_size: z.number().int().min(1).max(100).default(50).describe("Max results (1-100)"),
101
+ },
102
+ annotations: { readOnlyHint: true, destructiveHint: false },
103
+ }, async ({ org_id, user, relation, object, page_size }) => handleError(async () => {
104
+ const params = new URLSearchParams();
105
+ if (user)
106
+ params.set("user", user);
107
+ if (relation)
108
+ params.set("relation", relation);
109
+ if (object)
110
+ params.set("object", object);
111
+ if (page_size)
112
+ params.set("page_size", String(page_size));
113
+ const path = getClient().orgPath(org_id, `/fga/read?${params.toString()}`);
114
+ const result = await getClient().get(path);
115
+ const tuples = (result.tuples ?? []).map((t) => ({
116
+ user: t.key.user,
117
+ relation: t.key.relation,
118
+ object: t.key.object,
119
+ }));
120
+ if (tuples.length === 0)
121
+ return "_No matching tuples found._";
122
+ const rows = tuples.map((t) => `| \`${t.user}\` | **${t.relation}** | \`${t.object}\` |`).join("\n");
123
+ return `| User | Relation | Object |\n| --- | --- | --- |\n${rows}`;
124
+ }));
125
+ }
126
+ //# sourceMappingURL=fga.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fga.js","sourceRoot":"","sources":["../../src/tools/fga.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerGroupTools(server: McpServer): void;
3
+ //# sourceMappingURL=groups.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groups.d.ts","sourceRoot":"","sources":["../../src/tools/groups.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkM1D"}
@@ -0,0 +1,135 @@
1
+ import { z } from "zod";
2
+ import { getClient } from "../client.js";
3
+ import { handleError, mdTable } from "../helpers.js";
4
+ export function registerGroupTools(server) {
5
+ server.registerTool("clavex_list_groups", {
6
+ title: "List Groups",
7
+ description: `List all groups in an organization.
8
+
9
+ Returns: id, name, description, member_count.
10
+
11
+ Use when: "show groups in org <id>", "what groups exist for acme?".`,
12
+ inputSchema: {
13
+ org_id: z.string().uuid().describe("Organization UUID"),
14
+ },
15
+ annotations: { readOnlyHint: true, destructiveHint: false },
16
+ }, async ({ org_id }) => handleError(async () => {
17
+ const groups = await getClient().get(getClient().orgPath(org_id, "/groups"));
18
+ return mdTable(groups, ["id", "name", "description"]);
19
+ }));
20
+ server.registerTool("clavex_create_group", {
21
+ title: "Create Group",
22
+ description: `Create a new group in an organization.
23
+
24
+ Args:
25
+ - org_id: Organization UUID
26
+ - name: Group name (e.g. "Admins", "Engineering")
27
+ - description (optional): Group description
28
+
29
+ Returns: Created group JSON.
30
+
31
+ Use when: "create group Admins in org <id>", "add a new security group".`,
32
+ inputSchema: {
33
+ org_id: z.string().uuid().describe("Organization UUID"),
34
+ name: z.string().describe("Group name"),
35
+ description: z.string().optional().describe("Group description"),
36
+ },
37
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
38
+ }, async ({ org_id, name, description }) => handleError(async () => {
39
+ const group = await getClient().post(getClient().orgPath(org_id, "/groups"), { name, description });
40
+ return `Group created:\n\n${JSON.stringify(group, null, 2)}`;
41
+ }));
42
+ server.registerTool("clavex_list_group_members", {
43
+ title: "List Group Members",
44
+ description: `List all users who are members of a group.
45
+
46
+ Returns: id, email, first_name, last_name of each member.
47
+
48
+ Use when: "who is in the Admins group?", "list members of group <id>".`,
49
+ inputSchema: {
50
+ org_id: z.string().uuid().describe("Organization UUID"),
51
+ group_id: z.string().uuid().describe("Group UUID"),
52
+ },
53
+ annotations: { readOnlyHint: true, destructiveHint: false },
54
+ }, async ({ org_id, group_id }) => handleError(async () => {
55
+ const members = await getClient().get(getClient().orgPath(org_id, `/groups/${group_id}/members`));
56
+ return mdTable(members, ["id", "email", "first_name", "last_name"]);
57
+ }));
58
+ server.registerTool("clavex_add_group_member", {
59
+ title: "Add User to Group",
60
+ description: `Add a user to a group.
61
+
62
+ Use when: "add Alice to the Admins group", "put user <user_id> in group <group_id>".`,
63
+ inputSchema: {
64
+ org_id: z.string().uuid().describe("Organization UUID"),
65
+ group_id: z.string().uuid().describe("Group UUID"),
66
+ user_id: z.string().uuid().describe("User UUID to add"),
67
+ },
68
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
69
+ }, async ({ org_id, group_id, user_id }) => handleError(async () => {
70
+ await getClient().put(getClient().orgPath(org_id, `/groups/${group_id}/members/${user_id}`));
71
+ return `User ${user_id} added to group ${group_id}.`;
72
+ }));
73
+ server.registerTool("clavex_remove_group_member", {
74
+ title: "Remove User from Group",
75
+ description: `Remove a user from a group.
76
+
77
+ Use when: "remove Alice from the Admins group", "revoke group membership for user <id>".`,
78
+ inputSchema: {
79
+ org_id: z.string().uuid().describe("Organization UUID"),
80
+ group_id: z.string().uuid().describe("Group UUID"),
81
+ user_id: z.string().uuid().describe("User UUID to remove"),
82
+ },
83
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
84
+ }, async ({ org_id, group_id, user_id }) => handleError(async () => {
85
+ await getClient().del(getClient().orgPath(org_id, `/groups/${group_id}/members/${user_id}`));
86
+ return `User ${user_id} removed from group ${group_id}.`;
87
+ }));
88
+ // ── Roles ──────────────────────────────────────────────────────────────────
89
+ server.registerTool("clavex_list_roles", {
90
+ title: "List Roles",
91
+ description: `List all roles defined in an organization.
92
+
93
+ Returns: id, name, description for each role.
94
+
95
+ Use when: "what roles are available in org <id>?", "list permissions/roles".`,
96
+ inputSchema: {
97
+ org_id: z.string().uuid().describe("Organization UUID"),
98
+ },
99
+ annotations: { readOnlyHint: true, destructiveHint: false },
100
+ }, async ({ org_id }) => handleError(async () => {
101
+ const roles = await getClient().get(getClient().orgPath(org_id, "/roles"));
102
+ return mdTable(roles, ["id", "name", "description"]);
103
+ }));
104
+ server.registerTool("clavex_assign_role", {
105
+ title: "Assign Role to User",
106
+ description: `Assign a role to a user in an organization.
107
+
108
+ Use when: "give Alice the admin role", "assign role <id> to user <id>".`,
109
+ inputSchema: {
110
+ org_id: z.string().uuid().describe("Organization UUID"),
111
+ role_id: z.string().uuid().describe("Role UUID"),
112
+ user_id: z.string().uuid().describe("User UUID"),
113
+ },
114
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
115
+ }, async ({ org_id, role_id, user_id }) => handleError(async () => {
116
+ await getClient().put(getClient().orgPath(org_id, `/roles/${role_id}/users/${user_id}`));
117
+ return `Role ${role_id} assigned to user ${user_id}.`;
118
+ }));
119
+ server.registerTool("clavex_unassign_role", {
120
+ title: "Revoke Role from User",
121
+ description: `Revoke a role from a user in an organization.
122
+
123
+ Use when: "remove admin role from Alice", "revoke role <id> from user <id>".`,
124
+ inputSchema: {
125
+ org_id: z.string().uuid().describe("Organization UUID"),
126
+ role_id: z.string().uuid().describe("Role UUID"),
127
+ user_id: z.string().uuid().describe("User UUID"),
128
+ },
129
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
130
+ }, async ({ org_id, role_id, user_id }) => handleError(async () => {
131
+ await getClient().del(getClient().orgPath(org_id, `/roles/${role_id}/users/${user_id}`));
132
+ return `Role ${role_id} revoked from user ${user_id}.`;
133
+ }));
134
+ }
135
+ //# sourceMappingURL=groups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groups.js","sourceRoot":"","sources":["../../src/tools/groups.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerIDPTools(server: McpServer): void;
3
+ //# sourceMappingURL=idps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idps.d.ts","sourceRoot":"","sources":["../../src/tools/idps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmIxD"}
@@ -0,0 +1,98 @@
1
+ import { z } from "zod";
2
+ import { getClient } from "../client.js";
3
+ import { handleError, mdTable } from "../helpers.js";
4
+ export function registerIDPTools(server) {
5
+ // ── List IdPs ──────────────────────────────────────────────────────────────
6
+ server.registerTool("clavex_list_idps", {
7
+ title: "List Identity Providers",
8
+ description: `List all external identity providers (OIDC federation, SAML, social) configured in an organization.
9
+
10
+ Returns: id, provider_type, name, issuer, is_active.
11
+
12
+ Use when: "what SSO providers does org <id> have?", "list identity providers for acme".`,
13
+ inputSchema: {
14
+ org_id: z.string().uuid().describe("Organization UUID"),
15
+ },
16
+ annotations: { readOnlyHint: true, destructiveHint: false },
17
+ }, async ({ org_id }) => handleError(async () => {
18
+ const idps = await getClient().get(getClient().orgPath(org_id, "/identity-providers"));
19
+ return mdTable(idps, ["id", "provider_type", "name", "issuer", "is_active"]);
20
+ }));
21
+ // ── Get IdP ────────────────────────────────────────────────────────────────
22
+ server.registerTool("clavex_get_idp", {
23
+ title: "Get Identity Provider",
24
+ description: `Get full configuration details of an identity provider.
25
+
26
+ Use when: "show IdP config for <id>", "what are the SAML settings for this org?".`,
27
+ inputSchema: {
28
+ org_id: z.string().uuid().describe("Organization UUID"),
29
+ idp_id: z.string().uuid().describe("Identity Provider UUID"),
30
+ },
31
+ annotations: { readOnlyHint: true, destructiveHint: false },
32
+ }, async ({ org_id, idp_id }) => handleError(async () => {
33
+ const idp = await getClient().get(getClient().orgPath(org_id, `/identity-providers/${idp_id}`));
34
+ return JSON.stringify(idp, null, 2);
35
+ }));
36
+ // ── Webhooks ───────────────────────────────────────────────────────────────
37
+ server.registerTool("clavex_list_webhooks", {
38
+ title: "List Webhooks",
39
+ description: `List all webhook endpoints registered in an organization.
40
+
41
+ Returns: id, url, event_types, is_active.
42
+
43
+ Use when: "show webhooks for org <id>", "what events does acme receive?".`,
44
+ inputSchema: {
45
+ org_id: z.string().uuid().describe("Organization UUID"),
46
+ },
47
+ annotations: { readOnlyHint: true, destructiveHint: false },
48
+ }, async ({ org_id }) => handleError(async () => {
49
+ const hooks = await getClient().get(getClient().orgPath(org_id, "/webhooks"));
50
+ return mdTable(hooks, ["id", "url", "event_types", "is_active"]);
51
+ }));
52
+ server.registerTool("clavex_create_webhook", {
53
+ title: "Create Webhook",
54
+ description: `Register a webhook endpoint to receive Clavex identity events.
55
+
56
+ Args:
57
+ - org_id: Organization UUID
58
+ - url: HTTPS endpoint that will receive webhook POSTs
59
+ - event_types: Array of event types to subscribe to. Common values:
60
+ "user.created", "user.updated", "user.deleted",
61
+ "session.created", "session.revoked",
62
+ "org.updated"
63
+ - description (optional): Label for the webhook
64
+
65
+ Returns: Created webhook JSON with signing secret.
66
+ IMPORTANT: Save the signing_secret — used to verify webhook signatures (HMAC-SHA256).
67
+
68
+ Use when: "add a webhook to notify my app on user.created", "set up event delivery to <url>".`,
69
+ inputSchema: {
70
+ org_id: z.string().uuid().describe("Organization UUID"),
71
+ url: z.string().url().describe("HTTPS endpoint URL"),
72
+ event_types: z.array(z.string()).describe('Events to subscribe to, e.g. ["user.created"]'),
73
+ description: z.string().optional().describe("Human-readable label"),
74
+ },
75
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
76
+ }, async ({ org_id, url, event_types, description }) => handleError(async () => {
77
+ const hook = await getClient().post(getClient().orgPath(org_id, "/webhooks"), { url, event_types, description });
78
+ const secret = hook.signing_secret
79
+ ? `\n\n⚠️ SAVE THIS SIGNING SECRET:\nsigning_secret: ${hook.signing_secret}`
80
+ : "";
81
+ return `Webhook created.${secret}\n\n${JSON.stringify(hook, null, 2)}`;
82
+ }));
83
+ server.registerTool("clavex_delete_webhook", {
84
+ title: "Delete Webhook",
85
+ description: `Delete a webhook endpoint. No more events will be delivered to its URL.
86
+
87
+ Use when: "remove webhook <id>", "unsubscribe endpoint from events".`,
88
+ inputSchema: {
89
+ org_id: z.string().uuid().describe("Organization UUID"),
90
+ webhook_id: z.string().uuid().describe("Webhook UUID"),
91
+ },
92
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true },
93
+ }, async ({ org_id, webhook_id }) => handleError(async () => {
94
+ await getClient().del(getClient().orgPath(org_id, `/webhooks/${webhook_id}`));
95
+ return `Webhook ${webhook_id} deleted.`;
96
+ }));
97
+ }
98
+ //# sourceMappingURL=idps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idps.js","sourceRoot":"","sources":["../../src/tools/idps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerOrgTools(server: McpServer): void;
3
+ //# sourceMappingURL=orgs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orgs.d.ts","sourceRoot":"","sources":["../../src/tools/orgs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiHxD"}
@@ -0,0 +1,90 @@
1
+ import { z } from "zod";
2
+ import { getClient } from "../client.js";
3
+ import { handleError, mdTable } from "../helpers.js";
4
+ export function registerOrgTools(server) {
5
+ // ── List orgs ──────────────────────────────────────────────────────────────
6
+ server.registerTool("clavex_list_orgs", {
7
+ title: "List Organizations",
8
+ description: `List all organizations in the Clavex instance. Requires superadmin token.
9
+
10
+ Returns a table with columns: id, slug, name, is_active, created_at.
11
+
12
+ Use when: "show me all tenants", "list all orgs", "how many organizations are there".`,
13
+ inputSchema: {},
14
+ annotations: { readOnlyHint: true, destructiveHint: false },
15
+ }, async () => handleError(async () => {
16
+ const orgs = await getClient().get("/api/v1/organizations");
17
+ return mdTable(orgs, ["id", "slug", "name", "is_active", "created_at"]);
18
+ }));
19
+ // ── Get org ────────────────────────────────────────────────────────────────
20
+ server.registerTool("clavex_get_org", {
21
+ title: "Get Organization",
22
+ description: `Get details of a single organization by its UUID.
23
+
24
+ Returns full JSON of the org object.
25
+
26
+ Use when: "get org abc123", "show details of organization <id>".`,
27
+ inputSchema: {
28
+ org_id: z.string().uuid().describe("Organization UUID"),
29
+ },
30
+ annotations: { readOnlyHint: true, destructiveHint: false },
31
+ }, async ({ org_id }) => handleError(async () => {
32
+ const org = await getClient().get(`/api/v1/organizations/${org_id}`);
33
+ return JSON.stringify(org, null, 2);
34
+ }));
35
+ // ── Create org ─────────────────────────────────────────────────────────────
36
+ server.registerTool("clavex_create_org", {
37
+ title: "Create Organization",
38
+ description: `Create a new organization (tenant) in Clavex. Requires superadmin.
39
+
40
+ Args:
41
+ - name (string): Display name for the organization
42
+ - slug (string): URL slug used in auth endpoints (e.g. "acme" → /acme/authorize). Must be unique, lowercase, alphanumeric+hyphens.
43
+ - domain (string, optional): Primary email domain for the org
44
+ - logo_url (string, optional): URL to the org logo
45
+
46
+ Returns: Created organization JSON.
47
+
48
+ Use when: "create a new tenant for ACME", "add organization example.com".`,
49
+ inputSchema: {
50
+ name: z.string().min(2).describe("Display name for the organization"),
51
+ slug: z.string().regex(/^[a-z0-9-]+$/).describe("URL slug (lowercase, alphanumeric + hyphens)"),
52
+ domain: z.string().optional().describe("Primary email domain, e.g. acme.com"),
53
+ logo_url: z.string().url().optional().describe("URL to the organization logo"),
54
+ },
55
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
56
+ }, async ({ name, slug, domain, logo_url }) => handleError(async () => {
57
+ const org = await getClient().post("/api/v1/organizations", {
58
+ name, slug, domain, logo_url,
59
+ });
60
+ return `Organization created:\n\n${JSON.stringify(org, null, 2)}`;
61
+ }));
62
+ // ── Update org ─────────────────────────────────────────────────────────────
63
+ server.registerTool("clavex_update_org", {
64
+ title: "Update Organization",
65
+ description: `Update an organization's settings. All fields are optional (PATCH semantics).
66
+
67
+ Args:
68
+ - org_id (string): Organization UUID
69
+ - name (string, optional): New display name
70
+ - domain (string, optional): New primary domain
71
+ - logo_url (string, optional): New logo URL
72
+ - is_active (boolean, optional): Enable or disable the organization
73
+
74
+ Returns: Updated organization JSON.`,
75
+ inputSchema: {
76
+ org_id: z.string().uuid().describe("Organization UUID"),
77
+ name: z.string().optional().describe("New display name"),
78
+ domain: z.string().optional().describe("New primary domain"),
79
+ logo_url: z.string().url().optional().describe("New logo URL"),
80
+ is_active: z.boolean().optional().describe("Enable or disable the org"),
81
+ },
82
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
83
+ }, async ({ org_id, ...updates }) => handleError(async () => {
84
+ // Remove undefined values
85
+ const body = Object.fromEntries(Object.entries(updates).filter(([, v]) => v !== undefined));
86
+ const org = await getClient().patch(`/api/v1/organizations/${org_id}`, body);
87
+ return `Organization updated:\n\n${JSON.stringify(org, null, 2)}`;
88
+ }));
89
+ }
90
+ //# sourceMappingURL=orgs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orgs.js","sourceRoot":"","sources":["../../src/tools/orgs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerPAMTools(server: McpServer): void;
3
+ //# sourceMappingURL=pam.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pam.d.ts","sourceRoot":"","sources":["../../src/tools/pam.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuRxD"}