domeneshop-mcp
Manage Domeneshop domains, DNS records, HTTP forwards, dynamic DNS, and invoices through MCP tools.
List domains and inspect domain details such as expiry, renewal, nameservers, and services.
List, get, create, replace, patch, upsert, and delete DNS records across all supported record types.
List, get, create, update, and delete HTTP forwarding rules.
Update dynamic DNS for one or more hostnames to specified or apparent IP addresses.
List and inspect invoices, including status filtering and PDF links.
Optionally restrict exposure with read-only mode, tool allowlists, or denylists.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@domeneshop-mcplist my domains and show the DNS records for example.com"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
An MCP server that turns the Domeneshop API into tools an assistant can call. Every operation the API offers is covered — 17 tools across domains, DNS, HTTP forwarding, dynamic DNS and invoices.
It talks MCP over stdio, so it works with any MCP-compatible client: Claude Code, Claude Desktop, Cursor, VS Code, Codex, Windsurf, Cline and others.
MCP (Model Context Protocol) is an open standard that lets AI apps call outside tools. This package is an MCP server: a small program your AI app starts in the background and talks to. Once it is registered, you just ask in plain language — "point blog.example.no at 203.0.113.10" — and the assistant picks the right tool, shows you what it is about to do and asks before changing anything.
You never run the server yourself, and you do not need to know the tool names. What you need:
A Domeneshop API token and secret, a key pair that lets a program act on your account. Treat them like a password.
An MCP client, the app you chat with. Claude Code is used below; any other works too (see Client setup).
Node.js 20.3+ (download the LTS) or Homebrew. Not needed for the Claude Desktop bundle.
If you are unsure about letting an assistant change live DNS, start in read-only mode: it can look at everything but change nothing.
Quick start
You need a Domeneshop account, plus either Node.js 20.3 or newer (for npx) or
Homebrew.
1. Create an API token and secret at domeneshop.no/admin?view=api.
2. Register the server in Claude Code, replacing the placeholders with your token and secret:
claude mcp add domeneshop \
--env DOMENESHOP_API_TOKEN=<your-api-token> \
--env DOMENESHOP_API_SECRET=<your-api-secret> \
-- npx -y domeneshop-mcpAdd --env DOMENESHOP_READ_ONLY=true to start with read-only tools only, and
--scope user to make it available in every project (the default is the
current project only).
3. Ask for something. Start a new claude session and try "List my
Domeneshop domains". Running /mcp inside Claude Code shows whether the server
connected.
Using Homebrew instead of npx? Install once, then register the binary in
step 2 with -- domeneshop-mcp in place of -- npx -y domeneshop-mcp:
brew install martinzachariassen/tap/domeneshop-mcpUsing a different client? Claude Desktop has a one-click bundle that needs no Node.js, and Cursor and VS Code have one-click install buttons at the top of this page. Codex and others take a short config block. See Client setup.
Related MCP server: Name.com MCP Server
What you can ask for
Area | Example prompt |
Domains | "Which domains are on my account, and when do they renew?" |
DNS | "Show every DNS record for example.no" |
DNS | "Point blog.example.no at 203.0.113.10" |
DNS | "Lower the TTL on the www record for example.no to 5 minutes" |
DNS | "Add the TXT record Google gave me for domain verification" |
DNS | "Set up Fastmail's MX records on example.no" |
Forwarding | "Forward old.example.no to https://example.no" |
Dynamic DNS | "Update home.example.no to my current IP" |
Invoices | "List my unpaid Domeneshop invoices" |
Client setup
The server is launched by your client rather than run by hand. It needs two
environment variables, DOMENESHOP_API_TOKEN and DOMENESHOP_API_SECRET; the
optional ones are listed under Configuration.
Most clients take the same standard config. Replace the placeholders with
your token and secret, and if the file already lists other servers, add the
"domeneshop" entry inside the existing "mcpServers" object:
{
"mcpServers": {
"domeneshop": {
"command": "npx",
"args": ["-y", "domeneshop-mcp"],
"env": {
"DOMENESHOP_API_TOKEN": "<your-api-token>",
"DOMENESHOP_API_SECRET": "<your-api-secret>"
}
}
}
}Most clients can also scope a server to the current project or make it available everywhere, usually by choosing which config file you write to. The blocks below note this where it applies.
Use the CLI command from Quick start. It defaults to
--scope local, private to you and this project. Use --scope project to
write <your-project>/.mcp.json instead, shared via version control, or
--scope user for every project on your account.
You can also pass the standard config as raw JSON:
claude mcp add-json domeneshop '{"command":"npx","args":["-y","domeneshop-mcp"],"env":{"DOMENESHOP_API_TOKEN":"<your-api-token>","DOMENESHOP_API_SECRET":"<your-api-secret>"}}'Or write the standard config straight into <your-project>/.mcp.json.
claude mcp list shows registered servers and whether they connect.
The easiest route is the one-click bundle, which needs no Node.js:
Download
domeneshop-mcp-<version>.mcpbfrom the latest release.Open it (double-click, or drag it into Claude Desktop).
Paste your token and secret, optionally turn on read-only mode, and install.
Claude Desktop stores the credentials securely.
To configure it by hand instead, add the standard config to
claude_desktop_config.json, reachable from Settings → Developer → Edit Config,
then restart Claude Desktop:
Platform | Full path |
macOS |
|
Windows |
|
Linux (unofficial builds) |
|
The button installs the server with placeholder credentials. Cursor cannot
prompt for them, so afterwards open Settings → MCP, edit the domeneshop
entry and replace <your-api-token> and <your-api-secret> with your own.
To set it up by hand instead, add the standard config to an mcp.json file:
Scope | Full path |
This project only |
|
Every project (macOS/Linux) |
|
Every project (Windows) |
|
The buttons install the server in your user configuration. VS Code then asks for your token and secret and stores them securely, so nothing is written to a config file in plain text.
To set it up by hand instead, note that VS Code uses a servers key instead of mcpServers, and wants an explicit
type. For this project only, add it to <your-project>/.vscode/mcp.json:
{
"servers": {
"domeneshop": {
"type": "stdio",
"command": "npx",
"args": ["-y", "domeneshop-mcp"],
"env": {
"DOMENESHOP_API_TOKEN": "<your-api-token>",
"DOMENESHOP_API_SECRET": "<your-api-secret>"
}
}
}
}For every project, run the command palette action MCP: Open User Configuration and add the same block there, or register it in one line:
code --add-mcp '{"name":"domeneshop","command":"npx","args":["-y","domeneshop-mcp"],"env":{"DOMENESHOP_API_TOKEN":"<your-api-token>","DOMENESHOP_API_SECRET":"<your-api-secret>"}}'Codex CLI reads MCP servers from mcp_servers in its config file:
Platform | Full path |
macOS/Linux |
|
Windows |
|
[mcp_servers.domeneshop]
command = "npx"
args = ["-y", "domeneshop-mcp"]
env = { DOMENESHOP_API_TOKEN = "<your-api-token>", DOMENESHOP_API_SECRET = "<your-api-secret>" }codex mcp add domeneshop -- npx -y domeneshop-mcp registers it from the
command line, but takes no env flags, so set the two variables in the
[mcp_servers.domeneshop] block it creates.
Windsurf, Cline, Continue, LM Studio and anything else that runs MCP servers over stdio will work. Most use the same shape as the standard config above; check your client's documentation for the config file and key name, then point it at:
command:
npxargs:
["-y", "domeneshop-mcp"]env:
DOMENESHOP_API_TOKENandDOMENESHOP_API_SECRET
To avoid resolving the package on every launch, install it once and use
domeneshop-mcp as the command with no args. With npm:
npm install -g domeneshop-mcpOr with Homebrew on macOS or Linux, which also installs Node.js for you if it is missing:
brew install martinzachariassen/tap/domeneshop-mcpbrew upgrade domeneshop-mcp picks up new releases. GUI apps such as Claude
Desktop usually do not see Homebrew's PATH, so give them the full path
(brew --prefix prints the prefix: /opt/homebrew on Apple silicon,
/usr/local on Intel Macs, /home/linuxbrew/.linuxbrew on Linux):
{
"mcpServers": {
"domeneshop": {
"command": "/opt/homebrew/bin/domeneshop-mcp",
"env": {
"DOMENESHOP_API_TOKEN": "<your-api-token>",
"DOMENESHOP_API_SECRET": "<your-api-secret>"
}
}
}
}Configuration
All settings are environment variables, passed with --env in Claude Code or
in the env block of the config above. Only the first two are required.
Variable | Required | Description |
| Yes | API token from the Domeneshop control panel |
| Yes | The matching API secret |
| No |
|
| No | Comma-separated allowlist of tool names to expose |
| No | Comma-separated tool names to hide |
| No | Per-request timeout in milliseconds (default |
| No |
|
Tools
Every tool declares MCP annotations and a title, so clients know which ones are safe to run without asking you first. The Access column below mirrors those annotations. Arguments are validated before anything is sent to Domeneshop (TTL range, URL scheme, IP addresses, and the fields each record type requires), and read-only tools also return structured output for clients that support it.
Domains
Tool | Access | Description |
| Read-only | List all domains on the account, optionally filtered by name |
| Read-only | Get a single domain by its Domeneshop domain ID |
DNS
Tool | Access | Description |
| Read-only | List a domain's records, optionally filtered by host and type |
| Read-only | Get a single record by ID |
| Adds | Create a record and return it as stored |
| Overwrites | Replace a record and return it as stored — see the warning below |
| Overwrites | Change only the given fields of a record; the rest keep their stored values |
| Overwrites | Update the single record for a host and type, or create it if there is none |
| Deletes | Delete a record |
Heads up:
update_dns_recordreplaces the whole record rather than patching it. Any field left out is dropped, and omittingttlresets it to the default 3600 seconds. Usepatch_dns_recordto change only some fields.upsert_dns_recordrefuses to act when a host has several records of the same type (typical forMXandTXT) and lists their IDs instead.
HTTP forwarding
Tool | Access | Description |
| Read-only | List a domain's HTTP forwards |
| Read-only | Get the forward for one host |
| Adds | Create a forward |
| Overwrites | Update a forward |
| Deletes | Delete a forward |
Dynamic DNS
Tool | Access | Description |
| Overwrites | Point one or more comma-separated hostnames at up to nine IPv4/IPv6 addresses, or at the caller's apparent IP; creates the record if missing |
Invoices
Tool | Access | Description |
| Read-only | List invoices from the past three years, optionally filtered by status |
| Read-only | Get a single invoice |
Access control
The Domeneshop API has no scoped tokens: a token can do everything the account can. To limit what the assistant can do, limit which tools the server exposes. Hidden tools are not registered at all, so the model never sees them.
Read-only mode. Set
DOMENESHOP_READ_ONLY=trueto expose only the eight read-only tools. This is a good default if you mainly ask questions about your domains, DNS and invoices, or are trying the server out for the first time.Allowlist. Set
DOMENESHOP_TOOLS=list_domains,list_dns_records,patch_dns_recordto expose exactly those tools.Denylist. Set
DOMENESHOP_DISABLED_TOOLS=delete_dns_record,delete_forwardto hide specific tools.
The settings combine, and a misspelled tool name stops the server at startup instead of being silently ignored.
Most clients ask before running a tool not annotated read-only. Keep that confirmation on for this server: write tools change live DNS, and a wrong record can take a site or mailbox offline.
Credentials are only ever sent to api.domeneshop.no and are never logged. To
revoke access, delete the token in the Domeneshop control panel.
Troubleshooting
The tools do not show up: restart the client (most only load servers at startup) or, in Claude Code, check
/mcp. Runnpx -y domeneshop-mcp --versionto check that Node.js 20.3+ and npx work. If you edited a JSON config by hand, make sure it is still valid JSON. WithDOMENESHOP_DEBUG=truethe server logs every API request (method, path, status and duration, never credentials) to stderr, which most clients capture in their MCP logs.API returned status 401: the token or secret is wrong. Copy both again from domeneshop.no/admin?view=api. Surrounding whitespace is trimmed automatically.API returned status 404: the domain or record ID does not exist on this account. Ask the assistant to list domains or records first.Timeouts: requests give up after 30 seconds. Idempotent requests are retried on rate limiting and temporary errors. Raise the limit with
DOMENESHOP_TIMEOUT_MSif needed.A DNS change does not show up: DNS is cached for the record's TTL (3600 seconds by default), so other resolvers may serve the old value for up to an hour. Ask the assistant to show the record to confirm Domeneshop stored it.
Still stuck? Open an issue.
Reference
All eleven record types Domeneshop accepts are supported, with their type-specific fields:
Type | Fields beyond |
| — |
|
|
|
|
|
|
|
|
|
|
The tag field is deliberately untyped: it is a numeric key tag for DS and a
property tag such as issue for CAA, and Domeneshop documents neither.
A few things this server relies on are not in Domeneshop's published OpenAPI spec, but are supported and used by their own client libraries:
The spec documents seven record types;
ANAME,CAA,DSandNSwork too, as the record validation in domeneshop.js and python-domeneshop shows.GET /invoicesaccepts astatusfilter, which domeneshop.js uses.POST /forwards/answers201with an empty body and names the new forward only in theLocationheader.GET /dyndns/updateanswers204with no body rather than JSON, so the client does not try to decode it.
Claude Desktop bundle (
.mcpbon each release)
Development
npm install # install dependencies
npm run dev # run the server from source with tsx
npm run build # compile to ./dist
npm run typecheck # type-check without emitting
npm run lint # lint with Biome
npm run format # format with Biome
npm test # run the test suite (vitest)The tests stub the Domeneshop API with a local node:http server and drive the
MCP server over an in-memory transport, so they need no credentials and make no
network calls.
src/
domeneshop/ Domeneshop API client (HTTP transport + one resource per endpoint group)
mcp/ MCP server: tool registration, schemas, result/error helpers
index.ts CLI entry point
test/
domeneshop/ Client tests, against a local HTTP server
mcp/ End-to-end tool tests, against an in-memory MCP transportContributing
Issues and pull requests are welcome — see CONTRIBUTING.md for the development workflow and changelog conventions. Everyone taking part is expected to follow the Code of Conduct.
Security
See SECURITY.md for how to report a vulnerability.
License
Available Tools
17 toolscreate_dns_recordCreate DNS recordB
Create a new DNS record for a domain. Returns the stored record, including its new ID.
| Name | Required | Description | Default |
|---|---|---|---|
| alg | No | required for DS: the DNSSEC signing algorithm number | |
| tag | No | required for DS (the key tag of the referenced DNSKEY) and for CAA (the property tag, e.g. issue, issuewild or iodef) | |
| ttl | No | time-to-live in seconds, 60-604800, must be a multiple of 60, defaults to 3600 | |
| data | Yes | the record's main value: an IP address for A/AAAA, a hostname for ANAME/CNAME/MX/NS/SRV, free text for TXT, the CAA property value, or the hex hash for DS/TLSA | |
| host | Yes | the host/subdomain the record applies to, e.g. 'www' or '@' for the root | |
| port | No | required for SRV: the port the service is found on | |
| type | Yes | the record type | |
| dtype | No | required for TLSA: matching type of the hash in data (0 exact match, 1 SHA-256, 2 SHA-512) | |
| flags | No | required for CAA: 128 to mark the property critical, otherwise 0 | |
| usage | No | required for TLSA: certificate usage (0 PKIX-TA, 1 PKIX-EE, 2 DANE-TA, 3 DANE-EE) | |
| digest | No | required for DS: digest type of the hash in data (1 SHA-1, 2 SHA-256, 4 SHA-384) | |
| weight | No | required for SRV: relative weight among records with the same priority | |
| priority | No | required for MX and SRV: preference value, lower is tried first | |
| selector | No | required for TLSA: what the hash is taken from (0 full certificate, 1 subject public key) | |
| domain_id | Yes | the Domeneshop domain ID, from list_domains |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description's only addition is the return shape ('the stored record, including its new ID'), which is useful since no output schema exists, but it omits conflict/duplicate behavior for a non-idempotent write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the core action front-loaded and the return behavior second. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter write tool with heavy type-dependent requirements, the schema carries the parameter burden and annotations carry the safety profile, so the definition is callable. It is thin on the two things structured data cannot supply: how this differs from upsert_dns_record, and what happens on a duplicate host/type.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter — including the type-conditional ones (usage/dtype/selector for TLSA, alg/digest for DS, port/weight/priority for SRV) — is already documented in the schema. The description adds no parameter meaning beyond that, which is the expected baseline here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new DNS record for a domain') and adds a return-value clause. It does not name or contrast with the closest sibling, upsert_dns_record, leaving the agent to infer the create-vs-upsert distinction from names alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance and no exclusions. The critical routing question for this tool family — create vs upsert_dns_record vs update/patch_dns_record — is left entirely to inference, and nothing is said about what happens if the record already exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_forwardCreate HTTP forwardA
Create a new HTTP forward for a domain. Fails if the host already has a forward or a conflicting A, AAAA, ANAME or CNAME record.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | the destination URL to forward requests to, starting with http:// or https:// | |
| host | Yes | the host/subdomain to forward, e.g. 'www' or '@' for the root | |
| frame | No | if true, show the destination in a frame instead of redirecting; defaults to false | |
| domain_id | Yes | the Domeneshop domain ID, from list_domains |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations establish the mutation profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true). The description adds genuinely useful behavioral context beyond that: the operation fails if the host already has a forward or a conflicting A/AAAA/ANAME/CNAME record, which tells the agent about uniqueness/conflict preconditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and followed by the failure condition. No wasted words and appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-param create tool with a fully documented schema and mutation annotations, the description covers purpose and the conflict failure mode. Missing details like permission requirements or the return payload are minor since there is no output schema and annotations already convey the safety profile.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (url, host, frame, domain_id) are already documented in the schema. The description adds no parameter-level detail beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new HTTP forward for a domain'), which is distinct from the many create_dns_record/create_* siblings. It doesn't explicitly name a sibling to contrast against, but the resource ('HTTP forward') is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The implied use case (adding a forward) is clear from the verb, and the precondition that the host must not already have a forward gives some context. However, no alternatives are named (e.g. update_forward, create_dns_record) and there is no explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_dns_recordDelete DNS recordBDestructiveIdempotent
Delete a DNS record. This cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| domain_id | Yes | the Domeneshop domain ID, from list_domains | |
| record_id | Yes | the DNS record ID to delete, from list_dns_records |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is fully covered by structured data. The description's 'This cannot be undone' merely reinforces destructiveHint without adding new context such as required permissions, confirmation behavior, or cascade effects on dependent records.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler, and the core action is front-loaded ahead of the warning. Nothing needs to be trimmed or moved.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter delete with a complete schema and annotations that already cover the destructive/idempotent profile, the description is essentially sufficient. It could go further by noting confirmation expectations or effects on related records, but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both domain_id and record_id are documented in the schema, including their provenance ('from list_domains' and 'from list_dns_records'). The description adds nothing about the parameters, so the baseline 3 applies with the schema doing all the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a DNS record'), so an agent immediately knows the action. It does not explicitly differentiate itself from sibling delete tools such as delete_forward or mutation tools like update_dns_record, so sibling routing is left to the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus update_dns_record, patch_dns_record, or upsert_dns_record, nor any prerequisites or exclusions. The only caution is the irreversibility note, which is a warning rather than usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_forwardDelete HTTP forwardBDestructiveIdempotent
Delete an HTTP forward. This cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| host | Yes | the host/subdomain whose forward should be deleted | |
| domain_id | Yes | the Domeneshop domain ID, from list_domains |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, and openWorldHint=true. 'This cannot be undone' merely restates the destructive hint and adds no new context like auth requirements, side effects on related records, or confirmation behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and followed by the key constraint. No padding or redundant explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple two-parameter delete operation, rich schema descriptions, and thorough annotations, the description is nearly complete. It confirms the purpose and irreversibility, though it omits guidance about related tools that an agent might consider first.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are fully documented in the schema. The description adds no parameter-level detail beyond what the schema provides; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete an HTTP forward'), and the resource is clearly distinct from sibling tools such as delete_dns_record or delete_dyndns. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use, when-not-to-use, or alternatives are given. The name and purpose imply deletion, but the description does not distinguish this from other delete tools or state prerequisites such as owning the domain.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dns_recordGet DNS recordBRead-onlyIdempotent
Get a single DNS record by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| domain_id | Yes | the Domeneshop domain ID, from list_domains | |
| record_id | Yes | the DNS record ID, from list_dns_records |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| alg | No | |
| tag | No | |
| ttl | No | |
| data | Yes | |
| host | Yes | |
| port | No | |
| type | Yes | |
| dtype | No | |
| flags | No | |
| usage | No | |
| digest | No | |
| weight | No | |
| priority | No | |
| selector | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered structurally. The description adds nothing beyond that — no note on missing/not-found behavior, cross-domain lookup constraints, or rate limits — so it contributes no behavioral context of its own.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no wasted words and the resource front-loaded. It is arguably under-specified rather than bloated, but the structure itself is clean.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with an output schema and annotations covering safety and idempotency, the description covers the essential contract; return values need not be explained. The only gap is the absence of routing guidance versus list_dns_records.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both domain_id and record_id documented as coming from list_domains and list_dns_records respectively, so the schema does the heavy lifting. The description only alludes to 'by ID' and does not add format or provenance detail beyond the schema, which is the baseline 3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (a single DNS record) scoped by ID, which distinguishes it from the bulk sibling list_dns_records. It does not, however, name any sibling explicitly, so the differentiation is only implied by the word 'single'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance: the description never says to prefer this over list_dns_records when you already know the record ID, nor does it state any prerequisites. Usage must be inferred entirely from the name and schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_domainGet domainARead-onlyIdempotent
Get details for a single domain by its Domeneshop domain ID: expiry, renewal, nameservers and active services.
| Name | Required | Description | Default |
|---|---|---|---|
| domain_id | Yes | the Domeneshop domain ID, from list_domains |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| renew | No | |
| domain | Yes | |
| status | No | |
| services | No | |
| registrant | No | |
| expiry_date | No | |
| nameservers | No | |
| registered_date | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint. The description adds useful behavioral context by naming the returned fields (expiry, renewal, nameservers, active services), though it does not mention error behavior such as an invalid or missing domain ID.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no wasted words. The resource and identifier appear immediately, followed by the useful detail fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one parameter, an output schema present, and annotations covering read-only/idempotent behavior, the description is nearly complete. The only minor gap is error or authorization behavior for invalid or inaccessible domain IDs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter has 100% schema description coverage and is already documented as "the Domeneshop domain ID, from list_domains." The description restates that it takes a Domeneshop domain ID but adds no syntax or format details beyond the schema, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb+resource combination ("Get details for a single domain") and names the identifying key. The phrase "single domain" clearly contrasts with the sibling list_domains, so an agent can distinguish the scope without reading the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Makes clear this is for retrieving one domain's details and references the domain ID. It does not explicitly state when not to use it or name alternatives, but the single-item scope makes the intended context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_forwardGet HTTP forwardCRead-onlyIdempotent
Get the HTTP forward configured for a specific host.
| Name | Required | Description | Default |
|---|---|---|---|
| host | Yes | the host/subdomain the forward applies to, e.g. 'www' or '@' for the root | |
| domain_id | Yes | the Domeneshop domain ID, from list_domains |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| host | Yes | |
| frame | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is fully covered structurally. The description adds nothing beyond them: it does not say what happens when no forward exists for the host, whether the lookup is case-sensitive, or anything else about behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the resource and scoping constraint front-loaded and zero filler. It is efficient, though it is arguably too sparse to be maximally useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations carry the safety profile. What remains missing is routing information relative to list_forwards and the not-found case, leaving the definition minimally viable but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are well documented in the schema (including the '@' root-host convention and the domain_id source). The description adds no parameter detail beyond what the schema already provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get the HTTP forward') and scopes it to a specific host, so the agent knows exactly what is retrieved. It does not, however, distinguish this tool from the sibling list_forwards, which is the most likely alternative an agent would consider.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus list_forwards or get_domain, and no mention of prerequisites or error conditions. The agent must infer usage entirely from the name and the host parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_invoiceGet invoiceARead-onlyIdempotent
Get details for a single invoice, including a link to the PDF.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_id | Yes | the invoice ID, from list_invoices |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| url | No | |
| type | No | |
| amount | No | |
| status | No | |
| currency | No | |
| due_date | No | |
| paid_date | No | |
| issued_date | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and openWorld, so the safety profile is covered. The description adds genuinely new context by disclosing that the response includes a link to the PDF, which annotations and schema do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the resource and the notable output detail are both packed in without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety, the description needn't explain return values, and it adds the one non-obvious detail (PDF link). It stops short of noting behavior for missing/invalid IDs, but for a simple getter this is close to complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the sole parameter is fully documented in the schema ('the invoice ID, from list_invoices'). The description adds no syntax or format detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get) and resource (a single invoice), and the qualifier 'single' implicitly separates it from the list_invoices sibling. It does not name that sibling explicitly, so the differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance is given. Usage is only implied by the schema (invoice_id 'from list_invoices'), which routes the agent adequately but leaves the description itself silent on context and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dns_recordsList DNS recordsARead-onlyIdempotent
List DNS records for a domain, optionally filtered by host and/or record type.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | only return records for this host/subdomain, e.g. 'www' or '@' | |
| type | No | only return records of this type | |
| domain_id | Yes | the Domeneshop domain ID, from list_domains |
Output Schema
| Name | Required | Description |
|---|---|---|
| records | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered without the description. The description adds the filtering scope, but says nothing about pagination, result volume, or ordering for what is inherently a list tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence naming the verb, resource, scope and optional filters. No filler, no repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover the safety semantics. The only material gap is enumeration behavior (pagination/limits) for a list endpoint, which an agent may need before calling it against a large zone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all three parameters are documented in the schema, so the baseline is 3. The description restates the host and type filters without adding format or syntax detail (e.g. that '@' means apex, or that ''/empty type means all types) beyond what the schema already carries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (DNS records) with an explicit scope (for a domain), so the agent immediately knows it is a read/list operation. It does not explicitly differentiate itself from the sibling get_dns_record or from list_domains, but the resource is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'optionally filtered by host and/or record type' implies the usage context (enumerate or narrow a record set) but never states when to use this versus get_dns_record for a single record or list_domains for enumeration. No exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_domainsList domainsARead-onlyIdempotent
List all domains on the Domeneshop account, optionally filtered by domain name. Use this first to find the domain_id the other tools need.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | only return domains whose name contains this text, e.g. '.no' |
Output Schema
| Name | Required | Description |
|---|---|---|
| domains | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds meaningful behavioral context beyond that — that the call enumerates all domains and serves as the prerequisite lookup for domain_id — though it says nothing about return volume or account scoping limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler. The core purpose is front-loaded and the actionable usage hint follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained. Purpose, optional filtering, and the prerequisite role are all covered, and annotations handle the safety profile — nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single filter parameter is already fully documented in the schema. The description mirrors this ('optionally filtered by domain name') without adding syntax or matching semantics beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (domains) with scope ('on the Domeneshop account') and an optional filter, cleanly distinguishing it from the singular sibling get_domain. An agent can tell immediately what it returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear when-to-use context: 'Use this first to find the domain_id the other tools need,' establishing it as the prerequisite/entry point for the DNS and forward tool families. It stops short of naming a specific alternative (e.g. get_domain for a single domain's detail), so it is strong but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_forwardsList HTTP forwardsARead-onlyIdempotent
List all HTTP forwards configured for a domain.
| Name | Required | Description | Default |
|---|---|---|---|
| domain_id | Yes | the Domeneshop domain ID, from list_domains |
Output Schema
| Name | Required | Description |
|---|---|---|
| forwards | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=true, so the safety and side-effect profile is covered. The description adds nothing beyond that - no mention of pagination, ordering, or behavior when a domain has zero forwards - which is acceptable given annotations but adds no extra value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence, front-loaded with the verb and resource, with no filler or redundancy. Nothing in it fails to earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only single-parameter list tool with an output schema (so return values need no explanation) and full parameter documentation, the description is nearly sufficient. A brief note on empty results or the relationship to get_forward would have closed the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required parameter and schema description coverage is 100%, with the schema even documenting that domain_id comes from list_domains. The description adds no meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (HTTP forwards) plus a scope qualifier (configured for a domain). It is clear what the tool returns, but it never distinguishes itself from the sibling get_forward or from the broader list_dns_records family, so it lands at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'configured for a domain' implies the usage context (you need a domain in hand), but there is no explicit when-to-use guidance, no statement of when not to use it, and no pointer to get_forward for fetching a single forward. Usage is inferred, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_invoicesList invoicesARead-onlyIdempotent
List invoices from the past three years on the Domeneshop account, optionally filtered by status.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | only return invoices with this status; 'settled' applies only to credit notes |
Output Schema
| Name | Required | Description |
|---|---|---|
| invoices | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds one genuinely useful behavioral fact — results are limited to the past three years — but says nothing about pagination, result caps, or ordering. Comparable to the calibration case that scored 3 for a date-range scoping note without return-format detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the resource and its scope before the optional filter. Nothing is padded or repeated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the single optional parameter is fully documented in the schema. The only real gap is pagination/result-size behavior for what could be a multi-year invoice list.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema itself carries the important nuance ('settled' applies only to credit notes). The description only restates that status filtering exists, adding no syntax or semantics beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (invoices), plus a concrete scope: the past three years on the Domeneshop account. It distinguishes itself implicitly from get_invoice by the 'list' verb, but never names a sibling or clarifies how it relates to get_invoice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'optionally filtered by status' implies when the parameter should be supplied, but there is no guidance on when to reach for this tool versus get_invoice, nor any stated exclusions or prerequisites. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
patch_dns_recordPatch DNS recordADestructiveIdempotent
Change only some fields of an existing DNS record, e.g. just data or ttl. The current record is read first and every field you leave out keeps its stored value. Prefer this over update_dns_record. Returns the stored record.
| Name | Required | Description | Default |
|---|---|---|---|
| alg | No | required for DS: the DNSSEC signing algorithm number | |
| tag | No | required for DS (the key tag of the referenced DNSKEY) and for CAA (the property tag, e.g. issue, issuewild or iodef) | |
| ttl | No | time-to-live in seconds, 60-604800, must be a multiple of 60, defaults to 3600 | |
| data | No | the record's main value: an IP address for A/AAAA, a hostname for ANAME/CNAME/MX/NS/SRV, free text for TXT, the CAA property value, or the hex hash for DS/TLSA | |
| host | No | the host/subdomain the record applies to, e.g. 'www' or '@' for the root | |
| port | No | required for SRV: the port the service is found on | |
| type | No | the record type | |
| dtype | No | required for TLSA: matching type of the hash in data (0 exact match, 1 SHA-256, 2 SHA-512) | |
| flags | No | required for CAA: 128 to mark the property critical, otherwise 0 | |
| usage | No | required for TLSA: certificate usage (0 PKIX-TA, 1 PKIX-EE, 2 DANE-TA, 3 DANE-EE) | |
| digest | No | required for DS: digest type of the hash in data (1 SHA-1, 2 SHA-256, 4 SHA-384) | |
| weight | No | required for SRV: relative weight among records with the same priority | |
| priority | No | required for MX and SRV: preference value, lower is tried first | |
| selector | No | required for TLSA: what the hash is taken from (0 full certificate, 1 subject public key) | |
| domain_id | Yes | the Domeneshop domain ID, from list_domains | |
| record_id | Yes | the DNS record ID to change, from list_dns_records |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds real value beyond them by disclosing the read-merge-write behavior ('current record is read first and every field you leave out keeps its stored value') and the return ('Returns the stored record').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the partial-update behavior, then the merge semantics, then the sibling routing. Every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Signals the return value ('Returns the stored record') even though no output schema exists, and the schema fully documents the 16 parameters. For a partial-update mutation the description is essentially complete, with only the absence of an explicit when-not statement as a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every one of the 16 parameters is already documented in the schema, making the baseline 3. The description only reinforces this with the 'e.g. just data or ttl' example, adding no format or constraint detail the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Change only some fields of an existing DNS record') and pinpoints the partial-update semantics with 'e.g. just data or ttl', clearly distinguishing it from the sibling update_dns_record. An agent can tell patch from update and create without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Prefer this over update_dns_record' names the alternative and the condition (partial vs. full change). It does not state when update_dns_record would be the better choice, so the exclusion side is left implicit rather than fully spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_dns_recordReplace DNS recordADestructiveIdempotent
Replace an existing DNS record. This overwrites the whole record, so send every field it should keep: any omitted field is dropped, and leaving out ttl resets it to the default 3600 seconds. To change only some fields, use patch_dns_record instead. Returns the stored record.
| Name | Required | Description | Default |
|---|---|---|---|
| alg | No | required for DS: the DNSSEC signing algorithm number | |
| tag | No | required for DS (the key tag of the referenced DNSKEY) and for CAA (the property tag, e.g. issue, issuewild or iodef) | |
| ttl | No | time-to-live in seconds, 60-604800, must be a multiple of 60, defaults to 3600 | |
| data | Yes | the record's main value: an IP address for A/AAAA, a hostname for ANAME/CNAME/MX/NS/SRV, free text for TXT, the CAA property value, or the hex hash for DS/TLSA | |
| host | Yes | the host/subdomain the record applies to, e.g. 'www' or '@' for the root | |
| port | No | required for SRV: the port the service is found on | |
| type | Yes | the record type | |
| dtype | No | required for TLSA: matching type of the hash in data (0 exact match, 1 SHA-256, 2 SHA-512) | |
| flags | No | required for CAA: 128 to mark the property critical, otherwise 0 | |
| usage | No | required for TLSA: certificate usage (0 PKIX-TA, 1 PKIX-EE, 2 DANE-TA, 3 DANE-EE) | |
| digest | No | required for DS: digest type of the hash in data (1 SHA-1, 2 SHA-256, 4 SHA-384) | |
| weight | No | required for SRV: relative weight among records with the same priority | |
| priority | No | required for MX and SRV: preference value, lower is tried first | |
| selector | No | required for TLSA: what the hash is taken from (0 full certificate, 1 subject public key) | |
| domain_id | Yes | the Domeneshop domain ID, from list_domains | |
| record_id | Yes | the DNS record ID to update, from list_dns_records |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint, non-readonly and idempotent, but the description adds the operationally critical detail that this is a full overwrite: omitted fields are dropped and a missing ttl silently resets to 3600. That is behavior an agent cannot infer from the hints alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the destructive overwrite semantics, then the alternative, then the return. No filler and every sentence carries decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter destructive mutation with no output schema and full schema coverage, the description supplies exactly the missing piece: overwrite semantics and the routing rule. Return behavior is stated in one clause, which suffices absent an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema: the requirement to send every field that should be kept, and the default-reset consequence of omitting ttl. It stops short of explaining the per-type conditional fields (which the schema covers).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Replace an existing DNS record') and immediately distinguishes it from the sibling patch_dns_record, which handles partial updates. An agent can pick between update/patch/upsert without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-not rule with the alternative named: 'To change only some fields, use patch_dns_record instead.' Combined with the overwrite warning, this routes the agent correctly among the create/patch/upsert/update siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_dyndnsUpdate dynamic DNSADestructiveIdempotent
Point one or more hostnames at the given (or the caller's apparent) IP address using Domeneshop's dynamic DNS protocol. The record type (A or AAAA) follows from the address; a missing record is created, an existing one overwritten.
| Name | Required | Description | Default |
|---|---|---|---|
| myip | No | the IP address to set, IPv4 or IPv6; up to 9 addresses may be comma-separated, e.g. '192.0.2.1,2001:db8::1'. If omitted or empty, Domeneshop uses the caller's apparent IP | |
| hostname | Yes | the fully qualified hostname to update, e.g. 'home.example.com'; several hostnames can be updated at once by separating them with commas |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, destructive, idempotent and openWorld, so the safety profile is covered. The description adds value beyond them by disclosing upsert semantics ('a missing record is created, an existing one overwritten') and that the A/AAAA type is derived automatically, which is not in the annotations. It still omits auth/credential and failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, front-loaded with the action and followed by the record-type/upsert behavior. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter mutation with no output schema, 100% schema coverage and rich annotations, the description covers the core behavior an agent needs. It is slightly thin on prerequisites (dynamic-DNS credentials) and return shape, which the lack of an output schema pushes onto prose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already fully documented (comma-separated lists, IPv4/IPv6, caller's apparent IP fallback). The description mostly restates 'the given (or the caller's apparent) IP address,' adding only the minor inference that record type follows from address form. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource+mechanism: 'Point one or more hostnames at ... IP address using Domeneshop's dynamic DNS protocol.' An agent immediately knows the action and the protocol context. It does not, however, distinguish itself from the near-identical siblings update_dns_record and upsert_dns_record, so sibling differentiation is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use/when-not guidance and no alternative named, even though update_dns_record and upsert_dns_record are siblings with overlapping effect. The description only implies usage through its purpose statement; nothing routes the agent between these tools or mentions dynamic-DNS credential prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_forwardUpdate HTTP forwardADestructiveIdempotent
Update an existing HTTP forward for a domain. Returns the stored forward. frame is reset to false unless given. The host itself cannot be changed: to move a forward, delete it and create it again for the new host.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | the destination URL to forward requests to, starting with http:// or https:// | |
| host | Yes | the host/subdomain to forward, e.g. 'www' or '@' for the root | |
| frame | No | if true, show the destination in a frame instead of redirecting; defaults to false | |
| domain_id | Yes | the Domeneshop domain ID, from list_domains |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive, idempotent, and open-world behavior. The description adds critical behavioral context: `frame` resets to false unless provided, the `host` cannot be changed, and the tool returns the stored forward. It doesn't describe authentication or rate limits, but adds enough beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the core action and return value. Each sentence (purpose, return, frame reset, host immutability/alternative) adds distinct value with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering destructive/idempotent/open-world traits and full schema descriptions, the description fills remaining gaps: return value, frame reset semantics, and host immutability. It could clarify why `host` is required if immutable, but it is largely complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and already documents each parameter. The description adds a key constraint not in the schema: `host` cannot be changed, and reinforces the `frame` default reset behavior. This extra meaning justifies above the 3 baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb 'Update' and resource 'HTTP forward', with scope 'existing' and 'for a domain'. This clearly separates it from create_forward, delete_forward, and get_forward siblings without needing their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description says to use this for existing forwards and explicitly directs 'to move a forward, delete it and create it again' for host changes, providing an alternative. However, it doesn't state when to use update_forward versus other siblings like patch or upsert, or any prerequisites beyond the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_dns_recordCreate or update DNS recordADestructiveIdempotent
Make sure a host has exactly this record of the given type: updates the existing record for that host and type, or creates one if there is none. When updating, optional fields you leave out (e.g. ttl, priority) keep their stored value. Fails without changing anything if the host already has several records of that type (common for MX and TXT); then use patch_dns_record with a record_id, or create_dns_record to add another. Returns { action: "created" | "updated", record }.
| Name | Required | Description | Default |
|---|---|---|---|
| alg | No | required for DS: the DNSSEC signing algorithm number | |
| tag | No | required for DS (the key tag of the referenced DNSKEY) and for CAA (the property tag, e.g. issue, issuewild or iodef) | |
| ttl | No | time-to-live in seconds, 60-604800, must be a multiple of 60, defaults to 3600 | |
| data | Yes | the record's main value: an IP address for A/AAAA, a hostname for ANAME/CNAME/MX/NS/SRV, free text for TXT, the CAA property value, or the hex hash for DS/TLSA | |
| host | Yes | the host/subdomain the record applies to, e.g. 'www' or '@' for the root | |
| port | No | required for SRV: the port the service is found on | |
| type | Yes | the record type | |
| dtype | No | required for TLSA: matching type of the hash in data (0 exact match, 1 SHA-256, 2 SHA-512) | |
| flags | No | required for CAA: 128 to mark the property critical, otherwise 0 | |
| usage | No | required for TLSA: certificate usage (0 PKIX-TA, 1 PKIX-EE, 2 DANE-TA, 3 DANE-EE) | |
| digest | No | required for DS: digest type of the hash in data (1 SHA-1, 2 SHA-256, 4 SHA-384) | |
| weight | No | required for SRV: relative weight among records with the same priority | |
| priority | No | required for MX and SRV: preference value, lower is tried first | |
| selector | No | required for TLSA: what the hash is taken from (0 full certificate, 1 subject public key) | |
| domain_id | Yes | the Domeneshop domain ID, from list_domains |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (idempotentHint/destructiveHint/openWorldHint), the description discloses merge semantics ('optional fields you leave out keep their stored value'), atomic failure behavior ('Fails without changing anything'), and the return shape. These are exactly the behavioral facts annotations cannot convey for a partially-destructive upsert.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the upsert semantics and ordered by likelihood of need: what it does, update merge behavior, failure case plus alternatives, return shape. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter tool with 100% schema coverage and no output schema, the description supplies the missing pieces: the uniqueness/failure precondition, the alternative routes, and the return payload. Nothing an agent needs to call this correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds real value on top: it clarifies that omitted optional fields such as ttl and priority retain stored values on update rather than reverting to schema defaults, and it introduces the record_id parameter that lives in patch_dns_record.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource+scope: 'Make sure a host has exactly this record of the given type: updates the existing record for that host and type, or creates one if there is none.' An agent can distinguish it from create_dns_record, update_dns_record, and patch_dns_record without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly defines the failure condition (host already has several records of that type, common for MX/TXT) and routes the agent to named alternatives: patch_dns_record with a record_id, or create_dns_record to add another. Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
17 tool updates
v1.1.1- First observed
create_dns_record - First observed
create_forward - First observed
delete_dns_record - First observed
delete_forward - First observed
get_dns_record - First observed
get_domain - First observed
get_forward - First observed
get_invoice - First observed
list_dns_records - First observed
list_domains - First observed
list_forwards - First observed
list_invoices - First observed
patch_dns_record - First observed
update_dns_record - First observed
update_dyndns - First observed
update_forward - First observed
upsert_dns_record
TDQS
Scored across 17 tools
Most tools map to distinct resource+action pairs (domains, DNS records, forwards, dyndns, invoices). The one soft spot is the trio update_dns_record / patch_dns_record / upsert_dns_record, which all modify a DNS record; descriptions explicitly differentiate replace-vs-partial-vs-ensure semantics and even steer toward patch, so misselection is unlikely but not impossible.
Every tool follows a clean snake_case verb_noun pattern (list_domains, get_dns_record, create_forward, update_dyndns, etc.) with no mixed conventions or vague verbs. Pluralization is used consistently for collection tools and singular for single-resource tools.
17 tools is slightly above the comfortable 3-15 band, but the surface spans four sub-resources (domains, DNS records, forwards, invoices) plus dyndns, and nearly every tool earns its place. The DNS record CRUD set is large but justified by real API semantics (patch vs update vs upsert).
DNS records and HTTP forwards both have full list/get/create/update/delete lifecycles, and invoices and domains are covered read-side, so core workflows have no dead ends. Domain registration/transfer/delete operations are absent, but these appear outside the stated account-management scope.
Maintenance
Related MCP Connectors
Register, transfer and manage domain names and DNS from your AI agent.
Domeneshop-e-post og DNS i AI-assistenten din: søk, les, skriv, send. Gratis.
Buy & manage domains from any AI chat: availability, register, DNS, email forwarding, AI bot stats.
Domain search, registration, DNS, marketplace, and checkout with your AI agent.
Related MCP Servers
- AlicenseBqualityCmaintenanceEnables natural language domain management through Dynadot, supporting domain registration, DNS configuration, transfers, WHOIS contacts, and bulk operations across 106 API actions.1015 npm13MIT

Name.com MCP Serverofficial
AlicenseNot gradedqualityAmaintenanceEnables AI assistants to perform comprehensive domain management tasks through the Name.com API, including registration, DNS management, and transfers. It dynamically generates tools from the OpenAPI specification to facilitate natural language interaction with all Name.com services.56 npm3MIT- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage Gandi domains and LiveDNS records directly via the Gandi API v5. It supports comprehensive domain management operations and full CRUD functionality for various DNS record types.3MIT
- AlicenseAqualityDmaintenanceEnables AI agents to check domain availability, purchase domains via Stripe, and perform full DNS and nameserver management. It facilitates automated domain lifecycle tasks like record updates and transfer locks without requiring CAPTCHAs.MIT