@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/LICENSE +216 -190
- package/README.md +233 -227
- package/README.npm.md +233 -227
- package/README.repo.md +153 -365
- package/dist/cli.js +1 -1
- package/dist/create-server.d.ts +2 -2
- package/dist/create-server.js +2 -2
- package/dist/register-bug-report-tool.d.ts.map +1 -1
- package/dist/register-bug-report-tool.js +20 -5
- package/dist/register-bug-report-tool.js.map +1 -1
- package/package.json +60 -60
package/README.repo.md
CHANGED
|
@@ -1,365 +1,153 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
##
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
###
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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 —
|
|
34
|
+
'OneSource MCP — 28 tools for blockchain data.',
|
|
35
35
|
'',
|
|
36
36
|
authLine,
|
|
37
37
|
'',
|
package/dist/create-server.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Unified MCP Server Factory
|
|
3
3
|
*
|
|
4
|
-
* Creates a single McpServer named 'onesource' with all
|
|
5
|
-
* (
|
|
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';
|
package/dist/create-server.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Unified MCP Server Factory
|
|
3
3
|
*
|
|
4
|
-
* Creates a single McpServer named 'onesource' with all
|
|
5
|
-
* (
|
|
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,
|
|
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
|
-
|
|
53
|
-
|
|
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
|
-
|
|
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:
|
|
61
|
-
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":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,yDAAyD;AACzD,MAAM,sBAAsB,GAAG,0CAA0C,CAAC;AAE1E,SAAS,WAAW,CAAC,SAA6B;IAChD,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC3E,CAAC;AAmBD;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAkC;IACtE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,sBAAsB,CAAC;IAEjE,MAAM,CAAC,IAAI,CACT,eAAe,EACf,gKAAgK,EAChK,CAAC,CAAC,MAAM,CAAC;QACP,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oFAAoF,CAAC;QACtH,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qFAAqF,CAAC;QAChI,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iEAAiE,CAAC;QAChH,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wHAAwH,CAAC;QACrM,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gFAAgF,CAAC;QACzH,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;KAC9F,CAAC,CAAC,KAAK,EACR,KAAK,EAAE,KAAqB,EAAE,KAA6D,EAAE,EAAE;QAC7F,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAEpD,MAAM,IAAI,GAAwF;YAChG,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,eAAe;YACxB,IAAI,EAAE,eAAe;YACrB,QAAQ,EAAE,KAAK;YACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,YAAY,EAAE,SAAS;YACvB,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,MAAM;YACnB,WAAW,EAAE,UAAU,EAAE,IAAI;YAC7B,cAAc,EAAE,UAAU,EAAE,OAAO;YACnC,UAAU,EAAE,WAAW;YACvB,SAAS;YACT,MAAM,EAAE,SAAS;SAClB,CAAC;QAEF,IAAI,CAAC;YACH,
|
|
1
|
+
{"version":3,"file":"register-bug-report-tool.js","sourceRoot":"","sources":["../src/register-bug-report-tool.ts"],"names":[],"mappings":"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"}
|