@stellar-agent-services/dev-mcp 0.0.0-stage → 0.1.1
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 +21 -0
- package/README.md +50 -2
- package/dist/docs.d.ts +35 -0
- package/dist/docs.d.ts.map +1 -0
- package/dist/docs.js +92 -0
- package/dist/docs.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +14 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +125 -0
- package/dist/server.js.map +1 -0
- package/package.json +40 -4
- package/repository/AGENTS.md +162 -0
- package/repository/CONTRIBUTING.md +95 -0
- package/repository/IMPLEMENTATION_PLAN.md +560 -0
- package/repository/README.md +80 -0
- package/repository/SECURITY.md +22 -0
- package/repository/apps/wallet/README.md +78 -0
- package/repository/docs/client-integration/README-AI.md +495 -0
- package/repository/docs/client-integration/README.md +138 -0
- package/repository/docs/dx-improvements.md +670 -0
- package/repository/docs/erc-compatibility.md +163 -0
- package/repository/docs/job-recovery.md +201 -0
- package/repository/docs/payment-client.md +290 -0
- package/repository/docs/provider-setup-guide.md +348 -0
- package/repository/docs/provider-standard.md +728 -0
- package/repository/docs/recovery/README-AI.md +288 -0
- package/repository/docs/recovery/README.md +119 -0
- package/repository/docs/sow-closeout.md +67 -0
- package/repository/docs/standard/README-AI.md +614 -0
- package/repository/docs/standard/README.md +108 -0
- package/repository/docs/verification.md +504 -0
- package/repository/examples/paid-service/README.md +33 -0
- package/repository/examples/python-upstream/README.md +44 -0
- package/repository/llms.txt +65 -0
- package/repository/packages/create-stellar-service/README.md +143 -0
- package/repository/packages/dev-mcp/README.md +51 -0
- package/repository/packages/payment-client/README.md +98 -0
- package/repository/packages/protocol/README.md +15 -0
- package/repository/packages/protocol/schemas/manifest.schema.json +272 -0
- package/repository/packages/protocol/test-vectors/README.md +45 -0
- package/repository/packages/provider-kit/README.md +509 -0
- package/repository/packages/provider-kit/schemas/gateway-config.schema.json +140 -0
- package/repository/packages/verifier/README.md +131 -0
- package/repository/plugins/stellar-agent-services/README.md +31 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://algorialabs.github.io/stellar-agent-services/schemas/provider-kit/gateway-config.schema.json",
|
|
4
|
+
"title": "Provider Kit gateway config",
|
|
5
|
+
"description": "Puts an existing HTTP API, in any language, behind Provider Standard v1: manifest, x402 payment, job recovery and capacity. Run it with `provider-kit serve --config <file>`. Values written \"env:NAME\" are read from the environment variable NAME, in the fields that say so. The gateway holds no Stellar secret key.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["baseUrl", "network", "payTo", "facilitator", "provider", "services"],
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"$schema": { "type": "string" },
|
|
11
|
+
"baseUrl": {
|
|
12
|
+
"description": "The public HTTPS URL job paths are under, such as https://api.example.com/agent. http://localhost only with dev. May be \"env:NAME\".",
|
|
13
|
+
"type": "string"
|
|
14
|
+
},
|
|
15
|
+
"network": { "enum": ["stellar:testnet", "stellar:pubnet"] },
|
|
16
|
+
"payTo": {
|
|
17
|
+
"description": "The G... or C... address that receives payments: public, never a secret key. Use the agent wallet of your 8004 registration [I3]. May be \"env:NAME\".",
|
|
18
|
+
"type": "string"
|
|
19
|
+
},
|
|
20
|
+
"facilitator": {
|
|
21
|
+
"description": "The x402 facilitator URL, such as https://x402.org/facilitator on testnet. May be \"env:NAME\".",
|
|
22
|
+
"type": "string"
|
|
23
|
+
},
|
|
24
|
+
"facilitatorHeaders": {
|
|
25
|
+
"description": "Headers sent to the facilitator, for one that wants an API key. Values may be \"env:NAME\".",
|
|
26
|
+
"type": "object",
|
|
27
|
+
"additionalProperties": { "type": "string" }
|
|
28
|
+
},
|
|
29
|
+
"provider": {
|
|
30
|
+
"description": "Who you are, as the manifest shows it (§2.3).",
|
|
31
|
+
"type": "object",
|
|
32
|
+
"required": ["name"],
|
|
33
|
+
"additionalProperties": false,
|
|
34
|
+
"properties": {
|
|
35
|
+
"name": { "type": "string", "minLength": 1, "maxLength": 120 },
|
|
36
|
+
"description": { "type": "string", "maxLength": 500 },
|
|
37
|
+
"homepage": { "type": "string" },
|
|
38
|
+
"agentId": { "description": "Your Stellar 8004 agent id, after `provider-kit launch` or `register`. May be \"env:NAME\": an unset or empty variable leaves it out, as before registering.", "type": ["integer", "string"] },
|
|
39
|
+
"termsUrl": { "type": "string" },
|
|
40
|
+
"dataUse": {
|
|
41
|
+
"type": "object",
|
|
42
|
+
"additionalProperties": false,
|
|
43
|
+
"properties": { "storesInputs": { "type": "boolean" }, "trainsOnInputs": { "type": "boolean" } }
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"rpcUrl": {
|
|
48
|
+
"description": "The Soroban RPC the gateway reads the chain with, to decide payment_uncertain jobs and time on-success jobs by ledger. Default: the public RPC on testnet; pubnet has none, so set yours. May be \"env:NAME\".",
|
|
49
|
+
"type": "string"
|
|
50
|
+
},
|
|
51
|
+
"store": {
|
|
52
|
+
"description": "Where jobs are kept: a SQLite file path, relative to this config file (default ./jobs.sqlite), or \"memory\" for tests only. May be \"env:NAME\".",
|
|
53
|
+
"type": "string"
|
|
54
|
+
},
|
|
55
|
+
"listen": {
|
|
56
|
+
"description": "Where `serve` listens. Default port 8787 on 0.0.0.0. The PORT environment variable overrides the port.",
|
|
57
|
+
"type": "object",
|
|
58
|
+
"additionalProperties": false,
|
|
59
|
+
"properties": { "host": { "type": "string" }, "port": { "type": "integer", "minimum": 0, "maximum": 65535 } }
|
|
60
|
+
},
|
|
61
|
+
"maxTimeoutSeconds": { "description": "How long a signed payment is valid. Default 60.", "type": "integer", "minimum": 30, "maximum": 300 },
|
|
62
|
+
"settleTimeoutSeconds": { "description": "How long a settlement may take before the job is payment_uncertain. Default maxTimeoutSeconds + 30.", "type": "integer", "minimum": 1 },
|
|
63
|
+
"retentionSeconds": { "description": "How long finished jobs stay retrievable. Default 86400.", "type": "integer", "minimum": 3600 },
|
|
64
|
+
"manifestPath": { "description": "Default /.well-known/stellar-agent-services.json.", "type": "string", "pattern": "^/" },
|
|
65
|
+
"holdSeconds": { "description": "How long create-job waits before answering 202. Default 30.", "type": "integer", "minimum": 0, "maximum": 30 },
|
|
66
|
+
"runQueuedJobs": { "description": "Whether this process runs queued upfront jobs. Default true.", "type": "boolean" },
|
|
67
|
+
"leaseSeconds": { "type": "integer", "minimum": 3 },
|
|
68
|
+
"rateLimit": {
|
|
69
|
+
"description": "Per-caller limit on create-job (429). keyHeader names the header a trusted proxy sets to the caller's address.",
|
|
70
|
+
"type": "object",
|
|
71
|
+
"required": ["requests", "windowSeconds", "keyHeader"],
|
|
72
|
+
"additionalProperties": false,
|
|
73
|
+
"properties": {
|
|
74
|
+
"requests": { "type": "integer", "minimum": 1 },
|
|
75
|
+
"windowSeconds": { "type": "integer", "minimum": 1 },
|
|
76
|
+
"keyHeader": { "type": "string", "minLength": 1 }
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
"dev": { "description": "Allows http://localhost for baseUrl and the facilitator. Never in production.", "type": "boolean" },
|
|
80
|
+
"services": {
|
|
81
|
+
"type": "array",
|
|
82
|
+
"minItems": 1,
|
|
83
|
+
"maxItems": 25,
|
|
84
|
+
"items": { "$ref": "#/$defs/service" }
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"$defs": {
|
|
88
|
+
"service": {
|
|
89
|
+
"type": "object",
|
|
90
|
+
"required": ["name", "description", "price", "inputSchema", "outputSchema", "upstream"],
|
|
91
|
+
"additionalProperties": false,
|
|
92
|
+
"properties": {
|
|
93
|
+
"name": { "type": "string", "pattern": "^[a-z0-9][a-z0-9_-]{0,63}$" },
|
|
94
|
+
"title": { "type": "string" },
|
|
95
|
+
"description": { "description": "What it does, when to use it, and its limits (§3.4).", "type": "string", "minLength": 1, "maxLength": 1000 },
|
|
96
|
+
"price": { "description": "USDC, as a decimal string such as \"0.05\".", "type": "string", "pattern": "^\\d+(\\.\\d{1,7})?$" },
|
|
97
|
+
"charge": { "enum": ["on-success", "upfront"] },
|
|
98
|
+
"expectedDurationSeconds": { "type": "integer", "minimum": 1 },
|
|
99
|
+
"timeoutSeconds": { "description": "Longest the upstream call may take. Default: twice expectedDurationSeconds, or 600.", "type": "integer", "minimum": 1 },
|
|
100
|
+
"inputSchema": { "description": "A JSON Schema object, or the path of a JSON file holding one, relative to this config file.", "type": ["object", "string"] },
|
|
101
|
+
"outputSchema": { "description": "A JSON Schema object, or the path of a JSON file holding one.", "type": ["object", "string"] },
|
|
102
|
+
"examples": {
|
|
103
|
+
"type": "array",
|
|
104
|
+
"maxItems": 5,
|
|
105
|
+
"items": {
|
|
106
|
+
"type": "object",
|
|
107
|
+
"required": ["input", "output"],
|
|
108
|
+
"additionalProperties": false,
|
|
109
|
+
"properties": { "input": { "type": "object" }, "output": { "type": "object" } }
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"tags": { "type": "array", "maxItems": 10, "items": { "type": "string", "pattern": "^[a-z0-9-]{1,32}$" } },
|
|
113
|
+
"maxInputBytes": { "type": "integer", "minimum": 1, "maximum": 10485760 },
|
|
114
|
+
"capacity": {
|
|
115
|
+
"description": "What the upstream can take: calls at once, and how long a new job may wait (§5.8).",
|
|
116
|
+
"type": "object",
|
|
117
|
+
"additionalProperties": false,
|
|
118
|
+
"properties": {
|
|
119
|
+
"concurrency": { "type": "integer", "minimum": 1 },
|
|
120
|
+
"maxQueued": { "type": "integer", "minimum": 0 },
|
|
121
|
+
"maxQueueWaitSeconds": { "type": "integer", "minimum": 0 }
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
"upstream": {
|
|
125
|
+
"type": "object",
|
|
126
|
+
"required": ["url"],
|
|
127
|
+
"additionalProperties": false,
|
|
128
|
+
"properties": {
|
|
129
|
+
"url": { "description": "Where the input is POSTed as JSON. May be \"env:NAME\".", "type": "string" },
|
|
130
|
+
"headers": {
|
|
131
|
+
"description": "Sent with every call, such as the upstream's own API key. Values may be \"env:NAME\".",
|
|
132
|
+
"type": "object",
|
|
133
|
+
"additionalProperties": { "type": "string" }
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# @stellar-agent-services/verifier
|
|
2
|
+
|
|
3
|
+
Checks a provider against [Provider Standard v1](../../docs/provider-standard.md) and turns the result into evidence
|
|
4
|
+
anyone can check:
|
|
5
|
+
|
|
6
|
+
1. **Checks C1–C7:** manifest, identity, payment challenge, paid call, recovery, hygiene and load. Each finding
|
|
7
|
+
cites a rule of the standard.
|
|
8
|
+
2. **Verification receipt:** RFC 8785 canonical JSON, stored under its own SHA-256.
|
|
9
|
+
3. **Badges:** SVGs drawn only from a receipt.
|
|
10
|
+
4. **Validation Registry:** `validation_response` anchors the receipt's hash in the Stellar 8004 Validation
|
|
11
|
+
Registry.
|
|
12
|
+
5. **Self-serve:** `verifier watch` does all of it by itself for every validation request that names the verifier.
|
|
13
|
+
|
|
14
|
+
The full description, with every check and rule, is [docs/verification.md](../../docs/verification.md).
|
|
15
|
+
|
|
16
|
+
## Use
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install -g @stellar-agent-services/verifier # or run each command as npx @stellar-agent-services/verifier
|
|
20
|
+
|
|
21
|
+
# A provider testing itself, with no payment and no key:
|
|
22
|
+
verifier check http://localhost:8787/.well-known/stellar-agent-services.json --dev
|
|
23
|
+
|
|
24
|
+
# A verifier, answering every validation request that names it, until stopped:
|
|
25
|
+
VERIFIER_PAYER_SECRET=S... verifier watch --source verifier --public-url https://verifier.example.com \
|
|
26
|
+
--data /var/lib/verifier
|
|
27
|
+
|
|
28
|
+
# The same for one request, by hand: every check, paid by a dedicated testnet account, and a receipt.
|
|
29
|
+
VERIFIER_PAYER_SECRET=S... verifier verify https://api.example.com/.well-known/stellar-agent-services.json \
|
|
30
|
+
--pay --validator G... --out evidence/receipts
|
|
31
|
+
verifier publish evidence/receipts/<sha256>.json --request-hash <hex> --response-uri <https url> --source verifier
|
|
32
|
+
verifier badge evidence/receipts/<sha256>.json --request-hash <hex>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
Provider Standard v1 check: http://localhost:8787/.well-known/stellar-agent-services.json
|
|
37
|
+
✓ C1 Manifest
|
|
38
|
+
- C2 Identity: skipped, development mode: a loopback provider can't be registered
|
|
39
|
+
✓ C3 Challenge
|
|
40
|
+
- C4 Paid call: skipped, no test payer: run verifier verify --pay
|
|
41
|
+
- C5 Recovery: skipped, no test payer: run verifier verify --pay
|
|
42
|
+
✓ C6 Hygiene
|
|
43
|
+
✓ C7 Load
|
|
44
|
+
|
|
45
|
+
Level 1 (Described): score 33 of 100.
|
|
46
|
+
Load (C7) passed: Load-safe.
|
|
47
|
+
Every check that ran passed.
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Exit codes: `0` every check that ran passed, `1` a check or the command failed, `2` a usage error. `--json` prints
|
|
51
|
+
the report, or the receipt, on standard output. `watch` runs until SIGINT or SIGTERM, then exits `0`.
|
|
52
|
+
|
|
53
|
+
The paid checks poll an uncertain job within their existing follow deadline, allowing the provider to reconcile
|
|
54
|
+
it from the chain [J13]. They read the original job and never sign or send another payment while waiting [J11].
|
|
55
|
+
Unresolved uncertainty is skipped and earns no paid check.
|
|
56
|
+
|
|
57
|
+
As a library:
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
import { issueReceipt, localKeyPayer, verifyProvider, writeReceipt } from "@stellar-agent-services/verifier";
|
|
61
|
+
|
|
62
|
+
const report = await verifyProvider({ manifestUrl, payer: localKeyPayer(process.env.VERIFIER_PAYER_SECRET!) });
|
|
63
|
+
const receipt = issueReceipt(report, { validator: "G..." });
|
|
64
|
+
const { path, sha256 } = await writeReceipt(receipt, "evidence/receipts");
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
`openWatcher()` is the engine of `verifier watch`: `tick()` runs one round, and `handle(request)` is its HTTP side,
|
|
68
|
+
for any Fetch-API server.
|
|
69
|
+
|
|
70
|
+
## Watch
|
|
71
|
+
|
|
72
|
+
`verifier watch` answers validation requests with no hand-off. Every `--interval` (default 60 s) it reads the
|
|
73
|
+
Validation Registry for new requests that name the `--source` key's address. For each one, it finds the manifest
|
|
74
|
+
(the request document, which the agent's registration must agree with [I1], else the registration), runs every check
|
|
75
|
+
with the test payer, serves the receipt at `<public-url>/receipts/<sha256>.json` with its badges, and publishes
|
|
76
|
+
`validation_response` as `verifier publish` does. A provider that is not reachable yet is checked again with backoff
|
|
77
|
+
for `--retry-for` hours (default 24), then answered with its failing result. The state is `<data>/state.json`, so a
|
|
78
|
+
restart picks up where it stopped, and a request is never answered twice.
|
|
79
|
+
|
|
80
|
+
| Path | What it serves |
|
|
81
|
+
| --- | --- |
|
|
82
|
+
| `/receipts/<sha256>.json` | The receipt, exactly as written: the `response_uri` on chain |
|
|
83
|
+
| `/receipts/<sha256>.<badge>.svg` | Its badges |
|
|
84
|
+
| `/requests/<request hash>.json` | Where a request stands, for its owner: `waiting`, `publishing`, `answered` or `refused`, and why |
|
|
85
|
+
| `/healthz` | `ok`, or `degraded` with the verifier's own problems, such as a test payer to fund |
|
|
86
|
+
|
|
87
|
+
**Deploying it.** A small server or VM is enough: Node.js 22.13 or later, the Stellar CLI holding the validator key
|
|
88
|
+
(`stellar keys generate verifier --network testnet --fund`), and a persistent volume for `--data`. Put HTTPS in
|
|
89
|
+
front of `--port` (default `$PORT`, or 8080) at `--public-url`, with a reverse proxy such as Caddy or the platform's
|
|
90
|
+
TLS. Back the volume up and keep the URL stable: the chain links to the receipts in it. Keep at least `--max-spend`
|
|
91
|
+
(1.00 USDC) in the test payer. Run one watcher per validator key, where it can reach only the public internet: it
|
|
92
|
+
fetches URLs that agent owners chose. See
|
|
93
|
+
[docs/verification.md](../../docs/verification.md#self-serve-verification-verifier-watch).
|
|
94
|
+
|
|
95
|
+
## Keys
|
|
96
|
+
|
|
97
|
+
| Key | Used for | Where it lives |
|
|
98
|
+
| --- | --- | --- |
|
|
99
|
+
| Test payer | C4, C5 and C7's paid part | `VERIFIER_PAYER_SECRET`: a dedicated testnet account holding a little USDC |
|
|
100
|
+
| Validator | `validation_response` | The Stellar CLI keychain. `verifier publish --source <key>` and `verifier watch --source <key>` sign through it; the verifier never sees it. |
|
|
101
|
+
|
|
102
|
+
The test payer pays only a provider whose manifest passed C1 and whose challenge matches it, at most 0.10 USDC for
|
|
103
|
+
a job and 1.00 USDC in a run unless told otherwise, and never on pubnet without `--allow-pubnet`. The validator and
|
|
104
|
+
the test payer are always different accounts.
|
|
105
|
+
|
|
106
|
+
## Layout
|
|
107
|
+
|
|
108
|
+
| Path | What it does |
|
|
109
|
+
| --- | --- |
|
|
110
|
+
| `src/verify.ts` | `verifyProvider()`: runs the checks, in order, and returns the report |
|
|
111
|
+
| `src/checks/` | One module per check, C1–C7 |
|
|
112
|
+
| `src/jobs.ts` | The job endpoints, called as a careful client calls them, and the job view checks (§5.5–§5.7) |
|
|
113
|
+
| `src/http.ts` | The HTTP client for an untrusted provider: no redirects, deadlines, size limits, one origin |
|
|
114
|
+
| `src/payments.ts` | The test payer and its limits |
|
|
115
|
+
| `src/chain.ts` | Soroban RPC reads: the trustline, the test payer's balance, and the proofs that a payment did or did not settle |
|
|
116
|
+
| `src/registry.ts` | Stellar 8004 reads: identity and validation records, and the requests that name a validator |
|
|
117
|
+
| `src/receipt.ts`, `src/badges.ts`, `src/publish.ts` | Receipts, badges, and the Validation Registry response |
|
|
118
|
+
| `src/requests.ts` | What a validation request asks to check: its document from the `validation_request` event, or the agent's registration [I1] |
|
|
119
|
+
| `src/watch.ts` | `openWatcher()`: the engine of `verifier watch`, its retries and its HTTP side |
|
|
120
|
+
| `src/watch-state.ts` | The watcher's state file and the lock on its data directory |
|
|
121
|
+
| `src/cli/` | The `verifier` command; `cli/watch.ts` runs the watcher, `cli/serve.ts` serves it on Node's HTTP server |
|
|
122
|
+
|
|
123
|
+
## Tests
|
|
124
|
+
|
|
125
|
+
The tests run every check against the real Provider Kit in-process, with a facilitator that settles onto a fake
|
|
126
|
+
Soroban chain and a test payer that signs real payments offline. A conforming provider must pass every check; for
|
|
127
|
+
each rule, a provider made to break it must fail with that rule's id.
|
|
128
|
+
|
|
129
|
+
The watcher's tests (`test/watch.test.ts`, `test/support/watch.ts`) add a fake Validation Registry with its request
|
|
130
|
+
events, a fake Stellar CLI that records `validation_response`, a fetch that reaches the watcher's own HTTP side at its
|
|
131
|
+
public URL, and a clock that jumps ahead hours. They cover retries, refusals, restarts and never answering twice.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# stellar-agent-services plugin for Claude Code
|
|
2
|
+
|
|
3
|
+
Skills that teach a coding agent to build on [Provider Standard v1](../../docs/provider-standard.md): paid AI
|
|
4
|
+
services on Stellar, paid per job in USDC through x402.
|
|
5
|
+
|
|
6
|
+
```text
|
|
7
|
+
/plugin marketplace add AlgoriaLabs/stellar-agent-services
|
|
8
|
+
/plugin install stellar-agent-services@stellar-agent-services
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
| Skill | Use it to |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| [`build-paid-service`](skills/build-paid-service/SKILL.md) | Build a new paid service in TypeScript with the Provider Kit |
|
|
14
|
+
| [`wrap-existing-api`](skills/wrap-existing-api/SKILL.md) | Put an existing HTTP API, in any language, behind payments with the gateway and a JSON config |
|
|
15
|
+
| [`implement-standard`](skills/implement-standard/SKILL.md) | Implement the provider side natively in another language |
|
|
16
|
+
| [`build-payment-client`](skills/build-payment-client/SKILL.md) | Build an agent, wallet or app that pays providers, or a wallet adapter for the payment client |
|
|
17
|
+
| [`verify-provider`](skills/verify-provider/SKILL.md) | Check a provider (C1–C7), fix failing rules, register on 8004 and get verified |
|
|
18
|
+
|
|
19
|
+
The skills load when a task matches, and point to the references in this repository. They are plain Markdown, so
|
|
20
|
+
agents without plugin support can read them directly. They start on testnet, with test money. Mainnet (real USDC)
|
|
21
|
+
needs `--network mainnet` and a facilitator API key, and an agent never pays on mainnet unless the user asked.
|
|
22
|
+
|
|
23
|
+
The skills use the packages from npm. For spec lookups, manifest validation and provider checks, also add the
|
|
24
|
+
[MCP server](../../packages/dev-mcp):
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
claude mcp add stellar-agent-services -- npx -y @stellar-agent-services/dev-mcp
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
When you change a skill, keep it short. It routes to the reference documents and never restates the spec in
|
|
31
|
+
competing words. The spec wins.
|