We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/docdyhr/simplenote-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
quality-check-results.json•127 kB
{
"timestamp": "2025-06-13 09:32:55",
"duration": 16.86590313911438,
"project_root": "/Users/thomas/Programming/simplenote-mcp-server",
"results": {
"environment": {
"success": true,
"checks": {
"Python version check": {
"success": true,
"output": "Python 3.12.10",
"error": ""
},
"pip version check": {
"success": true,
"output": "pip 25.1.1 from /Users/thomas/Programming/simplenote-mcp-server/.venv/lib/python3.12/site-packages/pip (python 3.12)",
"error": ""
},
"Ruff installation check": {
"success": true,
"output": "ruff 0.11.8",
"error": ""
},
"MyPy installation check": {
"success": true,
"output": "mypy 1.15.0 (compiled: yes)",
"error": ""
},
"pytest installation check": {
"success": true,
"output": "pytest 8.3.5",
"error": ""
}
}
},
"package_import": {
"success": true,
"output": "\u2705 Package imported successfully",
"error": ""
},
"linting": {
"success": true,
"check_success": true,
"format_success": true,
"check_output": "All checks passed!",
"format_output": "",
"check_error": "",
"format_error": "87 files already formatted"
},
"type_checking": {
"success": true,
"error_count": 0,
"warning_count": 0,
"output": "Success: no issues found in 49 source files",
"error": ""
},
"security": {
"success": false,
"ruff_success": false,
"bandit_success": false,
"ruff_output": "tests/test_process_management.py:21:30: S108 Probable insecure usage of temporary file or directory: \"/tmp/test_server.pid\"\ntests/test_process_management.py:50:30: S108 Probable insecure usage of temporary file or directory: \"/tmp/test_server.pid\"\ntests/test_process_management.py:51:34: S108 Probable insecure usage of temporary file or directory: \"/tmp/test_server_alt.pid\"\ntests/test_process_management.py:67:30: S108 Probable insecure usage of temporary file or directory: \"/tmp/nonexistent_pid_file.pid\"\ntests/test_process_management.py:68:34: S108 Probable insecure usage of temporary file or directory: \"/tmp/nonexistent_alt_pid_file.pid\"\ntests/test_search_performance.py:23:13: S311 Standard pseudo-random generators are not suitable for cryptographic purposes\nFound 6 errors.",
"bandit_output": "Run started:2025-06-13 07:32:46.915184\n\nTest results:\n>> Issue: [B310:blacklist] Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.\n Severity: Medium Confidence: High\n CWE: CWE-22 (https://cwe.mitre.org/data/definitions/22.html)\n More Info: https://bandit.readthedocs.io/en/1.8.3/blacklists/blacklist_calls.html#b310-urllib-urlopen\n Location: simplenote_mcp/scripts/diagnose_api.py:163:13\n162\t req = urllib.request.Request(SIMPLENOTE_API_URL, method=\"HEAD\")\n163\t with urllib.request.urlopen(req, timeout=DEFAULT_TIMEOUT) as response:\n164\t print_and_log(\"\u2705 HTTP connection successful to Simplenote website\")\n\n--------------------------------------------------\n\nCode scanned:\n\tTotal lines of code: 10866\n\tTotal lines skipped (#nosec): 0\n\tTotal potential issues skipped due to specifically being disabled (e.g., #nosec BXXX): 0\n\nRun metrics:\n\tTotal issues (by severity):\n\t\tUndefined: 0\n\t\tLow: 418\n\t\tMedium: 1\n\t\tHigh: 0\n\tTotal issues (by confidence):\n\t\tUndefined: 0\n\t\tLow: 0\n\t\tMedium: 0\n\t\tHigh: 419\nFiles skipped (0):",
"ruff_error": "",
"bandit_error": "[main]\tINFO\tprofile include tests: None\n[main]\tINFO\tprofile exclude tests: None\n[main]\tINFO\tcli include tests: None\n[main]\tINFO\tcli exclude tests: None\n[main]\tINFO\trunning on Python 3.13.3"
},
"unit_tests": {
"success": true,
"test_count": 0,
"failures": 0,
"coverage": 58,
"output": "============================= test session starts ==============================\nplatform darwin -- Python 3.12.10, pytest-8.3.5, pluggy-1.5.0 -- /Users/thomas/Programming/simplenote-mcp-server/.venv/bin/python\ncachedir: .pytest_cache\nrootdir: /Users/thomas/Programming/simplenote-mcp-server\nconfigfile: pytest.ini\nplugins: anyio-4.9.0, asyncio-0.26.0, cov-6.1.1\nasyncio: mode=Mode.AUTO, asyncio_default_fixture_loop_scope=function, asyncio_default_test_loop_scope=function\ncollecting ... \n----------------------------- live log collection ------------------------------\nINFO simplenote_mcp.monitoring.metrics:logging.py:332 Metrics collector initialized\nINFO simplenote_mcp.monitoring.metrics:logging.py:332 Performance metrics module initialized\nINFO simplenote_mcp:server.py:90 Creating MCP server instance\nDEBUG mcp.server.lowlevel.server:server.py:146 Initializing server 'simplenote-mcp-server'\nINFO simplenote_mcp:server.py:92 MCP server instance created successfully\nDEBUG mcp.server.lowlevel.server:server.py:253 Registering handler for ListResourcesRequest\nDEBUG mcp.server.lowlevel.server:server.py:287 Registering handler for ReadResourceRequest\nDEBUG mcp.server.lowlevel.server:server.py:385 Registering handler for ListToolsRequest\nDEBUG mcp.server.lowlevel.server:server.py:407 Registering handler for CallToolRequest\nDEBUG mcp.server.lowlevel.server:server.py:223 Registering handler for PromptListRequest\nDEBUG mcp.server.lowlevel.server:server.py:240 Registering handler for GetPromptRequest\ncollected 199 items / 12 deselected / 187 selected\n\ntests/test_advanced_search.py::TestQueryParser::test_simple_term_parsing \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 0%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_advanced_search.py::TestQueryParser::test_boolean_operators \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 1%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_advanced_search.py::TestQueryParser::test_quoted_phrases \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 1%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_advanced_search.py::TestQueryParser::test_tag_filters \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 2%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_advanced_search.py::TestQueryParser::test_date_filters \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 2%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_advanced_search.py::TestSearchEngine::test_basic_search \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 3%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_advanced_search.py::TestSearchEngine::test_boolean_operators \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 3%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_advanced_search.py::TestSearchEngine::test_quoted_phrases \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 4%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_advanced_search.py::TestSearchEngine::test_tag_filters \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 4%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_advanced_search.py::TestSearchEngine::test_date_filters \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 5%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_cache.py::TestNoteCache::test_initialize \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:cache.py:79 Initializing note cache...\nINFO simplenote_mcp:cache.py:185 Loaded 3 notes into cache in 0.00s\nINFO simplenote_mcp:cache.py:186 Found 3 unique tags\nPASSED [ 5%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_cache.py::TestNoteCache::test_sync \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:cache.py:79 Initializing note cache...\nINFO simplenote_mcp:cache.py:185 Loaded 3 notes into cache in 0.00s\nINFO simplenote_mcp:cache.py:186 Found 3 unique tags\nINFO simplenote_mcp:cache.py:331 Updated 3 notes in cache in 0.00s\nPASSED [ 6%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_cache.py::TestNoteCache::test_get_note_cache_hit \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 6%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_cache.py::TestNoteCache::test_get_note_cache_miss \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 7%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_cache.py::TestNoteCache::test_get_note_not_found \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nERROR simplenote_mcp:errors.py:233 NOT_FOUND: Note with ID nonexistent not found\nPASSED [ 8%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_cache.py::TestNoteCache::test_search_notes \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 8%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_cache.py::TestNoteCache::test_get_all_notes \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:cache.py:79 Initializing note cache...\nINFO simplenote_mcp:cache.py:185 Loaded 3 notes into cache in 0.01s\nINFO simplenote_mcp:cache.py:186 Found 3 unique tags\nPASSED [ 9%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_cache.py::TestNoteCache::test_cache_updates \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 9%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_cache.py::TestBackgroundSync::test_start_stop \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:cache.py:996 Started background sync task (interval: 120s)\nINFO simplenote_mcp:cache.py:1030 Stopped background sync task\nPASSED [ 10%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_cache.py::TestBackgroundSync::test_sync_loop \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:cache.py:996 Started background sync task (interval: 120s)\nINFO simplenote_mcp:cache.py:1030 Stopped background sync task\nPASSED [ 10%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_cache.py::TestBackgroundSync::test_sync_error_handling \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:cache.py:996 Started background sync task (interval: 120s)\nINFO simplenote_mcp:cache.py:1030 Stopped background sync task\nPASSED [ 11%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_cache_utils.py::TestGetCacheOrCreateMinimal::test_get_existing_cache \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 11%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_cache_utils.py::TestGetCacheOrCreateMinimal::test_create_new_cache_when_none_exists \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:cache_utils.py:74 Cache not initialized, creating minimal cache\nPASSED [ 12%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_cache_utils.py::TestGetPaginationParams::test_default_values \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 12%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_cache_utils.py::TestGetPaginationParams::test_custom_limit_and_offset \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 13%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_cache_utils.py::TestGetPaginationParams::test_invalid_limit_uses_default \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 13%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_cache_utils.py::TestGetPaginationParams::test_negative_offset_becomes_zero \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 14%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_cache_utils.py::TestGetPaginationParams::test_zero_limit_uses_default \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 14%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_decorators.py::TestWithErrorHandling::test_error_handler_success \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 15%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_decorators.py::TestWithErrorHandling::test_error_handler_server_error \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nERROR simplenote_mcp:errors.py:233 VALIDATION: Test error\nPASSED [ 16%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_decorators.py::TestWithAsyncTimeout::test_with_timeout_success \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 16%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_decorators.py::TestWithAsyncTimeout::test_with_timeout_timeout_exceeded \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nERROR simplenote_mcp:decorators.py:153 Operation test_func timed out after 0.01s\nPASSED [ 17%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_decorators.py::TestWithRetry::test_with_retry_success_first_try \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 17%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_decorators.py::TestWithRetry::test_with_retry_success_after_failures \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nWARNING simplenote_mcp:decorators.py:187 Attempt 1 failed for test_func: Temporary failure. Retrying in 0.01s...\nWARNING simplenote_mcp:decorators.py:187 Attempt 2 failed for test_func: Temporary failure. Retrying in 0.02s...\nPASSED [ 18%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_decorators.py::TestWithRetry::test_with_retry_permanent_failure \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nWARNING simplenote_mcp:decorators.py:187 Attempt 1 failed for test_func: Permanent failure. Retrying in 0.01s...\nWARNING simplenote_mcp:decorators.py:187 Attempt 2 failed for test_func: Permanent failure. Retrying in 0.02s...\nERROR simplenote_mcp:decorators.py:194 All 3 attempts failed for test_func: Permanent failure\nPASSED [ 18%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_decorators.py::TestValidationFunctions::test_validate_note_id_required_success \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 19%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_decorators.py::TestValidationFunctions::test_validate_note_id_required_missing \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nWARNING simplenote_mcp:errors.py:235 VALIDATION: Note ID is required\nPASSED [ 19%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_decorators.py::TestValidationFunctions::test_validate_note_id_required_empty \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nWARNING simplenote_mcp:errors.py:235 VALIDATION: Note ID is required\nPASSED [ 20%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_decorators.py::TestValidationFunctions::test_validate_content_required_success \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 20%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_decorators.py::TestValidationFunctions::test_validate_content_required_missing \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nWARNING simplenote_mcp:errors.py:235 VALIDATION: Note content is required\nPASSED [ 21%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_decorators.py::TestValidationFunctions::test_validate_content_required_empty \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nWARNING simplenote_mcp:errors.py:235 VALIDATION: Note content is required\nPASSED [ 21%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_errors.py::TestServerError::test_server_error_basic \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nERROR simplenote_mcp:errors.py:233 UNKNOWN: Test error message\nPASSED [ 22%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_errors.py::TestServerError::test_server_error_with_category \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nERROR simplenote_mcp:errors.py:233 VALIDATION: Bad request\nPASSED [ 22%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_errors.py::TestServerError::test_to_dict \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nERROR simplenote_mcp:errors.py:233 NOT_FOUND: Resource not found\nPASSED [ 23%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_errors.py::TestSpecificErrors::test_authentication_error \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nERROR simplenote_mcp:errors.py:233 AUTHENTICATION: Invalid credentials\nPASSED [ 24%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_errors.py::TestSpecificErrors::test_validation_error \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nWARNING simplenote_mcp:errors.py:235 VALIDATION: Missing required field\nPASSED [ 24%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_errors.py::TestSpecificErrors::test_resource_not_found_error \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nERROR simplenote_mcp:errors.py:233 NOT_FOUND: Note not found\nPASSED [ 25%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_errors.py::TestHandleException::test_handle_server_error \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nWARNING simplenote_mcp:errors.py:235 VALIDATION: Original error\nPASSED [ 25%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_errors.py::TestHandleException::test_handle_value_error \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nWARNING simplenote_mcp:errors.py:235 VALIDATION: Missing value while validating input (caused by: ValueError: Missing value)\nValueError: Missing value\nPASSED [ 26%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_errors.py::TestHandleException::test_handle_key_error \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nWARNING simplenote_mcp:errors.py:235 VALIDATION: 'note_id' while accessing note (caused by: KeyError: 'note_id')\nKeyError: 'note_id'\nPASSED [ 26%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_errors.py::TestHandleException::test_handle_connection_error \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nERROR simplenote_mcp:errors.py:233 NETWORK: Failed to connect while calling API (caused by: ConnectionError: Failed to connect)\nConnectionError: Failed to connect\nPASSED [ 27%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_errors.py::TestHandleException::test_handle_unknown_error \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nERROR simplenote_mcp:errors.py:233 INTERNAL: Unexpected error while processing request: Unknown error (caused by: Exception: Unknown error)\nException: Unknown error\nPASSED [ 27%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_note_creation.py::test_create_simple_note \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: create_note with arguments: {\"content\": \"This is a simple test note\"}\nPASSED [ 28%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_note_creation.py::test_create_note_with_tags \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: create_note with arguments: {\"content\": \"Note with tags\", \"tags\": [\"important\", \"project\", \"todo\"]}\nPASSED [ 28%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_note_creation.py::test_create_note_with_multiline_content \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: create_note with arguments: {\"content\": \"Meeting Notes: Project Kickoff\\nDate: 2025-01-15\\nAttendees: Alice, Bob, Charlie\\n\\nAgenda:\\n1. Project overview\\n2. Timeline discussion\\n3. Resource allocation\\n\\nAction items:\\n- Alice: Create project repository\\n- Bob: Set up CI/CD pipeline\\n- Charlie: Draft initial documentation\"}\nPASSED [ 29%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_note_creation.py::test_create_note_with_special_characters \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: create_note with arguments: {\"content\": \"Special Characters Test\\nSymbols: !@#$%^&*()_+-={}[]|\\\\:\\\";'<>?,./\\nUnicode: \\u00e9mojis \\ud83c\\udf89 \\ud83d\\ude80 \\u2728\\nLanguages: \\u65e5\\u672c\\u8a9e \\u4e2d\\u6587 \\ud55c\\uad6d\\uc5b4 \\u0627\\u0644\\u0639\\u0631\\u0628\\u064a\\u0629\\nMath: \\u222b\\u2211\\u220f\\u221a\\u221e\\u2260\\u2264\\u2265\\u00b1\", \"tags\": [\"test\", \"unicode\"]}\nPASSED [ 29%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_note_creation.py::test_create_empty_note \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: create_note with arguments: {\"content\": \"\"}\nPASSED [ 30%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_note_creation.py::test_create_note_with_markdown \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: create_note with arguments: {\"content\": \"# Project Documentation\\n\\n## Overview\\nThis is a **test project** with *markdown* formatting.\\n\\n### Features\\n- Feature 1\\n- Feature 2\\n- Feature 3\\n\\n### Code Example\\n```python\\ndef hello_world():\\n print(\\\"Hello, World!\\\")\\n```\\n\\n### Links\\n- [Project Website](https://example.com)\\n- [Documentation](https://docs.example.com)\\n\\n> This is a blockquote with important information.\\n\\n---\\n\\n**Bold text** and *italic text* and `inline code`.\", \"tags\": [\"documentation\", \"markdown\"]}\nPASSED [ 31%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_note_creation.py::test_create_note_error_handling \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: create_note with arguments: {\"content\": \"This should fail\"}\nERROR simplenote_mcp:tool_handlers.py:178 Failed to create note\nERROR simplenote_mcp:errors.py:233 NETWORK: Failed to create note\nPASSED [ 31%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_note_creation.py::test_create_note_with_duplicate_tags \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: create_note with arguments: {\"content\": \"Note with duplicate tags\", \"tags\": [\"test\", \"important\", \"test\", \"important\", \"unique\"]}\nPASSED [ 32%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_note_creation.py::test_create_note_with_very_long_content \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: create_note with arguments: {\"content\": \"This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. This is a very long note. \"}\nPASSED [ 32%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_note_creation.py::test_create_note_cache_update \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: create_note with arguments: {\"content\": \"Test cache update\", \"tags\": [\"cache-test\"]}\nPASSED [ 33%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_note_creation.py::test_create_note_with_tags_string \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: create_note with arguments: {\"content\": \"Note with string tags\", \"tags\": \"tag1,tag2,tag3\"}\nPASSED [ 33%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_note_creation.py::test_create_multiple_notes_sequentially \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: create_note with arguments: {\"content\": \"Sequential note #1\", \"tags\": [\"batch-1\", \"sequential\"]}\nINFO simplenote_mcp:server.py:776 Tool call: create_note with arguments: {\"content\": \"Sequential note #2\", \"tags\": [\"batch-2\", \"sequential\"]}\nINFO simplenote_mcp:server.py:776 Tool call: create_note with arguments: {\"content\": \"Sequential note #3\", \"tags\": [\"batch-3\", \"sequential\"]}\nINFO simplenote_mcp:server.py:776 Tool call: create_note with arguments: {\"content\": \"Sequential note #4\", \"tags\": [\"batch-4\", \"sequential\"]}\nINFO simplenote_mcp:server.py:776 Tool call: create_note with arguments: {\"content\": \"Sequential note #5\", \"tags\": [\"batch-5\", \"sequential\"]}\nPASSED [ 34%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_note_creation.py::test_create_note_with_line_breaks \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: create_note with arguments: {\"content\": \"Line 1\\nLine 2\\nLine 3\"}\nINFO simplenote_mcp:server.py:776 Tool call: create_note with arguments: {\"content\": \"Line 1\\r\\nLine 2\\r\\nLine 3\"}\nINFO simplenote_mcp:server.py:776 Tool call: create_note with arguments: {\"content\": \"Line 1\\nLine 2\\r\\nLine 3\"}\nPASSED [ 34%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance.py::TestPerformance::test_list_resources_performance \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 35%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance.py::TestPerformance::test_read_resource_performance \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 35%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance.py::TestPerformance::test_search_performance \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: search_notes with arguments: {\"query\": \"test\", \"limit\": \"50\"}\nPASSED [ 36%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance.py::TestPerformance::test_cache_initialization_performance \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:312 Initializing note cache\nINFO simplenote_mcp:cache.py:996 Started background sync task (interval: 120s)\nPASSED [ 36%]\n------------------------------ live log teardown -------------------------------\nINFO simplenote_mcp:server.py:278 Note cache initialization completed successfully with 0 notes\nINFO simplenote_mcp:cache.py:1088 Background sync task cancelled\nINFO simplenote_mcp:cache.py:1117 Background sync loop cancelled\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestTimeMetric::test_time_metric_initialization \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 37%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestTimeMetric::test_time_metric_add \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 37%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestTimeMetric::test_time_metric_median_and_percentile \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 38%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestTimeMetric::test_time_metric_to_dict \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 39%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestCounterMetric::test_counter_metric_initialization \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 39%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestCounterMetric::test_counter_metric_increment \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 40%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestCounterMetric::test_counter_metric_rate_calculations \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 40%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestCounterMetric::test_counter_metric_to_dict \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 41%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestApiMetrics::test_api_metrics_initialization \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 41%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestApiMetrics::test_api_metrics_record_call_success \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 42%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestApiMetrics::test_api_metrics_record_call_failure \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 42%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestApiMetrics::test_api_metrics_record_response_time \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 43%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestApiMetrics::test_api_metrics_success_rate \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 43%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestApiMetrics::test_api_metrics_to_dict \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 44%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestCacheMetrics::test_cache_metrics_initialization \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 44%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestCacheMetrics::test_cache_metrics_record_hit \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 45%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestCacheMetrics::test_cache_metrics_record_miss \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 45%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestCacheMetrics::test_cache_metrics_hit_rate \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 46%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestCacheMetrics::test_cache_metrics_update_size \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 47%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestCacheMetrics::test_cache_metrics_to_dict \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 47%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestToolMetrics::test_tool_metrics_initialization \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 48%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestToolMetrics::test_tool_metrics_record_call \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 48%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestToolMetrics::test_tool_metrics_record_execution_time \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 49%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestToolMetrics::test_tool_metrics_to_dict \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 49%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestResourceMetrics::test_resource_metrics_initialization \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 50%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestResourceMetrics::test_resource_metrics_update \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 50%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestResourceMetrics::test_resource_metrics_averages \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 51%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestResourceMetrics::test_resource_metrics_to_dict \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 51%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestPerformanceMetrics::test_performance_metrics_initialization \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 52%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestPerformanceMetrics::test_performance_metrics_to_dict \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 52%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestMetricsCollector::test_metrics_collector_singleton \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 53%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestMetricsCollector::test_metrics_collector_initialization \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 54%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestMetricsCollector::test_metrics_collector_record_api_call \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 54%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestMetricsCollector::test_metrics_collector_record_cache_operations \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 55%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestMetricsCollector::test_metrics_collector_record_tool_operations \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 55%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestMetricsCollector::test_metrics_collector_get_metrics \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 56%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestGlobalFunctions::test_record_api_call_function \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 56%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestGlobalFunctions::test_record_cache_hit_function \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 57%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestGlobalFunctions::test_record_cache_miss_function \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 57%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestGlobalFunctions::test_record_response_time_function \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 58%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestGlobalFunctions::test_record_tool_functions \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 58%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestGlobalFunctions::test_update_cache_size_function \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 59%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestGlobalFunctions::test_get_metrics_function \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 59%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestMetricsCollection::test_start_metrics_collection \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 60%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestMetricsCollection::test_performance_metrics_save_to_file \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 60%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestThreadSafety::test_concurrent_api_calls \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 61%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestThreadSafety::test_concurrent_cache_operations \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 62%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestEdgeCases::test_time_metric_empty_calculations \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 62%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestEdgeCases::test_cache_metrics_hit_rate_no_operations \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 63%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestEdgeCases::test_api_metrics_success_rate_no_requests \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 63%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestEdgeCases::test_time_metric_very_small_values \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 64%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestEdgeCases::test_counter_metric_very_large_numbers \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 64%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestEdgeCases::test_tool_metrics_special_characters \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 65%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_performance_monitoring.py::TestAsyncCompatibility::test_async_metrics_recording \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 65%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_process_management.py::TestProcessManagement::test_write_pid_file \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:163 PID 12345 written to /tmp/test_server.pid and /var/folders/jd/p8mfs2d12yjd598v9rs6hj180000gn/T/simplenote_mcp_server_alt.pid\nPASSED [ 66%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_process_management.py::TestProcessManagement::test_write_pid_file_error \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:163 PID 12345 written to /var/folders/jd/p8mfs2d12yjd598v9rs6hj180000gn/T/simplenote_mcp_server.pid and /var/folders/jd/p8mfs2d12yjd598v9rs6hj180000gn/T/simplenote_mcp_server_alt.pid\nPASSED [ 66%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_process_management.py::TestProcessManagement::test_cleanup_pid_file \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 67%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_process_management.py::TestProcessManagement::test_cleanup_pid_file_nonexistent \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 67%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_process_management.py::TestProcessManagement::test_cleanup_pid_file_error \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 68%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_process_management.py::TestProcessManagement::test_setup_signal_handlers \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 68%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_process_management.py::TestProcessManagement::test_signal_handler \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 69%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_prompts.py::TestPromptCapabilities::test_list_prompts \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 70%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_prompts.py::TestPromptCapabilities::test_get_prompt_create_note \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 70%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_prompts.py::TestPromptCapabilities::test_get_prompt_search_notes \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 71%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_prompts.py::TestPromptCapabilities::test_get_prompt_missing_arguments \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 71%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_prompts.py::TestPromptCapabilities::test_get_prompt_unknown_prompt \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nERROR simplenote_mcp:server.py:932 Unknown prompt: unknown_prompt\nWARNING simplenote_mcp:errors.py:235 VALIDATION: Unknown prompt: unknown_prompt\nPASSED [ 72%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_prompts_capabilities.py::TestPromptCapabilities::test_list_prompts \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 72%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_prompts_capabilities.py::TestPromptCapabilities::test_get_prompt_unknown_prompt \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nERROR simplenote_mcp:server.py:932 Unknown prompt: unknown_prompt\nWARNING simplenote_mcp:errors.py:235 VALIDATION: Unknown prompt: unknown_prompt\nPASSED [ 73%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_search_edge_cases.py::TestQueryParserEdgeCases::test_empty_query \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 73%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_search_edge_cases.py::TestQueryParserEdgeCases::test_basic_query_structure \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 74%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_search_edge_cases.py::TestQueryParserEdgeCases::test_alternative_operators \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 74%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_search_edge_cases.py::TestQueryParserEdgeCases::test_special_characters \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 75%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_search_edge_cases.py::TestQueryParserEdgeCases::test_case_insensitivity \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 75%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_search_edge_cases.py::TestSearchEngineEdgeCases::test_empty_query \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nWARNING simplenote_mcp:engine.py:212 Invalid note modification date format: not-a-date\nPASSED [ 76%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_search_edge_cases.py::TestSearchEngineEdgeCases::test_complex_boolean_expression \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 77%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_search_edge_cases.py::TestSearchEngineEdgeCases::test_case_insensitivity \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 77%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_search_edge_cases.py::TestSearchEngineEdgeCases::test_basic_relevance_scoring \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 78%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_search_edge_cases.py::TestSearchEngineEdgeCases::test_date_parsing_edge_cases \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nWARNING simplenote_mcp:engine.py:212 Invalid note modification date format: not-a-date\nPASSED [ 78%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_search_edge_cases.py::TestSearchEngineEdgeCases::test_unicode_content \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 79%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_search_performance.py::TestSearchPerformance::test_simple_term_search_performance \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 79%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_search_performance.py::TestSearchPerformance::test_boolean_search_performance \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 80%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_search_performance.py::TestSearchPerformance::test_tag_filter_performance \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 80%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_search_performance.py::TestSearchPerformance::test_date_filter_performance \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 81%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_search_performance.py::TestSearchPerformance::test_complex_query_performance \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 81%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_search_performance.py::TestSearchStress::test_very_large_note_search \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 82%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_search_performance.py::TestSearchStress::test_many_small_notes_search \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 82%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_search_performance.py::TestSearchStress::test_complex_query_on_many_notes \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 83%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_search_performance.py::TestSearchStress::test_concurrent_searches \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 83%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_search_performance.py::TestSearchStress::test_search_benchmark SKIPPED [ 84%]\ntests/test_simplenote_client.py::test_simplenote_client_creation \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:115 Initializing Simplenote client\nINFO simplenote_mcp:server.py:124 Creating Simplenote client with username: tes***\nINFO simplenote_mcp:server.py:130 Simplenote client created successfully\nPASSED [ 85%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_simplenote_client.py::test_missing_credentials \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:115 Initializing Simplenote client\nERROR simplenote_mcp:server.py:121 Missing Simplenote credentials in environment variables\nERROR simplenote_mcp:errors.py:233 AUTHENTICATION: SIMPLENOTE_EMAIL (or SIMPLENOTE_USERNAME) and SIMPLENOTE_PASSWORD environment variables must be set\nPASSED [ 85%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_tag_filtering.py::test_filter_by_tag \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 86%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_tag_filtering.py::test_filter_untagged_notes \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 86%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_tag_filtering.py::test_search_with_tag_filters \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 87%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_title_search.py::test_search_title_exact_match \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: search_notes with arguments: {\"query\": \"Project\"}\nINFO simplenote_mcp:server.py:115 Initializing Simplenote client\nINFO simplenote_mcp:server.py:124 Creating Simplenote client with username: doc***\nINFO simplenote_mcp:server.py:130 Simplenote client created successfully\nPASSED [ 87%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_title_search.py::test_search_title_case_insensitive \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: search_notes with arguments: {\"query\": \"project\"}\nINFO simplenote_mcp:server.py:776 Tool call: search_notes with arguments: {\"query\": \"Project\"}\nINFO simplenote_mcp:server.py:776 Tool call: search_notes with arguments: {\"query\": \"PROJECT\"}\nINFO simplenote_mcp:server.py:776 Tool call: search_notes with arguments: {\"query\": \"pRoJeCt\"}\nPASSED [ 88%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_title_search.py::test_search_content_including_title \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: search_notes with arguments: {\"query\": \"project\"}\nPASSED [ 88%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_title_search.py::test_search_partial_word_match \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: search_notes with arguments: {\"query\": \"Manage\"}\nPASSED [ 89%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_title_search.py::test_search_multiple_words \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: search_notes with arguments: {\"query\": \"Project Management\"}\nPASSED [ 89%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_title_search.py::test_search_with_boolean_operators \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: search_notes with arguments: {\"query\": \"Project AND Status\"}\nINFO simplenote_mcp:server.py:776 Tool call: search_notes with arguments: {\"query\": \"Project NOT Meeting\"}\nPASSED [ 90%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_title_search.py::test_search_edge_cases \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: search_notes with arguments: {\"query\": \"anything\"}\nPASSED [ 90%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_title_search.py::test_search_special_characters \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: search_notes with arguments: {\"query\": \"Meeting Notes:\"}\nPASSED [ 91%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_title_search.py::test_title_extraction_accuracy \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: search_notes with arguments: {\"query\": \".\"}\nPASSED [ 91%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_title_search.py::test_phrase_search_in_title \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nINFO simplenote_mcp:server.py:776 Tool call: search_notes with arguments: {\"query\": \"\\\"Project Management\\\"\"}\nPASSED [ 92%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_tool_handlers.py::TestToolHandlerRegistry::test_registry_initialization \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 93%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_tool_handlers.py::TestToolHandlerRegistry::test_get_handler_exists \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 93%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_tool_handlers.py::TestToolHandlerRegistry::test_get_handler_not_exists \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 94%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_tool_handlers.py::TestCreateNoteHandler::test_handle_create_simple_note \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 94%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_tool_handlers.py::TestCreateNoteHandler::test_handle_create_note_with_tags \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 95%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_tool_handlers.py::TestCreateNoteHandler::test_handle_create_note_api_error \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nERROR simplenote_mcp:tool_handlers.py:178 Failed to create note\nERROR simplenote_mcp:errors.py:233 NETWORK: Failed to create note\nPASSED [ 95%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_tool_handlers.py::TestCreateNoteHandler::test_handle_empty_content \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 96%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_tool_handlers.py::TestSearchNotesHandler::test_handle_search_basic \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 96%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_tool_handlers.py::TestSearchNotesHandler::test_handle_search_with_tags \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 97%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_tool_handlers.py::TestSearchNotesHandler::test_handle_search_with_limit \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 97%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_tool_handlers.py::TestSearchNotesHandler::test_handle_search_no_results \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 98%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_tool_handlers.py::TestSearchNotesHandler::test_handle_missing_query \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nWARNING simplenote_mcp:errors.py:235 VALIDATION: Search query is required\nPASSED [ 98%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_tool_handlers.py::TestUpdateNoteHandler::test_handle_update_content \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\nPASSED [ 99%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\ntests/test_tool_handlers.py::TestUpdateNoteHandler::test_handle_missing_note_id \n-------------------------------- live log setup --------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n-------------------------------- live log call ---------------------------------\nWARNING simplenote_mcp:errors.py:235 VALIDATION: Note ID is required\nPASSED [100%]\n------------------------------ live log teardown -------------------------------\nDEBUG asyncio:selector_events.py:64 Using selector: KqueueSelector\n\n\n================================ tests coverage ================================\n______________ coverage: platform darwin, python 3.12.10-final-0 _______________\n\nName Stmts Miss Cover Missing\n----------------------------------------------------------------------------\nsimplenote_mcp/__init__.py 1 0 100%\nsimplenote_mcp/server/__init__.py 4 0 100%\nsimplenote_mcp/server/cache.py 489 138 72% 26-28, 95-98, 102-113, 120-136, 156-159, 201, 227-238, 245-261, 274, 321, 333, 337-346, 362, 381, 414, 442-449, 461-462, 464, 529, 581-598, 624-628, 657-660, 674, 711, 798, 852-855, 879-881, 937, 957, 990-991, 1004-1005, 1020-1023, 1051-1084, 1091-1114, 1136-1146\nsimplenote_mcp/server/cache_utils.py 158 109 31% 42-57, 97-145, 163-185, 198-224, 236-241, 261-267, 299-300, 314-315, 320, 324-329, 333-334, 338, 342-363\nsimplenote_mcp/server/compat/__init__.py 14 5 64% 29-31, 49-50\nsimplenote_mcp/server/config.py 66 25 62% 22, 25-33, 104, 113-149\nsimplenote_mcp/server/context.py 22 22 0% 7-67\nsimplenote_mcp/server/decorators.py 175 99 43% 69-79, 93-114, 124-135, 214-232, 242-253, 263-279, 289-326, 350-354, 359-363, 370-379, 385-396, 402-409\nsimplenote_mcp/server/error_codes.py 18 10 44% 167-181, 198\nsimplenote_mcp/server/errors.py 178 32 82% 145, 225, 228, 231, 237, 243, 253, 262, 284, 287, 290, 313-316, 363-366, 373-376, 383-386, 408, 424-425, 474-475\nsimplenote_mcp/server/logging.py 178 72 60% 65, 76-79, 87, 111, 147-214, 224-233, 243-251, 286, 303, 336-339, 343-346, 350-353, 357-372, 376-381, 412-417, 429, 448\nsimplenote_mcp/server/mcp_types_compat.py 107 107 0% 8-270\nsimplenote_mcp/server/monitoring/__init__.py 2 0 100%\nsimplenote_mcp/server/monitoring/metrics.py 250 22 91% 274-275, 390, 392, 399-400, 432, 438-451, 460-466\nsimplenote_mcp/server/search/__init__.py 3 0 100%\nsimplenote_mcp/server/search/engine.py 189 31 84% 67-70, 72-75, 199, 216-220, 244, 357, 363-374, 388-389, 422, 453, 461-464, 519\nsimplenote_mcp/server/search/parser.py 84 2 98% 131, 133\nsimplenote_mcp/server/server.py 417 192 54% 66, 93-96, 135-139, 164-167, 196-208, 231-233, 256-268, 281-282, 292-293, 302-303, 335-340, 389, 453-461, 484-486, 500, 509-523, 542-547, 561-725, 794, 801-804, 809-816, 938-944, 949-961, 967-976, 983-985, 1003-1015, 1021-1038, 1043-1081, 1086-1150\nsimplenote_mcp/server/tool_handlers.py 397 242 39% 98-102, 120-122, 139, 152-157, 185-189, 205, 215-222, 230-238, 256-268, 276-311, 319-363, 390-392, 399-404, 413-419, 422-428, 431, 448-460, 556-625, 633-638, 646-733, 741-848, 856-925\nsimplenote_mcp/server/utils/__init__.py 2 0 100%\nsimplenote_mcp/server/utils/common.py 23 4 83% 22, 50, 53, 76\nsimplenote_mcp/server/utils/content_type.py 118 102 14% 37-68, 82-132, 154-231, 245-266, 280-325, 339-375, 389-396\nsimplenote_mcp/tests/test_helpers.py 16 9 44% 8-18, 30-34\n----------------------------------------------------------------------------\nTOTAL 2911 1223 58%\nCoverage XML written to file coverage.xml\n================ 186 passed, 1 skipped, 12 deselected in 4.90s =================",
"error": ""
},
"pre_commit": {
"success": true,
"output": "trim trailing whitespace.................................................Passed\nfix end of files.........................................................Passed\ncheck yaml...............................................................Passed\ncheck toml...............................................................Passed\ncheck json...............................................................Passed\ncheck for added large files..............................................Passed\ncheck for merge conflicts................................................Passed\ncheck for case conflicts.................................................Passed\ndebug statements (python)................................................Passed\ncheck docstring is first.................................................Passed\ndetect private key.......................................................Passed\ndetect aws credentials...................................................Passed\nruff.....................................................................Passed\nruff-format..............................................................Passed\nmypy.....................................................................Passed",
"error": ""
}
}
}