@selfhost.dev/mcp-server 0.1.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 (59) hide show
  1. package/README.md +382 -0
  2. package/dist/auth.d.ts +18 -0
  3. package/dist/auth.js +204 -0
  4. package/dist/auth.js.map +1 -0
  5. package/dist/client.d.ts +10 -0
  6. package/dist/client.js +84 -0
  7. package/dist/client.js.map +1 -0
  8. package/dist/config.d.ts +13 -0
  9. package/dist/config.js +20 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/index.d.ts +2 -0
  12. package/dist/index.js +71 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/rate-limiter.d.ts +22 -0
  15. package/dist/rate-limiter.js +124 -0
  16. package/dist/rate-limiter.js.map +1 -0
  17. package/dist/session.d.ts +25 -0
  18. package/dist/session.js +48 -0
  19. package/dist/session.js.map +1 -0
  20. package/dist/tools/alerts.d.ts +2 -0
  21. package/dist/tools/alerts.js +372 -0
  22. package/dist/tools/alerts.js.map +1 -0
  23. package/dist/tools/auth.d.ts +2 -0
  24. package/dist/tools/auth.js +142 -0
  25. package/dist/tools/auth.js.map +1 -0
  26. package/dist/tools/backups.d.ts +2 -0
  27. package/dist/tools/backups.js +294 -0
  28. package/dist/tools/backups.js.map +1 -0
  29. package/dist/tools/credentials.d.ts +2 -0
  30. package/dist/tools/credentials.js +187 -0
  31. package/dist/tools/credentials.js.map +1 -0
  32. package/dist/tools/instances.d.ts +2 -0
  33. package/dist/tools/instances.js +555 -0
  34. package/dist/tools/instances.js.map +1 -0
  35. package/dist/tools/networking.d.ts +2 -0
  36. package/dist/tools/networking.js +240 -0
  37. package/dist/tools/networking.js.map +1 -0
  38. package/dist/tools/organizations.d.ts +2 -0
  39. package/dist/tools/organizations.js +260 -0
  40. package/dist/tools/organizations.js.map +1 -0
  41. package/dist/tools/pg-config.d.ts +2 -0
  42. package/dist/tools/pg-config.js +59 -0
  43. package/dist/tools/pg-config.js.map +1 -0
  44. package/dist/types/api.d.ts +20 -0
  45. package/dist/types/api.js +2 -0
  46. package/dist/types/api.js.map +1 -0
  47. package/dist/types/models.d.ts +44 -0
  48. package/dist/types/models.js +3 -0
  49. package/dist/types/models.js.map +1 -0
  50. package/dist/types/tiers.d.ts +15 -0
  51. package/dist/types/tiers.js +91 -0
  52. package/dist/types/tiers.js.map +1 -0
  53. package/dist/utils/formatters.d.ts +1 -0
  54. package/dist/utils/formatters.js +28 -0
  55. package/dist/utils/formatters.js.map +1 -0
  56. package/dist/utils/validators.d.ts +14 -0
  57. package/dist/utils/validators.js +9 -0
  58. package/dist/utils/validators.js.map +1 -0
  59. package/package.json +51 -0
@@ -0,0 +1,240 @@
1
+ import { z } from "zod";
2
+ import { apiRequest } from "../client.js";
3
+ import { session } from "../session.js";
4
+ /** Returns the org PID from the param or falls back to the active session org. */
5
+ function resolveOrgId(organization_id) {
6
+ return organization_id || session.getActiveOrgId();
7
+ }
8
+ const noOrgMessage = "No organization selected. Call `select_organization` first or pass an organization_id.";
9
+ const ipRangeSchema = z.object({
10
+ CidrIp: z.string(),
11
+ Description: z.string().optional(),
12
+ });
13
+ const ipv6RangeSchema = z.object({
14
+ CidrIpv6: z.string(),
15
+ Description: z.string().optional(),
16
+ });
17
+ const prefixListIdSchema = z.object({
18
+ PrefixListId: z.string(),
19
+ Description: z.string().optional(),
20
+ });
21
+ const userIdGroupPairSchema = z.object({
22
+ GroupId: z.string(),
23
+ Description: z.string().optional(),
24
+ });
25
+ const ipPermissionSchema = z.object({
26
+ IpProtocol: z.string().describe("Protocol: tcp, udp, icmp, or -1 for all"),
27
+ FromPort: z.number().optional(),
28
+ ToPort: z.number().optional(),
29
+ IpRanges: z.array(ipRangeSchema).optional(),
30
+ Ipv6Ranges: z.array(ipv6RangeSchema).optional(),
31
+ PrefixListIds: z.array(prefixListIdSchema).optional(),
32
+ UserIdGroupPairs: z.array(userIdGroupPairSchema).optional(),
33
+ });
34
+ export function registerNetworkingTools(server) {
35
+ // --- VPCs ---
36
+ server.tool("list_vpcs", `List VPCs in a region for an organization's AWS account. Returns VPCs grouped by type: "public" and "private".
37
+
38
+ IMPORTANT: For instance creation, only use VPCs from the "public" group. Private VPCs are not supported for database instances.
39
+ Pass the cloud_credential_id of the user's BYOC credential to see VPCs in their AWS account.`, {
40
+ organization_id: z.string().optional().describe("Organization PID (defaults to active org)"),
41
+ region: z.string().min(1, "AWS region is required (e.g. us-east-1)"),
42
+ cloud_credential_id: z.string().optional().describe("Credential PID (defaults to org default)"),
43
+ }, async ({ organization_id, region, cloud_credential_id }) => {
44
+ const orgId = resolveOrgId(organization_id);
45
+ if (!orgId) {
46
+ return { content: [{ type: "text", text: noOrgMessage }] };
47
+ }
48
+ const result = await apiRequest(`/aws/v1/organizations/${orgId}/vpcs`, {
49
+ toolName: "list_vpcs",
50
+ query: { region, cloud_credential_id },
51
+ skipOrgInjection: true,
52
+ });
53
+ if (!result.success) {
54
+ return { content: [{ type: "text", text: `Failed to list VPCs (${result.statusCode}): ${result.message}` }] };
55
+ }
56
+ return { content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }] };
57
+ });
58
+ server.tool("create_vpc", "Create a VPC in a region. Automatically creates an internet gateway, route table, and up to 3 subnets.", {
59
+ organization_id: z.string().optional().describe("Organization PID (defaults to active org)"),
60
+ region: z.string().min(1, "AWS region is required"),
61
+ cidr_block: z.string().min(1, "CIDR block is required (e.g. 10.0.0.0/16)"),
62
+ vpc_name: z.string().optional().describe("Name tag for the VPC"),
63
+ cloud_credential_id: z.string().optional().describe("Credential PID (defaults to org default)"),
64
+ }, async ({ organization_id, region, cidr_block, vpc_name, cloud_credential_id }) => {
65
+ const orgId = resolveOrgId(organization_id);
66
+ if (!orgId) {
67
+ return { content: [{ type: "text", text: noOrgMessage }] };
68
+ }
69
+ const result = await apiRequest(`/aws/v1/organizations/${orgId}/vpcs`, {
70
+ method: "POST",
71
+ body: { region, cidr_block, vpc_name, cloud_credential_id },
72
+ toolName: "create_vpc",
73
+ skipOrgInjection: true,
74
+ });
75
+ if (!result.success) {
76
+ return { content: [{ type: "text", text: `Failed to create VPC (${result.statusCode}): ${result.message}` }] };
77
+ }
78
+ return {
79
+ content: [
80
+ { type: "text", text: "VPC created." },
81
+ { type: "text", text: JSON.stringify(result.data, null, 2) },
82
+ ],
83
+ };
84
+ });
85
+ server.tool("delete_vpc", "DESTRUCTIVE: Delete a VPC by its AWS VPC ID. Removes the VPC and associated resources (subnets, route tables, internet gateway) from AWS. You MUST set confirm=true to proceed.", {
86
+ organization_id: z.string().optional().describe("Organization PID (defaults to active org)"),
87
+ vpc_id: z.string().min(1, "VPC ID is required (e.g. vpc-abc123)"),
88
+ cloud_credential_id: z.string().optional().describe("Credential PID (defaults to org default)"),
89
+ confirm: z.boolean().describe("Must be true to proceed. Ask the user for explicit confirmation before setting this."),
90
+ }, async ({ organization_id, vpc_id, cloud_credential_id, confirm }) => {
91
+ const orgId = resolveOrgId(organization_id);
92
+ if (!orgId) {
93
+ return { content: [{ type: "text", text: noOrgMessage }] };
94
+ }
95
+ if (!confirm) {
96
+ return {
97
+ content: [{
98
+ type: "text",
99
+ text: `You are about to DELETE VPC ${vpc_id} and all associated AWS resources (subnets, route tables, internet gateway).\n\nTo proceed, call this tool again with confirm=true.`,
100
+ }],
101
+ };
102
+ }
103
+ const result = await apiRequest(`/aws/v1/organizations/${orgId}/vpcs/${vpc_id}`, {
104
+ method: "DELETE",
105
+ query: { cloud_credential_id },
106
+ toolName: "delete_vpc",
107
+ skipOrgInjection: true,
108
+ });
109
+ if (!result.success) {
110
+ return { content: [{ type: "text", text: `Failed to delete VPC (${result.statusCode}): ${result.message}` }] };
111
+ }
112
+ return { content: [{ type: "text", text: `VPC ${vpc_id} deleted.` }] };
113
+ });
114
+ // --- Subnets ---
115
+ server.tool("list_subnets", "List subnets in a region for an organization's AWS account.", {
116
+ organization_id: z.string().optional().describe("Organization PID (defaults to active org)"),
117
+ region: z.string().min(1, "AWS region is required"),
118
+ cloud_credential_id: z.string().optional().describe("Credential PID (defaults to org default)"),
119
+ }, async ({ organization_id, region, cloud_credential_id }) => {
120
+ const orgId = resolveOrgId(organization_id);
121
+ if (!orgId) {
122
+ return { content: [{ type: "text", text: noOrgMessage }] };
123
+ }
124
+ const result = await apiRequest(`/aws/v1/organizations/${orgId}/subnets`, {
125
+ toolName: "list_subnets",
126
+ query: { region, cloud_credential_id },
127
+ skipOrgInjection: true,
128
+ });
129
+ if (!result.success) {
130
+ return { content: [{ type: "text", text: `Failed to list subnets (${result.statusCode}): ${result.message}` }] };
131
+ }
132
+ return { content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }] };
133
+ });
134
+ server.tool("create_subnet", "Create a subnet in a VPC. Requires region, vpc_id, cidr_block, and availability_zone.", {
135
+ organization_id: z.string().optional().describe("Organization PID (defaults to active org)"),
136
+ region: z.string().min(1, "AWS region is required"),
137
+ vpc_id: z.string().min(1, "VPC ID is required"),
138
+ name: z.string().min(1, "Subnet name is required"),
139
+ cidr_block: z.string().min(1, "CIDR block is required (e.g. 10.0.1.0/24)"),
140
+ availability_zone: z.string().min(1, "Availability zone is required (e.g. us-east-1a)"),
141
+ cloud_credential_id: z.string().optional().describe("Credential PID (defaults to org default)"),
142
+ }, async ({ organization_id, region, vpc_id, name, cidr_block, availability_zone, cloud_credential_id }) => {
143
+ const orgId = resolveOrgId(organization_id);
144
+ if (!orgId) {
145
+ return { content: [{ type: "text", text: noOrgMessage }] };
146
+ }
147
+ const result = await apiRequest(`/aws/v1/organizations/${orgId}/subnets`, {
148
+ method: "POST",
149
+ body: { region, vpc_id, name, cidr_block, availability_zone, cloud_credential_id },
150
+ toolName: "create_subnet",
151
+ skipOrgInjection: true,
152
+ });
153
+ if (!result.success) {
154
+ return { content: [{ type: "text", text: `Failed to create subnet (${result.statusCode}): ${result.message}` }] };
155
+ }
156
+ return {
157
+ content: [
158
+ { type: "text", text: "Subnet created." },
159
+ { type: "text", text: JSON.stringify(result.data, null, 2) },
160
+ ],
161
+ };
162
+ });
163
+ // --- Security Groups ---
164
+ server.tool("list_security_groups", "List security groups in a region for an organization's AWS account.", {
165
+ organization_id: z.string().optional().describe("Organization PID (defaults to active org)"),
166
+ region: z.string().min(1, "AWS region is required"),
167
+ cloud_credential_id: z.string().optional().describe("Credential PID (defaults to org default)"),
168
+ }, async ({ organization_id, region, cloud_credential_id }) => {
169
+ const orgId = resolveOrgId(organization_id);
170
+ if (!orgId) {
171
+ return { content: [{ type: "text", text: noOrgMessage }] };
172
+ }
173
+ const result = await apiRequest(`/aws/v1/organizations/${orgId}/security_groups`, {
174
+ toolName: "list_security_groups",
175
+ query: { region, cloud_credential_id },
176
+ skipOrgInjection: true,
177
+ });
178
+ if (!result.success) {
179
+ return { content: [{ type: "text", text: `Failed to list security groups (${result.statusCode}): ${result.message}` }] };
180
+ }
181
+ return { content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }] };
182
+ });
183
+ server.tool("create_security_group", "Create a security group in a VPC with optional inbound rules (ip_permissions).", {
184
+ organization_id: z.string().optional().describe("Organization PID (defaults to active org)"),
185
+ region: z.string().min(1, "AWS region is required"),
186
+ group_name: z.string().min(1, "Security group name is required"),
187
+ description: z.string().min(1, "Description is required"),
188
+ vpc_id: z.string().min(1, "VPC ID is required"),
189
+ ip_permissions: z.array(ipPermissionSchema).optional().describe("Inbound rules (AWS format)"),
190
+ cloud_credential_id: z.string().optional().describe("Credential PID (defaults to org default)"),
191
+ }, async ({ organization_id, region, group_name, description, vpc_id, ip_permissions, cloud_credential_id }) => {
192
+ const orgId = resolveOrgId(organization_id);
193
+ if (!orgId) {
194
+ return { content: [{ type: "text", text: noOrgMessage }] };
195
+ }
196
+ const result = await apiRequest(`/aws/v1/organizations/${orgId}/security_groups`, {
197
+ method: "POST",
198
+ body: { region, group_name, description, vpc_id, ip_permissions, cloud_credential_id },
199
+ toolName: "create_security_group",
200
+ skipOrgInjection: true,
201
+ });
202
+ if (!result.success) {
203
+ return { content: [{ type: "text", text: `Failed to create security group (${result.statusCode}): ${result.message}` }] };
204
+ }
205
+ return {
206
+ content: [
207
+ { type: "text", text: "Security group created." },
208
+ { type: "text", text: JSON.stringify(result.data, null, 2) },
209
+ ],
210
+ };
211
+ });
212
+ server.tool("update_security_group", "Update a security group's inbound rules. WARNING: This REPLACES all existing inbound rules with the provided ones. Egress rules are not affected.", {
213
+ organization_id: z.string().optional().describe("Organization PID (defaults to active org)"),
214
+ region: z.string().min(1, "AWS region is required"),
215
+ security_group_id: z.string().min(1, "Security group ID is required (e.g. sg-abc123)"),
216
+ ip_permissions: z.array(ipPermissionSchema).min(1, "At least one inbound rule is required"),
217
+ cloud_credential_id: z.string().optional().describe("Credential PID (defaults to org default)"),
218
+ }, async ({ organization_id, region, security_group_id, ip_permissions, cloud_credential_id }) => {
219
+ const orgId = resolveOrgId(organization_id);
220
+ if (!orgId) {
221
+ return { content: [{ type: "text", text: noOrgMessage }] };
222
+ }
223
+ const result = await apiRequest(`/aws/v1/organizations/${orgId}/security_groups/${security_group_id}`, {
224
+ method: "PUT",
225
+ body: { region, security_group_id, ip_permissions, cloud_credential_id },
226
+ toolName: "update_security_group",
227
+ skipOrgInjection: true,
228
+ });
229
+ if (!result.success) {
230
+ return { content: [{ type: "text", text: `Failed to update security group (${result.statusCode}): ${result.message}` }] };
231
+ }
232
+ return {
233
+ content: [
234
+ { type: "text", text: "Security group inbound rules updated." },
235
+ { type: "text", text: JSON.stringify(result.data, null, 2) },
236
+ ],
237
+ };
238
+ });
239
+ }
240
+ //# sourceMappingURL=networking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"networking.js","sourceRoot":"","sources":["../../src/tools/networking.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerOrganizationTools(server: McpServer): void;
@@ -0,0 +1,260 @@
1
+ import { z } from "zod";
2
+ import { apiRequest } from "../client.js";
3
+ import { session } from "../session.js";
4
+ /** Returns the org PID from the param or falls back to the active session org. */
5
+ function resolveOrgId(organization_id) {
6
+ return organization_id || session.getActiveOrgId();
7
+ }
8
+ export function registerOrganizationTools(server) {
9
+ server.tool("list_organizations", "List all organizations you belong to", {}, async () => {
10
+ const result = await apiRequest("/organizations", {
11
+ toolName: "list_organizations",
12
+ skipOrgInjection: true,
13
+ });
14
+ if (!result.success) {
15
+ return { content: [{ type: "text", text: `Failed to list organizations (${result.statusCode}): ${result.message}` }] };
16
+ }
17
+ return { content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }] };
18
+ });
19
+ server.tool("create_organization", "Create a new organization (limit: 1 per user). You become the owner and receive 5 invite credits.", {
20
+ name: z.string().min(2).max(100, "Name must be 2-100 characters"),
21
+ description: z.string().optional(),
22
+ default_instance_iam_role_arn: z.string().optional(),
23
+ }, async ({ name, description, default_instance_iam_role_arn }) => {
24
+ const body = {
25
+ organization: { name, description, default_instance_iam_role_arn },
26
+ };
27
+ const result = await apiRequest("/organizations", {
28
+ method: "POST",
29
+ body,
30
+ toolName: "create_organization",
31
+ skipOrgInjection: true,
32
+ });
33
+ if (!result.success) {
34
+ return { content: [{ type: "text", text: `Failed to create organization (${result.statusCode}): ${result.message}` }] };
35
+ }
36
+ const org = result.data;
37
+ // Auto-select the newly created org
38
+ session.setActiveOrg({
39
+ id: org.id,
40
+ name: org.name,
41
+ billingPlan: org.billing_plan ?? "free",
42
+ });
43
+ return {
44
+ content: [
45
+ { type: "text", text: `Organization "${org.name}" created. You are now working in this org.` },
46
+ { type: "text", text: JSON.stringify(org, null, 2) },
47
+ ],
48
+ };
49
+ });
50
+ server.tool("get_organization", "Get details of an organization (defaults to your active org)", {
51
+ organization_id: z.string().optional().describe("Organization PID (defaults to active org)"),
52
+ }, async ({ organization_id }) => {
53
+ const orgId = resolveOrgId(organization_id);
54
+ if (!orgId) {
55
+ return { content: [{ type: "text", text: "No organization selected. Call `select_organization` first or pass an organization_id." }] };
56
+ }
57
+ const result = await apiRequest(`/organizations/${orgId}`, {
58
+ toolName: "get_organization",
59
+ skipOrgInjection: true,
60
+ });
61
+ if (!result.success) {
62
+ return { content: [{ type: "text", text: `Failed to get organization (${result.statusCode}): ${result.message}` }] };
63
+ }
64
+ return { content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }] };
65
+ });
66
+ server.tool("update_organization", "Update an organization's name, description, or IAM role (requires owner or admin role)", {
67
+ organization_id: z.string().optional().describe("Organization PID (defaults to active org)"),
68
+ name: z.string().min(2).max(100).optional(),
69
+ description: z.string().optional(),
70
+ default_instance_iam_role_arn: z.string().optional(),
71
+ }, async ({ organization_id, name, description, default_instance_iam_role_arn }) => {
72
+ const orgId = resolveOrgId(organization_id);
73
+ if (!orgId) {
74
+ return { content: [{ type: "text", text: "No organization selected. Call `select_organization` first or pass an organization_id." }] };
75
+ }
76
+ const result = await apiRequest(`/organizations/${orgId}`, {
77
+ method: "PUT",
78
+ body: { organization: { name, description, default_instance_iam_role_arn } },
79
+ toolName: "update_organization",
80
+ skipOrgInjection: true,
81
+ });
82
+ if (!result.success) {
83
+ return { content: [{ type: "text", text: `Failed to update organization (${result.statusCode}): ${result.message}` }] };
84
+ }
85
+ return {
86
+ content: [
87
+ { type: "text", text: "Organization updated." },
88
+ { type: "text", text: JSON.stringify(result.data, null, 2) },
89
+ ],
90
+ };
91
+ });
92
+ server.tool("delete_organization", "DESTRUCTIVE: Delete an organization (requires owner or admin role). This soft-deletes the org and all related resources. You MUST set confirm=true to proceed.", {
93
+ organization_id: z.string().optional().describe("Organization PID (defaults to active org)"),
94
+ confirm: z.boolean().describe("Must be true to proceed. Ask the user for explicit confirmation before setting this."),
95
+ }, async ({ organization_id, confirm }) => {
96
+ const orgId = resolveOrgId(organization_id);
97
+ if (!orgId) {
98
+ return { content: [{ type: "text", text: "No organization selected. Call `select_organization` first or pass an organization_id." }] };
99
+ }
100
+ if (!confirm) {
101
+ return {
102
+ content: [{
103
+ type: "text",
104
+ text: `You are about to DELETE organization ${orgId}. This will soft-delete the org and ALL related resources (instances, credentials, backups, etc.).\n\nTo proceed, call this tool again with confirm=true.`,
105
+ }],
106
+ };
107
+ }
108
+ const result = await apiRequest(`/organizations/${orgId}`, {
109
+ method: "DELETE",
110
+ toolName: "delete_organization",
111
+ skipOrgInjection: true,
112
+ });
113
+ if (!result.success) {
114
+ return { content: [{ type: "text", text: `Failed to delete organization (${result.statusCode}): ${result.message}` }] };
115
+ }
116
+ // Clear session if the deleted org was the active one
117
+ if (session.getActiveOrgId() === orgId) {
118
+ session.clear();
119
+ }
120
+ return { content: [{ type: "text", text: `Organization ${orgId} deleted.` }] };
121
+ });
122
+ server.tool("list_members", "List members of an organization with their roles", {
123
+ organization_id: z.string().optional().describe("Organization PID (defaults to active org)"),
124
+ }, async ({ organization_id }) => {
125
+ const orgId = resolveOrgId(organization_id);
126
+ if (!orgId) {
127
+ return { content: [{ type: "text", text: "No organization selected. Call `select_organization` first or pass an organization_id." }] };
128
+ }
129
+ const result = await apiRequest(`/organizations/${orgId}/members`, {
130
+ toolName: "list_members",
131
+ skipOrgInjection: true,
132
+ });
133
+ if (!result.success) {
134
+ return { content: [{ type: "text", text: `Failed to list members (${result.statusCode}): ${result.message}` }] };
135
+ }
136
+ return { content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }] };
137
+ });
138
+ server.tool("remove_member", "DESTRUCTIVE: Remove a member from an organization (requires owner or admin role). Cannot remove the last owner. You MUST set confirm=true to proceed.", {
139
+ organization_id: z.string().optional().describe("Organization PID (defaults to active org)"),
140
+ user_id: z.string().min(1, "User PID is required"),
141
+ confirm: z.boolean().describe("Must be true to proceed. Ask the user for explicit confirmation before setting this."),
142
+ }, async ({ organization_id, user_id, confirm }) => {
143
+ const orgId = resolveOrgId(organization_id);
144
+ if (!orgId) {
145
+ return { content: [{ type: "text", text: "No organization selected. Call `select_organization` first or pass an organization_id." }] };
146
+ }
147
+ if (!confirm) {
148
+ return {
149
+ content: [{
150
+ type: "text",
151
+ text: `You are about to REMOVE member ${user_id} from organization ${orgId}. They will lose access to all org resources.\n\nTo proceed, call this tool again with confirm=true.`,
152
+ }],
153
+ };
154
+ }
155
+ const result = await apiRequest(`/organizations/${orgId}/members/${user_id}`, {
156
+ method: "DELETE",
157
+ toolName: "remove_member",
158
+ skipOrgInjection: true,
159
+ });
160
+ if (!result.success) {
161
+ return { content: [{ type: "text", text: `Failed to remove member (${result.statusCode}): ${result.message}` }] };
162
+ }
163
+ return { content: [{ type: "text", text: `Member ${user_id} removed from organization.` }] };
164
+ });
165
+ server.tool("invite_to_org", "Invite a user to your organization by email. Requires members:invite permission. Role hierarchy is enforced (can only invite at or below your role).", {
166
+ organization_id: z.string().optional().describe("Organization PID (defaults to active org)"),
167
+ email: z.string().email("Valid email is required"),
168
+ role_pid: z.string().min(1, "Role PID is required (e.g. role PID for member, admin, etc.)"),
169
+ }, async ({ organization_id, email, role_pid }) => {
170
+ const orgId = resolveOrgId(organization_id);
171
+ if (!orgId) {
172
+ return { content: [{ type: "text", text: "No organization selected. Call `select_organization` first or pass an organization_id." }] };
173
+ }
174
+ const result = await apiRequest(`/organizations/${orgId}/invitations`, {
175
+ method: "POST",
176
+ body: { email, role_pid },
177
+ toolName: "invite_to_org",
178
+ skipOrgInjection: true,
179
+ });
180
+ if (!result.success) {
181
+ return { content: [{ type: "text", text: `Failed to send invitation (${result.statusCode}): ${result.message}` }] };
182
+ }
183
+ return {
184
+ content: [
185
+ { type: "text", text: `Invitation sent to ${email}.` },
186
+ { type: "text", text: JSON.stringify(result.data, null, 2) },
187
+ ],
188
+ };
189
+ });
190
+ server.tool("list_org_invitations", "List pending invitations for an organization", {
191
+ organization_id: z.string().optional().describe("Organization PID (defaults to active org)"),
192
+ }, async ({ organization_id }) => {
193
+ const orgId = resolveOrgId(organization_id);
194
+ if (!orgId) {
195
+ return { content: [{ type: "text", text: "No organization selected. Call `select_organization` first or pass an organization_id." }] };
196
+ }
197
+ const result = await apiRequest(`/organizations/${orgId}/invitations`, {
198
+ toolName: "list_org_invitations",
199
+ skipOrgInjection: true,
200
+ });
201
+ if (!result.success) {
202
+ return { content: [{ type: "text", text: `Failed to list invitations (${result.statusCode}): ${result.message}` }] };
203
+ }
204
+ return { content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }] };
205
+ });
206
+ server.tool("cancel_invitation", "DESTRUCTIVE: Cancel a pending organization invitation. You MUST set confirm=true to proceed.", {
207
+ organization_id: z.string().optional().describe("Organization PID (defaults to active org)"),
208
+ invitation_id: z.string().min(1, "Invitation PID is required"),
209
+ confirm: z.boolean().describe("Must be true to proceed. Ask the user for explicit confirmation before setting this."),
210
+ }, async ({ organization_id, invitation_id, confirm }) => {
211
+ const orgId = resolveOrgId(organization_id);
212
+ if (!orgId) {
213
+ return { content: [{ type: "text", text: "No organization selected. Call `select_organization` first or pass an organization_id." }] };
214
+ }
215
+ if (!confirm) {
216
+ return {
217
+ content: [{
218
+ type: "text",
219
+ text: `You are about to CANCEL invitation ${invitation_id}. The invited user will no longer be able to join.\n\nTo proceed, call this tool again with confirm=true.`,
220
+ }],
221
+ };
222
+ }
223
+ const result = await apiRequest(`/organizations/${orgId}/invitations/${invitation_id}`, {
224
+ method: "DELETE",
225
+ toolName: "cancel_invitation",
226
+ skipOrgInjection: true,
227
+ });
228
+ if (!result.success) {
229
+ return { content: [{ type: "text", text: `Failed to cancel invitation (${result.statusCode}): ${result.message}` }] };
230
+ }
231
+ return { content: [{ type: "text", text: `Invitation ${invitation_id} cancelled.` }] };
232
+ });
233
+ server.tool("get_my_invitations", "List pending organization invitations sent to you", {}, async () => {
234
+ const result = await apiRequest("/my_invitations", {
235
+ toolName: "get_my_invitations",
236
+ skipOrgInjection: true,
237
+ });
238
+ if (!result.success) {
239
+ return { content: [{ type: "text", text: `Failed to get invitations (${result.statusCode}): ${result.message}` }] };
240
+ }
241
+ return { content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }] };
242
+ });
243
+ server.tool("list_activity_logs", "List activity logs for an organization (audit trail of actions)", {
244
+ organization_id: z.string().optional().describe("Organization PID (defaults to active org)"),
245
+ }, async ({ organization_id }) => {
246
+ const orgId = resolveOrgId(organization_id);
247
+ if (!orgId) {
248
+ return { content: [{ type: "text", text: "No organization selected. Call `select_organization` first or pass an organization_id." }] };
249
+ }
250
+ const result = await apiRequest(`/organizations/${orgId}/activity_logs`, {
251
+ toolName: "list_activity_logs",
252
+ skipOrgInjection: true,
253
+ });
254
+ if (!result.success) {
255
+ return { content: [{ type: "text", text: `Failed to list activity logs (${result.statusCode}): ${result.message}` }] };
256
+ }
257
+ return { content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }] };
258
+ });
259
+ }
260
+ //# 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,2 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerPgConfigTools(server: McpServer): void;
@@ -0,0 +1,59 @@
1
+ import { z } from "zod";
2
+ import { apiRequest } from "../client.js";
3
+ const pgConfigSchema = z.object({
4
+ shared_buffers: z.unknown().optional().describe("Shared memory for caching (e.g. '256MB'). Set null to revert to default."),
5
+ effective_cache_size: z.unknown().optional().describe("Planner estimate of OS cache (e.g. '768MB'). Set null to revert."),
6
+ random_page_cost: z.unknown().optional().describe("Cost of non-sequential page fetch (e.g. 1.1). Set null to revert."),
7
+ work_mem: z.unknown().optional().describe("Memory per sort/hash operation (e.g. '4MB'). Set null to revert."),
8
+ maintenance_work_mem: z.unknown().optional().describe("Memory for maintenance ops (e.g. '64MB'). Set null to revert."),
9
+ max_connections: z.unknown().optional().describe("Max concurrent connections (e.g. 100). Set null to revert. Requires restart."),
10
+ }).describe("PostgreSQL configuration overrides");
11
+ export function registerPgConfigTools(server) {
12
+ server.tool("preview_pg_config", "Preview calculated PostgreSQL configuration defaults for an instance type and region. Use this to see what values will be auto-calculated before creating or tuning an instance.", {
13
+ instance_type: z.string().min(1, "EC2 instance type is required (e.g. t3.medium)"),
14
+ region: z.string().min(1, "AWS region is required"),
15
+ }, async ({ instance_type, region }) => {
16
+ const result = await apiRequest("/aws/v1/postgresql_configs/preview", {
17
+ toolName: "preview_pg_config",
18
+ query: { instance_type, region },
19
+ skipOrgInjection: true,
20
+ });
21
+ if (!result.success) {
22
+ return { content: [{ type: "text", text: `Failed to preview PG config (${result.statusCode}): ${result.message}` }] };
23
+ }
24
+ return { content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }] };
25
+ });
26
+ server.tool("get_pg_config", "Get the current PostgreSQL configuration for a running instance, showing calculated defaults, overrides, and effective values.", {
27
+ instance_pid: z.string().min(1, "Instance PID is required"),
28
+ }, async ({ instance_pid }) => {
29
+ const result = await apiRequest(`/aws/v1/instances/${instance_pid}/postgresql_config`, {
30
+ toolName: "get_pg_config",
31
+ skipOrgInjection: true,
32
+ });
33
+ if (!result.success) {
34
+ return { content: [{ type: "text", text: `Failed to get PG config (${result.statusCode}): ${result.message}` }] };
35
+ }
36
+ return { content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }] };
37
+ });
38
+ server.tool("update_pg_config", "Update PostgreSQL configuration parameters on a running instance. Set a value to null to revert to the calculated default. shared_buffers and max_connections require a restart. Changes auto-sync to replicas.", {
39
+ instance_pid: z.string().min(1, "Instance PID is required"),
40
+ postgresql_config: pgConfigSchema,
41
+ }, async ({ instance_pid, postgresql_config }) => {
42
+ const result = await apiRequest(`/aws/v1/instances/${instance_pid}/postgresql_config`, {
43
+ method: "PATCH",
44
+ body: { postgresql_config },
45
+ toolName: "update_pg_config",
46
+ skipOrgInjection: true,
47
+ });
48
+ if (!result.success) {
49
+ return { content: [{ type: "text", text: `Failed to update PG config (${result.statusCode}): ${result.message}` }] };
50
+ }
51
+ return {
52
+ content: [
53
+ { type: "text", text: "PostgreSQL configuration updated." },
54
+ { type: "text", text: JSON.stringify(result.data, null, 2) },
55
+ ],
56
+ };
57
+ });
58
+ }
59
+ //# sourceMappingURL=pg-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg-config.js","sourceRoot":"","sources":["../../src/tools/pg-config.ts"],"names":[],"mappings":"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"}