summaryrefslogtreecommitdiff
path: root/src/mcp/tools/search_messages.c
diff options
context:
space:
mode:
authortanaka takashi <isazaka@gmail.com>2026-06-30 19:03:25 +0900
committertanaka takashi <isazaka@gmail.com>2026-06-30 19:03:25 +0900
commit05c8e0a31a0d4192c590e833b24393208e1c751f (patch)
treef7c2c82c9327abde67bf3acf1d0258573b3bc6c2 /src/mcp/tools/search_messages.c
parent4bc721c3bf7589b519c5730d093f704ce56e3f09 (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.c21
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;
}