@andrewkimjoseph/celina 0.3.3 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -139
- package/assets/logo-black.png +0 -0
- package/assets/logo-yellow.png +0 -0
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<
|
|
3
|
-
|
|
2
|
+
<picture>
|
|
3
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/andrewkimjoseph/celina/main/assets/logo-yellow.png">
|
|
4
|
+
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/andrewkimjoseph/celina/main/assets/logo-black.png">
|
|
5
|
+
<img src="https://raw.githubusercontent.com/andrewkimjoseph/celina/main/assets/logo-black.png" alt="Celina logo — C with profile silhouette" width="160">
|
|
6
|
+
</picture>
|
|
4
7
|
</p>
|
|
5
8
|
|
|
6
9
|
<h1 align="center">Celina — Celo MCP Server</h1>
|
|
@@ -18,28 +21,14 @@
|
|
|
18
21
|
## Install
|
|
19
22
|
|
|
20
23
|
```bash
|
|
21
|
-
npm i @andrewkimjoseph/celina
|
|
24
|
+
npm i @andrewkimjoseph/celina@latest
|
|
22
25
|
```
|
|
23
26
|
|
|
24
|
-
npm: [@andrewkimjoseph/celina](https://www.npmjs.com/package/@andrewkimjoseph/celina)
|
|
25
|
-
|
|
26
27
|
## Quick start
|
|
27
28
|
|
|
28
29
|
Celina is not meant to be run manually in a terminal for normal use. Your MCP client (Cursor, Claude Desktop, LM Studio, etc.) spawns it as a child process and talks to it over stdio.
|
|
29
30
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
npm i @andrewkimjoseph/celina
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
**From source** (development):
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
npm install
|
|
40
|
-
npm run build
|
|
41
|
-
npm start
|
|
42
|
-
```
|
|
31
|
+
Install from npm, then add Celina to your MCP config — see [MCP setup](#mcp-setup).
|
|
43
32
|
|
|
44
33
|
## MCP setup
|
|
45
34
|
|
|
@@ -47,19 +36,19 @@ Pick your client, install the package, paste the config, restart. Celina shows u
|
|
|
47
36
|
|
|
48
37
|
### Local stdio (recommended)
|
|
49
38
|
|
|
50
|
-
Install the package, then
|
|
39
|
+
Install the package, then add Celina to your MCP config. Your client spawns `npx` and talks to Celina over stdio. Works in any stdio client (Cursor, Claude Desktop, LM Studio, Continue, MCP Inspector). Requires Node.js ≥ 20.
|
|
51
40
|
|
|
52
|
-
1. Run `npm i @andrewkimjoseph/celina`
|
|
41
|
+
1. Run `npm i @andrewkimjoseph/celina` (optional but recommended — caches the package locally for faster MCP startup)
|
|
53
42
|
2. Open your MCP config (e.g. `claude_desktop_config.json`, Cursor **Settings → MCP**) and merge the snippet below into `mcpServers`
|
|
54
|
-
3.
|
|
43
|
+
3. Restart the client
|
|
55
44
|
|
|
56
45
|
```json
|
|
57
46
|
{
|
|
58
47
|
"mcpServers": {
|
|
59
48
|
"celina": {
|
|
60
49
|
"type": "stdio",
|
|
61
|
-
"command": "
|
|
62
|
-
"args": ["
|
|
50
|
+
"command": "npx",
|
|
51
|
+
"args": ["-y", "@andrewkimjoseph/celina"],
|
|
63
52
|
"env": {
|
|
64
53
|
"CELO_PRIVATE_KEY": "0x...",
|
|
65
54
|
"SELF_AGENT_PRIVATE_KEY": "0x..."
|
|
@@ -71,37 +60,21 @@ Install the package, then point your MCP client at the built entry. Works in any
|
|
|
71
60
|
|
|
72
61
|
Keep `CELO_PRIVATE_KEY` and `SELF_AGENT_PRIVATE_KEY` out of source control — they stay on your machine. Omit both for read-only chain queries.
|
|
73
62
|
|
|
74
|
-
###
|
|
75
|
-
|
|
76
|
-
No local install — paste and go. Write tools use the [hosted encryption flow](#write-tools-hosted-mode) (no plaintext keys in config).
|
|
77
|
-
|
|
78
|
-
```json
|
|
79
|
-
{
|
|
80
|
-
"mcpServers": {
|
|
81
|
-
"celina": {
|
|
82
|
-
"type": "streamable-http",
|
|
83
|
-
"url": "https://mcp.celina.andrewkimjoseph.com/mcp"
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
> Custom domains must be listed in `ALLOWED_HOSTS` on the server. Render's default hostname (`RENDER_EXTERNAL_HOSTNAME`) is always allowed automatically.
|
|
63
|
+
### Claude Desktop
|
|
90
64
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
Claude Desktop's `claude_desktop_config.json` only supports local stdio servers — it does **not** accept `"type": "streamable-http"` with a `"url"`. Free-plan users should bridge the hosted server with [`mcp-remote`](https://github.com/geelen/mcp-remote). Install it once (`npm i -g mcp-remote`), then:
|
|
65
|
+
Use the same stdio config in `claude_desktop_config.json` (macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`). Requires Node.js ≥ 20.
|
|
94
66
|
|
|
95
67
|
```json
|
|
96
68
|
{
|
|
97
69
|
"mcpServers": {
|
|
98
70
|
"celina": {
|
|
99
|
-
"
|
|
100
|
-
"
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
"
|
|
104
|
-
|
|
71
|
+
"type": "stdio",
|
|
72
|
+
"command": "npx",
|
|
73
|
+
"args": ["-y", "@andrewkimjoseph/celina"],
|
|
74
|
+
"env": {
|
|
75
|
+
"CELO_PRIVATE_KEY": "0x...",
|
|
76
|
+
"SELF_AGENT_PRIVATE_KEY": "0x..."
|
|
77
|
+
}
|
|
105
78
|
}
|
|
106
79
|
}
|
|
107
80
|
}
|
|
@@ -109,8 +82,6 @@ Claude Desktop's `claude_desktop_config.json` only supports local stdio servers
|
|
|
109
82
|
|
|
110
83
|
Fully quit and relaunch Claude Desktop after editing the config (closing the window is not enough).
|
|
111
84
|
|
|
112
|
-
> **Pro / Max / Team / Enterprise:** you can skip `mcp-remote` and add `https://mcp.celina.andrewkimjoseph.com/mcp` under **Settings → Integrations** instead.
|
|
113
|
-
|
|
114
85
|
### Local stdio (from source)
|
|
115
86
|
|
|
116
87
|
For development from a cloned repo, point at your local `build/index.js`:
|
|
@@ -131,32 +102,11 @@ For development from a cloned repo, point at your local `build/index.js`:
|
|
|
131
102
|
}
|
|
132
103
|
```
|
|
133
104
|
|
|
134
|
-
## Deploy to Render
|
|
135
|
-
|
|
136
|
-
This project includes a [Render Blueprint](render.yaml) for one-click deployment as a public Streamable HTTP MCP server.
|
|
137
|
-
|
|
138
|
-
### 1. Generate an RSA key pair
|
|
139
|
-
|
|
140
|
-
```bash
|
|
141
|
-
openssl genpkey -algorithm RSA -out private.pem -pkeyopt rsa_keygen_bits:2048
|
|
142
|
-
openssl rsa -pubout -in private.pem -out public.pem
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
### 2. Deploy
|
|
146
|
-
|
|
147
|
-
1. Push this repo to GitHub
|
|
148
|
-
2. Render Dashboard → **New → Blueprint** → connect the repo
|
|
149
|
-
3. Set `WALLET_ENCRYPTION_PRIVATE_KEY` in the Render Environment tab (paste contents of `private.pem`)
|
|
150
|
-
4. (Optional) Add a custom domain in Render and set `ALLOWED_HOSTS` to that hostname (comma-separated if multiple)
|
|
151
|
-
5. Your MCP endpoint will be at your Render URL + `/mcp`
|
|
152
|
-
|
|
153
|
-
> **Note:** Free Render services spin down after ~15 minutes of inactivity. Cold starts can take 30–60 seconds and may cause MCP client timeouts. Use a Starter plan for always-on hosting.
|
|
154
|
-
|
|
155
105
|
## Local LLM integration
|
|
156
106
|
|
|
157
107
|
Celina is an **MCP tool server**. A local LLM stack needs an **MCP client** that can connect to Celina and pass tool definitions to a model that supports **function / tool calling**.
|
|
158
108
|
|
|
159
|
-
Read-only tools (balances, blocks, GoodDollar status, etc.) work out of the box. For
|
|
109
|
+
Read-only tools (balances, blocks, GoodDollar status, etc.) work out of the box. For write tools (`send_token`, `estimate_send`, `execute_mento_fx`, Aave supply/withdraw), set `CELO_PRIVATE_KEY` in the MCP server `env` block.
|
|
160
110
|
|
|
161
111
|
### LM Studio (0.3.17+)
|
|
162
112
|
|
|
@@ -167,47 +117,8 @@ LM Studio can host MCP servers directly via `mcp.json`. After `npm i @andrewkimj
|
|
|
167
117
|
3. In **Server Settings**, enable **Allow calling servers from mcp.json**
|
|
168
118
|
4. Chat with a tool-capable model (e.g. Qwen 2.5, Llama 3.1+)
|
|
169
119
|
|
|
170
|
-
```json
|
|
171
|
-
{
|
|
172
|
-
"mcpServers": {
|
|
173
|
-
"celina": {
|
|
174
|
-
"type": "stdio",
|
|
175
|
-
"command": "node",
|
|
176
|
-
"args": ["/absolute/path/to/node_modules/@andrewkimjoseph/celina/build/index.js"],
|
|
177
|
-
"env": {
|
|
178
|
-
"CELO_PRIVATE_KEY": "0x...",
|
|
179
|
-
"SELF_AGENT_PRIVATE_KEY": "0x..."
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
```
|
|
185
|
-
|
|
186
120
|
Omit both env vars for read-only chain queries.
|
|
187
121
|
|
|
188
|
-
### Open WebUI + Ollama
|
|
189
|
-
|
|
190
|
-
[Open WebUI](https://docs.openwebui.com/features/extensibility/mcp/) supports **streamable HTTP** MCP natively (not stdio).
|
|
191
|
-
|
|
192
|
-
**Hosted Celina (easiest):** Admin Settings → External Tools → **Add Server** → Type: **MCP (Streamable HTTP)** → URL:
|
|
193
|
-
|
|
194
|
-
```
|
|
195
|
-
https://mcp.celina.andrewkimjoseph.com/mcp
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
**Local HTTP server:** run Celina in HTTP mode, then point Open WebUI at it:
|
|
199
|
-
|
|
200
|
-
```bash
|
|
201
|
-
npm run build
|
|
202
|
-
npm run start:http
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
Add an External Tool with Type **MCP (Streamable HTTP)** and URL `http://localhost:10000/mcp`.
|
|
206
|
-
|
|
207
|
-
For write tools over HTTP, set `WALLET_ENCRYPTION_PRIVATE_KEY` in `.env` (see [Deploy to Render](#deploy-to-render)) and use the [encrypt-key flow](#write-tools-hosted-mode).
|
|
208
|
-
|
|
209
|
-
> If Open WebUI runs in Docker, use `http://host.docker.internal:10000/mcp` instead of `localhost`.
|
|
210
|
-
|
|
211
122
|
### Continue (VS Code)
|
|
212
123
|
|
|
213
124
|
[Continue](https://docs.continue.dev/customize/deep-dives/mcp) works with local models (Ollama, LM Studio, etc.) in **agent mode**.
|
|
@@ -246,37 +157,18 @@ npm run inspect
|
|
|
246
157
|
- Start with read-only prompts, e.g. *"What's the USDm balance of 0x…?"* or *"Is this wallet GoodDollar whitelisted?"*
|
|
247
158
|
- Keep private keys in env vars only — never commit them to config files in git.
|
|
248
159
|
|
|
249
|
-
## Write tools
|
|
160
|
+
## Write tools
|
|
250
161
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
### Flow
|
|
254
|
-
|
|
255
|
-
1. Fetch the server's public key:
|
|
256
|
-
- MCP tool: `get_wallet_encryption_public_key`
|
|
257
|
-
- HTTP: `GET https://mcp.celina.andrewkimjoseph.com/public-key`
|
|
258
|
-
2. Encrypt your key locally:
|
|
259
|
-
|
|
260
|
-
```bash
|
|
261
|
-
npm run encrypt-key -- --url https://mcp.celina.andrewkimjoseph.com --key 0xYOUR_PRIVATE_KEY
|
|
262
|
-
```
|
|
263
|
-
|
|
264
|
-
3. Give the agent the encrypted blob (base64 output) along with your transaction details
|
|
265
|
-
4. The agent calls `send_token` with the `encryptedPrivateKey` parameter
|
|
266
|
-
|
|
267
|
-
The server decrypts the key ephemerally to sign the transaction — it is not stored.
|
|
162
|
+
Set `CELO_PRIVATE_KEY` in your MCP server `env` block for on-chain writes (`send_token`, `estimate_send`, `execute_mento_fx`, `supply_aave_usdt`, `withdraw_aave_usdt`). Use `SELF_AGENT_PRIVATE_KEY` for Self agent signing tools. Keys stay on your machine and are not sent to Celina's authors.
|
|
268
163
|
|
|
269
164
|
## Environment variables
|
|
270
165
|
|
|
271
166
|
| Variable | Default | Description |
|
|
272
167
|
|----------|---------|-------------|
|
|
273
|
-
| `
|
|
274
|
-
| `CELO_PRIVATE_KEY` | — | Local stdio write tools only |
|
|
168
|
+
| `CELO_PRIVATE_KEY` | — | Write tools (send, Mento FX, Aave) |
|
|
275
169
|
| `SELF_AGENT_PRIVATE_KEY` | — | Self Agent ID signing/identity tools (separate from CELO wallet) |
|
|
276
170
|
| `SELF_AGENT_API_BASE` | `https://app.ai.self.xyz` | Override Self Agent ID REST API base URL |
|
|
277
|
-
| `
|
|
278
|
-
| `ALLOWED_HOSTS` | — | Comma-separated custom hostnames (e.g. `mcp.celina.andrewkimjoseph.com`) |
|
|
279
|
-
| `PORT` | `10000` | HTTP server port (set by Render) |
|
|
171
|
+
| `CELO_RPC_URL_MAINNET` | Forno public RPC | Override mainnet RPC |
|
|
280
172
|
|
|
281
173
|
Copy `.env.example` to `.env` for local development.
|
|
282
174
|
|
|
@@ -308,11 +200,11 @@ Token symbols are resolved case-insensitively. Legacy aliases `cUSD` and `cEUR`
|
|
|
308
200
|
| `get_celo_balances` | read | CELO + ERC-20 balances (default: CELO + USDm) |
|
|
309
201
|
| `get_stablecoin_balances` | read | All registry stablecoins including GoodDollar |
|
|
310
202
|
| `get_token_info` | read | Token metadata |
|
|
311
|
-
| `get_wallet_encryption_public_key` | read | RSA public key
|
|
312
|
-
| `estimate_send` | read* | Gas estimate (*needs
|
|
203
|
+
| `get_wallet_encryption_public_key` | read | RSA public key (HTTP/self-hosted mode only) |
|
|
204
|
+
| `estimate_send` | read* | Gas estimate (*needs `CELO_PRIVATE_KEY`) |
|
|
313
205
|
| `send_token` | write | Send CELO or ERC-20 |
|
|
314
206
|
| `get_mento_fx_quote` | read | Mento FX expected output (no wallet) |
|
|
315
|
-
| `estimate_mento_fx` | read* | Mento FX gas estimate (*needs
|
|
207
|
+
| `estimate_mento_fx` | read* | Mento FX gas estimate (*needs `CELO_PRIVATE_KEY`) |
|
|
316
208
|
| `execute_mento_fx` | write | Execute Mento FX conversion |
|
|
317
209
|
| `supply_aave_usdt` | write | Supply USDT to Aave V3 on Celo |
|
|
318
210
|
| `withdraw_aave_usdt` | write | Withdraw USDT from Aave V3 on Celo |
|
|
@@ -378,8 +270,6 @@ No changes to `src/index.ts` or server bootstrap required.
|
|
|
378
270
|
```bash
|
|
379
271
|
npm run dev # watch TypeScript
|
|
380
272
|
npm run inspect # MCP Inspector UI (stdio)
|
|
381
|
-
npm run start:http # HTTP server on PORT (default 10000)
|
|
382
|
-
npm run encrypt-key # encrypt a private key for write tools
|
|
383
273
|
```
|
|
384
274
|
|
|
385
275
|
## License
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@andrewkimjoseph/celina",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.5",
|
|
4
4
|
"description": "Celina — MCP server for Celo mainnet. Balances, transfers, Self Agent ID, and chain reads for LLM agents.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "build/index.js",
|
|
@@ -14,6 +14,8 @@
|
|
|
14
14
|
"build/",
|
|
15
15
|
"bin/",
|
|
16
16
|
"assets/logo.png",
|
|
17
|
+
"assets/logo-black.png",
|
|
18
|
+
"assets/logo-yellow.png",
|
|
17
19
|
"README.md",
|
|
18
20
|
"LICENSE"
|
|
19
21
|
],
|