Skip to main content
Glama
team.ts8.85 kB
/** * Team Management Tools * * 团队管理相关的 MCP 工具实现 */ import type { GiteaClient } from '../gitea-client.js'; import type { ContextManager } from '../context-manager.js'; import type { GiteaTeam, GiteaUser, GiteaRepository, CreateTeamOptions, UpdateTeamOptions, } from '../types/gitea.js'; import { createLogger } from '../logger.js'; const logger = createLogger('tools:team'); export interface TeamToolsContext { client: GiteaClient; contextManager: ContextManager; } /** * 创建团队 */ export async function createTeam( ctx: TeamToolsContext, args: { org: string; name: string; description?: string; permission?: 'read' | 'write' | 'admin'; can_create_org_repo?: boolean; includes_all_repositories?: boolean; units?: string[]; token?: string; } ) { logger.debug({ args }, 'Creating team'); const createOptions: CreateTeamOptions = { name: args.name, description: args.description, permission: args.permission || 'read', can_create_org_repo: args.can_create_org_repo || false, includes_all_repositories: args.includes_all_repositories || false, units: args.units, }; const team = await ctx.client.post<GiteaTeam>( `/orgs/${args.org}/teams`, createOptions, args.token ); logger.info({ org: args.org, team: team.name }, 'Team created successfully'); return { success: true, team: { id: team.id, name: team.name, description: team.description, permission: team.permission, can_create_org_repo: team.can_create_org_repo, includes_all_repositories: team.includes_all_repositories, }, }; } /** * 列出组织的所有团队 */ export async function listTeams( ctx: TeamToolsContext, args: { org: string; page?: number; limit?: number; token?: string; } ) { logger.debug({ args }, 'Listing teams'); const teams = await ctx.client.get<GiteaTeam[]>(`/orgs/${args.org}/teams`, { page: args.page || 1, limit: args.limit || 30, }, args.token); logger.debug({ count: teams.length }, 'Teams listed'); return { success: true, teams: teams.map((team) => ({ id: team.id, name: team.name, description: team.description, permission: team.permission, can_create_org_repo: team.can_create_org_repo, includes_all_repositories: team.includes_all_repositories, })), pagination: { page: args.page || 1, limit: args.limit || 30, total: teams.length, }, }; } /** * 获取团队详情 */ export async function getTeam( ctx: TeamToolsContext, args: { id: number; token?: string; } ) { logger.debug({ args }, 'Getting team'); const team = await ctx.client.get<GiteaTeam>(`/teams/${args.id}`, undefined, args.token); logger.debug({ team: team.name }, 'Team retrieved'); return { success: true, team: { id: team.id, name: team.name, description: team.description, organization: { id: team.organization.id, name: team.organization.name, full_name: team.organization.full_name, }, permission: team.permission, can_create_org_repo: team.can_create_org_repo, includes_all_repositories: team.includes_all_repositories, units: team.units, }, }; } /** * 更新团队 */ export async function updateTeam( ctx: TeamToolsContext, args: { id: number; name?: string; description?: string; permission?: 'read' | 'write' | 'admin'; can_create_org_repo?: boolean; includes_all_repositories?: boolean; units?: string[]; token?: string; } ) { logger.debug({ args }, 'Updating team'); const updateOptions: UpdateTeamOptions = { name: args.name, description: args.description, permission: args.permission, can_create_org_repo: args.can_create_org_repo, includes_all_repositories: args.includes_all_repositories, units: args.units, }; const team = await ctx.client.patch<GiteaTeam>( `/teams/${args.id}`, updateOptions, args.token ); logger.info({ team: team.name }, 'Team updated successfully'); return { success: true, team: { id: team.id, name: team.name, description: team.description, permission: team.permission, can_create_org_repo: team.can_create_org_repo, includes_all_repositories: team.includes_all_repositories, }, }; } /** * 删除团队 */ export async function deleteTeam( ctx: TeamToolsContext, args: { id: number; token?: string; } ) { logger.debug({ args }, 'Deleting team'); await ctx.client.delete(`/teams/${args.id}`, undefined, args.token); logger.info({ team: args.id }, 'Team deleted successfully'); return { success: true, message: `Team #${args.id} has been deleted`, }; } /** * 列出团队成员 */ export async function listTeamMembers( ctx: TeamToolsContext, args: { id: number; page?: number; limit?: number; token?: string; } ) { logger.debug({ args }, 'Listing team members'); const members = await ctx.client.get<GiteaUser[]>(`/teams/${args.id}/members`, { page: args.page || 1, limit: args.limit || 30, }, args.token); logger.debug({ count: members.length }, 'Team members listed'); return { success: true, members: members.map((member) => ({ id: member.id, login: member.login, full_name: member.full_name, email: member.email, avatar_url: member.avatar_url, })), pagination: { page: args.page || 1, limit: args.limit || 30, total: members.length, }, }; } /** * 添加成员到团队 */ export async function addTeamMember( ctx: TeamToolsContext, args: { id: number; username: string; token?: string; } ) { logger.debug({ args }, 'Adding member to team'); await ctx.client.put(`/teams/${args.id}/members/${args.username}`, undefined, args.token); logger.info( { team: args.id, username: args.username }, 'Member added to team successfully' ); return { success: true, message: `User ${args.username} has been added to team #${args.id}`, }; } /** * 从团队移除成员 */ export async function removeTeamMember( ctx: TeamToolsContext, args: { id: number; username: string; token?: string; } ) { logger.debug({ args }, 'Removing member from team'); await ctx.client.delete(`/teams/${args.id}/members/${args.username}`, undefined, args.token); logger.info( { team: args.id, username: args.username }, 'Member removed from team successfully' ); return { success: true, message: `User ${args.username} has been removed from team #${args.id}`, }; } /** * 列出团队可访问的仓库 */ export async function listTeamRepos( ctx: TeamToolsContext, args: { id: number; page?: number; limit?: number; token?: string; } ) { logger.debug({ args }, 'Listing team repositories'); const repos = await ctx.client.get<GiteaRepository[]>( `/teams/${args.id}/repos`, { page: args.page || 1, limit: args.limit || 30, }, args.token ); logger.debug({ count: repos.length }, 'Team repositories listed'); return { success: true, repositories: repos.map((repo) => ({ id: repo.id, name: repo.name, full_name: repo.full_name, description: repo.description, private: repo.private, html_url: repo.html_url, })), pagination: { page: args.page || 1, limit: args.limit || 30, total: repos.length, }, }; } /** * 为团队添加仓库访问权限 */ export async function addTeamRepo( ctx: TeamToolsContext, args: { id: number; org: string; repo: string; token?: string; } ) { logger.debug({ args }, 'Adding repository to team'); await ctx.client.put(`/teams/${args.id}/repos/${args.org}/${args.repo}`, undefined, args.token); logger.info( { team: args.id, repo: `${args.org}/${args.repo}` }, 'Repository added to team successfully' ); return { success: true, message: `Repository ${args.org}/${args.repo} has been added to team #${args.id}`, }; } /** * 移除团队的仓库访问权限 */ export async function removeTeamRepo( ctx: TeamToolsContext, args: { id: number; org: string; repo: string; token?: string; } ) { logger.debug({ args }, 'Removing repository from team'); await ctx.client.delete(`/teams/${args.id}/repos/${args.org}/${args.repo}`, undefined, args.token); logger.info( { team: args.id, repo: `${args.org}/${args.repo}` }, 'Repository removed from team successfully' ); return { success: true, message: `Repository ${args.org}/${args.repo} has been removed from team #${args.id}`, }; }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/SupenBysz/gitea-mcp-tool'

If you have feedback or need assistance with the MCP directory API, please join our Discord server