diff options
| author | tanaka takashi <isazaka@gmail.com> | 2026-06-29 21:43:54 +0900 |
|---|---|---|
| committer | tanaka takashi <isazaka@gmail.com> | 2026-06-30 01:23:51 +0900 |
| commit | 4bc721c3bf7589b519c5730d093f704ce56e3f09 (patch) | |
| tree | 38da055ab15fd70f5c92584560ea73486e5ddce0 /src/mcp/tools/read_messages.c | |
| parent | 4c6a831aa2a57e2bcc20aa3fc2f1b7172f5be285 (diff) | |
refactor: MCP層をmcpc APIベースに刷新
- 独自JSON-RPC処理をmcpcへ置き換え
- 各MCPツールを個別ソースへ分離
- 共通コンテキストと登録処理を整理
- mcpc互換修正と統合テストを更新
Diffstat (limited to 'src/mcp/tools/read_messages.c')
| -rw-r--r-- | src/mcp/tools/read_messages.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/mcp/tools/read_messages.c b/src/mcp/tools/read_messages.c new file mode 100644 index 0000000..55696d6 --- /dev/null +++ b/src/mcp/tools/read_messages.c @@ -0,0 +1,80 @@ +#include "mcp/tools/common/registry.h" + +#include "mcp/tools/common/common.h" +#include "mcp/tools/common/context.h" + +#include <stdlib.h> +#include <string.h> + +#include "base/allocator.h" + +static int +compare_history(const void *left, const void *right) +{ + const tiny_store_entry_t *a = *(const tiny_store_entry_t *const *)left; + const tiny_store_entry_t *b = *(const tiny_store_entry_t *const *)right; + if (a->message.timestamp_ms < b->message.timestamp_ms) + { + return -1; + } + if (a->message.timestamp_ms > b->message.timestamp_ms) + { + return 1; + } + return strcmp(a->message.message_id, b->message.message_id); +} + +static void +call_read_messages(const mcpc_tool_t *tool, mcpc_ucbr_t *result) +{ + tiny_mcp_tools_context_t *context = tiny_mcp_tools_context_current(); + char *session = tiny_mcp_tool_get_string(tool, "session_id", TINY_SESSION_ID_MAX); + const tiny_store_entry_t **items = NULL; + size_t index, count = 0; + tiny_json_buffer_t json; + if (!context || !session || !session[0]) + { + free(session); + tiny_mcp_tool_add_error(result, "VALIDATION_ERROR", "session_id is required"); + return; + } + items = malloc((tiny_store_entry_count(context->store) + 1) * sizeof(*items)); + if (!items) + { + free(session); + tiny_mcp_tool_add_error(result, "INTERNAL_ERROR", "out of memory"); + return; + } + for (index = 0; index < tiny_store_entry_count(context->store); ++index) + { + const tiny_store_entry_t *entry = tiny_store_entry(context->store, index); + if (!entry->deleted && strcmp(entry->message.session_id, session) == 0) + { + items[count++] = entry; + } + } + qsort(items, count, sizeof(*items), compare_history); + tiny_json_init(&json); + tiny_json_raw(&json, "{\"history\":["); + for (index = 0; index < count; ++index) + { + if (index) + { + tiny_json_raw(&json, ","); + } + tiny_mcp_tool_append_message(&json, &items[index]->message); + } + tiny_json_raw(&json, "]}"); + tiny_mcp_tool_add_json(result, &json); + tiny_json_free(&json); + free(items); + free(session); +} + +bool +tiny_mcp_register_read_messages(mcpc_server_t *server) +{ + mcpc_tool_t *tool = tiny_mcp_tool_new("read_messages", "Read a session", call_read_messages); + return tool && tiny_mcp_tool_add_property(tool, "session_id", "Session ID", MCPC_U8STR) + && mcpc_server_add_tool(server, tool) == MCPC_EC_0; +} |
