Initial commit: MCP Hub Community Edition v3.0.0
Community edition generated from private repo via sync pipeline. Includes 9 plugins (WordPress, WooCommerce, WP Advanced, Gitea, n8n, Supabase, OpenPanel, Appwrite, Directus) with ~587 tools. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
245
plugins/gitea/handlers/users.py
Normal file
245
plugins/gitea/handlers/users.py
Normal file
@@ -0,0 +1,245 @@
|
||||
"""User & Organization Handler - manages Gitea users, organizations, and teams"""
|
||||
|
||||
import json
|
||||
from typing import Any
|
||||
|
||||
from plugins.gitea.client import GiteaClient
|
||||
|
||||
def get_tool_specifications() -> list[dict[str, Any]]:
|
||||
"""Return tool specifications for ToolGenerator"""
|
||||
return [
|
||||
# === USERS ===
|
||||
{
|
||||
"name": "get_user",
|
||||
"method_name": "get_user",
|
||||
"description": "Get information about a Gitea user by username.",
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"username": {
|
||||
"type": "string",
|
||||
"description": "Username to look up",
|
||||
"minLength": 1,
|
||||
}
|
||||
},
|
||||
"required": ["username"],
|
||||
},
|
||||
"scope": "read",
|
||||
},
|
||||
{
|
||||
"name": "list_user_repos",
|
||||
"method_name": "list_user_repos",
|
||||
"description": "List all public repositories of a Gitea user.",
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"username": {"type": "string", "description": "Username", "minLength": 1},
|
||||
"page": {
|
||||
"type": "integer",
|
||||
"description": "Page number",
|
||||
"default": 1,
|
||||
"minimum": 1,
|
||||
},
|
||||
"limit": {
|
||||
"type": "integer",
|
||||
"description": "Items per page (1-100)",
|
||||
"default": 30,
|
||||
"minimum": 1,
|
||||
"maximum": 100,
|
||||
},
|
||||
},
|
||||
"required": ["username"],
|
||||
},
|
||||
"scope": "read",
|
||||
},
|
||||
{
|
||||
"name": "search_users",
|
||||
"method_name": "search_users",
|
||||
"description": "Search for Gitea users by query or user ID.",
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"q": {
|
||||
"anyOf": [{"type": "string"}, {"type": "null"}],
|
||||
"description": "Search query (username or full name)",
|
||||
},
|
||||
"uid": {
|
||||
"anyOf": [{"type": "integer"}, {"type": "null"}],
|
||||
"description": "User ID to search for",
|
||||
},
|
||||
},
|
||||
},
|
||||
"scope": "read",
|
||||
},
|
||||
# === ORGANIZATIONS ===
|
||||
{
|
||||
"name": "list_organizations",
|
||||
"method_name": "list_organizations",
|
||||
"description": "List organizations for the current authenticated user.",
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"page": {
|
||||
"type": "integer",
|
||||
"description": "Page number",
|
||||
"default": 1,
|
||||
"minimum": 1,
|
||||
},
|
||||
"limit": {
|
||||
"type": "integer",
|
||||
"description": "Items per page (1-100)",
|
||||
"default": 30,
|
||||
"minimum": 1,
|
||||
"maximum": 100,
|
||||
},
|
||||
},
|
||||
},
|
||||
"scope": "read",
|
||||
},
|
||||
{
|
||||
"name": "get_organization",
|
||||
"method_name": "get_organization",
|
||||
"description": "Get information about a Gitea organization by name.",
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"org": {"type": "string", "description": "Organization name", "minLength": 1}
|
||||
},
|
||||
"required": ["org"],
|
||||
},
|
||||
"scope": "read",
|
||||
},
|
||||
{
|
||||
"name": "list_org_repos",
|
||||
"method_name": "list_org_repos",
|
||||
"description": "List all repositories of an organization.",
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"org": {"type": "string", "description": "Organization name", "minLength": 1},
|
||||
"page": {
|
||||
"type": "integer",
|
||||
"description": "Page number",
|
||||
"default": 1,
|
||||
"minimum": 1,
|
||||
},
|
||||
"limit": {
|
||||
"type": "integer",
|
||||
"description": "Items per page (1-100)",
|
||||
"default": 30,
|
||||
"minimum": 1,
|
||||
"maximum": 100,
|
||||
},
|
||||
},
|
||||
"required": ["org"],
|
||||
},
|
||||
"scope": "read",
|
||||
},
|
||||
# === TEAMS ===
|
||||
{
|
||||
"name": "list_org_teams",
|
||||
"method_name": "list_org_teams",
|
||||
"description": "List all teams in an organization.",
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"org": {"type": "string", "description": "Organization name", "minLength": 1},
|
||||
"page": {
|
||||
"type": "integer",
|
||||
"description": "Page number",
|
||||
"default": 1,
|
||||
"minimum": 1,
|
||||
},
|
||||
"limit": {
|
||||
"type": "integer",
|
||||
"description": "Items per page (1-100)",
|
||||
"default": 30,
|
||||
"minimum": 1,
|
||||
"maximum": 100,
|
||||
},
|
||||
},
|
||||
"required": ["org"],
|
||||
},
|
||||
"scope": "read",
|
||||
},
|
||||
{
|
||||
"name": "list_team_members",
|
||||
"method_name": "list_team_members",
|
||||
"description": "List all members of a team.",
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"team_id": {"type": "integer", "description": "Team ID", "minimum": 1},
|
||||
"page": {
|
||||
"type": "integer",
|
||||
"description": "Page number",
|
||||
"default": 1,
|
||||
"minimum": 1,
|
||||
},
|
||||
"limit": {
|
||||
"type": "integer",
|
||||
"description": "Items per page (1-100)",
|
||||
"default": 30,
|
||||
"minimum": 1,
|
||||
"maximum": 100,
|
||||
},
|
||||
},
|
||||
"required": ["team_id"],
|
||||
},
|
||||
"scope": "read",
|
||||
},
|
||||
]
|
||||
|
||||
async def get_user(client: GiteaClient, username: str) -> str:
|
||||
"""Get user information"""
|
||||
user = await client.get_user(username)
|
||||
result = {"success": True, "user": user}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
async def list_user_repos(
|
||||
client: GiteaClient, username: str, page: int = 1, limit: int = 30
|
||||
) -> str:
|
||||
"""List user repositories"""
|
||||
repos = await client.list_user_repos(username, page=page, limit=limit)
|
||||
result = {"success": True, "count": len(repos), "repositories": repos}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
async def search_users(client: GiteaClient, q: str | None = None, uid: int | None = None) -> str:
|
||||
"""Search users"""
|
||||
users = await client.search_users(query=q, uid=uid)
|
||||
result = {"success": True, "count": len(users), "users": users}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
# Organization operations
|
||||
async def list_organizations(client: GiteaClient, page: int = 1, limit: int = 30) -> str:
|
||||
"""List organizations"""
|
||||
orgs = await client.list_organizations(page=page, limit=limit)
|
||||
result = {"success": True, "count": len(orgs), "organizations": orgs}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
async def get_organization(client: GiteaClient, org: str) -> str:
|
||||
"""Get organization information"""
|
||||
organization = await client.get_organization(org)
|
||||
result = {"success": True, "organization": organization}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
async def list_org_repos(client: GiteaClient, org: str, page: int = 1, limit: int = 30) -> str:
|
||||
"""List organization repositories"""
|
||||
repos = await client.list_org_repos(org, page=page, limit=limit)
|
||||
result = {"success": True, "count": len(repos), "repositories": repos}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
# Team operations
|
||||
async def list_org_teams(client: GiteaClient, org: str, page: int = 1, limit: int = 30) -> str:
|
||||
"""List organization teams"""
|
||||
teams = await client.list_org_teams(org, page=page, limit=limit)
|
||||
result = {"success": True, "count": len(teams), "teams": teams}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
async def list_team_members(
|
||||
client: GiteaClient, team_id: int, page: int = 1, limit: int = 30
|
||||
) -> str:
|
||||
"""List team members"""
|
||||
members = await client.list_team_members(team_id, page=page, limit=limit)
|
||||
result = {"success": True, "count": len(members), "members": members}
|
||||
return json.dumps(result, indent=2)
|
||||
Reference in New Issue
Block a user