@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 CHANGED
@@ -1,6 +1,9 @@
1
1
  <p align="center">
2
- <img src="https://raw.githubusercontent.com/andrewkimjoseph/celina/main/assets/logo-yellow.png#gh-dark-mode-only" alt="Celina logo — yellow C with profile silhouette on black" width="160" />
3
- <img src="https://raw.githubusercontent.com/andrewkimjoseph/celina/main/assets/logo-black.png#gh-light-mode-only" alt="Celina logo — black C with profile silhouette" width="160" />
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
- **Recommended:** install from npm, then add Celina to your MCP config (see [MCP setup](#mcp-setup)).
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 point your MCP client at the built entry. Works in any stdio client (Cursor, Claude Desktop, LM Studio, Continue, MCP Inspector). Requires Node.js ≥ 20.
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. Replace the path with your absolute path to `node_modules/@andrewkimjoseph/celina/build/index.js`, then restart the client
43
+ 3. Restart the client
55
44
 
56
45
  ```json
57
46
  {
58
47
  "mcpServers": {
59
48
  "celina": {
60
49
  "type": "stdio",
61
- "command": "node",
62
- "args": ["/absolute/path/to/node_modules/@andrewkimjoseph/celina/build/index.js"],
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
- ### Cursor — remote (streamable HTTP)
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
- ### Claude Desktop remote (free plan)
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
- "command": "mcp-remote",
100
- "args": [
101
- "https://mcp.celina.andrewkimjoseph.com/mcp",
102
- "--transport",
103
- "http-only"
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 local write tools (`send_token`, `estimate_send`, `execute_mento_fx`), set `CELO_PRIVATE_KEY` in the MCP server `env` block (stdio) or use the [hosted encryption flow](#write-tools-hosted-mode) (HTTP).
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 (hosted mode)
160
+ ## Write tools
250
161
 
251
- Write tools (`send_token`, `estimate_send`, `execute_mento_fx`) accept an RSA-encrypted private key per request never plaintext.
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
- | `CELO_RPC_URL_MAINNET` | Forno public RPC | Override mainnet RPC |
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
- | `WALLET_ENCRYPTION_PRIVATE_KEY` | | RSA private key PEM for HTTP write tools |
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 for encrypting private keys |
312
- | `estimate_send` | read* | Gas estimate (*needs encrypted or env key) |
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 encrypted or env key) |
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",
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
  ],