Mercurial
annotate npc/main.c @ 279:b3b547563ec7
Add Google connector service and agent wiki
Implement the C/Seobeo Google Drive and Gmail connector with encrypted OAuth storage, Zenbu authentication, browser testing, AI tool discovery, chunked HTTP decoding, and Bazel coverage. Consolidate repository guidance into progressive wiki documentation and enforce arena-first allocation for new first-party C code.
Co-authored-by: Copilot <[email protected]>
Copilot-Session: 84c338fd-0939-4bb3-b7f3-1062eb213e5d
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Mon, 17 Aug 2026 22:22:36 -0700 |
| parents | a2720eac50ce |
| children |
| rev | line source |
|---|---|
|
181
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
1 #include "seobeo/seobeo.h" |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
2 #include <string.h> |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
3 #include <time.h> |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
4 |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
5 static _Atomic uint32_t counter = 0; |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
6 |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
7 static void build_response(char *out, size_t size, const char *id, const char *result) { |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
8 snprintf(out, size, "{\"jsonrpc\":\"2.0\",\"id\":%s,\"result\":%s}", id, result); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
9 } |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
10 |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
11 static void build_error(char *out, size_t size, const char *id, int code, const char *msg) { |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
12 snprintf(out, size, |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
13 "{\"jsonrpc\":\"2.0\",\"id\":%s,\"error\":{\"code\":%d,\"message\":\"%s\"}}", |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
14 id, code, msg); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
15 } |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
16 |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
17 static void handle_initialize(char *out, size_t size, const char *id) { |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
18 const char *result = "{" |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
19 "\"protocolVersion\":\"2024-11-05\"," |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
20 "\"capabilities\":{\"tools\":{}}," |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
21 "\"serverInfo\":{\"name\":\"simple-mcp\",\"version\":\"1.0.0\"}" |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
22 "}"; |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
23 build_response(out, size, id, result); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
24 } |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
25 |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
26 static void handle_tools_list(char *out, size_t size, const char *id) { |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
27 const char *result = "{" |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
28 "\"tools\":[" |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
29 "{" |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
30 "\"name\":\"get_time\"," |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
31 "\"description\":\"Get current Unix timestamp\"," |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
32 "\"inputSchema\":{\"type\":\"object\",\"properties\":{}}" |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
33 "}," |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
34 "{" |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
35 "\"name\":\"get_counter\"," |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
36 "\"description\":\"Get and increment a counter\"," |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
37 "\"inputSchema\":{\"type\":\"object\",\"properties\":{}}" |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
38 "}" |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
39 "]" |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
40 "}"; |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
41 build_response(out, size, id, result); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
42 } |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
43 |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
44 static void handle_tools_call(char *out, size_t size, const char *id, Dowa_JSON_Entry *json) { |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
45 Dowa_JSON_Value *params_val = Dowa_JSON_Get(json, "params"); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
46 if (!params_val || params_val->type != DOWA_JSON_OBJECT) |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
47 { |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
48 build_error(out, size, id, -32602, "Missing params"); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
49 return; |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
50 } |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
51 |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
52 Dowa_JSON_Entry *params = (Dowa_JSON_Entry *)params_val->object_val; |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
53 char *tool_name = Dowa_JSON_Get_String(params, "name"); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
54 |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
55 if (!tool_name) { |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
56 build_error(out, size, id, -32602, "Missing tool name"); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
57 return; |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
58 } |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
59 |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
60 char result[256]; |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
61 if (strcmp(tool_name, "get_time") == 0) { |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
62 time_t now = time(NULL); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
63 snprintf(result, sizeof(result), |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
64 "{\"content\":[{\"type\":\"text\",\"text\":\"Current timestamp: %ld\"}]}", |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
65 (long)now); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
66 } else if (strcmp(tool_name, "get_counter") == 0) { |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
67 uint32_t val = ++counter; |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
68 snprintf(result, sizeof(result), |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
69 "{\"content\":[{\"type\":\"text\",\"text\":\"Counter value: %u\"}]}", |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
70 val); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
71 } else { |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
72 build_error(out, size, id, -32601, "Unknown tool"); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
73 return; |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
74 } |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
75 |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
76 build_response(out, size, id, result); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
77 } |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
78 |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
79 Seobeo_Request_Entry* HandleMCP(Seobeo_Request_Entry *req, Dowa_Arena *arena) |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
80 { |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
81 Seobeo_Request_Entry *resp = NULL; |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
82 |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
83 void *body_kv = Dowa_HashMap_Get_Ptr(req, "Body"); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
84 if (!body_kv) |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
85 { |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
86 char *err = "{\"jsonrpc\":\"2.0\",\"id\":null,\"error\":{\"code\":-32700,\"message\":\"No body\"}}"; |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
87 Dowa_HashMap_Push_Arena(resp, "status", "400", arena); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
88 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
89 Dowa_HashMap_Push_Arena(resp, "body", err, arena); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
90 return resp; |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
91 } |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
92 |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
93 const char *body = ((Seobeo_Request_Entry*)body_kv)->value; |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
94 int32 body_len = strlen(body); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
95 |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
96 Dowa_JSON_Value parsed = Dowa_JSON_Parse(body, body_len, arena); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
97 if (parsed.type != DOWA_JSON_OBJECT || !parsed.object_val) |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
98 { |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
99 char *err = "{\"jsonrpc\":\"2.0\",\"id\":null,\"error\":{\"code\":-32700,\"message\":\"Parse error\"}}"; |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
100 Dowa_HashMap_Push_Arena(resp, "status", "400", arena); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
101 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
102 Dowa_HashMap_Push_Arena(resp, "body", err, arena); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
103 return resp; |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
104 } |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
105 |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
106 Dowa_JSON_Entry *json = (Dowa_JSON_Entry *)parsed.object_val; |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
107 char *method = Dowa_JSON_Get_String(json, "method"); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
108 Dowa_JSON_Value *id_val = Dowa_JSON_Get(json, "id"); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
109 char id_buf[32] = "null"; |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
110 if (id_val) |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
111 { |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
112 if (id_val->type == DOWA_JSON_NUMBER) |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
113 snprintf(id_buf, sizeof(id_buf), "%.0f", id_val->num_val); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
114 else if (id_val->type == DOWA_JSON_STRING) |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
115 snprintf(id_buf, sizeof(id_buf), "\"%s\"", id_val->str_val); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
116 } |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
117 |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
118 char *response = Dowa_Arena_Allocate(arena, 2048); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
119 |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
120 if (!method) |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
121 build_error(response, 2048, id_buf, -32600, "Missing method"); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
122 else if (strcmp(method, "initialize") == 0) |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
123 handle_initialize(response, 2048, id_buf); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
124 else if (strcmp(method, "tools/list") == 0) |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
125 handle_tools_list(response, 2048, id_buf); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
126 else if (strcmp(method, "tools/call") == 0) |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
127 handle_tools_call(response, 2048, id_buf, json); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
128 else if (strcmp(method, "notifications/initialized") == 0) |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
129 snprintf(response, 2048, "{\"jsonrpc\":\"2.0\",\"id\":%s,\"result\":{}}", id_buf); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
130 else |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
131 build_error(response, 2048, id_buf, -32601, "Method not found"); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
132 |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
133 Dowa_HashMap_Push_Arena(resp, "status", "200", arena); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
134 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
135 Dowa_HashMap_Push_Arena(resp, "body", response, arena); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
136 return resp; |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
137 } |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
138 |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
139 int main(void) { |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
140 Seobeo_Router_Init(); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
141 Seobeo_Router_Register("POST", "/mcp", HandleMCP); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
142 |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
143 Seobeo_Log(SEOBEO_INFO, "MCP server running on http://localhost:8080/mcp\n"); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
144 Seobeo_Web_Server_Start(NULL, "8080", SEOBEO_MODE_FORK, 0); |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
145 return 0; |
|
a2720eac50ce
[NPC] Adding JSON RPC protocol for MPC endpoints
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
146 } |