"""MCP tools for Connpass API."""
from typing import Optional
from .api_client import ConnpassClient
from .config import GROUP_MAPPING, PREFECTURE_MAPPING, DEFAULT_START, DEFAULT_COUNT
from .errors import ConnpassError
class ConnpassTools:
"""Connpass MCP tools collection."""
def __init__(self):
self.client = ConnpassClient()
async def get_user_attended_events(
self,
nickname: str,
start: int = DEFAULT_START,
count: int = DEFAULT_COUNT
) -> dict:
"""
指定したユーザーが参加したイベントのリストを取得します。
Args:
nickname: ユーザーのニックネーム
start: 開始位置 (デフォルト: 1)
count: 取得する最大件数 (デフォルト: 10, 最大: 100)
"""
return await self.client.get_user_attended_events(nickname, start, count)
async def get_group_events(
self,
group_name: str,
start: int = DEFAULT_START,
count: int = DEFAULT_COUNT
) -> dict:
"""
指定したグループのイベント一覧を取得します。
Args:
group_name: グループ名
start: 開始位置 (デフォルト: 1)
count: 取得する最大件数 (デフォルト: 10, 最大: 100)
"""
if group_name not in GROUP_MAPPING:
return ConnpassError.invalid_group(
group_name,
list(GROUP_MAPPING.keys())
)
group_id = GROUP_MAPPING[group_name]
return await self.client.get_events(group_id=group_id, start=start, count=count)
async def list_available_groups(self) -> dict:
"""利用可能なグループの一覧を表示します。"""
return {
"available_groups": list(GROUP_MAPPING.keys()),
"total_count": len(GROUP_MAPPING),
"group_mapping": GROUP_MAPPING
}
async def search_events_by_location(
self,
prefecture: Optional[str] = None,
keyword: Optional[str] = None,
start: int = DEFAULT_START,
count: int = DEFAULT_COUNT
) -> dict:
"""
開催場所やキーワードでイベントを検索します。
Args:
prefecture: 都道府県名 (オンライン, 東京, 大阪, 沖縄など)
keyword: 検索キーワード (イベント名、説明、場所を検索)
start: 開始位置 (デフォルト: 1)
count: 取得する最大件数 (デフォルト: 10, 最大: 100)
"""
if not prefecture and not keyword:
return ConnpassError.missing_parameters(
["prefecture", "keyword"]
)
prefecture_code = None
if prefecture:
if prefecture not in PREFECTURE_MAPPING:
return ConnpassError.invalid_prefecture(
prefecture,
list(PREFECTURE_MAPPING.keys())
)
prefecture_code = PREFECTURE_MAPPING[prefecture]
return await self.client.get_events(
prefecture=prefecture_code,
keyword=keyword,
start=start,
count=count
)
async def search_events_by_keyword_or(
self,
keyword: str,
start: int = DEFAULT_START,
count: int = DEFAULT_COUNT
) -> dict:
"""
キーワードでイベントを検索します(OR条件)。
Args:
keyword: 検索キーワード (複数キーワードはOR条件で検索)
start: 開始位置 (デフォルト: 1)
count: 取得する最大件数 (デフォルト: 10, 最大: 100)
"""
return await self.client.get_events(
keyword_or=keyword,
start=start,
count=count
)
async def list_available_prefectures(self) -> dict:
"""検索可能な都道府県の一覧を表示します。"""
return {
"available_prefectures": list(PREFECTURE_MAPPING.keys()),
"total_count": len(PREFECTURE_MAPPING),
"prefecture_mapping": PREFECTURE_MAPPING
}