eigen-skills 1.1.4 → 1.1.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
@@ -139,6 +139,16 @@ mkdir -p .claude/skills/eigen
139
139
  curl -o .claude/skills/eigen/SKILL.md https://raw.githubusercontent.com/zeeshan8281/eigen-agent-skills/main/SKILL.md
140
140
  ```
141
141
 
142
+ ### As an MCP Server (Claude Desktop, Cursor, Windsurf, Claude Code)
143
+
144
+ Install the separate [`eigen-mcp`](https://www.npmjs.com/package/eigen-mcp) package for MCP support — all 21 tools, no SKILL.md files or curl needed:
145
+
146
+ ```bash
147
+ npm install -g eigen-mcp
148
+ ```
149
+
150
+ See the [eigen-mcp README](https://www.npmjs.com/package/eigen-mcp) for config examples for Claude Desktop, Cursor, Windsurf, and Claude Code.
151
+
142
152
  ### For Programmatic Use (JavaScript)
143
153
 
144
154
  ```javascript
package/SKILL.md CHANGED
@@ -1,249 +1,218 @@
1
1
  ---
2
2
  name: eigen-skills
3
- description: "Query live EigenLayer data restaking, operators, AVS, rewards, delegation, stakers, TVL, deposits, withdrawals, EigenCompute TEE, and EigenDA blob storage via EigenExplorer API"
4
- version: 1.0.1
3
+ description: "Deploy any app to EigenCompute TEE hardware-isolated Trusted Execution Environments with encrypted memory, sealed secrets, and cryptographic attestation"
4
+ version: 1.1.5
5
5
  metadata:
6
- emoji: "🔄"
7
- tags: ["eigenlayer", "restaking", "avs", "operators", "rewards", "delegation", "eigencompute", "eigenda"]
6
+ emoji: "🔒"
7
+ tags: ["eigencompute", "tee", "deploy", "ecloud"]
8
8
  user-invocable: true
9
9
  ---
10
10
 
11
- # EigenLayer Skills for Claude Code
11
+ # EigenCompute Deploy Skill
12
12
 
13
- One-command integration: drop this file into your project and Claude Code can query live EigenLayer data.
13
+ One-command integration: install this skill and Claude Code can deploy any app to EigenCompute TEE.
14
14
 
15
- ## Setup
16
-
17
- ```bash
18
- curl -o SKILL.md https://raw.githubusercontent.com/zeeshan8281/eigen-agent-skills/main/SKILL.md
19
- ```
20
-
21
- Get a free API key at https://developer.eigenexplorer.com and set it:
22
-
23
- ```bash
24
- export EIGEN_API_KEY="your-key-here"
25
- ```
26
-
27
- ## Data Source
28
-
29
- **EigenExplorer API** — `https://api.eigenexplorer.com`
30
- - Auth: `x-api-token` header
31
- - Testnet: `https://api-holesky.eigenexplorer.com`
32
-
33
- ---
34
-
35
- ## 1. Ecosystem Metrics
36
-
37
- Use when the user asks about EigenLayer stats, total TVL, total stakers, total operators, or an ecosystem overview.
38
-
39
- ### Get ecosystem metrics
40
- ```bash
41
- curl -s "https://api.eigenexplorer.com/metrics" -H "x-api-token: $EIGEN_API_KEY"
42
- ```
43
-
44
- ### Get historical TVL
45
15
  ```bash
46
- curl -s "https://api.eigenexplorer.com/metrics/historical/tvl" -H "x-api-token: $EIGEN_API_KEY"
16
+ npm install eigen-skills
47
17
  ```
48
18
 
49
19
  ---
50
20
 
51
- ## 2. Operators
52
-
53
- Use when the user asks about EigenLayer operators, top operators, operator details, or operator search.
21
+ ## FIRST-TIME SETUP (do these once)
54
22
 
55
- ### List operators (sorted by staker count)
23
+ ### Step 1: Install the ecloud CLI
56
24
  ```bash
57
- curl -s "https://api.eigenexplorer.com/operators?withTvl=true&sortByTotalStakers=desc&take=10" -H "x-api-token: $EIGEN_API_KEY"
25
+ npm install -g @layr-labs/ecloud-cli
58
26
  ```
59
27
 
60
- ### List operators by TVL
28
+ ### Step 2: Generate keys and authenticate
29
+ For new users who have never used ecloud before:
61
30
  ```bash
62
- curl -s "https://api.eigenexplorer.com/operators?withTvl=true&sortByTvl=desc&take=10" -H "x-api-token: $EIGEN_API_KEY"
31
+ ecloud auth generate --store
63
32
  ```
33
+ This generates a new private key AND stores it in the OS keyring in one step.
64
34
 
65
- ### List operators by APY
35
+ If they already have a private key:
66
36
  ```bash
67
- curl -s "https://api.eigenexplorer.com/operators?withTvl=true&sortByApy=desc&take=10" -H "x-api-token: $EIGEN_API_KEY"
37
+ ecloud auth login
68
38
  ```
39
+ This will prompt them to paste their existing private key.
69
40
 
70
- ### Search operators by name
41
+ ### Step 3: Verify authentication
71
42
  ```bash
72
- curl -s "https://api.eigenexplorer.com/operators?searchByText=NAME&withTvl=true" -H "x-api-token: $EIGEN_API_KEY"
43
+ ecloud auth whoami
73
44
  ```
45
+ Should show their address and "stored credentials".
74
46
 
75
- ### Get a specific operator
47
+ ### Step 4: Subscribe to billing (required before first deploy)
76
48
  ```bash
77
- curl -s "https://api.eigenexplorer.com/operators/0xOPERATOR_ADDRESS?withTvl=true" -H "x-api-token: $EIGEN_API_KEY"
49
+ ecloud billing subscribe
78
50
  ```
79
-
80
- ### Get stakers delegating to an operator
51
+ Check status:
81
52
  ```bash
82
- curl -s "https://api.eigenexplorer.com/operators/0xOPERATOR_ADDRESS/stakers?take=20" -H "x-api-token: $EIGEN_API_KEY"
53
+ ecloud billing status
83
54
  ```
84
55
 
85
- ### Get all operator addresses (lightweight)
56
+ ### Step 5: Ensure Docker is installed and running
57
+ Docker Desktop (or docker daemon) must be running. The deploy process builds and pushes images. Check with:
86
58
  ```bash
87
- curl -s "https://api.eigenexplorer.com/operators/addresses" -H "x-api-token: $EIGEN_API_KEY"
59
+ docker info
88
60
  ```
61
+ If Docker is not running, start Docker Desktop:
62
+ - macOS: `open -a Docker`
63
+ - Then wait for `docker info` to succeed before proceeding.
89
64
 
90
65
  ---
91
66
 
92
- ## 3. Stakers
67
+ ## DEPLOYING AN APP (full playbook)
93
68
 
94
- Use when the user asks about a specific staker's position, deposits, withdrawals, or delegation.
69
+ **CRITICAL: The `ecloud compute app deploy` CLI is fully interactive with 6+ prompts. It CANNOT be run directly from a non-interactive shell. You MUST use an expect script to automate the prompts.**
95
70
 
96
- ### Get staker info
97
- ```bash
98
- curl -s "https://api.eigenexplorer.com/stakers/0xSTAKER_ADDRESS" -H "x-api-token: $EIGEN_API_KEY"
99
- ```
71
+ ### Step 1: Ensure the project has a Dockerfile
72
+ If the project does not have a Dockerfile, generate one based on the project type:
100
73
 
101
- ### Get staker deposits
102
- ```bash
103
- curl -s "https://api.eigenexplorer.com/stakers/0xSTAKER_ADDRESS/deposits?take=20" -H "x-api-token: $EIGEN_API_KEY"
74
+ **Node.js:**
75
+ ```dockerfile
76
+ FROM node:20-slim
77
+ WORKDIR /app
78
+ COPY package*.json ./
79
+ RUN npm ci --omit=dev
80
+ COPY . .
81
+ EXPOSE 3000
82
+ CMD ["node", "index.js"]
104
83
  ```
105
84
 
106
- ### Get staker withdrawals
107
- ```bash
108
- curl -s "https://api.eigenexplorer.com/stakers/0xSTAKER_ADDRESS/withdrawals?take=20" -H "x-api-token: $EIGEN_API_KEY"
85
+ **Python:**
86
+ ```dockerfile
87
+ FROM python:3.12-slim
88
+ WORKDIR /app
89
+ COPY requirements.txt ./
90
+ RUN pip install --no-cache-dir -r requirements.txt
91
+ COPY . .
92
+ EXPOSE 8000
93
+ CMD ["python", "main.py"]
109
94
  ```
110
95
 
111
- ### Get staker rewards
112
- ```bash
113
- curl -s "https://api.eigenexplorer.com/stakers/0xSTAKER_ADDRESS/rewards" -H "x-api-token: $EIGEN_API_KEY"
96
+ **Go:**
97
+ ```dockerfile
98
+ FROM golang:1.22-alpine AS builder
99
+ WORKDIR /app
100
+ COPY go.* ./
101
+ RUN go mod download
102
+ COPY . .
103
+ RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o server .
104
+ FROM alpine:3.19
105
+ COPY --from=builder /app/server /server
106
+ EXPOSE 8080
107
+ CMD ["/server"]
114
108
  ```
115
109
 
116
- ---
117
-
118
- ## 4. AVS (Actively Validated Services)
119
-
120
- Use when the user asks about AVS, which services exist, operators/stakers per AVS, or comparing AVS.
121
-
122
- ### List all AVS (sorted by TVL)
123
- ```bash
124
- curl -s "https://api.eigenexplorer.com/avs?withTvl=true&sortByTvl=desc&take=10" -H "x-api-token: $EIGEN_API_KEY"
110
+ **Rust:**
111
+ ```dockerfile
112
+ FROM rust:1.77-slim AS builder
113
+ WORKDIR /app
114
+ COPY . .
115
+ RUN cargo build --release
116
+ FROM debian:bookworm-slim
117
+ COPY --from=builder /app/target/release/app /app
118
+ EXPOSE 8080
119
+ CMD ["/app"]
125
120
  ```
126
121
 
127
- ### List AVS by APY
128
- ```bash
129
- curl -s "https://api.eigenexplorer.com/avs?withTvl=true&sortByApy=desc&take=10" -H "x-api-token: $EIGEN_API_KEY"
122
+ Also create a `.dockerignore`:
130
123
  ```
131
-
132
- ### Search AVS by name
133
- ```bash
134
- curl -s "https://api.eigenexplorer.com/avs?searchByText=NAME&withTvl=true" -H "x-api-token: $EIGEN_API_KEY"
124
+ node_modules
125
+ .git
126
+ target
127
+ __pycache__
135
128
  ```
136
129
 
137
- ### Get a specific AVS
130
+ ### Step 2: Build the Docker image
131
+ **IMPORTANT: Must build for linux/amd64 — EigenCompute TEEs run on x86_64.**
138
132
  ```bash
139
- curl -s "https://api.eigenexplorer.com/avs/0xAVS_ADDRESS?withTvl=true" -H "x-api-token: $EIGEN_API_KEY"
133
+ docker build --platform linux/amd64 -t <REGISTRY_USER>/<APP_NAME>:latest .
140
134
  ```
141
135
 
142
- ### Get operators registered to an AVS
136
+ ### Step 3: Push to a container registry
137
+ The image must be in a public registry (Docker Hub or GHCR) so EigenCompute can pull it.
143
138
  ```bash
144
- curl -s "https://api.eigenexplorer.com/avs/0xAVS_ADDRESS/operators?take=20" -H "x-api-token: $EIGEN_API_KEY"
139
+ docker push <REGISTRY_USER>/<APP_NAME>:latest
145
140
  ```
146
141
 
147
- ### Get stakers for an AVS
148
- ```bash
149
- curl -s "https://api.eigenexplorer.com/avs/0xAVS_ADDRESS/stakers?take=20" -H "x-api-token: $EIGEN_API_KEY"
150
- ```
142
+ ### Step 4: Deploy using an expect script
143
+ Create a file called `deploy.exp` and run it with `expect`. This handles all interactive prompts:
151
144
 
152
- ### Get rewards distributed by an AVS
153
- ```bash
154
- curl -s "https://api.eigenexplorer.com/avs/0xAVS_ADDRESS/rewards" -H "x-api-token: $EIGEN_API_KEY"
155
- ```
145
+ ```expect
146
+ #!/usr/bin/expect -f
147
+ set timeout 300
156
148
 
157
- ### Get registration events for an AVS
158
- ```bash
159
- curl -s "https://api.eigenexplorer.com/avs/0xAVS_ADDRESS/events/registration?take=20" -H "x-api-token: $EIGEN_API_KEY"
160
- ```
149
+ spawn ecloud compute app deploy --name "<APP_NAME>" --image-ref "<REGISTRY_USER>/<APP_NAME>:latest" --skip-profile --log-visibility public
161
150
 
162
- ### Get operator-sets for an AVS
163
- ```bash
164
- curl -s "https://api.eigenexplorer.com/avs/0xAVS_ADDRESS/operator-sets?take=20" -H "x-api-token: $EIGEN_API_KEY"
165
- ```
151
+ # Prompt 1: Build from verifiable source? -> No
152
+ expect "Build from verifiable source?"
153
+ send "n\r"
166
154
 
167
- ---
155
+ # Prompt 2: Choose deployment method -> "Deploy existing image from registry" (arrow down once)
156
+ expect "Choose deployment method:"
157
+ send "\033\[B\r"
168
158
 
169
- ## 5. Rewards & Yield
159
+ # Prompt 3: Env file -> "Continue without env file" (arrow down once)
160
+ # If the project has a .env file, select "Enter path to existing env file" instead (just press enter)
161
+ expect "Choose an option:"
162
+ send "\033\[B\r"
170
163
 
171
- Use when the user asks about rewards, APY, yield, best operators/AVS by returns, or how much a staker is earning.
164
+ # Prompt 4: Instance type -> default g1-micro-1v (just press enter)
165
+ # Use arrow keys to select a larger instance if needed
166
+ expect "Choose instance:"
167
+ send "\r"
172
168
 
173
- ### Top operators by APY
174
- ```bash
175
- curl -s "https://api.eigenexplorer.com/operators?withTvl=true&sortByApy=desc&take=10" -H "x-api-token: $EIGEN_API_KEY"
176
- ```
169
+ # Prompt 5: Resource usage monitoring -> Yes (just press enter)
170
+ expect "resource usage"
171
+ send "\r"
177
172
 
178
- ### Top AVS by APY
179
- ```bash
180
- curl -s "https://api.eigenexplorer.com/avs?withTvl=true&sortByApy=desc&take=10" -H "x-api-token: $EIGEN_API_KEY"
173
+ # Catch any remaining prompts
174
+ expect {
175
+ "Confirm" { send "y\r"; exp_continue }
176
+ "(y/N)" { send "y\r"; exp_continue }
177
+ "(Y/n)" { send "y\r"; exp_continue }
178
+ eof { }
179
+ }
181
180
  ```
182
181
 
183
- ### Get rewards for a specific operator
182
+ Run it:
184
183
  ```bash
185
- curl -s "https://api.eigenexplorer.com/operators/0xOPERATOR_ADDRESS/rewards" -H "x-api-token: $EIGEN_API_KEY"
184
+ chmod +x deploy.exp && expect deploy.exp
186
185
  ```
187
186
 
188
- ---
189
-
190
- ## 6. Deposits & Withdrawals (Global)
191
-
192
- Use when the user asks about recent deposits/withdrawals across the whole protocol.
193
-
194
- ### Get recent deposits
195
- ```bash
196
- curl -s "https://api.eigenexplorer.com/deposits?take=20" -H "x-api-token: $EIGEN_API_KEY"
187
+ The output will contain the **App ID** and **IP address** on success:
197
188
  ```
198
-
199
- ### Get recent withdrawals
200
- ```bash
201
- curl -s "https://api.eigenexplorer.com/withdrawals?take=20" -H "x-api-token: $EIGEN_API_KEY"
189
+ App ID: 0x...
190
+ App is now running with IP: x.x.x.x
202
191
  ```
203
192
 
204
- ---
205
-
206
- ## 7. Delegation & Events
207
-
208
- Use when the user asks about delegation events, who is delegating to whom, or operator registration events.
209
-
210
- ### Get delegation events
193
+ ### Step 5: Verify the deployment
211
194
  ```bash
212
- curl -s "https://api.eigenexplorer.com/events/delegation?take=20" -H "x-api-token: $EIGEN_API_KEY"
213
- ```
214
-
215
- ### Get operator registration events
216
- ```bash
217
- curl -s "https://api.eigenexplorer.com/events/registration-status?take=20" -H "x-api-token: $EIGEN_API_KEY"
218
- ```
219
-
220
- ### Get all operator-sets
221
- ```bash
222
- curl -s "https://api.eigenexplorer.com/operator-sets?take=20" -H "x-api-token: $EIGEN_API_KEY"
195
+ ecloud compute app list
196
+ ecloud compute app info <APP_ID>
223
197
  ```
224
198
 
225
199
  ---
226
200
 
227
- ## 8. EigenCompute (TEE)
201
+ ## Instance types available
228
202
 
229
- Use when the user asks about deploying to EigenCompute, TEE, EigenCloud, attestation, or app management.
203
+ | Instance | Specs | TEE Type |
204
+ |----------|-------|----------|
205
+ | g1-micro-1v | 2 shared vCPUs, 1 GB RAM | Shielded VM (default) |
206
+ | g1-medium-1v | 2 shared vCPUs, 4 GB RAM | Shielded VM |
207
+ | g1-custom-2-4096s | 2 vCPUs, 4 GB RAM | SEV-SNP |
208
+ | g1-standard-2s | 2 vCPUs, 8 GB RAM | SEV-SNP |
209
+ | g1-standard-4t | 4 vCPUs, 16 GB RAM | TDX |
210
+ | g1-standard-8t | 8 vCPUs, 32 GB RAM | TDX |
230
211
 
231
- **Requires:** `npm install -g @layr-labs/ecloud-cli`
232
-
233
- ### Authentication
234
- ```bash
235
- ecloud auth login
236
- ecloud auth whoami
237
- ```
212
+ ---
238
213
 
239
- ### Deploy an app
240
- ```bash
241
- ecloud compute app create --name my-app --language typescript
242
- ecloud compute app deploy
243
- ```
244
- Always use **"Build and deploy from Dockerfile"** — deploy from registry is unreliable.
214
+ ## Manage deployed apps
245
215
 
246
- ### Manage apps
247
216
  ```bash
248
217
  ecloud compute app list
249
218
  ecloud compute app info <APP_ID>
@@ -254,75 +223,25 @@ ecloud compute app terminate <APP_ID>
254
223
  ecloud compute app upgrade <APP_ID>
255
224
  ```
256
225
 
257
- ### Set sealed secrets
226
+ ---
227
+
228
+ ## Set sealed secrets (encrypted env vars, decrypted only inside TEE)
229
+
258
230
  ```bash
259
231
  ecloud compute app env set MY_SECRET="value" API_KEY="key"
260
232
  ```
261
233
 
262
- ### TEE attestation
263
- Inside the TEE, the KMS signing key is at `/usr/local/bin/kms-signing-public-key.pem`. Verify at `https://verify-sepolia.eigencloud.xyz`.
264
-
265
234
  ---
266
235
 
267
- ## 9. EigenDA (Data Availability)
268
-
269
- Use when the user asks about storing/retrieving data on EigenDA, blob storage, or data availability.
270
-
271
- **Requires:** EigenDA Proxy running locally:
272
- ```bash
273
- docker run -d --name eigenda-proxy -p 3100:3100 \
274
- ghcr.io/layr-labs/eigenda-proxy:latest \
275
- --eigenda.disperser-rpc=disperser-sepolia.eigenda.xyz:443 \
276
- --eigenda.service-manager-addr=0xD4A7E1Bd8015057293f0D0A557088c286942e84b \
277
- --eigenda.eth-rpc=YOUR_SEPOLIA_RPC_URL \
278
- --eigenda.status-query-timeout=45s \
279
- --eigenda.signer-private-key-hex=YOUR_PRIVATE_KEY \
280
- --memstore.enabled=false --eigenda.disable-tls=false
281
- ```
236
+ ## TEE attestation
282
237
 
283
- ### Store a blob
284
- ```bash
285
- curl -s -X POST "http://127.0.0.1:3100/put?commitment_mode=standard" \
286
- -H "Content-Type: application/json" \
287
- -d '{"key": "value"}'
288
- ```
238
+ Inside the TEE, the KMS signing key is at `/usr/local/bin/kms-signing-public-key.pem`. Verify at `https://verify-sepolia.eigencloud.xyz`.
289
239
 
290
- ### Retrieve a blob
291
- ```bash
292
- curl -s "http://127.0.0.1:3100/get/COMMITMENT_HASH?commitment_mode=standard"
293
- ```
240
+ ---
294
241
 
295
- ### Health check
296
- ```bash
297
- curl -s "http://127.0.0.1:3100/health"
298
- ```
242
+ ## Dashboard
299
243
 
300
- ### View blob on explorer
244
+ View any deployed app at:
301
245
  ```
302
- https://blobs-sepolia.eigenda.xyz/blobs/COMMITMENT_HASH
246
+ https://verify-sepolia.eigencloud.xyz/app/<APP_ID>
303
247
  ```
304
-
305
- ---
306
-
307
- ## Query Parameters Reference
308
-
309
- | Parameter | Used On | Values | Description |
310
- |-----------|---------|--------|-------------|
311
- | `withTvl` | operators, avs | `true`/`false` | Include TVL calculations |
312
- | `sortByTvl` | operators, avs | `asc`/`desc` | Sort by TVL |
313
- | `sortByApy` | operators, avs | `asc`/`desc` | Sort by APY |
314
- | `sortByTotalStakers` | operators, avs | `asc`/`desc` | Sort by staker count |
315
- | `sortByTotalAvs` | operators | `asc`/`desc` | Sort by AVS count |
316
- | `searchByText` | operators, avs | string | Case-insensitive name search |
317
- | `skip` | all list endpoints | number | Pagination offset (default: 0) |
318
- | `take` | all list endpoints | number | Results per page (default: 12) |
319
-
320
- ## Response Formatting
321
-
322
- When presenting results to users:
323
- - **Bold names** and abbreviate addresses (`0x1234...abcd`)
324
- - TVL in human-readable form ("$1.2B" not "1200000000")
325
- - APY as percentages ("4.2% APY")
326
- - Show staker counts and operator counts
327
- - Use bullet points, not tables
328
- - Flag high APY + low TVL as potentially risky
@@ -0,0 +1,180 @@
1
+ # Eigen Skills & Eigen MCP — Code Walkthrough Script
2
+
3
+ ## Video Details
4
+ - **Target length**: ~10-12 minutes
5
+ - **Tone**: Developer-to-developer, casual but technically precise
6
+ - **Audience**: Devs interested in AI agent tooling, EigenLayer ecosystem
7
+
8
+ ---
9
+
10
+ ## FLOW (at a glance)
11
+
12
+ ```
13
+ 1. Hook & Context (~1 min)
14
+ 2. Project Overview (~1 min)
15
+ 3. Skills Deep Dive (~3 min)
16
+ 4. MCP Deep Dive (~2 min)
17
+ 5. Skills vs MCP — same data, two paths (~1 min)
18
+ 6. Live Demo (~3 min)
19
+ 7. Chat UI & Deployment (~1.5 min)
20
+ 8. Wrap-up (~30s)
21
+ ```
22
+
23
+ ---
24
+
25
+ ## SCRIPT
26
+
27
+ ### 1. Hook & Context (0:00 – 1:00)
28
+
29
+ > "What if any AI agent — Claude Code, Cursor, Windsurf — could query live EigenLayer data just by reading a markdown file?
30
+ >
31
+ > That's what we built. This is `eigen-skills` — an open-source package that gives AI agents the ability to query operators, AVS data, staker positions, rewards, delegation events, TEE compute, and data availability blobs — all from the EigenLayer ecosystem.
32
+ >
33
+ > There are two integration paths: **Agent Skills** for Claude Code and compatible agents, and **MCP** for Claude Desktop, Cursor, and Windsurf. Let me walk you through the code."
34
+
35
+ ---
36
+
37
+ ### 2. Project Overview (1:00 – 2:00)
38
+
39
+ **[SCREEN: terminal, run `ls` or show file tree]**
40
+
41
+ > "Here's the repo structure. At the top level:
42
+ >
43
+ > - `skills/` — six skill modules, one per EigenLayer domain
44
+ > - `eigen-mcp/` — a standalone MCP server package
45
+ > - `index.js` — exports all six API client classes
46
+ > - `server.js` — a chat UI powered by Gemini with tool-use
47
+ > - `Dockerfile` + `entrypoint.sh` — for deploying into EigenCompute TEE
48
+ >
49
+ > The key insight is that **skills and MCP share the same API client layer**. Let me show you."
50
+
51
+ **[SCREEN: open `index.js`]**
52
+
53
+ > "Six classes. `EigenAPI`, `AVSAPI`, `RewardsAPI`, `DelegationAPI`, `EigenCompute`, `EigenDA`. Every integration path — skills, MCP, chat UI — uses these same clients underneath."
54
+
55
+ ---
56
+
57
+ ### 3. Skills Deep Dive (2:00 – 5:00)
58
+
59
+ **[SCREEN: open `skills/` directory]**
60
+
61
+ > "Each skill follows the same pattern: a `SKILL.md` file and a `scripts/` folder with the JS client."
62
+
63
+ **[SCREEN: open `skills/eigen-restaking/SKILL.md`]**
64
+
65
+ > "This is the magic. The `SKILL.md` is a markdown file that an agent reads to understand what it can do. It has:
66
+ >
67
+ > - A description of the skill's purpose
68
+ > - The base URL and auth headers
69
+ > - Complete curl examples for every endpoint
70
+ >
71
+ > When a user asks Claude Code something like 'show me the top EigenLayer operators by TVL', Claude reads this file, picks the right curl command, runs it, and formats the response. No SDK, no dependencies — just curl."
72
+
73
+ **[SCREEN: open `skills/eigen-avs/SKILL.md` briefly]**
74
+
75
+ > "Same pattern for AVS data — services, their operators, their stakers."
76
+
77
+ **[SCREEN: open `skills/eigen-rewards/SKILL.md` briefly]**
78
+
79
+ > "Rewards and APY rankings..."
80
+
81
+ **[SCREEN: open one API client, e.g. `skills/eigen-restaking/scripts/eigen-api.js`]**
82
+
83
+ > "And if you want to use these programmatically in your own Node app, each skill also has a JS client. Standard axios wrapper — constructor takes an API key, methods map to endpoints. Nothing fancy, deliberately simple."
84
+
85
+ **[SCREEN: open `scripts/postinstall.js`]**
86
+
87
+ > "One nice DX touch — when you `npm install eigen-skills`, the postinstall hook copies the unified `SKILL.md` into `~/.claude/skills/eigen/`. Claude Code auto-discovers skills in that directory, so installation is literally one command and you're done."
88
+
89
+ ---
90
+
91
+ ### 4. MCP Deep Dive (5:00 – 7:00)
92
+
93
+ **[SCREEN: open `eigen-mcp/` directory]**
94
+
95
+ > "Now the second integration path — MCP, the Model Context Protocol.
96
+ >
97
+ > MCP is a standard from Anthropic for exposing tools to AI agents over a structured RPC interface. Instead of the agent reading markdown and running curl, the agent calls named tools with typed parameters and gets structured JSON back."
98
+
99
+ **[SCREEN: open `eigen-mcp/mcp.js`]**
100
+
101
+ > "Here's the server. It imports the same six API clients from `eigen-skills`, then registers 21 tools.
102
+ >
103
+ > Each tool has a name, description, and a Zod schema for parameter validation. When Claude Desktop or Cursor calls `get_operators`, the MCP server runs `eigenAPI.getOperators()` and returns the result.
104
+ >
105
+ > Look — the tool implementations are just thin wrappers around the same API clients the skills use. Same data, different delivery mechanism."
106
+
107
+ **[SCREEN: show the tool registration pattern — pick `get_metrics` and `get_operators`]**
108
+
109
+ > "Simple example: `get_metrics` takes no parameters, calls `eigenAPI.getMetrics()`, returns JSON. `get_operators` takes optional skip, take, and search parameters with Zod validation."
110
+
111
+ **[SCREEN: open `eigen-mcp/README.md` — show config snippets]**
112
+
113
+ > "To use it, you register it with your client. For Claude Desktop, add it to `claude_desktop_config.json`. For Cursor or Windsurf, similar JSON config. One line: `npx eigen-mcp`."
114
+
115
+ ---
116
+
117
+ ### 5. Skills vs MCP — Same Data, Two Paths (7:00 – 8:00)
118
+
119
+ **[SCREEN: side-by-side or diagram]**
120
+
121
+ > "So why two paths?
122
+ >
123
+ > **Skills** are the agent-native approach. The agent reads a markdown file, understands the API surface, and runs curl commands. No server process, no extra dependencies. Works great with Claude Code and any agent that supports the skills spec.
124
+ >
125
+ > **MCP** is the protocol-native approach. A server process exposes typed tools over stdio. Better for IDE integrations like Cursor and Windsurf where you want structured tool calling.
126
+ >
127
+ > Both hit the same EigenExplorer API. Both return the same data. It's about meeting agents where they are."
128
+
129
+ ---
130
+
131
+ ### 6. Live Demo (8:00 – 11:00)
132
+
133
+ **[SCREEN: terminal with Claude Code open]**
134
+
135
+ > "Let me show you this working. I've got Claude Code open with eigen-skills installed."
136
+
137
+ **Demo queries (pick 3-4):**
138
+
139
+ 1. **"What's the current EigenLayer TVL?"** — hits `get_metrics`, shows ecosystem stats
140
+ 2. **"Show me the top 5 operators by TVL"** — hits `get_operators`, tabular output
141
+ 3. **"What AVS has the most operators?"** — hits `get_avs_list`, cross-references data
142
+ 4. **"Show me the highest APY strategies"** — hits rewards skill, shows yield data
143
+
144
+ > *(narrate what Claude is doing as it runs — "it's reading the skill file... picking the right endpoint... running the curl... formatting the response")*
145
+
146
+ **[Optional: show the MCP path too in Claude Desktop or Cursor if set up]**
147
+
148
+ ---
149
+
150
+ ### 7. Chat UI & TEE Deployment (11:00 – 12:30)
151
+
152
+ **[SCREEN: open `server.js` briefly]**
153
+
154
+ > "Bonus — there's also a web chat UI. Express server, Socket.io for real-time chat, Gemini as the LLM via OpenRouter. It has the same 21 tools defined inline. You can ask EigenLayer questions in a browser."
155
+
156
+ **[SCREEN: open `ui/index.html` or show the running UI briefly]**
157
+
158
+ **[SCREEN: open `Dockerfile` and `entrypoint.sh`]**
159
+
160
+ > "And the whole thing can be deployed into EigenCompute — Intel TDX trusted execution environments. The entrypoint script sources sealed secrets from the TEE, writes the env file, and starts the server. Your API keys never leave the enclave."
161
+
162
+ ---
163
+
164
+ ### 8. Wrap-up (12:30 – 13:00)
165
+
166
+ > "That's eigen-skills. Six EigenLayer domains, two integration paths, same underlying clients.
167
+ >
168
+ > `npm install eigen-skills` for Claude Code. `npx eigen-mcp` for Claude Desktop and Cursor. Or use the JS clients directly in your own app.
169
+ >
170
+ > Links in the description. Star the repo, open issues, PRs welcome."
171
+
172
+ ---
173
+
174
+ ## Production Notes
175
+
176
+ - **Screen recordings**: Use a clean terminal theme, large font (16-18pt)
177
+ - **Code highlights**: When showing files, zoom into the relevant section — don't scroll through entire files
178
+ - **Transitions**: Cut between terminal and editor, avoid long pauses
179
+ - **B-roll ideas**: EigenExplorer website, EigenLayer docs, Claude Code in action
180
+ - **Thumbnail**: Terminal with EigenLayer logo + "AI Agent Skills" text