@themkn/gandi-mcp 1.1.1 → 1.1.2
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 +45 -3
- package/dist/gandi/client.d.ts +2 -0
- package/dist/gandi/client.d.ts.map +1 -1
- package/dist/gandi/client.js +24 -8
- package/dist/gandi/client.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/server.d.ts +3 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +9 -4
- package/dist/server.js.map +1 -1
- package/dist/tools/records.js +3 -3
- package/dist/tools/records.js.map +1 -1
- package/dist/tools/snapshots.js +1 -1
- package/dist/tools/snapshots.js.map +1 -1
- package/package.json +26 -14
package/README.md
CHANGED
|
@@ -79,14 +79,56 @@ Add this to your `.mcp.json` (project-scoped) or `~/.config/claude/mcp.json` (gl
|
|
|
79
79
|
}
|
|
80
80
|
```
|
|
81
81
|
|
|
82
|
-
###
|
|
82
|
+
### Recommended permissions
|
|
83
83
|
|
|
84
|
-
By default Claude Code
|
|
84
|
+
By default Claude Code asks for permission on every Gandi tool call. A blanket
|
|
85
|
+
`mcp__gandi__*` allow works, but it also auto-approves irreversible live DNS
|
|
86
|
+
changes like `delete_record` and `update_record`. A tiered policy keeps the
|
|
87
|
+
inspection flow frictionless while making destructive zone edits explicit.
|
|
88
|
+
|
|
89
|
+
Add this to your `~/.claude/settings.json`:
|
|
90
|
+
|
|
91
|
+
```json
|
|
92
|
+
{
|
|
93
|
+
"permissions": {
|
|
94
|
+
"allow": [
|
|
95
|
+
"mcp__gandi__list_domains",
|
|
96
|
+
"mcp__gandi__list_records",
|
|
97
|
+
"mcp__gandi__get_record",
|
|
98
|
+
"mcp__gandi__list_snapshots",
|
|
99
|
+
"mcp__gandi__create_snapshot",
|
|
100
|
+
"mcp__gandi__add_record"
|
|
101
|
+
]
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
What this does:
|
|
107
|
+
|
|
108
|
+
- **Reads** (`list_domains`, `list_records`, `get_record`, `list_snapshots`) run
|
|
109
|
+
without prompting — they can't change anything.
|
|
110
|
+
- **Additive writes** (`create_snapshot`, `add_record`) also run without
|
|
111
|
+
prompting. Snapshots are purely additive, and the server takes an automatic
|
|
112
|
+
local zone backup before every record mutation, so a stray `add_record` is
|
|
113
|
+
easy to recover from.
|
|
114
|
+
- **Destructive writes** (`update_record`, `delete_record`) are *not* listed, so
|
|
115
|
+
Claude Code will prompt before each call. The auto-backup helps recover the
|
|
116
|
+
previous record values, but DNS caches still propagate — a bad change can
|
|
117
|
+
break a live site for as long as the old TTL lasts. These should be
|
|
118
|
+
deliberate.
|
|
119
|
+
|
|
120
|
+
If you want a stricter setup, keep a wildcard `allow` and add a `deny` block for
|
|
121
|
+
the destructive tools — `deny` blocks the call entirely (no prompt, no
|
|
122
|
+
override):
|
|
85
123
|
|
|
86
124
|
```json
|
|
87
125
|
{
|
|
88
126
|
"permissions": {
|
|
89
|
-
"allow": ["mcp__gandi__*"]
|
|
127
|
+
"allow": ["mcp__gandi__*"],
|
|
128
|
+
"deny": [
|
|
129
|
+
"mcp__gandi__update_record",
|
|
130
|
+
"mcp__gandi__delete_record"
|
|
131
|
+
]
|
|
90
132
|
}
|
|
91
133
|
}
|
|
92
134
|
```
|
package/dist/gandi/client.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ import type { DnsRecord, Domain, Organization, RecordInput, Snapshot } from "./t
|
|
|
2
2
|
export declare class GandiClient {
|
|
3
3
|
private readonly token;
|
|
4
4
|
constructor(token: string);
|
|
5
|
+
/** Defensive scrubber: strip the API token from arbitrary text. */
|
|
6
|
+
scrub(text: string): string;
|
|
5
7
|
private request;
|
|
6
8
|
listDomains(sharingId?: string): Promise<Domain[]>;
|
|
7
9
|
listOrganizations(): Promise<Organization[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/gandi/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAKzF,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/gandi/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAKzF,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,MAAM;IAE1C,mEAAmE;IACnE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;YAIb,OAAO;IA8Bf,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAMlD,iBAAiB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAI5C,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAIjD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAMzE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5D,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/D,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvE,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAIlD,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;CAQvE"}
|
package/dist/gandi/client.js
CHANGED
|
@@ -5,6 +5,10 @@ export class GandiClient {
|
|
|
5
5
|
constructor(token) {
|
|
6
6
|
this.token = token;
|
|
7
7
|
}
|
|
8
|
+
/** Defensive scrubber: strip the API token from arbitrary text. */
|
|
9
|
+
scrub(text) {
|
|
10
|
+
return sanitize(text, this.token);
|
|
11
|
+
}
|
|
8
12
|
async request(path, options = {}) {
|
|
9
13
|
const response = await fetch(`${BASE_URL}${path}`, {
|
|
10
14
|
...options,
|
|
@@ -19,7 +23,7 @@ export class GandiClient {
|
|
|
19
23
|
try {
|
|
20
24
|
const body = (await response.json());
|
|
21
25
|
if (body.message)
|
|
22
|
-
detail = body.message;
|
|
26
|
+
detail = sanitize(body.message, this.token);
|
|
23
27
|
}
|
|
24
28
|
catch {
|
|
25
29
|
// body not JSON — keep statusText
|
|
@@ -44,13 +48,13 @@ export class GandiClient {
|
|
|
44
48
|
return this.request("/organization/organizations");
|
|
45
49
|
}
|
|
46
50
|
async listRecords(domain) {
|
|
47
|
-
return this.request(`/livedns/domains/${
|
|
51
|
+
return this.request(`/livedns/domains/${encode(domain)}/records`);
|
|
48
52
|
}
|
|
49
53
|
async getRecord(domain, name, type) {
|
|
50
|
-
return this.request(`/livedns/domains/${
|
|
54
|
+
return this.request(`/livedns/domains/${encode(domain)}/records/${encode(name)}/${encode(type)}`);
|
|
51
55
|
}
|
|
52
56
|
async addRecord(domain, input) {
|
|
53
|
-
await this.request(`/livedns/domains/${
|
|
57
|
+
await this.request(`/livedns/domains/${encode(domain)}/records`, {
|
|
54
58
|
method: "POST",
|
|
55
59
|
body: JSON.stringify({
|
|
56
60
|
rrset_name: input.name,
|
|
@@ -61,7 +65,7 @@ export class GandiClient {
|
|
|
61
65
|
});
|
|
62
66
|
}
|
|
63
67
|
async updateRecord(domain, input) {
|
|
64
|
-
await this.request(`/livedns/domains/${
|
|
68
|
+
await this.request(`/livedns/domains/${encode(domain)}/records/${encode(input.name)}/${encode(input.type)}`, {
|
|
65
69
|
method: "PUT",
|
|
66
70
|
body: JSON.stringify({
|
|
67
71
|
rrset_values: input.values,
|
|
@@ -70,16 +74,28 @@ export class GandiClient {
|
|
|
70
74
|
});
|
|
71
75
|
}
|
|
72
76
|
async deleteRecord(domain, name, type) {
|
|
73
|
-
await this.request(`/livedns/domains/${
|
|
77
|
+
await this.request(`/livedns/domains/${encode(domain)}/records/${encode(name)}/${encode(type)}`, { method: "DELETE" });
|
|
74
78
|
}
|
|
75
79
|
async listSnapshots(domain) {
|
|
76
|
-
return this.request(`/livedns/domains/${
|
|
80
|
+
return this.request(`/livedns/domains/${encode(domain)}/snapshots`);
|
|
77
81
|
}
|
|
78
82
|
async createSnapshot(domain, name) {
|
|
79
83
|
const init = { method: "POST" };
|
|
80
84
|
if (name !== undefined)
|
|
81
85
|
init.body = JSON.stringify({ name });
|
|
82
|
-
return this.request(`/livedns/domains/${
|
|
86
|
+
return this.request(`/livedns/domains/${encode(domain)}/snapshots`, init);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/** Defensive scrubber: strip the API token if it ever appears in a message. */
|
|
90
|
+
function sanitize(message, token) {
|
|
91
|
+
if (!token)
|
|
92
|
+
return message;
|
|
93
|
+
return message.split(token).join("[redacted]");
|
|
94
|
+
}
|
|
95
|
+
function encode(segment) {
|
|
96
|
+
if (!segment || segment.includes("/") || segment.includes("?") || segment.includes("#")) {
|
|
97
|
+
throw new Error(`Invalid path segment: ${JSON.stringify(segment)}`);
|
|
83
98
|
}
|
|
99
|
+
return encodeURIComponent(segment);
|
|
84
100
|
}
|
|
85
101
|
//# sourceMappingURL=client.js.map
|
package/dist/gandi/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/gandi/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,QAAQ,GAAG,0BAA0B,CAAC;AAE5C,MAAM,OAAO,WAAW;IACO;IAA7B,YAA6B,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;IAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/gandi/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
File without changes
|
package/dist/server.d.ts
CHANGED
|
@@ -10,7 +10,9 @@ export interface ToolDefinition<Input> {
|
|
|
10
10
|
}
|
|
11
11
|
export interface ToolContext {
|
|
12
12
|
client: GandiClient;
|
|
13
|
-
|
|
13
|
+
defaultDomain: string | undefined;
|
|
14
|
+
autoBackup: boolean;
|
|
15
|
+
backupDir: string;
|
|
14
16
|
}
|
|
15
17
|
export interface ServerBootstrap {
|
|
16
18
|
config: Config;
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAOnE,OAAO,EAAK,KAAK,UAAU,EAAE,MAAM,KAAK,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,cAAc,CAAC,KAAK;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAOnE,OAAO,EAAK,KAAK,UAAU,EAAE,MAAM,KAAK,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,cAAc,CAAC,KAAK;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;CAClC;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,eAAe,GAAG,MAAM,CAiD9D;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzE"}
|
package/dist/server.js
CHANGED
|
@@ -6,8 +6,13 @@ import { GandiError } from "./gandi/errors.js";
|
|
|
6
6
|
export function buildServer(bootstrap) {
|
|
7
7
|
const { config, client, tools } = bootstrap;
|
|
8
8
|
const byName = new Map(tools.map((t) => [t.name, t]));
|
|
9
|
-
const ctx = {
|
|
10
|
-
|
|
9
|
+
const ctx = {
|
|
10
|
+
client,
|
|
11
|
+
defaultDomain: config.defaultDomain,
|
|
12
|
+
autoBackup: config.autoBackup,
|
|
13
|
+
backupDir: config.backupDir,
|
|
14
|
+
};
|
|
15
|
+
const mcp = new Server({ name: "gandi-mcp", version: "1.1.2" }, { capabilities: { tools: {} } });
|
|
11
16
|
mcp.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
12
17
|
tools: tools.map((t) => ({
|
|
13
18
|
name: t.name,
|
|
@@ -33,10 +38,10 @@ export function buildServer(bootstrap) {
|
|
|
33
38
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
34
39
|
}
|
|
35
40
|
catch (err) {
|
|
36
|
-
const
|
|
41
|
+
const raw = err instanceof GandiError
|
|
37
42
|
? err.toUserMessage()
|
|
38
43
|
: `Unexpected error: ${err.message}`;
|
|
39
|
-
return { isError: true, content: [{ type: "text", text }] };
|
|
44
|
+
return { isError: true, content: [{ type: "text", text: client.scrub(raw) }] };
|
|
40
45
|
}
|
|
41
46
|
});
|
|
42
47
|
return mcp;
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAEvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAmB,MAAM,KAAK,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/records.js
CHANGED
|
@@ -21,7 +21,7 @@ const UpdateInput = z
|
|
|
21
21
|
.strict();
|
|
22
22
|
const DeleteInput = z.object({ domain: DomainRef, name: NameStr, type: TypeStr }).strict();
|
|
23
23
|
function resolveDomain(input, ctx) {
|
|
24
|
-
const d = input.domain ?? ctx.
|
|
24
|
+
const d = input.domain ?? ctx.defaultDomain;
|
|
25
25
|
if (!d) {
|
|
26
26
|
throw new Error("No domain provided and no `defaultDomain` in config. Pass `domain` explicitly or set one in ~/.gandi-mcp/config.json.");
|
|
27
27
|
}
|
|
@@ -35,10 +35,10 @@ function globToRegex(pattern) {
|
|
|
35
35
|
return new RegExp(`^${escaped}$`, "i");
|
|
36
36
|
}
|
|
37
37
|
async function backupIfEnabled(ctx, domain) {
|
|
38
|
-
if (!ctx.
|
|
38
|
+
if (!ctx.autoBackup)
|
|
39
39
|
return null;
|
|
40
40
|
const records = await ctx.client.listRecords(domain);
|
|
41
|
-
return writeLocalBackup(domain, records, ctx.
|
|
41
|
+
return writeLocalBackup(domain, records, ctx.backupDir);
|
|
42
42
|
}
|
|
43
43
|
export const recordTools = [
|
|
44
44
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/tools/records.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC/C,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAClC,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAClC,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACpD,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAE7D,MAAM,SAAS,GAAG,CAAC;KAChB,MAAM,CAAC;IACN,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACzC,CAAC;KACD,MAAM,EAAE,CAAC;AACZ,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AACxF,MAAM,QAAQ,GAAG,CAAC;KACf,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;KAChG,MAAM,EAAE,CAAC;AACZ,MAAM,WAAW,GAAG,CAAC;KAClB,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;KAChG,MAAM,EAAE,CAAC;AACZ,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAE3F,SAAS,aAAa,CAAC,KAA0B,EAAE,GAAgB;IACjE,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/tools/records.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/snapshots.js
CHANGED
|
@@ -3,7 +3,7 @@ const DomainRef = z.string().min(1).optional();
|
|
|
3
3
|
const ListInput = z.object({ domain: DomainRef }).strict();
|
|
4
4
|
const CreateInput = z.object({ domain: DomainRef, name: z.string().min(1).optional() }).strict();
|
|
5
5
|
function resolveDomain(input, ctx) {
|
|
6
|
-
const d = input.domain ?? ctx.
|
|
6
|
+
const d = input.domain ?? ctx.defaultDomain;
|
|
7
7
|
if (!d) {
|
|
8
8
|
throw new Error("No domain provided and no `defaultDomain` in config. Pass `domain` explicitly or set one in ~/.gandi-mcp/config.json.");
|
|
9
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshots.js","sourceRoot":"","sources":["../../src/tools/snapshots.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AAE/C,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAC3D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAEjG,SAAS,aAAa,CAAC,KAA0B,EAAE,GAAgB;IACjE,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"snapshots.js","sourceRoot":"","sources":["../../src/tools/snapshots.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AAE/C,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAC3D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAEjG,SAAS,aAAa,CAAC,KAA0B,EAAE,GAAgB;IACjE,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,aAAa,CAAC;IAC5C,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CACb,uHAAuH,CACxH,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAA8B;IACtD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,gEAAgE;QAC7E,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC5B,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACjC,OAAO,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,CAAC;KACF;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,wLAAwL;QAC1L,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC5B,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnC,OAAO,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAClE,CAAC;KACF;CACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@themkn/gandi-mcp",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"description": "MCP server for Gandi LiveDNS — manage DNS records, domains, and zone snapshots from Claude Code or any MCP client.",
|
|
5
|
-
"keywords": [
|
|
5
|
+
"keywords": [
|
|
6
|
+
"mcp",
|
|
7
|
+
"mcp-server",
|
|
8
|
+
"model-context-protocol",
|
|
9
|
+
"gandi",
|
|
10
|
+
"dns",
|
|
11
|
+
"livedns",
|
|
12
|
+
"claude",
|
|
13
|
+
"claude-code"
|
|
14
|
+
],
|
|
6
15
|
"license": "MIT",
|
|
7
16
|
"author": "mkn <khoa@khoa.ch>",
|
|
8
17
|
"type": "module",
|
|
@@ -14,17 +23,11 @@
|
|
|
14
23
|
"engines": {
|
|
15
24
|
"node": ">=24"
|
|
16
25
|
},
|
|
17
|
-
"files": [
|
|
18
|
-
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
|
|
22
|
-
"test": "vitest run",
|
|
23
|
-
"test:watch": "vitest",
|
|
24
|
-
"typecheck": "tsc --noEmit -p tsconfig.test.json",
|
|
25
|
-
"audit": "npm audit --audit-level=high",
|
|
26
|
-
"prepublishOnly": "pnpm build && pnpm test"
|
|
27
|
-
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist",
|
|
28
|
+
"README.md",
|
|
29
|
+
"LICENSE"
|
|
30
|
+
],
|
|
28
31
|
"dependencies": {
|
|
29
32
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
30
33
|
"zod": "^4.3.6"
|
|
@@ -42,5 +45,14 @@
|
|
|
42
45
|
"homepage": "https://github.com/themkn/gandi-mcp#readme",
|
|
43
46
|
"publishConfig": {
|
|
44
47
|
"access": "public"
|
|
48
|
+
},
|
|
49
|
+
"scripts": {
|
|
50
|
+
"build": "tsc",
|
|
51
|
+
"start": "node dist/index.js",
|
|
52
|
+
"dev": "tsc --watch",
|
|
53
|
+
"test": "vitest run",
|
|
54
|
+
"test:watch": "vitest",
|
|
55
|
+
"typecheck": "tsc --noEmit -p tsconfig.test.json",
|
|
56
|
+
"audit": "npm audit --audit-level=high"
|
|
45
57
|
}
|
|
46
|
-
}
|
|
58
|
+
}
|