accessTokens.ts•3 kB
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { GraphQLClient } from "../graphqlClient.js";
import { z } from "zod";
import { text } from "../util/mcp.js";
export function registerAccessTokenTools(server: McpServer, gql: GraphQLClient) {
  const listAccessTokensHandler = async () => {
    try {
      const query = `query { accessTokens { id name createdAt expiresAt } }`;
      const data = await gql.request<{ accessTokens: any[] }>(query);
      return text(data.accessTokens || []);
    } catch (error: any) {
      console.error("List access tokens error:", error.message);
      return text([]);
    }
  };
  server.registerTool(
    "affine_list_access_tokens",
    {
      title: "List Access Tokens",
      description: "List personal access tokens (metadata).",
      inputSchema: {}
    },
    listAccessTokensHandler as any
  );
  server.registerTool(
    "list_access_tokens",
    {
      title: "List Access Tokens",
      description: "List personal access tokens (metadata).",
      inputSchema: {}
    },
    listAccessTokensHandler as any
  );
  const generateAccessTokenHandler = async (parsed: { name: string; expiresAt?: string }) => {
    const mutation = `mutation($input: GenerateAccessTokenInput!){ generateUserAccessToken(input:$input){ id name createdAt expiresAt token } }`;
    const data = await gql.request<{ generateUserAccessToken: any }>(mutation, { input: { name: parsed.name, expiresAt: parsed.expiresAt ?? null } });
    return text(data.generateUserAccessToken);
  };
  server.registerTool(
    "affine_generate_access_token",
    {
      title: "Generate Access Token",
      description: "Generate a personal access token (returns token).",
      inputSchema: {
        name: z.string(),
        expiresAt: z.string().optional()
      }
    },
    generateAccessTokenHandler as any
  );
  server.registerTool(
    "generate_access_token",
    {
      title: "Generate Access Token",
      description: "Generate a personal access token (returns token).",
      inputSchema: {
        name: z.string(),
        expiresAt: z.string().optional()
      }
    },
    generateAccessTokenHandler as any
  );
  const revokeAccessTokenHandler = async (parsed: { id: string }) => {
    const mutation = `mutation($id:String!){ revokeUserAccessToken(id:$id) }`;
    const data = await gql.request<{ revokeUserAccessToken: boolean }>(mutation, { id: parsed.id });
    return text({ success: data.revokeUserAccessToken });
  };
  server.registerTool(
    "affine_revoke_access_token",
    {
      title: "Revoke Access Token",
      description: "Revoke a personal access token by id.",
      inputSchema: {
        id: z.string()
      }
    },
    revokeAccessTokenHandler as any
  );
  server.registerTool(
    "revoke_access_token",
    {
      title: "Revoke Access Token",
      description: "Revoke a personal access token by id.",
      inputSchema: {
        id: z.string()
      }
    },
    revokeAccessTokenHandler as any
  );
}