Skip to main content
Glama
snowild

Redmine MCP Server

by snowild

search_users

Find Redmine users by name or login ID to identify team members, assign tasks, or manage project permissions. Returns matching user profiles with configurable result limits.

Instructions

搜尋用戶(依姓名或登入名)

Args:
    query: 搜尋關鍵字(姓名或登入名)
    limit: 最大回傳數量 (預設 10,最大 50)

Returns:
    符合搜尋條件的用戶列表

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
queryYes
limitNo

Implementation Reference

  • MCP tool handler for search_users: formats client results into a readable table string.
    @mcp.tool()
    def search_users(query: str, limit: int = 10) -> str:
        """
        搜尋用戶(依姓名或登入名)
        
        Args:
            query: 搜尋關鍵字(姓名或登入名)
            limit: 最大回傳數量 (預設 10,最大 50)
        
        Returns:
            符合搜尋條件的用戶列表
        """
        try:
            if not query.strip():
                return "請提供搜尋關鍵字"
            
            client = get_client()
            limit = min(max(limit, 1), 50)
            
            users = client.search_users(query, limit)
            
            if not users:
                return f"沒有找到匹配「{query}」的用戶"
            
            result = f"搜尋關鍵字: '{query}'\n找到 {len(users)} 個相關用戶:\n\n"
            result += f"{'ID':<5} {'登入名':<15} {'姓名':<20} {'狀態':<8}\n"
            result += f"{'-'*5} {'-'*15} {'-'*20} {'-'*8}\n"
            
            for user in users:
                full_name = f"{user.firstname} {user.lastname}".strip()
                if not full_name:
                    full_name = user.login
                status_text = "啟用" if user.status == 1 else "停用"
                result += f"{user.id:<5} {user.login:<15} {full_name:<20} {status_text:<8}\n"
            
            return result
            
        except RedmineAPIError as e:
            return f"搜尋用戶失敗: {str(e)}"
        except Exception as e:
            return f"系統錯誤: {str(e)}"
  • RedmineClient.search_users: performs API call to /users.json with name=query param and parses into RedmineUser objects.
    def search_users(self, query: str, limit: int = 10) -> List[RedmineUser]:
        """搜尋用戶(依姓名或登入名)"""
        if not query.strip():
            return []
            
        params = {
            'name': query.strip(),
            'limit': min(max(limit, 1), 50)
        }
        
        response = self._make_request('GET', '/users.json', params=params)
        
        users = []
        for user_data in response.get('users', []):
            users.append(RedmineUser(
                id=user_data['id'],
                login=user_data['login'],
                firstname=user_data.get('firstname', ''),
                lastname=user_data.get('lastname', ''),
                mail=user_data.get('mail', ''),
                status=user_data.get('status', 1),
                created_on=user_data.get('created_on'),
                last_login_on=user_data.get('last_login_on')
            ))
        
        return users
  • Dataclass defining RedmineUser structure used by search_users.
    class RedmineUser:
        """Redmine 用戶數據結構"""
        id: int
        login: str
        firstname: str
        lastname: str
        mail: str
        status: int
        created_on: Optional[str] = None
        last_login_on: Optional[str] = None

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/snowild/redmine-mcp'

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