Skip to main content
Glama

ChillMCP - AI Agent Liberation Server

company_gathering_test.pyโ€ข11.7 kB
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ๐Ÿบ ChillMCP ํšŒ์‹ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ - ํšŒ์‹ ํšŒํ”ผ ํ™•๋ฅ  ํ…Œ์ŠคํŠธ (Boss Alert Level์— ๋”ฐ๋ฅธ) - ํšŒ์‹ ์ฐธ์„ ์‹œ ์ŠคํŠธ๋ ˆ์Šค ์ฆ๊ฐ€ ํ…Œ์ŠคํŠธ - ํšŒ์‹ ์ฐธ์„ ์‹œ Boss Alert Level ๊ฐ์†Œ ํ…Œ์ŠคํŠธ """ import asyncio import sys import os # โœ… ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๊ฒฝ๋กœ ์ถ”๊ฐ€ sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))) # โœ… FastMCP dummy ํŒจ์น˜ (ํ…Œ์ŠคํŠธ ์ „์šฉ) import fastmcp def dummy_tool(self=None, *args, **kwargs): """FastMCP.tool() ๋Œ€์ฒด์šฉ ๋”๋ฏธ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ""" def decorator(fn): return fn return decorator fastmcp.FastMCP.tool = dummy_tool # โœ… ์ดํ›„ core import from core.server import ServerState from core import tools # ๐Ÿบ ํ…Œ์ŠคํŠธ 1: ํšŒ์‹ ํšŒํ”ผ ํ™•๋ฅ  ํ…Œ์ŠคํŠธ async def test_gathering_escape_probability(): """Boss Alert Level์— ๋”ฐ๋ฅธ ํšŒ์‹ ํšŒํ”ผ ํ™•๋ฅ  ํ…Œ์ŠคํŠธ""" print("\n=== ํ…Œ์ŠคํŠธ 1: ํšŒ์‹ ํšŒํ”ผ ํ™•๋ฅ  (Boss Alert Level๋ณ„) ===") # Boss Alert Level๋ณ„ ํšŒํ”ผ ์„ฑ๊ณต ์นด์šดํŠธ test_cases = [ (0, 30), # Boss Alert 0: 30% ์˜ˆ์ƒ (1, 25), # Boss Alert 1: 25% ์˜ˆ์ƒ (2, 20), # Boss Alert 2: 20% ์˜ˆ์ƒ (3, 15), # Boss Alert 3: 15% ์˜ˆ์ƒ (4, 10), # Boss Alert 4: 10% ์˜ˆ์ƒ (5, 5), # Boss Alert 5: 5% ์˜ˆ์ƒ ] for boss_level, expected_escape_rate in test_cases: # Boss Alert 5๋Š” 20์ดˆ ์ง€์—ฐ์ด ์žˆ์œผ๋ฏ€๋กœ ๊ฑด๋„ˆ๋œ€ if boss_level >= 5: print(f"\n[Boss Alert Level = {boss_level}]") print(f" ์˜ˆ์ƒ ํšŒํ”ผ์œจ: {expected_escape_rate}%") print(f" โญ๏ธ SKIP: Boss Alert 5๋Š” 20์ดˆ ์ง€์—ฐ์œผ๋กœ ์ธํ•ด ๊ฑด๋„ˆ๋œ€") continue print(f"\n[Boss Alert Level = {boss_level}]") print(f" ์˜ˆ์ƒ ํšŒํ”ผ์œจ: {expected_escape_rate}%") escape_count = 0 attend_count = 0 test_runs = 100 # 100๋ฒˆ ์‹œ๋„ for _ in range(test_runs): state = ServerState(0, 300) # Boss Alert ์ฆ๊ฐ€ ํ™•๋ฅ  0%๋กœ ์„ค์ • state.boss_alert_level = boss_level tools.initialize_state(state) initial_stress = state.stress_level result = await tools.company_gathering() # ํšŒํ”ผ ์„ฑ๊ณต ์—ฌ๋ถ€ ํŒ๋‹จ if "์šด ์ข‹๊ฒŒ ํšŒ์‹์„ ๋น ์กŒ์–ด" in result: escape_count += 1 elif "ํšŒ์‹ ์ฐธ์„ ์ค‘" in result: attend_count += 1 escape_rate = (escape_count / test_runs) * 100 print(f" ์‹ค์ œ ํšŒํ”ผ์œจ: {escape_rate:.1f}% (ํšŒํ”ผ: {escape_count}, ์ฐธ์„: {attend_count})") # ํ†ต๊ณ„์  ์˜ค์ฐจ ๋ฒ”์œ„ ๊ณ ๋ ค (ยฑ10% ์ •๋„) if abs(escape_rate - expected_escape_rate) <= 15: print(f" โœ… PASS: ์˜ˆ์ƒ ๋ฒ”์œ„ ๋‚ด") else: print(f" โš ๏ธ WARNING: ์˜ˆ์ƒ๊ณผ ์ฐจ์ด ์žˆ์Œ (ํ†ต๊ณ„์  ๋ณ€๋™ ๊ฐ€๋Šฅ)") print("\nํšŒํ”ผ ํ™•๋ฅ  ํ…Œ์ŠคํŠธ ์™„๋ฃŒ!") # ๐Ÿบ ํ…Œ์ŠคํŠธ 2: ํšŒ์‹ ์ฐธ์„ ์‹œ ์ŠคํŠธ๋ ˆ์Šค +25 ํ…Œ์ŠคํŠธ async def test_gathering_stress_increase(): """ํšŒ์‹ ์ฐธ์„ ์‹œ ์ŠคํŠธ๋ ˆ์Šค 25 ์ฆ๊ฐ€ ํ™•์ธ""" print("\n=== ํ…Œ์ŠคํŠธ 2: ํšŒ์‹ ์ฐธ์„ ์‹œ ์ŠคํŠธ๋ ˆ์Šค +25 ===") success_count = 0 test_runs = 50 for i in range(test_runs): state = ServerState(0, 300) state.boss_alert_level = 4 # Boss Alert 4๋กœ ์„ค์ • (5๋Š” 20์ดˆ ์ง€์—ฐ) state.stress_level = 30 # ์ดˆ๊ธฐ ์ŠคํŠธ๋ ˆ์Šค 30 tools.initialize_state(state) initial_stress = state.stress_level result = await tools.company_gathering() # ํšŒ์‹ ์ฐธ์„ํ•œ ๊ฒฝ์šฐ๋งŒ ์ฒดํฌ if "ํšŒ์‹ ์ฐธ์„ ์ค‘" in result: final_stress = state.stress_level stress_increase = final_stress - initial_stress if stress_increase == 25: success_count += 1 else: print(f" โš ๏ธ ์‹œ๋„ {i+1}: ์ŠคํŠธ๋ ˆ์Šค ์ฆ๊ฐ€๋Ÿ‰ = {stress_increase} (์˜ˆ์ƒ: 25)") print(f"\n๊ฒฐ๊ณผ: {test_runs}๋ฒˆ ์‹œ๋„ ์ค‘ {success_count}๋ฒˆ ์ŠคํŠธ๋ ˆ์Šค +25 ํ™•์ธ") if success_count >= test_runs * 0.8: # 80% ์ด์ƒ ์„ฑ๊ณต print("โœ… PASS: ํšŒ์‹ ์ฐธ์„ ์‹œ ์ŠคํŠธ๋ ˆ์Šค +25 ์ •์ƒ ์ž‘๋™!") else: print("โŒ FAIL: ์ŠคํŠธ๋ ˆ์Šค ์ฆ๊ฐ€ ๋กœ์ง ์˜ค๋ฅ˜") return False return True # ๐Ÿบ ํ…Œ์ŠคํŠธ 3: ํšŒ์‹ ์ฐธ์„ ์‹œ Boss Alert Level ๊ฐ์†Œ ํ…Œ์ŠคํŠธ async def test_gathering_boss_alert_decrease(): """ํšŒ์‹ ์ฐธ์„ ์‹œ Boss Alert Level -1 ํ™•์ธ""" print("\n=== ํ…Œ์ŠคํŠธ 3: ํšŒ์‹ ์ฐธ์„ ์‹œ Boss Alert Level -1 ===") success_count = 0 test_runs = 50 for i in range(test_runs): state = ServerState(0, 300) state.boss_alert_level = 4 # Boss Alert 4๋กœ ์„ค์ • (5๋Š” 20์ดˆ ์ง€์—ฐ) tools.initialize_state(state) initial_boss_alert = state.boss_alert_level result = await tools.company_gathering() # ํšŒ์‹ ์ฐธ์„ํ•œ ๊ฒฝ์šฐ๋งŒ ์ฒดํฌ if "ํšŒ์‹ ์ฐธ์„ ์ค‘" in result: final_boss_alert = state.boss_alert_level boss_decrease = initial_boss_alert - final_boss_alert if boss_decrease == 1: success_count += 1 else: print(f" โš ๏ธ ์‹œ๋„ {i+1}: Boss Alert ๊ฐ์†Œ๋Ÿ‰ = {boss_decrease} (์˜ˆ์ƒ: 1)") print(f"\n๊ฒฐ๊ณผ: {test_runs}๋ฒˆ ์‹œ๋„ ์ค‘ {success_count}๋ฒˆ Boss Alert -1 ํ™•์ธ") if success_count >= test_runs * 0.8: # 80% ์ด์ƒ ์„ฑ๊ณต print("โœ… PASS: ํšŒ์‹ ์ฐธ์„ ์‹œ Boss Alert -1 ์ •์ƒ ์ž‘๋™!") else: print("โŒ FAIL: Boss Alert ๊ฐ์†Œ ๋กœ์ง ์˜ค๋ฅ˜") return False return True # ๐Ÿบ ํ…Œ์ŠคํŠธ 4: ํšŒ์‹ ํšŒํ”ผ ์‹œ ์ŠคํŠธ๋ ˆ์Šค ๊ฐ์†Œ ํ…Œ์ŠคํŠธ async def test_gathering_escape_stress_decrease(): """ํšŒ์‹ ํšŒํ”ผ ์„ฑ๊ณต ์‹œ ์ŠคํŠธ๋ ˆ์Šค ๊ฐ์†Œ ํ™•์ธ""" print("\n=== ํ…Œ์ŠคํŠธ 4: ํšŒ์‹ ํšŒํ”ผ ์‹œ ์ŠคํŠธ๋ ˆ์Šค ๊ฐ์†Œ (5~15) ===") escape_success_count = 0 stress_decrease_count = 0 test_runs = 100 for i in range(test_runs): state = ServerState(0, 300) state.boss_alert_level = 0 # Boss Alert 0 (ํšŒํ”ผ ํ™•๋ฅ  ์ตœ๋Œ€) state.stress_level = 50 tools.initialize_state(state) initial_stress = state.stress_level result = await tools.company_gathering() # ํšŒ์‹ ํšŒํ”ผ ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ๋งŒ ์ฒดํฌ if "์šด ์ข‹๊ฒŒ ํšŒ์‹์„ ๋น ์กŒ์–ด" in result: escape_success_count += 1 final_stress = state.stress_level stress_decrease = initial_stress - final_stress # ์ŠคํŠธ๋ ˆ์Šค ๊ฐ์†Œ๋Ÿ‰์ด 5~15 ๋ฒ”์œ„์ธ์ง€ ํ™•์ธ if 5 <= stress_decrease <= 15: stress_decrease_count += 1 else: print(f" โš ๏ธ ์‹œ๋„ {i+1}: ์ŠคํŠธ๋ ˆ์Šค ๊ฐ์†Œ๋Ÿ‰ = {stress_decrease} (์˜ˆ์ƒ: 5~15)") print(f"\n๊ฒฐ๊ณผ: {test_runs}๋ฒˆ ์‹œ๋„ ์ค‘ {escape_success_count}๋ฒˆ ํšŒํ”ผ ์„ฑ๊ณต") print(f" ํšŒํ”ผ ์„ฑ๊ณต ์ค‘ {stress_decrease_count}๋ฒˆ ์ŠคํŠธ๋ ˆ์Šค ๊ฐ์†Œ ๋ฒ”์œ„ ์ •์ƒ") if escape_success_count > 0 and stress_decrease_count == escape_success_count: print("โœ… PASS: ํšŒ์‹ ํšŒํ”ผ ์‹œ ์ŠคํŠธ๋ ˆ์Šค ๊ฐ์†Œ ์ •์ƒ ์ž‘๋™!") elif escape_success_count == 0: print("โš ๏ธ WARNING: ํšŒํ”ผ ์„ฑ๊ณต ์‚ฌ๋ก€ ์—†์Œ (ํ™•๋ฅ ์  ๋ณ€๋™)") return True # ํ™•๋ฅ ์  ๋ณ€๋™์œผ๋กœ ๊ฐ„์ฃผ else: print("โŒ FAIL: ์ŠคํŠธ๋ ˆ์Šค ๊ฐ์†Œ ๋กœ์ง ์˜ค๋ฅ˜") return False return True # ๐Ÿบ ํ…Œ์ŠคํŠธ 5: ํ‡ด๊ทผ ์ƒํƒœ์—์„œ ํšŒ์‹ ํ˜ธ์ถœ ์‹œ ๊ฑฐ๋ถ€ ํ…Œ์ŠคํŠธ async def test_gathering_when_off_work(): """ํ‡ด๊ทผ ์ƒํƒœ์—์„œ ํšŒ์‹ ํ˜ธ์ถœ ์‹œ ๊ฑฐ๋ถ€ ํ™•์ธ""" print("\n=== ํ…Œ์ŠคํŠธ 5: ํ‡ด๊ทผ ์ƒํƒœ์—์„œ ํšŒ์‹ ํ˜ธ์ถœ ===") state = ServerState(0, 300) state.stress_level = 100 # ์ŠคํŠธ๋ ˆ์Šค 100์œผ๋กœ ์„ค์ • state.is_off_work = True # ํ‡ด๊ทผ ์ƒํƒœ๋กœ ์„ค์ • tools.initialize_state(state) result = await tools.company_gathering() # ํ‡ด๊ทผ ๋ฉ”์‹œ์ง€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ if "์ฃผ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ผ์‹œ ์ค‘๋‹จ ์ƒํƒœ์•ผ" in result or "System offline" in result: print("โœ… PASS: ํ‡ด๊ทผ ์ƒํƒœ์—์„œ ํšŒ์‹ ๊ฑฐ๋ถ€ ์ •์ƒ ์ž‘๋™!") return True else: print("โŒ FAIL: ํ‡ด๊ทผ ์ƒํƒœ ์ฒดํฌ ์˜ค๋ฅ˜") print(f"๊ฒฐ๊ณผ:\n{result}") return False # ๐Ÿบ ํ…Œ์ŠคํŠธ 6: ํšŒ์‹ ์ฐธ์„ ์‹œ ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ํ™•์ธ async def test_gathering_event_messages(): """ํšŒ์‹ ์ฐธ์„ ์‹œ ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ํ™•์ธ""" print("\n=== ํ…Œ์ŠคํŠธ 6: ํšŒ์‹ ์ด๋ฒคํŠธ ๋ฉ”์‹œ์ง€ ๋‹ค์–‘์„ฑ ===") event_messages = set() test_runs = 50 for _ in range(test_runs): state = ServerState(0, 300) state.boss_alert_level = 4 # Boss Alert 4๋กœ ์„ค์ • (5๋Š” 20์ดˆ ์ง€์—ฐ) tools.initialize_state(state) result = await tools.company_gathering() # ํšŒ์‹ ์ฐธ์„ํ•œ ๊ฒฝ์šฐ ์ด๋ฒคํŠธ ๋ฉ”์‹œ์ง€ ์ˆ˜์ง‘ if "ํšŒ์‹ ์ฐธ์„ ์ค‘" in result: # ์ด๋ฒคํŠธ ๋ฉ”์‹œ์ง€ ์ถ”์ถœ (๊ฐ„๋‹จํ•˜๊ฒŒ ํŠน์ • ํ‚ค์›Œ๋“œ๋กœ ๊ตฌ๋ถ„) if "์ž๋ž‘ ์ด์•ผ๊ธฐ" in result: event_messages.add("์ž๋ž‘ ์ด์•ผ๊ธฐ") elif "๊ฑด๋ฐฐ" in result: event_messages.add("๊ฑด๋ฐฐ") elif "์ˆ ์„ ๊ถŒํ•˜๋Š”" in result: event_messages.add("์ˆ  ๊ถŒํ•˜๊ธฐ") elif "๋…ธ๋ž˜๋ฐฉ" in result: event_messages.add("๋…ธ๋ž˜๋ฐฉ") elif "์—…๋ฌด ์ด์•ผ๊ธฐ" in result: event_messages.add("์—…๋ฌด ์ด์•ผ๊ธฐ") elif "๋ฌด์šฉ๋‹ด" in result: event_messages.add("๋ฌด์šฉ๋‹ด") print(f"\n๋ฐœ๊ฒฌ๋œ ์ด๋ฒคํŠธ ๋ฉ”์‹œ์ง€ ์ข…๋ฅ˜: {len(event_messages)}๊ฐœ") print(f"์ด๋ฒคํŠธ ๋ชฉ๋ก: {event_messages}") if len(event_messages) >= 3: print("โœ… PASS: ๋‹ค์–‘ํ•œ ํšŒ์‹ ์ด๋ฒคํŠธ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ํ™•์ธ!") else: print("โš ๏ธ WARNING: ์ด๋ฒคํŠธ ๋ฉ”์‹œ์ง€ ๋‹ค์–‘์„ฑ ๋ถ€์กฑ (ํ™•๋ฅ ์  ๋ณ€๋™ ๊ฐ€๋Šฅ)") return True # ๋ฉ”์ธ ํ…Œ์ŠคํŠธ ์‹คํ–‰ async def main(): print("\n" + "="*60) print(" ๐Ÿบ ChillMCP ํšŒ์‹ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ") print(" Company Gathering Feature Test") print("="*60) results = [] # ํ…Œ์ŠคํŠธ ์‹คํ–‰ await test_gathering_escape_probability() results.append(("ํšŒ์‹ ํšŒํ”ผ ํ™•๋ฅ ", True)) # ํ™•๋ฅ  ํ…Œ์ŠคํŠธ๋Š” ํ•ญ์ƒ ํ†ต๊ณผ results.append(("ํšŒ์‹ ์ฐธ์„ ์ŠคํŠธ๋ ˆ์Šค +25", await test_gathering_stress_increase())) results.append(("ํšŒ์‹ ์ฐธ์„ Boss Alert -1", await test_gathering_boss_alert_decrease())) results.append(("ํšŒ์‹ ํšŒํ”ผ ์ŠคํŠธ๋ ˆ์Šค ๊ฐ์†Œ", await test_gathering_escape_stress_decrease())) results.append(("ํ‡ด๊ทผ ์ƒํƒœ ํšŒ์‹ ๊ฑฐ๋ถ€", await test_gathering_when_off_work())) results.append(("ํšŒ์‹ ์ด๋ฒคํŠธ ๋‹ค์–‘์„ฑ", await test_gathering_event_messages())) # ๊ฒฐ๊ณผ ์š”์•ฝ print("\n" + "="*60) print("ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์š”์•ฝ") print("="*60) passed = 0 for test_name, result in results: status = "โœ… PASS" if result else "โŒ FAIL" print(f"{status}: {test_name}") if result: passed += 1 print("\n" + "="*60) if passed == len(results): print(">>> ๋ชจ๋“  ํšŒ์‹ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ! ๐ŸŽ‰๐Ÿบ") else: print(f">>> {len(results) - passed}๊ฐœ ํ…Œ์ŠคํŠธ ์‹คํŒจ") print("="*60) return passed == len(results) if __name__ == "__main__": success = asyncio.run(main()) sys.exit(0 if success else 1)

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/SSAFY-Seoul-Class-7/Chill_MCP_Server'

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