zitadel-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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +127 -0
  3. package/build/auth/client.d.ts +28 -0
  4. package/build/auth/client.js +125 -0
  5. package/build/auth/client.js.map +1 -0
  6. package/build/index.d.ts +6 -0
  7. package/build/index.js +81 -0
  8. package/build/index.js.map +1 -0
  9. package/build/tools/applications.d.ts +7 -0
  10. package/build/tools/applications.js +189 -0
  11. package/build/tools/applications.js.map +1 -0
  12. package/build/tools/index.d.ts +8 -0
  13. package/build/tools/index.js +44 -0
  14. package/build/tools/index.js.map +1 -0
  15. package/build/tools/organizations.d.ts +7 -0
  16. package/build/tools/organizations.js +65 -0
  17. package/build/tools/organizations.js.map +1 -0
  18. package/build/tools/portal.d.ts +10 -0
  19. package/build/tools/portal.js +191 -0
  20. package/build/tools/portal.js.map +1 -0
  21. package/build/tools/projects.d.ts +7 -0
  22. package/build/tools/projects.js +109 -0
  23. package/build/tools/projects.js.map +1 -0
  24. package/build/tools/roles.d.ts +7 -0
  25. package/build/tools/roles.js +203 -0
  26. package/build/tools/roles.js.map +1 -0
  27. package/build/tools/service-accounts.d.ts +7 -0
  28. package/build/tools/service-accounts.js +122 -0
  29. package/build/tools/service-accounts.js.map +1 -0
  30. package/build/tools/users.d.ts +7 -0
  31. package/build/tools/users.js +183 -0
  32. package/build/tools/users.js.map +1 -0
  33. package/build/tools/utility.d.ts +7 -0
  34. package/build/tools/utility.js +51 -0
  35. package/build/tools/utility.js.map +1 -0
  36. package/build/types/tools.d.ts +43 -0
  37. package/build/types/tools.js +16 -0
  38. package/build/types/tools.js.map +1 -0
  39. package/build/types/zitadel.d.ts +232 -0
  40. package/build/types/zitadel.js +6 -0
  41. package/build/types/zitadel.js.map +1 -0
  42. package/build/utils/config.d.ts +36 -0
  43. package/build/utils/config.js +35 -0
  44. package/build/utils/config.js.map +1 -0
  45. package/build/utils/error-handler.d.ts +18 -0
  46. package/build/utils/error-handler.js +56 -0
  47. package/build/utils/error-handler.js.map +1 -0
  48. package/build/utils/logger.d.ts +20 -0
  49. package/build/utils/logger.js +46 -0
  50. package/build/utils/logger.js.map +1 -0
  51. package/package.json +54 -0
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Tool registry — aggregates all tools and handlers
3
+ * Portal tools conditionally included based on config
4
+ */
5
+ import { USER_TOOLS, USER_HANDLERS } from './users.js';
6
+ import { PROJECT_TOOLS, PROJECT_HANDLERS } from './projects.js';
7
+ import { APPLICATION_TOOLS, APPLICATION_HANDLERS } from './applications.js';
8
+ import { ROLE_TOOLS, ROLE_HANDLERS } from './roles.js';
9
+ import { SERVICE_ACCOUNT_TOOLS, SERVICE_ACCOUNT_HANDLERS } from './service-accounts.js';
10
+ import { ORG_TOOLS, ORG_HANDLERS } from './organizations.js';
11
+ import { UTILITY_TOOLS, UTILITY_HANDLERS } from './utility.js';
12
+ import { PORTAL_TOOLS, PORTAL_HANDLERS } from './portal.js';
13
+ import { isPortalEnabled } from '../utils/config.js';
14
+ export function getTools(config) {
15
+ const tools = [
16
+ ...USER_TOOLS,
17
+ ...PROJECT_TOOLS,
18
+ ...APPLICATION_TOOLS,
19
+ ...ROLE_TOOLS,
20
+ ...SERVICE_ACCOUNT_TOOLS,
21
+ ...ORG_TOOLS,
22
+ ...UTILITY_TOOLS,
23
+ ];
24
+ if (isPortalEnabled(config)) {
25
+ tools.push(...PORTAL_TOOLS);
26
+ }
27
+ return tools;
28
+ }
29
+ export function getHandlers(config) {
30
+ const handlers = {
31
+ ...USER_HANDLERS,
32
+ ...PROJECT_HANDLERS,
33
+ ...APPLICATION_HANDLERS,
34
+ ...ROLE_HANDLERS,
35
+ ...SERVICE_ACCOUNT_HANDLERS,
36
+ ...ORG_HANDLERS,
37
+ ...UTILITY_HANDLERS,
38
+ };
39
+ if (isPortalEnabled(config)) {
40
+ Object.assign(handlers, PORTAL_HANDLERS);
41
+ }
42
+ return handlers;
43
+ }
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG5D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,UAAU,QAAQ,CAAC,MAAqB;IAC5C,MAAM,KAAK,GAAqB;QAC9B,GAAG,UAAU;QACb,GAAG,aAAa;QAChB,GAAG,iBAAiB;QACpB,GAAG,UAAU;QACb,GAAG,qBAAqB;QACxB,GAAG,SAAS;QACZ,GAAG,aAAa;KACjB,CAAC;IAEF,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAqB;IAC/C,MAAM,QAAQ,GAAgC;QAC5C,GAAG,aAAa;QAChB,GAAG,gBAAgB;QACnB,GAAG,oBAAoB;QACvB,GAAG,aAAa;QAChB,GAAG,wBAAwB;QAC3B,GAAG,YAAY;QACf,GAAG,gBAAgB;KACpB,CAAC;IAEF,IAAI,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Organization tools (2 tools)
3
+ * Org-level operations via Zitadel Management API v1 + Admin API
4
+ */
5
+ import type { ToolDefinition, ToolHandler } from '../types/tools.js';
6
+ export declare const ORG_TOOLS: ToolDefinition[];
7
+ export declare const ORG_HANDLERS: Record<string, ToolHandler>;
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Organization tools (2 tools)
3
+ * Org-level operations via Zitadel Management API v1 + Admin API
4
+ */
5
+ import { z } from 'zod';
6
+ import { textResponse } from '../types/tools.js';
7
+ // ─── Tool Definitions ───────────────────────────────────────────────────────
8
+ export const ORG_TOOLS = [
9
+ {
10
+ name: 'zitadel_get_org',
11
+ description: 'Get details of the current organization (based on the configured ZITADEL_ORG_ID).',
12
+ inputSchema: { type: 'object', properties: {} },
13
+ _meta: { readOnly: true, domain: 'organizations' },
14
+ annotations: { title: 'Get Organization', readOnlyHint: true, destructiveHint: false, idempotentHint: true },
15
+ },
16
+ {
17
+ name: 'zitadel_list_orgs',
18
+ description: 'List all organizations in the Zitadel instance. Requires IAM-level admin permissions.',
19
+ inputSchema: {
20
+ type: 'object',
21
+ properties: {
22
+ limit: { type: 'number', description: 'Maximum number of results (default: 50)' },
23
+ },
24
+ },
25
+ _meta: { readOnly: true, domain: 'organizations' },
26
+ annotations: { title: 'List Organizations', readOnlyHint: true, destructiveHint: false, idempotentHint: true },
27
+ },
28
+ ];
29
+ // ─── Handlers ────────────────────────────────────────────────────────────────
30
+ const getOrgHandler = async (_params, ctx) => {
31
+ const response = await ctx.client.request('/management/v1/orgs/me');
32
+ const org = response.org;
33
+ const lines = [
34
+ `Organization: ${org.name}`,
35
+ `ID: ${org.id}`,
36
+ `State: ${org.state?.replace('ORG_STATE_', '') || 'UNKNOWN'}`,
37
+ `Primary Domain: ${org.primaryDomain || 'N/A'}`,
38
+ `Created: ${org.details?.creationDate || 'N/A'}`,
39
+ ];
40
+ return textResponse(lines.join('\n'));
41
+ };
42
+ const listOrgsHandler = async (params, ctx) => {
43
+ const input = z.object({
44
+ limit: z.number().min(1).max(500).default(50),
45
+ }).parse(params);
46
+ const response = await ctx.client.request('/admin/v1/orgs/_search', {
47
+ method: 'POST',
48
+ body: JSON.stringify({ query: { offset: '0', limit: input.limit } }),
49
+ });
50
+ const orgs = response.result || [];
51
+ if (orgs.length === 0) {
52
+ return textResponse('No organizations found.');
53
+ }
54
+ const lines = orgs.map((o) => {
55
+ const state = o.state?.replace('ORG_STATE_', '') || 'UNKNOWN';
56
+ return `- ${o.name} [${state}] ID: ${o.id}`;
57
+ });
58
+ return textResponse(`Found ${orgs.length} organization(s):\n\n${lines.join('\n')}`);
59
+ };
60
+ // ─── Export ──────────────────────────────────────────────────────────────────
61
+ export const ORG_HANDLERS = {
62
+ zitadel_get_org: getOrgHandler,
63
+ zitadel_list_orgs: listOrgsHandler,
64
+ };
65
+ //# sourceMappingURL=organizations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organizations.js","sourceRoot":"","sources":["../../src/tools/organizations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * App-portal extension tools (2 tools)
3
+ * Only registered when PORTAL_DATABASE_URL is set
4
+ *
5
+ * Inserts into the app-portal `apps` table and orchestrates
6
+ * cross-system app setup (Zitadel + portal DB)
7
+ */
8
+ import type { ToolDefinition, ToolHandler } from '../types/tools.js';
9
+ export declare const PORTAL_TOOLS: ToolDefinition[];
10
+ export declare const PORTAL_HANDLERS: Record<string, ToolHandler>;
@@ -0,0 +1,191 @@
1
+ /**
2
+ * App-portal extension tools (2 tools)
3
+ * Only registered when PORTAL_DATABASE_URL is set
4
+ *
5
+ * Inserts into the app-portal `apps` table and orchestrates
6
+ * cross-system app setup (Zitadel + portal DB)
7
+ */
8
+ import { z } from 'zod';
9
+ import postgres from 'postgres';
10
+ import { textResponse, errorResponse } from '../types/tools.js';
11
+ import { logger } from '../utils/logger.js';
12
+ // ─── Tool Definitions ───────────────────────────────────────────────────────
13
+ export const PORTAL_TOOLS = [
14
+ {
15
+ name: 'portal_register_app',
16
+ description: 'Register an application in the app-portal database so it appears in the portal UI. This only creates the portal DB record — use zitadel_create_oidc_app separately if you also need the Zitadel OIDC app.',
17
+ inputSchema: {
18
+ type: 'object',
19
+ properties: {
20
+ slug: { type: 'string', description: 'URL-safe slug (e.g., "proposal-rodeo"). Used as the role key: app:{slug}' },
21
+ name: { type: 'string', description: 'Display name (e.g., "Proposal Rodeo")' },
22
+ description: { type: 'string', description: 'Brief description of the application' },
23
+ appUrl: { type: 'string', description: 'URL where the app is hosted (e.g., "https://proposals.renewalinitiatives.org")' },
24
+ iconUrl: { type: 'string', description: 'Optional URL to the app icon' },
25
+ },
26
+ required: ['slug', 'name', 'appUrl'],
27
+ },
28
+ _meta: { readOnly: false, domain: 'portal' },
29
+ annotations: { title: 'Register App in Portal', readOnlyHint: false, destructiveHint: false, idempotentHint: false },
30
+ },
31
+ {
32
+ name: 'portal_setup_full_app',
33
+ description: 'One-click app setup: creates a Zitadel project (or uses existing), OIDC application, project role, AND registers the app in the portal database. Returns the .env.local configuration for the new app.',
34
+ inputSchema: {
35
+ type: 'object',
36
+ properties: {
37
+ name: { type: 'string', description: 'Application name (e.g., "Proposal Rodeo")' },
38
+ slug: { type: 'string', description: 'URL-safe slug (e.g., "proposal-rodeo")' },
39
+ appUrl: { type: 'string', description: 'URL where the app will be hosted' },
40
+ description: { type: 'string', description: 'Brief description' },
41
+ iconUrl: { type: 'string', description: 'Optional icon URL' },
42
+ projectId: { type: 'string', description: 'Existing project ID. If omitted, a new project is created.' },
43
+ redirectUris: {
44
+ type: 'array',
45
+ items: { type: 'string' },
46
+ description: 'OAuth redirect URIs. Defaults to ["{appUrl}/api/auth/callback/zitadel"] if omitted.',
47
+ },
48
+ devMode: { type: 'boolean', description: 'Enable dev mode for http:// URIs (default: false)' },
49
+ },
50
+ required: ['name', 'slug', 'appUrl'],
51
+ },
52
+ _meta: { readOnly: false, domain: 'portal' },
53
+ annotations: { title: 'Full App Setup', readOnlyHint: false, destructiveHint: false, idempotentHint: false },
54
+ },
55
+ ];
56
+ // ─── Helpers ─────────────────────────────────────────────────────────────────
57
+ function getPortalDb(ctx) {
58
+ if (!ctx.config.portalDatabaseUrl) {
59
+ throw new Error('PORTAL_DATABASE_URL is not configured');
60
+ }
61
+ return postgres(ctx.config.portalDatabaseUrl);
62
+ }
63
+ // ─── Handlers ────────────────────────────────────────────────────────────────
64
+ const portalRegisterAppHandler = async (params, ctx) => {
65
+ const input = z.object({
66
+ slug: z.string().min(1).regex(/^[a-z0-9-]+$/, 'Slug must be lowercase letters, numbers, and hyphens only'),
67
+ name: z.string().min(1),
68
+ description: z.string().optional(),
69
+ appUrl: z.string().url(),
70
+ iconUrl: z.string().url().optional(),
71
+ }).parse(params);
72
+ const sql = getPortalDb(ctx);
73
+ try {
74
+ // Check slug uniqueness
75
+ const existing = await sql `SELECT id FROM apps WHERE slug = ${input.slug} LIMIT 1`;
76
+ if (existing.length > 0) {
77
+ return errorResponse(`Slug '${input.slug}' already exists in the portal database.`);
78
+ }
79
+ const [app] = await sql `
80
+ INSERT INTO apps (slug, name, description, app_url, icon_url, created_at, updated_at)
81
+ VALUES (${input.slug}, ${input.name}, ${input.description || ''}, ${input.appUrl}, ${input.iconUrl || null}, NOW(), NOW())
82
+ RETURNING id, slug, name
83
+ `;
84
+ return textResponse(`App registered in portal.\n` +
85
+ `ID: ${app?.['id']}\n` +
86
+ `Slug: ${app?.['slug']}\n` +
87
+ `Name: ${app?.['name']}`);
88
+ }
89
+ finally {
90
+ await sql.end();
91
+ }
92
+ };
93
+ const portalSetupFullAppHandler = async (params, ctx) => {
94
+ const input = z.object({
95
+ name: z.string().min(1),
96
+ slug: z.string().min(1).regex(/^[a-z0-9-]+$/),
97
+ appUrl: z.string().url(),
98
+ description: z.string().optional(),
99
+ iconUrl: z.string().url().optional(),
100
+ projectId: z.string().optional(),
101
+ redirectUris: z.array(z.string()).optional(),
102
+ devMode: z.boolean().default(false),
103
+ }).parse(params);
104
+ const results = [];
105
+ const config = ctx.client.getConfig();
106
+ // Step 1: Create or use existing project
107
+ let projectId = input.projectId || config.projectId;
108
+ if (!projectId) {
109
+ logger.info('Creating new Zitadel project', { name: input.name });
110
+ const project = await ctx.client.request('/management/v1/projects', {
111
+ method: 'POST',
112
+ body: JSON.stringify({
113
+ name: input.name,
114
+ projectRoleAssertion: true,
115
+ projectRoleCheck: false,
116
+ }),
117
+ });
118
+ projectId = project.id;
119
+ results.push(`1. Created project: ${projectId}`);
120
+ }
121
+ else {
122
+ results.push(`1. Using existing project: ${projectId}`);
123
+ }
124
+ // Step 2: Create OIDC application
125
+ const redirectUris = input.redirectUris || [`${input.appUrl}/api/auth/callback/zitadel`];
126
+ logger.info('Creating OIDC app', { name: input.name, projectId });
127
+ const app = await ctx.client.request(`/management/v1/projects/${projectId}/apps/oidc`, {
128
+ method: 'POST',
129
+ body: JSON.stringify({
130
+ name: input.name,
131
+ redirectUris,
132
+ responseTypes: ['OIDC_RESPONSE_TYPE_CODE'],
133
+ grantTypes: ['OIDC_GRANT_TYPE_AUTHORIZATION_CODE'],
134
+ appType: 'OIDC_APP_TYPE_WEB',
135
+ authMethodType: 'OIDC_AUTH_METHOD_TYPE_NONE',
136
+ devMode: input.devMode,
137
+ }),
138
+ });
139
+ results.push(`2. Created OIDC app: Client ID = ${app.clientId}`);
140
+ // Step 3: Create project role for the app
141
+ const roleKey = `app:${input.slug}`;
142
+ logger.info('Creating project role', { roleKey, projectId });
143
+ try {
144
+ await ctx.client.request(`/management/v1/projects/${projectId}/roles`, {
145
+ method: 'POST',
146
+ body: JSON.stringify({ roleKey, displayName: input.name }),
147
+ });
148
+ results.push(`3. Created role: ${roleKey}`);
149
+ }
150
+ catch (error) {
151
+ // Role may already exist — that's fine
152
+ results.push(`3. Role ${roleKey} already exists (skipped)`);
153
+ }
154
+ // Step 4: Insert into portal database
155
+ const sql = getPortalDb(ctx);
156
+ try {
157
+ const existing = await sql `SELECT id FROM apps WHERE slug = ${input.slug} LIMIT 1`;
158
+ if (existing.length > 0) {
159
+ results.push(`4. App slug '${input.slug}' already in portal DB (skipped)`);
160
+ }
161
+ else {
162
+ await sql `
163
+ INSERT INTO apps (slug, name, description, app_url, icon_url, created_at, updated_at)
164
+ VALUES (${input.slug}, ${input.name}, ${input.description || ''}, ${input.appUrl}, ${input.iconUrl || null}, NOW(), NOW())
165
+ `;
166
+ results.push(`4. Registered in portal database`);
167
+ }
168
+ }
169
+ finally {
170
+ await sql.end();
171
+ }
172
+ // Step 5: Format env vars
173
+ const envVars = [
174
+ `AUTH_ZITADEL_ISSUER=${config.issuer}`,
175
+ `AUTH_ZITADEL_CLIENT_ID=${app.clientId}`,
176
+ ].join('\n');
177
+ return textResponse(`Full app setup complete:\n\n` +
178
+ `${results.join('\n')}\n\n` +
179
+ `# .env.local for ${input.name}\n${envVars}\n\n` +
180
+ `# Reference\n` +
181
+ `# ZITADEL_PROJECT_ID=${projectId}\n` +
182
+ `# ZITADEL_ORG_ID=${config.orgId}\n` +
183
+ `# ZITADEL_APP_ID=${app.appId}\n` +
184
+ `# Role key: ${roleKey}`);
185
+ };
186
+ // ─── Export ──────────────────────────────────────────────────────────────────
187
+ export const PORTAL_HANDLERS = {
188
+ portal_register_app: portalRegisterAppHandler,
189
+ portal_setup_full_app: portalSetupFullAppHandler,
190
+ };
191
+ //# sourceMappingURL=portal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal.js","sourceRoot":"","sources":["../../src/tools/portal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Project management tools (3 tools)
3
+ * CRUD operations for Zitadel projects via Management API v1
4
+ */
5
+ import type { ToolDefinition, ToolHandler } from '../types/tools.js';
6
+ export declare const PROJECT_TOOLS: ToolDefinition[];
7
+ export declare const PROJECT_HANDLERS: Record<string, ToolHandler>;
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Project management tools (3 tools)
3
+ * CRUD operations for Zitadel projects via Management API v1
4
+ */
5
+ import { z } from 'zod';
6
+ import { textResponse, zitadelId } from '../types/tools.js';
7
+ import { logger } from '../utils/logger.js';
8
+ // ─── Tool Definitions ───────────────────────────────────────────────────────
9
+ export const PROJECT_TOOLS = [
10
+ {
11
+ name: 'zitadel_list_projects',
12
+ description: 'List all projects in the Zitadel organization.',
13
+ inputSchema: {
14
+ type: 'object',
15
+ properties: {
16
+ limit: { type: 'number', description: 'Maximum number of results (default: 50)' },
17
+ },
18
+ },
19
+ _meta: { readOnly: true, domain: 'projects' },
20
+ annotations: { title: 'List Projects', readOnlyHint: true, destructiveHint: false, idempotentHint: true },
21
+ },
22
+ {
23
+ name: 'zitadel_get_project',
24
+ description: 'Get details of a specific project by its ID.',
25
+ inputSchema: {
26
+ type: 'object',
27
+ properties: {
28
+ projectId: { type: 'string', description: 'The project ID' },
29
+ },
30
+ required: ['projectId'],
31
+ },
32
+ _meta: { readOnly: true, domain: 'projects' },
33
+ annotations: { title: 'Get Project', readOnlyHint: true, destructiveHint: false, idempotentHint: true },
34
+ },
35
+ {
36
+ name: 'zitadel_create_project',
37
+ description: 'Create a new project in Zitadel. Projects contain applications, roles, and grants.',
38
+ inputSchema: {
39
+ type: 'object',
40
+ properties: {
41
+ name: { type: 'string', description: 'Project name' },
42
+ projectRoleAssertion: { type: 'boolean', description: 'Include roles in tokens (default: true)' },
43
+ projectRoleCheck: { type: 'boolean', description: 'Only allow users with grants to authenticate (default: false)' },
44
+ },
45
+ required: ['name'],
46
+ },
47
+ _meta: { readOnly: false, domain: 'projects' },
48
+ annotations: { title: 'Create Project', readOnlyHint: false, destructiveHint: false, idempotentHint: false },
49
+ },
50
+ ];
51
+ // ─── Handlers ────────────────────────────────────────────────────────────────
52
+ function formatProject(p) {
53
+ const state = p.state?.replace('PROJECT_STATE_', '') || 'UNKNOWN';
54
+ return `- ${p.name} [${state}] ID: ${p.id}`;
55
+ }
56
+ const listProjectsHandler = async (params, ctx) => {
57
+ const input = z.object({
58
+ limit: z.number().min(1).max(500).default(50),
59
+ }).parse(params);
60
+ const response = await ctx.client.request('/management/v1/projects/_search', {
61
+ method: 'POST',
62
+ body: JSON.stringify({ query: { offset: '0', limit: input.limit } }),
63
+ });
64
+ const projects = response.result || [];
65
+ if (projects.length === 0) {
66
+ return textResponse('No projects found.');
67
+ }
68
+ const lines = projects.map(formatProject);
69
+ return textResponse(`Found ${projects.length} project(s):\n\n${lines.join('\n')}`);
70
+ };
71
+ const getProjectHandler = async (params, ctx) => {
72
+ const { projectId } = z.object({ projectId: zitadelId('projectId') }).parse(params);
73
+ const project = await ctx.client.request(`/management/v1/projects/${projectId}`);
74
+ const lines = [
75
+ `Project: ${project.name}`,
76
+ `ID: ${project.id}`,
77
+ `State: ${project.state?.replace('PROJECT_STATE_', '') || 'UNKNOWN'}`,
78
+ `Role Assertion: ${project.projectRoleAssertion ?? 'N/A'}`,
79
+ `Role Check: ${project.projectRoleCheck ?? 'N/A'}`,
80
+ `Created: ${project.details?.creationDate || 'N/A'}`,
81
+ ];
82
+ return textResponse(lines.join('\n'));
83
+ };
84
+ const createProjectHandler = async (params, ctx) => {
85
+ const input = z.object({
86
+ name: z.string().min(1),
87
+ projectRoleAssertion: z.boolean().default(true),
88
+ projectRoleCheck: z.boolean().default(false),
89
+ }).parse(params);
90
+ logger.info('Creating project', { name: input.name });
91
+ const response = await ctx.client.request('/management/v1/projects', {
92
+ method: 'POST',
93
+ body: JSON.stringify({
94
+ name: input.name,
95
+ projectRoleAssertion: input.projectRoleAssertion,
96
+ projectRoleCheck: input.projectRoleCheck,
97
+ }),
98
+ });
99
+ return textResponse(`Project created successfully.\n` +
100
+ `Project ID: ${response.id}\n` +
101
+ `Name: ${input.name}`);
102
+ };
103
+ // ─── Export ──────────────────────────────────────────────────────────────────
104
+ export const PROJECT_HANDLERS = {
105
+ zitadel_list_projects: listProjectsHandler,
106
+ zitadel_get_project: getProjectHandler,
107
+ zitadel_create_project: createProjectHandler,
108
+ };
109
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Role & grant management tools (5 tools)
3
+ * Project roles and user grants via Zitadel Management API v1
4
+ */
5
+ import type { ToolDefinition, ToolHandler } from '../types/tools.js';
6
+ export declare const ROLE_TOOLS: ToolDefinition[];
7
+ export declare const ROLE_HANDLERS: Record<string, ToolHandler>;