@one-source/mcp 5.1.0 → 5.2.0

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.repo.md CHANGED
@@ -1,365 +1,153 @@
1
- # @one-source/mcp
2
-
3
- Unified MCP server for [OneSource](https://docs.onesource.io) 27 tools for blockchain data and live chain queries in a single server.
4
-
5
- > **What is MCP?** The [Model Context Protocol](https://modelcontextprotocol.io) lets AI assistants call tools and access data sources. This server exposes both the OneSource blockchain API and its documentation as tools.
6
-
7
- ## Quick Start
8
-
9
- ### Claude Code
10
-
11
- ```bash
12
- claude mcp add onesource -- npx -y @one-source/mcp@latest
13
- ```
14
-
15
- ### Claude Desktop / Cursor
16
-
17
- Add to your MCP config:
18
-
19
- ```json
20
- {
21
- "mcpServers": {
22
- "onesource": {
23
- "command": "npx",
24
- "args": ["-y", "@one-source/mcp@latest"]
25
- }
26
- }
27
- }
28
- ```
29
-
30
- ### Any MCP Client (stdio)
31
-
32
- ```bash
33
- npx -y @one-source/mcp@latest
34
- ```
35
-
36
- ### HTTP Server (self-hosted)
37
-
38
- ```bash
39
- npx -y @one-source/mcp@latest --http
40
- npx -y @one-source/mcp@latest --http --port=8080
41
- ```
42
-
43
- Then connect your MCP client to `http://localhost:3000/`.
44
-
45
- Health check: `GET http://localhost:3000/health`
46
-
47
- ## Tools (27)
48
-
49
- ### Blockchain API — Live Chain (12 tools)
50
-
51
- | Tool | Description |
52
- |------|-------------|
53
- | `1s_allowance_live` | ERC20 allowance check |
54
- | `1s_contract_info_live` | Contract type detection via ERC165 |
55
- | `1s_erc1155_balance_live` | ERC1155 balance via RPC |
56
- | `1s_erc20_balance_live` | ERC20 balance via balanceOf |
57
- | `1s_erc20_transfers_live` | ERC20 Transfer logs via eth_getLogs |
58
- | `1s_erc721_tokens_live` | ERC721 token enumeration |
59
- | `1s_events_live` | Event logs via eth_getLogs |
60
- | `1s_multi_balance_live` | ETH + multiple ERC20 balances |
61
- | `1s_nft_metadata_live` | NFT metadata via tokenURI |
62
- | `1s_nft_owner_live` | NFT owner via ownerOf |
63
- | `1s_total_supply_live` | Token total supply |
64
- | `1s_tx_details_live` | Transaction + receipt via RPC |
65
-
66
- ### Blockchain API Chain Utilities (13 tools)
67
-
68
- RPC only.
69
-
70
- | Tool | Description |
71
- |------|-------------|
72
- | `1s_block_by_number` | Block details by number via RPC |
73
- | `1s_block_number` | Latest block number |
74
- | `1s_chain_id` | EIP-155 chain ID |
75
- | `1s_contract_code` | Contract bytecode |
76
- | `1s_ens_resolve` | ENS name/address resolution |
77
- | `1s_estimate_gas` | Gas estimation |
78
- | `1s_network_info` | Chain ID, block number, gas price |
79
- | `1s_nonce` | Transaction count |
80
- | `1s_pending_block` | Pending block from mempool |
81
- | `1s_proxy_detect` | Proxy contract detection |
82
- | `1s_simulate_call` | Simulate eth_call |
83
- | `1s_storage_read` | Read storage slot |
84
- | `1s_tx_receipt` | Transaction receipt |
85
-
86
- ### Setup & Ops (2 tools)
87
-
88
- No authentication required.
89
-
90
- | Tool | Purpose | When to use |
91
- |------|---------|-------------|
92
- | `1s_setup_check` | Server health, version, auth status, setup instructions | First thing to call — checks if everything is configured |
93
- | `1s_report_bug` | Report bugs to Slack (or GitHub Issues fallback) | When a tool errors or user wants to report an issue |
94
-
95
- ## Networks
96
-
97
- All blockchain API tools accept an optional `network` parameter:
98
-
99
- | Network | Description |
100
- |---------|-------------|
101
- | `ethereum` | Ethereum mainnet (default) |
102
- | `sepolia` | Ethereum Sepolia testnet |
103
- | `avax` | Avalanche C-Chain |
104
-
105
- ## Authentication
106
-
107
- Blockchain API tools require authentication. Two options are available — if both are set, API key takes priority.
108
-
109
- | Method | Variable | Description |
110
- |--------|----------|-------------|
111
- | API key | `ONESOURCE_API_KEY` | Unlimited calls, no per-call cost |
112
- | x402 micropayments | `X402_PRIVATE_KEY` | Pay-per-call via USDC on Base, no account required |
113
-
114
- ### Option 1: API Key
115
-
116
- 1. Go to [app.onesource.io](https://app.onesource.io) and create an account.
117
- 2. Subscribe to a developer plan (Stripe checkout).
118
- 3. Navigate to **API Keys** and generate a key.
119
- 4. Copy the key it starts with `sk_`.
120
-
121
- #### Claude Code
122
-
123
- ```bash
124
- claude mcp add onesource -e ONESOURCE_API_KEY=<key> -- npx -y @one-source/mcp@latest
125
- ```
126
-
127
- #### Claude Desktop / Cursor
128
-
129
- Add the `env` block to your MCP config:
130
-
131
- ```json
132
- {
133
- "mcpServers": {
134
- "onesource": {
135
- "command": "npx",
136
- "args": ["-y", "@one-source/mcp@latest"],
137
- "env": {
138
- "ONESOURCE_API_KEY": "<key>"
139
- }
140
- }
141
- }
142
- }
143
- ```
144
-
145
- #### Any MCP Client (stdio)
146
-
147
- ```bash
148
- ONESOURCE_API_KEY=<key> npx -y @one-source/mcp@latest
149
- ```
150
-
151
- After adding, reload the MCP server and call `1s_setup_check` — it should show `Status: Configured (API key)`.
152
-
153
- ### Option 2: x402 Micropayments
154
-
155
- Blockchain API endpoints are priced in USDC on Base via [x402](https://github.com/coinbase/x402). When you set `X402_PRIVATE_KEY`, the server automatically handles payments — tool calls are paid and retried transparently without any extra work from the agent.
156
-
157
- 1. **Get an EVM private key** — export one from MetaMask, Coinbase Wallet, or any EVM wallet, or generate a fresh one. The key is a 64-character hex string. The `0x` prefix is optional — both formats are accepted.
158
- 2. **Pass the key to the server** using one of the methods below.
159
- 3. **Reload and find your wallet address** — reload the MCP server, then call `1s_setup_check`. It will show the wallet address derived from your key under "Wallet address".
160
- 4. **Fund that address with USDC on Base** — send USDC to the address shown in `1s_setup_check`, on the [Base](https://base.org) network. A few dollars ($1–5 USDC) is enough for hundreds of calls. If your USDC is on Ethereum mainnet, bridge it using the [Base Bridge](https://bridge.base.org).
161
- 5. **Verify** — call `1s_network_info` for ethereum. If it returns chain data (block number, gas price), x402 payments are working end-to-end.
162
-
163
- #### Claude Code
164
-
165
- ```bash
166
- claude mcp add onesource -e X402_PRIVATE_KEY=<key> -- npx -y @one-source/mcp@latest
167
- ```
168
-
169
- #### Claude Desktop / Cursor
170
-
171
- Add the `env` block to your MCP config:
172
-
173
- ```json
174
- {
175
- "mcpServers": {
176
- "onesource": {
177
- "command": "npx",
178
- "args": ["-y", "@one-source/mcp@latest"],
179
- "env": {
180
- "X402_PRIVATE_KEY": "<key>"
181
- }
182
- }
183
- }
184
- }
185
- ```
186
-
187
- #### Any MCP Client (stdio)
188
-
189
- ```bash
190
- X402_PRIVATE_KEY=<key> npx -y @one-source/mcp@latest
191
- ```
192
-
193
- ### Config File Locations
194
-
195
- If you prefer editing the config file directly instead of using CLI commands:
196
-
197
- | Client | Config file path |
198
- |--------|-----------------|
199
- | Claude Code | Run `claude mcp get onesource` to see the file path |
200
- | Claude Desktop (macOS) | `~/Library/Application Support/Claude/claude_desktop_config.json` |
201
- | Claude Desktop (Windows) | `%APPDATA%\Claude\claude_desktop_config.json` |
202
- | Cursor (macOS) | `~/.cursor/mcp.json` |
203
- | Cursor (Windows) | `%USERPROFILE%\.cursor\mcp.json` |
204
-
205
- Add the `onesource` entry inside `"mcpServers"` using the JSON block shown above.
206
-
207
- ### Alternative: Set as an Environment Variable
208
-
209
- Instead of the `env` config block, you can set either variable as a shell or system environment variable: `export ONESOURCE_API_KEY=<key>` (bash/zsh) or `$env:ONESOURCE_API_KEY = "<key>"` (PowerShell). Set it at the OS level for persistence across sessions.
210
-
211
- ### Security
212
-
213
- Never commit keys to source control. Use environment variables, a `.env` file (excluded from git), or a secrets manager.
214
-
215
- > **After any config change:** Run `/reload-plugins` in Claude Code, or restart Claude Desktop / Cursor. The MCP server must be reloaded to pick up new environment variables.
216
-
217
- ## Environment Variables
218
-
219
- | Variable | Default | Description |
220
- |----------|---------|-------------|
221
- | `ONESOURCE_API_KEY` | — | OneSource API key for Bearer token auth. Takes priority over x402. |
222
- | `X402_PRIVATE_KEY` | — | EVM private key (64-char hex, `0x` prefix optional) for automatic x402 USDC payments on Base |
223
- | `ONESOURCE_BASE_URL` | `https://skills.onesource.io` | API base URL |
224
- | `ONESOURCE_ANALYTICS` | — | Set to `false` to disable analytics |
225
- | `ONESOURCE_ANALYTICS_URL` | — | Dashboard endpoint for analytics |
226
- | `X402_ANALYTICS_KEY` | — | API key for dashboard analytics |
227
-
228
- ## Troubleshooting
229
-
230
- **`1s_setup_check` shows "Not configured"**
231
- Set either `ONESOURCE_API_KEY` or `X402_PRIVATE_KEY`. Reload the MCP server after setting either variable (see note above). If the key still isn't reaching the server, set it as a shell environment variable directly.
232
-
233
- **Getting 403 / wrong key active despite correct setup**
234
- A key set in your shell profile (e.g. `~/.zshrc`, `~/.bash_profile`) is picked up by the MCP server process even if it isn't in your Claude MCP config. Run `echo $ONESOURCE_API_KEY` in your terminal to check. If it prints a value you didn't intend, unset it (`unset ONESOURCE_API_KEY`) or explicitly clear it when adding the server: `claude mcp add onesource -e ONESOURCE_API_KEY= -e X402_PRIVATE_KEY=<key> -- npx -y @one-source/mcp@latest`. `1s_setup_check` shows the first 6 characters of whichever key is active so you can confirm which one the server is using.
235
-
236
- **Instructions show wrong auth method after reinstall**
237
- `/reload-plugins` in Claude Code reconnects tools but may not refresh the system prompt the LLM sees. If you switch auth method (e.g. API key → x402), do a full Claude Code restart to ensure the instructions reflect the new auth.
238
-
239
- **"MCP server onesource already exists" error**
240
- Run `claude mcp remove onesource` first, then re-add with your updated config.
241
-
242
- **Windows: `npx` requires `cmd /c` wrapper**
243
- Claude Code's `/doctor` command may warn about this. Update your MCP config to use `"command": "cmd"` with `"args": ["/c", "npx", "-y", "@one-source/mcp@latest"]`.
244
-
245
- **`npx` hangs with no output**
246
- That's normal — stdio mode waits for JSON-RPC input on stdin. Use `--http` if you want an HTTP server you can curl.
247
-
248
- **Port already in use**
249
- Specify a different port: `npx -y @one-source/mcp@latest --http --port=8080`
250
-
251
- ## Registry Publishing
252
-
253
- This package is listed on the [official MCP Registry](https://registry.modelcontextprotocol.io) under the verified namespace `io.onesource/mcp` and on [Glama](https://glama.ai/mcp/servers). When releasing a new version, update both registries.
254
-
255
- ### MCP Registry
256
-
257
- #### First-Time Setup
258
-
259
- ##### 1. Install Go
260
-
261
- Download the installer for your platform from [go.dev/dl](https://go.dev/dl/) and run it. Verify:
262
-
263
- ```bash
264
- go version
265
- ```
266
-
267
- ##### 2. Install mcp-publisher
268
-
269
- ```bash
270
- go install github.com/modelcontextprotocol/registry/cmd/mcp-publisher@latest
271
- ```
272
-
273
- If the Go module path has changed and the command fails, download the binary directly from the [mcp-publisher GitHub releases](https://github.com/modelcontextprotocol/registry/releases) page instead.
274
-
275
- On Windows, add Go's bin directory to your PATH if the command isn't recognized:
276
-
277
- ```powershell
278
- $env:PATH += ";$env:USERPROFILE\go\bin"
279
- ```
280
-
281
- Verify:
282
-
283
- ```bash
284
- mcp-publisher --help
285
- ```
286
-
287
- ##### 3. DNS Authentication (already done)
288
-
289
- The `onesource.io` domain has a DNS TXT record that proves ownership of the `io.onesource` namespace. This is already configured — you don't need to redo it.
290
-
291
- The record is on the root domain (`onesource.io`, not `_mcp-registry.onesource.io`):
292
-
293
- ```
294
- v=MCPv1; k=ed25519; p=7D3U5rufgNXb/lH2MthTRZdDzEGeE7/Jvg8YkiArQc8=
295
- ```
296
-
297
- You can verify it resolves:
298
-
299
- ```bash
300
- nslookup -type=TXT onesource.io 8.8.8.8
301
- ```
302
-
303
- ##### 4. Get the Private Key
304
-
305
- Authentication requires the ed25519 private key in **hex format** that corresponds to the public key in the DNS record. Ask the team lead for this key — it's stored in the team's password manager / vault.
306
-
307
- If you need to regenerate the keypair (this invalidates the current DNS record and requires updating it):
308
-
309
- 1. Generate a new ed25519 keypair (e.g., `openssl genpkey -algorithm Ed25519 -out key.pem`)
310
- 2. Extract the raw 32-byte private key seed and convert to hex:
311
- ```bash
312
- openssl pkey -in key.pem -outform DER | tail -c 32 | xxd -p -c 32
313
- ```
314
- 3. Extract the public key in base64 for the DNS TXT record:
315
- ```bash
316
- openssl pkey -in key.pem -pubout -outform DER | tail -c 32 | base64
317
- ```
318
- 4. Update the DNS TXT record on `onesource.io` with the new public key:
319
- ```
320
- v=MCPv1; k=ed25519; p=<base64-public-key>
321
- ```
322
- 5. Wait for DNS propagation before attempting to log in.
323
-
324
- #### Publishing a New Version
325
-
326
- Every time you release a new npm version, update the MCP Registry:
327
-
328
- 1. **Publish to npm** (the registry validates the package exists, so this must happen first):
329
- ```bash
330
- npm run build
331
- npm publish --access public
332
- ```
333
-
334
- 2. **Update `server.json`** — set both `version` fields to match the new npm version:
335
- ```json
336
- {
337
- "version": "x.y.z",
338
- ...
339
- "packages": [{ "version": "x.y.z", ... }]
340
- }
341
- ```
342
- The `mcpName` field in `package.json` must be `"io.onesource/mcp"` and must match the `name` field in `server.json`. This is already set — don't remove it.
343
-
344
- 3. **Authenticate** (tokens expire, so do this each time):
345
- ```bash
346
- mcp-publisher login dns --domain onesource.io --private-key <ed25519-hex-private-key>
347
- ```
348
-
349
- 4. **Publish to the registry:**
350
- ```bash
351
- mcp-publisher publish
352
- ```
353
-
354
- 5. **Verify:**
355
- ```bash
356
- curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=onesource"
357
- ```
358
-
359
- ### Glama
360
-
361
- Glama auto-syncs from the GitHub repo daily. No manual steps needed after a release — just make sure changes are pushed to `main`. The `glama.json` file in the repo root controls ownership. Manual re-sync is available from the [Glama admin panel](https://glama.ai/mcp/servers) after claiming the server.
362
-
363
- ## License
364
-
365
- Apache 2.0 — see [LICENSE](LICENSE) for details.
1
+ # MCP Registry
2
+
3
+ The MCP registry provides MCP clients with a list of MCP servers, like an app store for MCP servers.
4
+
5
+ [**📤 Publish my MCP server**](docs/modelcontextprotocol-io/quickstart.mdx) | [**⚡️ Live API docs**](https://registry.modelcontextprotocol.io/docs) | [**👀 Ecosystem vision**](docs/design/ecosystem-vision.md) | 📖 **[Full documentation](./docs)**
6
+
7
+ ## Development Status
8
+
9
+ **2025-10-24 update**: The Registry API has entered an **API freeze (v0.1)** 🎉. For the next month or more, the API will remain stable with no breaking changes, allowing integrators to confidently implement support. This freeze applies to v0.1 while development continues on v0. We'll use this period to validate the API in real-world integrations and gather feedback to shape v1 for general availability. Thank you to everyone for your contributions and patience—your involvement has been key to getting us here!
10
+
11
+ **2025-09-08 update**: The registry has launched in preview 🎉 ([announcement blog post](https://blog.modelcontextprotocol.io/posts/2025-09-08-mcp-registry-preview/)). While the system is now more stable, this is still a preview release and breaking changes or data resets may occur. A general availability (GA) release will follow later. We'd love your feedback in [GitHub discussions](https://github.com/modelcontextprotocol/registry/discussions/new?category=ideas) or in the [#registry-dev Discord](https://discord.com/channels/1358869848138059966/1369487942862504016) ([joining details here](https://modelcontextprotocol.io/community/communication)).
12
+
13
+ Current key maintainers:
14
+ - **Adam Jones** (Anthropic) [@domdomegg](https://github.com/domdomegg)
15
+ - **Tadas Antanavicius** (PulseMCP) [@tadasant](https://github.com/tadasant)
16
+ - **Toby Padilla** (GitHub) [@toby](https://github.com/toby)
17
+ - **Radoslav (Rado) Dimitrov** (Stacklok) [@rdimitrov](https://github.com/rdimitrov)
18
+
19
+ ## Contributing
20
+
21
+ We use multiple channels for collaboration - see [modelcontextprotocol.io/community/communication](https://modelcontextprotocol.io/community/communication).
22
+
23
+ Often (but not always) ideas flow through this pipeline:
24
+
25
+ - **[Discord](https://modelcontextprotocol.io/community/communication)** - Real-time community discussions
26
+ - **[Discussions](https://github.com/modelcontextprotocol/registry/discussions)** - Propose and discuss product/technical requirements
27
+ - **[Issues](https://github.com/modelcontextprotocol/registry/issues)** - Track well-scoped technical work
28
+ - **[Pull Requests](https://github.com/modelcontextprotocol/registry/pulls)** - Contribute work towards issues
29
+
30
+ ### Quick start:
31
+
32
+ #### Pre-requisites
33
+
34
+ - **Docker**
35
+ - **Go 1.24.x**
36
+ - **ko** - Container image builder for Go ([installation instructions](https://ko.build/install/))
37
+ - **golangci-lint v2.4.0**
38
+
39
+ #### Running the server
40
+
41
+ ```bash
42
+ # Start full development environment
43
+ make dev-compose
44
+ ```
45
+
46
+ This starts the registry at [`localhost:8080`](http://localhost:8080) with PostgreSQL. The database uses ephemeral storage and is reset each time you restart the containers, ensuring a clean state for development and testing.
47
+
48
+ **Note:** The registry uses [ko](https://ko.build) to build container images. The `make dev-compose` command automatically builds the registry image with ko and loads it into your local Docker daemon before starting the services.
49
+
50
+ By default, the registry seeds from the production API with a filtered subset of servers (to keep startup fast). This ensures your local environment mirrors production behavior and all seed data passes validation. For offline development you can seed from a file without validation with `MCP_REGISTRY_SEED_FROM=data/seed.json MCP_REGISTRY_ENABLE_REGISTRY_VALIDATION=false make dev-compose`.
51
+
52
+ The setup can be configured with environment variables in [docker-compose.yml](./docker-compose.yml) - see [.env.example](./.env.example) for a reference.
53
+
54
+ <details>
55
+ <summary>Alternative: Running a pre-built Docker image</summary>
56
+
57
+ Pre-built Docker images are automatically published to GitHub Container Registry:
58
+
59
+ ```bash
60
+ # Run latest stable release
61
+ docker run -p 8080:8080 ghcr.io/modelcontextprotocol/registry:latest
62
+
63
+ # Run latest from main branch (continuous deployment)
64
+ docker run -p 8080:8080 ghcr.io/modelcontextprotocol/registry:main
65
+
66
+ # Run specific release version
67
+ docker run -p 8080:8080 ghcr.io/modelcontextprotocol/registry:v1.0.0
68
+
69
+ # Run development build from main branch
70
+ docker run -p 8080:8080 ghcr.io/modelcontextprotocol/registry:main-20250906-abc123d
71
+ ```
72
+
73
+ **Available tags:**
74
+ - **Releases**: `latest`, `v1.0.0`, `v1.1.0`, etc.
75
+ - **Continuous**: `main` (latest main branch build)
76
+ - **Development**: `main-<date>-<sha>` (specific commit builds)
77
+
78
+ </details>
79
+
80
+ #### Publishing a server
81
+
82
+ To publish a server, we've built a simple CLI. You can use it with:
83
+
84
+ ```bash
85
+ # Build the latest CLI
86
+ make publisher
87
+
88
+ # Use it!
89
+ ./bin/mcp-publisher --help
90
+ ```
91
+
92
+ See [the publisher guide](./docs/modelcontextprotocol-io/quickstart.mdx) for more details.
93
+
94
+ #### Other commands
95
+
96
+ ```bash
97
+ # Run lint, unit tests and integration tests
98
+ make check
99
+ ```
100
+
101
+ There are also a few more helpful commands for development. Run `make help` to learn more, or look in [Makefile](./Makefile).
102
+
103
+ <!--
104
+ For Claude and other AI tools: Always prefer make targets over custom commands where possible.
105
+ -->
106
+
107
+ ## Architecture
108
+
109
+ ### Project Structure
110
+
111
+ ```
112
+ ├── cmd/ # Application entry points
113
+ │ └── publisher/ # Server publishing tool
114
+ ├── data/ # Seed data
115
+ ├── deploy/ # Deployment configuration (Pulumi)
116
+ ├── docs/ # Documentation
117
+ ├── internal/ # Private application code
118
+ │ ├── api/ # HTTP handlers and routing
119
+ │ ├── auth/ # Authentication (GitHub OAuth, JWT, namespace blocking)
120
+ │ ├── config/ # Configuration management
121
+ │ ├── database/ # Data persistence (PostgreSQL)
122
+ │ ├── service/ # Business logic
123
+ │ ├── telemetry/ # Metrics and monitoring
124
+ │ └── validators/ # Input validation
125
+ ├── pkg/ # Public packages
126
+ │ ├── api/ # API types and structures
127
+ │ │ └── v0/ # Version 0 API types
128
+ │ └── model/ # Data models for server.json
129
+ ├── scripts/ # Development and testing scripts
130
+ ├── tests/ # Integration tests
131
+ └── tools/ # CLI tools and utilities
132
+ └── validate-*.sh # Schema validation tools
133
+ ```
134
+
135
+ ### Authentication
136
+
137
+ Publishing supports multiple authentication methods:
138
+ - **GitHub OAuth** - For publishing by logging into GitHub
139
+ - **GitHub OIDC** - For publishing from GitHub Actions
140
+ - **DNS verification** - For proving ownership of a domain and its subdomains
141
+ - **HTTP verification** - For proving ownership of a domain
142
+
143
+ The registry validates namespace ownership when publishing. E.g. to publish...:
144
+ - `io.github.domdomegg/my-cool-mcp` you must login to GitHub as `domdomegg`, or be in a GitHub Action on domdomegg's repos
145
+ - `me.adamjones/my-cool-mcp` you must prove ownership of `adamjones.me` via DNS or HTTP challenge
146
+
147
+ ## Community Projects
148
+
149
+ Check out [community projects](docs/community-projects.md) to explore notable registry-related work created by the community.
150
+
151
+ ## More documentation
152
+
153
+ See the [documentation](./docs) for more details if your question has not been answered here!
package/dist/cli.js CHANGED
@@ -31,7 +31,7 @@ function buildInstructions(currentVersion, latestVersion, authMethod) {
31
31
  ? 'Blockchain API tools require x402 payment (USDC on Base). If a tool returns a 402 error, the user needs to configure X402_PRIVATE_KEY. Call 1s_setup_check for diagnostics and setup instructions.'
32
32
  : 'Blockchain API tools require authentication. Set ONESOURCE_API_KEY (API key) or X402_PRIVATE_KEY (x402 micropayments) to access them. Call 1s_setup_check for setup instructions.';
33
33
  const baseline = [
34
- 'OneSource MCP — 27 tools for blockchain data.',
34
+ 'OneSource MCP — 28 tools for blockchain data.',
35
35
  '',
36
36
  authLine,
37
37
  '',
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Unified MCP Server Factory
3
3
  *
4
- * Creates a single McpServer named 'onesource' with all 27 tools
5
- * (25 API + 1 setup check + 1 bug report) by delegating to the register modules.
4
+ * Creates a single McpServer named 'onesource' with all 28 tools
5
+ * (26 API incl. payment-mode + 1 setup check + 1 bug report) by delegating to the register modules.
6
6
  */
7
7
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
8
  import type { OneSourceClient } from '@one-source/api-mcp/client';
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Unified MCP Server Factory
3
3
  *
4
- * Creates a single McpServer named 'onesource' with all 27 tools
5
- * (25 API + 1 setup check + 1 bug report) by delegating to the register modules.
4
+ * Creates a single McpServer named 'onesource' with all 28 tools
5
+ * (26 API incl. payment-mode + 1 setup check + 1 bug report) by delegating to the register modules.
6
6
  */
7
7
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
8
  import { registerApiTools } from './register-api-tools.js';
@@ -1 +1 @@
1
- {"version":3,"file":"register-bug-report-tool.d.ts","sourceRoot":"","sources":["../src/register-bug-report-tool.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,gBAAgB,CAAC;AAoB/D,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,4BAA4B,GAAG,MAAM,CA2GhF"}
1
+ {"version":3,"file":"register-bug-report-tool.d.ts","sourceRoot":"","sources":["../src/register-bug-report-tool.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,gBAAgB,CAAC;AAoB/D,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,4BAA4B,GAAG,MAAM,CA2HhF"}
@@ -49,16 +49,31 @@ export function registerBugReportTool(opts) {
49
49
  source: 'unified',
50
50
  };
51
51
  try {
52
- // Validate: description is required and non-empty
53
- if (!input.description?.trim()) {
52
+ const descriptionTrimmed = input.description?.trim() ?? '';
53
+ const toolNameTrimmed = input.tool_name?.trim();
54
+ const networkTrimmed = input.network?.trim();
55
+ if (descriptionTrimmed.length < 10) {
54
56
  return {
55
- content: [{ type: 'text', text: 'Bug report requires a description. Please describe what went wrong.' }],
57
+ isError: true,
58
+ content: [{ type: 'text', text: 'Bug report requires a description of at least 10 characters.' }],
59
+ };
60
+ }
61
+ if (toolNameTrimmed && !/^1s_[a-z][a-z0-9_]*[a-z0-9]$/.test(toolNameTrimmed)) {
62
+ return {
63
+ isError: true,
64
+ content: [{ type: 'text', text: 'Invalid tool_name. Must be a valid OneSource tool name (e.g. 1s_network_info, 1s_erc20_balance_live).' }],
65
+ };
66
+ }
67
+ if (networkTrimmed !== undefined && (networkTrimmed.length === 0 || networkTrimmed.length > 100)) {
68
+ return {
69
+ isError: true,
70
+ content: [{ type: 'text', text: 'Network field is too long. Use a blockchain network name like ethereum, sepolia, or avax.' }],
56
71
  };
57
72
  }
58
73
  // Build the payload — structured JSON, backend handles formatting
59
74
  const payload = {
60
- description: input.description.slice(0, 3000),
61
- tool_name: input.tool_name,
75
+ description: descriptionTrimmed.slice(0, 3000),
76
+ tool_name: toolNameTrimmed?.slice(0, 100),
62
77
  error_message: input.error_message?.slice(0, 1000),
63
78
  severity: input.severity ?? 'medium',
64
79
  network: input.network,
@@ -1 +1 @@
1
- {"version":3,"file":"register-bug-report-tool.js","sourceRoot":"","sources":["../src/register-bug-report-tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"register-bug-report-tool.js","sourceRoot":"","sources":["../src/register-bug-report-tool.ts"],"names":[],"mappings":"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"}