diff options
| author | tanaka takashi <isazaka@gmail.com> | 2026-06-30 19:03:25 +0900 |
|---|---|---|
| committer | tanaka takashi <isazaka@gmail.com> | 2026-06-30 19:03:25 +0900 |
| commit | 05c8e0a31a0d4192c590e833b24393208e1c751f (patch) | |
| tree | f7c2c82c9327abde67bf3acf1d0258573b3bc6c2 /src/mcp/tools/search_messages.c | |
| parent | 4bc721c3bf7589b519c5730d093f704ce56e3f09 (diff) | |
fix: MCPCをvendored fork化しMCP準拠と接続安定性を改善
- Git submoduleを廃止してMCPCを直接管理
- Windowsで254リクエスト付近に発生する切断を修正
- JSON-RPC 2.0エラー応答を標準化
- tool schemaとruntimeの必須・任意引数を一致
- 1000回連続呼び出しの回帰テストを追加
Diffstat (limited to 'src/mcp/tools/search_messages.c')
| -rw-r--r-- | src/mcp/tools/search_messages.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/src/mcp/tools/search_messages.c b/src/mcp/tools/search_messages.c index 166c167..d20d7b2 100644 --- a/src/mcp/tools/search_messages.c +++ b/src/mcp/tools/search_messages.c @@ -45,14 +45,15 @@ call_search_messages(const mcpc_tool_t *tool, mcpc_ucbr_t *result) tiny_mcp_tools_context_t *context = tiny_mcp_tools_context_current(); char *query = tiny_mcp_tool_get_string(tool, "query", TINY_QUERY_MAX); char *session = tiny_mcp_tool_get_string(tool, "session_id", TINY_SESSION_ID_MAX); - int32_t requested_limit = 0; + int32_t requested_limit = 20; + mcpc_errcode_t limit_status + = mcpc_tool_get_tpropval_i32(tool, (const char8_t *)"limit", &requested_limit); size_t limit, index, count = 0, candidate_count = 0, *candidates = NULL; result_item_t *items = NULL; tiny_json_buffer_t json; - bool valid - = context && query && query[0] && session - && mcpc_tool_get_tpropval_i32(tool, (const char8_t *)"limit", &requested_limit) == MCPC_EC_0 - && requested_limit >= 1 && requested_limit <= 100; + bool valid = context && query && query[0] + && (limit_status == MCPC_EC_0 || limit_status == MCPC_EC_ANYDATA_NOTFOUND) + && requested_limit >= 1 && requested_limit <= 100; if (!valid) { tiny_mcp_tool_add_error(result, "VALIDATION_ERROR", "query or limit is invalid"); @@ -85,7 +86,7 @@ call_search_messages(const mcpc_tool_t *tool, mcpc_ucbr_t *result) = tiny_store_entry(context->store, candidates[index]); double score; if (!entry || entry->deleted - || (session[0] && strcmp(entry->message.session_id, session) != 0)) + || (session && session[0] && strcmp(entry->message.session_id, session) != 0)) { continue; } @@ -127,8 +128,10 @@ bool tiny_mcp_register_search_messages(mcpc_server_t *server) { mcpc_tool_t *tool = tiny_mcp_tool_new("search_messages", "Search messages", call_search_messages); - return tool && tiny_mcp_tool_add_property(tool, "query", "Search text", MCPC_U8STR) - && tiny_mcp_tool_add_property(tool, "session_id", "Session ID; empty for all", MCPC_U8STR) - && tiny_mcp_tool_add_property(tool, "limit", "Result limit from 1 to 100", MCPC_I32) + return tool && tiny_mcp_tool_add_property(tool, "query", "Search text", MCPC_U8STR, true) + && tiny_mcp_tool_add_property( + tool, "session_id", "Optional session ID; omitted searches all", MCPC_U8STR, false) + && tiny_mcp_tool_add_property( + tool, "limit", "Optional result limit from 1 to 100; defaults to 20", MCPC_I32, false) && mcpc_server_add_tool(server, tool) == MCPC_EC_0; } |
