File size: 1,804 Bytes
c691d96
 
 
62cf129
dd125ca
076e59d
a65d39f
c691d96
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62cf129
dd125ca
c691d96
 
8397cce
c691d96
 
 
8397cce
c691d96
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a65d39f
 
c691d96
 
 
 
 
 
 
a65d39f
c691d96
 
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
import { type InferSchema, type ToolMetadata } from "xmcp";
import { headers } from "xmcp/headers";
import { z } from "zod";
import { patchOperationSchema } from "../schemas/patchOperationSchema";
import { getScimBaseUrl } from "../utils/getSCIMBaseUrl";
import { getScimToken } from "../utils/getSCIMToken";
import { readJsonBody } from "../utils/responseBody";

export const metadata: ToolMetadata = {
  name: "patch-user",
  description: "Partially update a user resource",
  annotations: {
    title: "Patch User Resource",
    readOnlyHint: false,
    destructiveHint: false,
    idempotentHint: true,
    openWorldHint: true,
  },
};

export const schema = {
  userId: z.string().describe("The unique identifier of the user to patch"),
  ...patchOperationSchema,
};

export default async function patchUser(
  params: InferSchema<typeof schema>
) {
  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 { userId, ...patchOperation } = params;

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

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

  const data = await readJsonBody(response);

  return {
    content: [
      {
        type: "text",
        text: `User ${userId} patched successfully`,
      },
    ],
    structuredContent: data ?? undefined,
  };
}