@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,124 @@
1
+ import { z } from "zod";
2
+ import { getClient } from "../client.js";
3
+ import { handleError, mdTable } from "../helpers.js";
4
+ export function registerClientTools(server) {
5
+ // ── List clients ───────────────────────────────────────────────────────────
6
+ server.registerTool("clavex_list_clients", {
7
+ title: "List OIDC Clients",
8
+ description: `List all OIDC/OAuth2 clients registered in an organization.
9
+
10
+ Returns: client_id, name, grant_types, redirect_uris, is_active.
11
+
12
+ Use when: "show me all apps registered in org <id>", "list OIDC clients 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 clients = await getClient().get(getClient().orgPath(org_id, "/clients"));
19
+ return mdTable(clients, ["client_id", "name", "grant_types", "is_active"]);
20
+ }));
21
+ // ── Get client ─────────────────────────────────────────────────────────────
22
+ server.registerTool("clavex_get_client", {
23
+ title: "Get OIDC Client",
24
+ description: `Get full details of an OIDC/OAuth2 client registration.
25
+
26
+ Returns full client JSON including redirect URIs, scopes, grant types, and settings.
27
+
28
+ Note: client_secret is never returned after creation — use clavex_rotate_client_secret to reset it.`,
29
+ inputSchema: {
30
+ org_id: z.string().uuid().describe("Organization UUID"),
31
+ client_id: z.string().describe("OIDC client_id"),
32
+ },
33
+ annotations: { readOnlyHint: true, destructiveHint: false },
34
+ }, async ({ org_id, client_id }) => handleError(async () => {
35
+ const client = await getClient().get(getClient().orgPath(org_id, `/clients/${client_id}`));
36
+ return JSON.stringify(client, null, 2);
37
+ }));
38
+ // ── Create client ──────────────────────────────────────────────────────────
39
+ server.registerTool("clavex_create_client", {
40
+ title: "Create OIDC Client",
41
+ description: `Register a new OIDC/OAuth2 client in an organization.
42
+
43
+ Args:
44
+ - org_id: Organization UUID
45
+ - name: Human-readable client name (e.g. "My Web App")
46
+ - redirect_uris: Array of allowed redirect URIs (must be https:// in production)
47
+ - grant_types: Array of allowed grant types. Common values:
48
+ ["authorization_code"] — standard web app
49
+ ["authorization_code", "refresh_token"] — web app with refresh
50
+ ["client_credentials"] — machine-to-machine
51
+ - response_types (optional): defaults to ["code"]
52
+ - scopes (optional): allowed scopes, defaults to ["openid", "profile", "email"]
53
+ - is_public (optional): true for SPAs/mobile apps (no client_secret)
54
+ - post_logout_redirect_uris (optional): allowed logout redirect URIs
55
+
56
+ Returns: Created client JSON including the one-time plaintext client_secret.
57
+ IMPORTANT: Save the client_secret immediately — it will never be shown again.
58
+
59
+ Use when: "register Grafana as an OIDC client", "add a new web app to acme org".`,
60
+ inputSchema: {
61
+ org_id: z.string().uuid().describe("Organization UUID"),
62
+ name: z.string().describe("Client display name"),
63
+ redirect_uris: z.array(z.string().url()).min(1).describe("Allowed redirect URIs"),
64
+ grant_types: z.array(z.string()).describe('e.g. ["authorization_code","refresh_token"]'),
65
+ response_types: z.array(z.string()).optional().describe('e.g. ["code"]'),
66
+ scopes: z.array(z.string()).optional().describe('e.g. ["openid","profile","email","groups"]'),
67
+ is_public: z.boolean().optional().describe("True for SPA/mobile (no client_secret)"),
68
+ post_logout_redirect_uris: z.array(z.string().url()).optional().describe("Allowed post-logout redirect URIs"),
69
+ },
70
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
71
+ }, async ({ org_id, ...params }) => handleError(async () => {
72
+ const result = await getClient().post(getClient().orgPath(org_id, "/clients"), params);
73
+ const secret = result.client_secret
74
+ ? `\n\n⚠️ SAVE THIS SECRET — it will not be shown again:\nclient_secret: ${result.client_secret}`
75
+ : "";
76
+ return `Client registered successfully.${secret}\n\n${JSON.stringify(result, null, 2)}`;
77
+ }));
78
+ // ── Update client ──────────────────────────────────────────────────────────
79
+ server.registerTool("clavex_update_client", {
80
+ title: "Update OIDC Client",
81
+ description: `Update an existing OIDC client registration (PATCH semantics).
82
+
83
+ Args:
84
+ - org_id, client_id: identifiers
85
+ - name, redirect_uris, grant_types, scopes, is_active (all optional): new values
86
+
87
+ Returns: Updated client JSON.
88
+
89
+ Use when: "add a redirect URI to the Grafana client", "disable client <id>".`,
90
+ inputSchema: {
91
+ org_id: z.string().uuid().describe("Organization UUID"),
92
+ client_id: z.string().describe("OIDC client_id"),
93
+ name: z.string().optional().describe("New display name"),
94
+ redirect_uris: z.array(z.string().url()).optional().describe("New redirect URIs (replaces existing)"),
95
+ post_logout_redirect_uris: z.array(z.string().url()).optional().describe("New logout redirect URIs"),
96
+ scopes: z.array(z.string()).optional().describe("New allowed scopes"),
97
+ is_active: z.boolean().optional().describe("Enable or disable the client"),
98
+ },
99
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true },
100
+ }, async ({ org_id, client_id, ...updates }) => handleError(async () => {
101
+ const body = Object.fromEntries(Object.entries(updates).filter(([, v]) => v !== undefined));
102
+ const result = await getClient().patch(getClient().orgPath(org_id, `/clients/${client_id}`), body);
103
+ return `Client updated:\n\n${JSON.stringify(result, null, 2)}`;
104
+ }));
105
+ // ── Rotate secret ──────────────────────────────────────────────────────────
106
+ server.registerTool("clavex_rotate_client_secret", {
107
+ title: "Rotate Client Secret",
108
+ description: `Generate a new client_secret for an OIDC client. The old secret is immediately invalidated.
109
+
110
+ Returns: New plaintext client_secret.
111
+ IMPORTANT: Update the secret in your application immediately after rotation.
112
+
113
+ Use when: "rotate secret for client <id>", "regenerate client credentials".`,
114
+ inputSchema: {
115
+ org_id: z.string().uuid().describe("Organization UUID"),
116
+ client_id: z.string().describe("OIDC client_id"),
117
+ },
118
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false },
119
+ }, async ({ org_id, client_id }) => handleError(async () => {
120
+ const result = await getClient().post(getClient().orgPath(org_id, `/clients/${client_id}/rotate-secret`));
121
+ return `⚠️ New secret (save immediately):\nclient_secret: ${result.client_secret}`;
122
+ }));
123
+ }
124
+ //# sourceMappingURL=clients.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clients.js","sourceRoot":"","sources":["../../src/tools/clients.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerDeveloperTools(server: McpServer): void;
3
+ //# sourceMappingURL=developer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"developer.d.ts","sourceRoot":"","sources":["../../src/tools/developer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAyTpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2V9D"}