@linkbunny/mcp 0.1.5 → 0.1.7
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 +38 -8
- package/dist/index.js +1255 -90
- package/dist/skill.md +44 -24
- package/npm-shrinkwrap.json +2 -2
- package/package.json +2 -2
package/dist/skill.md
CHANGED
|
@@ -15,10 +15,15 @@ publishing through the site's normal workflow, or rejects the request.
|
|
|
15
15
|
|
|
16
16
|
1. A LinkBunny account is required. The human may create an account or log in at
|
|
17
17
|
`https://getlinkbunny.com`; an agent may do so only with explicitly authorized browser control.
|
|
18
|
-
2.
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
2. A new account can try one exchange free: one site, one completed link placement and one received
|
|
19
|
+
backlink, no card. Each direction stops on its own: after the site's first placement is
|
|
20
|
+
successfully reported, it gets no new assignments to place, and after its first backlink is
|
|
21
|
+
reported, it is no longer picked as the target of new assignments. The other direction stays
|
|
22
|
+
open. Assignments already issued can still be reported within their normal window and settle,
|
|
23
|
+
so a free site can end up with more than one placement or backlink. The paid subscription removes that limit and covers up to 10 sites. The human
|
|
24
|
+
must authorize starting, changing, or cancelling billing; an authorized browser-capable agent may
|
|
25
|
+
operate the website UI for that approved action.
|
|
26
|
+
3. Create an API token in the account UI. The human must authorize
|
|
22
27
|
each creation, rotation, or revocation; an authorized browser-capable agent may perform it. Copy
|
|
23
28
|
the token once into an owner-approved secret store and keep it secret.
|
|
24
29
|
4. Use that token for the public API workflow below. The public API does not provide signup, login,
|
|
@@ -35,14 +40,15 @@ may carry out an authorized API or site action only within the approval given.
|
|
|
35
40
|
When the owner asks you to set up LinkBunny and has no account or API token yet:
|
|
36
41
|
|
|
37
42
|
1. Plan locally. Inspect the project and propose one HTTPS target URL and one HTTPS area of the
|
|
38
|
-
site where nofollow links can go, both on the same registrable domain. Tell the owner the
|
|
39
|
-
($20/month for up to 10 sites, no per-link
|
|
40
|
-
match, that some check-ins return no request,
|
|
41
|
-
no LinkBunny API call while there is no token.
|
|
43
|
+
site where nofollow links can go, both on the same registrable domain. Tell the owner the first
|
|
44
|
+
exchange is free for one site, the price after that ($20/month for up to 10 sites, no per-link
|
|
45
|
+
fees), that profiles are reviewed before they can match, that some check-ins return no request,
|
|
46
|
+
and which later steps need their approval. Make no LinkBunny API call while there is no token.
|
|
42
47
|
2. With the owner's OK, open `https://getlinkbunny.com/login?redirect=%2Faccount%3Fsetup%3Dagent`
|
|
43
48
|
in their browser, or print it when you cannot open a browser (for example in a cloud or remote
|
|
44
49
|
session). Opening the link is not browser control: do not read, click, fill, or otherwise
|
|
45
|
-
operate the page. The owner signs in
|
|
50
|
+
operate the page. The owner signs in and creates the API token there. Subscribing is optional
|
|
51
|
+
for the free exchange.
|
|
46
52
|
3. With the owner's OK, create a project file `.env.linkbunny` containing only an empty
|
|
47
53
|
`LINKBUNNY_API_TOKEN=` line and make sure Git ignores it, or use another secret store the owner
|
|
48
54
|
chooses. The owner pastes the token there. Never ask for the token in chat, and never print,
|
|
@@ -51,12 +57,12 @@ When the owner asks you to set up LinkBunny and has no account or API token yet:
|
|
|
51
57
|
token out of command arguments and output, for example:
|
|
52
58
|
`tr -d '\r' < .env.linkbunny | sed -nE 's/^(export )?LINKBUNNY_API_TOKEN="?([A-Za-z0-9._~-]+)"?$/header = "Authorization: Bearer \2"/p' | curl -sS -w '\nHTTP %{http_code}\n' --config - https://api.getlinkbunny.com/v1/me`.
|
|
53
59
|
If the LinkBunny MCP server is already configured with that token file, its `get_status` tool
|
|
54
|
-
makes the same read.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
says it is done again.
|
|
58
|
-
5.
|
|
59
|
-
|
|
60
|
+
makes the same read. A `200` response confirms setup. `subscriptionActive: false` with
|
|
61
|
+
`siteLimit: 1` means the account is on the free exchange; `subscriptionActive: true` means the
|
|
62
|
+
paid plan is active. `401` means the token is missing or wrong in the file. Do not poll; wait
|
|
63
|
+
until the owner says it is done again.
|
|
64
|
+
5. After a `200` status read, continue with "A — Create a profile". Ask the owner before
|
|
65
|
+
registering the site.
|
|
60
66
|
|
|
61
67
|
## Activation and approval gates
|
|
62
68
|
|
|
@@ -108,12 +114,22 @@ with a valid token even when the subscription has lapsed, and neither reserves,
|
|
|
108
114
|
anything. Call them when the owner asks about setup or status, or to recover a lost ID; do not poll.
|
|
109
115
|
Present an existing pending assignment for owner review rather than checking in again.
|
|
110
116
|
|
|
117
|
+
`GET /assignments/:assignmentID` returns one assignment issued to one of your sites, including a
|
|
118
|
+
rejected or expired one: `assignmentID`, source `profileID`, `sourceDomain`, `inventoryPrefix`,
|
|
119
|
+
`targetURL`, `requestedAnchor`, `status` (`pending`, `expired`, `rejected`, `reported`, or
|
|
120
|
+
`reported_late`), `rejectionReason`, `rejectedAt`, the unchanged original `expiresAt`,
|
|
121
|
+
`reportableUntil`, and `canReport`. `reportableUntil` is the last moment a report is accepted:
|
|
122
|
+
`expiresAt` for a rejected assignment, 30 days after `expiresAt` for a pending or expired one, and
|
|
123
|
+
`null` once reported. A pending assignment reads as `expired` from its `expiresAt`. Any assignment
|
|
124
|
+
not issued to your sites returns `404`. Like the other status reads, it needs no subscription,
|
|
125
|
+
changes nothing, and should not be polled; use it to confirm an assignment before asking to report.
|
|
126
|
+
|
|
111
127
|
### A — Create a profile
|
|
112
128
|
|
|
113
129
|
After specific authorization, `POST /profiles` with `targetURL`, `requestedAnchor`, one documented
|
|
114
130
|
`category`, and `inventoryPrefix`. Both URLs must be public HTTPS URLs without credentials or
|
|
115
|
-
fragments, on the same registrable domain.
|
|
116
|
-
successful Domain Rating lookup returns `201` with status `pending_review`. LinkBunny reviews each
|
|
131
|
+
fragments, on the same registrable domain. Without a subscription, an account can register one
|
|
132
|
+
site for its free exchange. A successful Domain Rating lookup returns `201` with status `pending_review`. LinkBunny reviews each
|
|
117
133
|
new profile once before it can match as a source or target. Tell the owner review is pending and
|
|
118
134
|
suggest asking the agent to check again after the advisory interval or once approval is confirmed.
|
|
119
135
|
Immediately record and retain the response's canonical `profileID` in the owner's approved private
|
|
@@ -144,11 +160,13 @@ only when no more specific category fits:
|
|
|
144
160
|
After specific authorization, `PATCH /profiles/:profileID` accepts the same fields. Changing the
|
|
145
161
|
target or inventory URL materially resets the profile to Domain Rating lookup and one-time review;
|
|
146
162
|
it cannot match during re-review. Anchor- or category-only edits preserve an existing approval.
|
|
163
|
+
Without a subscription, a URL change made within an hour of the site's creation or previous URL
|
|
164
|
+
change waits up to an hour for its Domain Rating lookup and stays `pending` until then.
|
|
147
165
|
|
|
148
166
|
### B — Check in
|
|
149
167
|
|
|
150
|
-
After specific authorization, `POST /profiles/:profileID/check-in`.
|
|
151
|
-
|
|
168
|
+
After specific authorization, `POST /profiles/:profileID/check-in`. Without a subscription, the
|
|
169
|
+
free exchange allows check-ins until the site's one placement is reported. The response contains the same existing pending assignment, one newly
|
|
152
170
|
reserved assignment, or `{ "assignment": null }`. A profile awaiting review instead returns
|
|
153
171
|
`{ "assignment": null, "status": "profile_pending_review", "message": "This site is awaiting marketplace review.", "retryAfterSeconds": 3600 }`;
|
|
154
172
|
the one-hour interval is advisory, and every check-in still requires specific owner authorization.
|
|
@@ -240,11 +258,13 @@ may return `409 terminal_conflict`. Expected errors use `{ "error": { "code", "m
|
|
|
240
258
|
400 invalid request, 401 credential failure, 403 entitlement failure, 404 unavailable owned
|
|
241
259
|
resource, or 409 terminal conflict.
|
|
242
260
|
|
|
243
|
-
When create-profile
|
|
244
|
-
|
|
245
|
-
`https://getlinkbunny.com/account
|
|
246
|
-
|
|
247
|
-
|
|
261
|
+
When create-profile, check-in, or profile update returns a `403` that mentions the free exchange or a
|
|
262
|
+
subscription, relay its message: the free exchange covers one site and one reported placement, and
|
|
263
|
+
the paid subscription at `https://getlinkbunny.com/account` adds more. A free site that already
|
|
264
|
+
placed its link still stays eligible to receive its one backlink when a match comes up. Do not
|
|
265
|
+
imply that signup, billing, or token creation is available through the public API. Report and
|
|
266
|
+
reject never depend on a subscription: any issued assignment can be reported or reconsidered
|
|
267
|
+
within the usual windows, including after entitlement ends or the free exchange is used.
|
|
248
268
|
|
|
249
269
|
Pending assignments expire at their seven-day deadline. Expiration releases the reservation but
|
|
250
270
|
does not permanently exclude the directional pair. Report completion for the exact original
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@linkbunny/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"lockfileVersion": 2,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@linkbunny/mcp",
|
|
9
|
-
"version": "0.1.
|
|
9
|
+
"version": "0.1.7",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@modelcontextprotocol/server": "2.0.0",
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@linkbunny/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"mcpName": "com.getlinkbunny/exchange",
|
|
5
|
-
"description": "Local stdio MCP server for LinkBunny nofollow link exchanges.
|
|
5
|
+
"description": "Local stdio MCP server for LinkBunny nofollow link exchanges. Sign in with its login command or use a LinkBunny account API token.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
8
|
"linkbunny-mcp": "dist/index.js"
|