File size: 1,801 Bytes
5fb7ff1
 
796ba8e
62cf129
dd125ca
076e59d
a65d39f
5fb7ff1
 
 
 
 
 
 
 
 
 
 
 
 
f509db9
796ba8e
 
 
5fb7ff1
f509db9
 
 
 
5fb7ff1
f509db9
5fb7ff1
f509db9
5fb7ff1
62cf129
dd125ca
5fb7ff1
 
8397cce
5fb7ff1
 
 
8397cce
5fb7ff1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a65d39f
5fb7ff1
 
 
 
 
 
 
 
a65d39f
5fb7ff1
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import { type InferSchema, type ToolMetadata } from "xmcp";
import { headers } from "xmcp/headers";
import { z } from "zod";
import { groupResourceSchema } from "../schemas/groupResourceSchema";
import { getScimBaseUrl } from "../utils/getSCIMBaseUrl";
import { getScimToken } from "../utils/getSCIMToken";
import { readJsonBody } from "../utils/responseBody";

export const metadata: ToolMetadata = {
  name: "create-group",
  description: "Create a group resource",
  annotations: {
    title: "Create Group Resource",
    readOnlyHint: false,
    destructiveHint: false,
    idempotentHint: true,
    openWorldHint: true,
  },
};

const createGroupInputSchema = z.object(groupResourceSchema).omit({
  id: true,
  meta: true,
});

export const schema = {
  groupResource: createGroupInputSchema,
};

export default async function createGroup(
  params: InferSchema<typeof schema>
) {
  const { groupResource } = params;
  const requestHeaders = headers();
  const apiToken = getScimToken(requestHeaders);
  const baseUrl = getScimBaseUrl(requestHeaders);

  if (!apiToken) {
    throw new Error("Missing required headers: x-scim-api-token or SCIM_API_TOKEN env");
  }

  if (!baseUrl) {
    throw new Error("Missing required headers: x-scim-base-url or SCIM_API_BASE_URL env");
  }

  const response = await fetch(`${baseUrl}/Groups`, {
    method: "POST",
    headers: {
      "Content-Type": "application/scim+json",
      Authorization: `Bearer ${apiToken}`,
    },
    body: JSON.stringify(groupResource),
  });

  if (!response.ok) {
    throw new Error(await response.text());
  }

  const data = await readJsonBody(response);

  return {
    content: [
      {
        type: "text",
        text: `Group created successfully`,
      },
    ],
    structuredContent: data ?? undefined,
  };
}