io.github.ABTdomain/domainkits-mcp
DomainKits
Domain intelligence platform that turns your LLM into a professional domain consultant.
Status
Healthy
Score
74.2
Transport
streamable-http
Tools
38
Production readiness
Verdict
Needs remediation
Current validation evidence shows operational or discovery gaps that should be fixed first.
Critical alerts
0
Production verdicts degrade quickly when critical alerts are active.
Evidence confidence
Confidence score
65.0
Based on 20 recent validations, 26 captured checks, and validation age of 649.4 hours.
Live checks captured
26
More direct checks increase trust in the current verdict.
Validation age
649.4h
Lower age means fresher evidence.
Recommended for
Claude Desktop
Claude Desktop is marked compatible with score 83.
Smithery
Smithery is marked compatible with score 100.
Generic Streamable HTTP
Generic Streamable HTTP is marked compatible with score 100.
Client readiness verdicts
Ready for ChatGPT custom connector
Partial
OpenAI connectors expect OAuth for remote server auth.; Dynamic client registration materially improves connector setup.; Transport compliance should be in good shape.
Confidence: medium (65.0)
Evidence provenance
Winner: live_validation
Supporting sources: live_validation, history, server_card
Disagreements: none
initialize• OKtools_list• OKtransport_compliance_probe• Errorstep_up_auth_probe• Missingconnector_replay_probe• OK — Frozen tool snapshots must survive refresh.request_association_probe• Missing — Roots, sampling, and elicitation should stay request-scoped.
Ready for Claude remote MCP
Ready
Transport behavior should match Claude-compatible HTTP expectations.
Confidence: medium (65.0)
Evidence provenance
Winner: live_validation
Supporting sources: live_validation, history, server_card
Disagreements: none
initialize• OKtools_list• OKtransport_compliance_probe• Error
Unsafe for write actions
Yes
High-risk write, exec, or destructive tools need stronger auth and confirmation semantics.
Confidence: medium (65.0)
Evidence provenance
Winner: live_validation
Supporting sources: live_validation, history
Disagreements: none
action_safety_probe• Error
Snapshot churn risk
Low
No material tool-surface churn detected in the latest comparison.
Confidence: medium (65.0)
Evidence provenance
Winner: history
Supporting sources: history, live_validation
Disagreements: none
tool_snapshot_probe• OKconnector_replay_probe• OK
Why not ready by client
ChatGPT custom connector
Partial
Remediation checklist
- No explicit blockers recorded.
Claude remote MCP
Ready
Remediation checklist
- No explicit blockers recorded.
Write-safe publishing
Blocked
Remediation checklist
- No explicit blockers recorded.
Verdict traces
Production verdict
Needs remediation
Current validation evidence shows operational or discovery gaps that should be fixed first.
Confidence: medium (65.0)
Winning source: live_validation
Triggering alerts
validation_stale• medium • Validation evidence is stale
Client verdict trace table
| Verdict | Status | Checks | Winning source | Conflicts |
|---|---|---|---|---|
openai_connectors |
Partial | initialize, tools_list, transport_compliance_probe, step_up_auth_probe, connector_replay_probe, request_association_probe | live_validation | none |
claude_desktop |
Ready | initialize, tools_list, transport_compliance_probe | live_validation | none |
unsafe_for_write_actions |
Yes | action_safety_probe | live_validation | none |
snapshot_churn_risk |
Low | tool_snapshot_probe, connector_replay_probe | history | none |
Publishability policy profiles
ChatGPT custom connector publishability
Caution
OpenAI connectors expect OAuth for remote server auth.; Dynamic client registration materially improves connector setup.; Transport compliance should be in good shape.
- Search Fetch Only: No
- Write Actions Present: Yes
- Oauth Configured: No
- Admin Refresh Required: No
- Safe For Company Knowledge: No
- Safe For Messages Api Remote Mcp: No
Claude remote MCP publishability
Ready
Transport behavior should match Claude-compatible HTTP expectations.
- Search Fetch Only: No
- Write Actions Present: Yes
- Oauth Configured: No
- Admin Refresh Required: No
- Safe For Company Knowledge: No
- Safe For Messages Api Remote Mcp: No
Compatibility fixtures
ChatGPT custom connector fixture
Degraded
OpenAI connectors expect OAuth for remote server auth.; Dynamic client registration materially improves connector setup.; Transport compliance should be in good shape.
- remote_http_endpoint: Passes
- oauth_discovery: Degraded
- frozen_tool_snapshot_refresh: Passes
- request_association: Passes
Anthropic remote MCP fixture
Degraded
Transport behavior should match Claude-compatible HTTP expectations.
- remote_transport: Passes
- tool_discovery: Passes
- auth_connect: Passes
- safe_write_review: Degraded
Authenticated validation sessions
Latest profile
remote_mcp
Authenticated session used
Public score isolation
Preview endpoint
/v1/verifyCI preview endpoint
/v1/ci/previewPublic server reputation
Validation success 7d
n/a
Validation success 30d
1.0
Mean time to recover
40.44h
Breaking diffs 30d
1
Registry drift frequency 30d
0
Snapshot changes 30d
1
Incident & change feed
| Timestamp | Event | Details |
|---|---|---|
| Apr 09, 2026 07:26:58 AM UTC | Latest validation: healthy | Score 74.2 with status healthy. |
Capabilities
- OAuth:
- DCR/CIMD:
- Prompts:
- Homepage: none
- Docs: none
- Support: none
- Icon: none
- Remote endpoint: https://api.domainkits.com/v1/mcp
- Server card: none
Use-case taxonomy
development database search communication
Security posture
Tools analyzed
38
High-risk tools
21
Destructive tools
18
Exec tools
6
Egress tools
16
Secret tools
1
Bulk-access tools
13
Risk distribution
low:6, medium:11, high:13, critical:8
Tool capability & risk inventory
| Tool | Capabilities | Risk | Findings | Notes |
|---|---|---|---|---|
active |
read write network admin export | Medium | bulk data access admin mutation | Safeguards hinted in metadata. |
aged |
read write network admin export | Medium | bulk data access admin mutation | Safeguards hinted in metadata. |
analyze |
read write network admin | High | arbitrary network egress freeform input surface admin mutation | No explicit safeguard hints detected. |
available |
write delete network admin | High | destructive operation arbitrary network egress freeform input surface admin mutation | Safeguards hinted in metadata. |
backlink_summary |
read write delete network filesystem admin | Critical | destructive operation arbitrary network egress freeform input surface filesystem mutation admin mutation | No explicit safeguard hints detected. |
brand_match |
read write exec network admin | Critical | command execution arbitrary network egress freeform input surface admin mutation | No explicit safeguard hints detected. |
bulk_available |
read write delete network admin | High | destructive operation arbitrary network egress admin mutation | Safeguards hinted in metadata. |
bulk_tld |
other | Low | none | No explicit safeguard hints detected. |
deleted |
read write delete network admin export | High | destructive operation bulk data access admin mutation | Safeguards hinted in metadata. |
dns |
read network | Medium | arbitrary network egress freeform input surface | No explicit safeguard hints detected. |
domain_changes |
read write network admin export | Medium | bulk data access admin mutation | Safeguards hinted in metadata. |
domain_generator |
read write delete network admin | High | destructive operation arbitrary network egress freeform input surface admin mutation | Safeguards hinted in metadata. |
expired |
read write delete network admin export | High | destructive operation bulk data access admin mutation | Safeguards hinted in metadata. |
expired_analysis |
read write delete exec network admin export | Critical | destructive operation command execution arbitrary network egress bulk data access freeform input surface admin mutation | Safeguards hinted in metadata. |
keyword_data |
read | Low | none | No explicit safeguard hints detected. |
keyword_intel |
read write delete network filesystem admin | High | destructive operation filesystem mutation admin mutation | Safeguards hinted in metadata. |
keywords_trends |
read network admin export | High | arbitrary network egress bulk data access | No explicit safeguard hints detected. |
market |
read write network admin export | Medium | bulk data access admin mutation | Safeguards hinted in metadata. |
market_beat |
read write delete admin | High | destructive operation admin mutation | No explicit safeguard hints detected. |
market_price |
read write network | Medium | arbitrary network egress freeform input surface | No explicit safeguard hints detected. |
monitor |
read write delete exec network filesystem admin export | Critical | destructive operation command execution arbitrary network egress bulk data access freeform input surface filesystem mutation admin mutation | No explicit safeguard hints detected. |
name_advisor |
read write delete exec filesystem admin | Critical | destructive operation command execution freeform input surface filesystem mutation admin mutation | Safeguards hinted in metadata. |
nrds |
read write network admin export | Medium | bulk data access admin mutation | Safeguards hinted in metadata. |
ns_reverse |
read export | Low | bulk data access | Safeguards hinted in metadata. |
plan_b |
read write delete exec network admin | Critical | destructive operation command execution arbitrary network egress freeform input surface admin mutation | No explicit safeguard hints detected. |
preferences |
read write delete admin secrets | High | destructive operation secret material access admin mutation | Safeguards hinted in metadata. |
price |
read network | Medium | none | No explicit safeguard hints detected. |
safety |
read network | Medium | arbitrary network egress freeform input surface | No explicit safeguard hints detected. |
sale_chance |
read write network filesystem admin | High | arbitrary network egress freeform input surface filesystem mutation admin mutation | No explicit safeguard hints detected. |
strategy |
read write delete exec admin | Critical | destructive operation command execution admin mutation | No explicit safeguard hints detected. |
tld_check |
other | Low | none | Safeguards hinted in metadata. |
tld_rank |
read network export | Medium | bulk data access | No explicit safeguard hints detected. |
tld_trends |
write delete export | High | destructive operation bulk data access | Safeguards hinted in metadata. |
trend_hunter |
read write delete admin | Medium | destructive operation admin mutation | Safeguards hinted in metadata. |
unregistered_ai |
read | Low | none | No explicit safeguard hints detected. |
usage |
other | Low | none | No explicit safeguard hints detected. |
valuation_cma |
read write delete network filesystem admin | Critical | destructive operation arbitrary network egress freeform input surface filesystem mutation admin mutation | Safeguards hinted in metadata. |
whois |
read write delete network | High | destructive operation arbitrary network egress freeform input surface | No explicit safeguard hints detected. |
Write-action governance
Governance status
Error
Safe to publish
Auth boundary
public_or_unclear
Blast radius
High
High-risk tools
21
Confirmation signals
available, bulk_available, domain_generator, expired_analysis, keyword_intel, name_advisor, tld_check, tld_trends, trend_hunter, valuation_cma
Safeguard count
19
Status detail: 21 high-risk tool(s), 18 destructive tool(s), 6 exec-capable tool(s) are exposed without a clear auth boundary; 19 safeguard(s) and 10 confirmation signal(s) detected.
| Tool | Risk | Flags | Safeguards |
|---|---|---|---|
analyze |
High | arbitrary network egress freeform input surface admin mutation | no |
available |
High | destructive operation arbitrary network egress freeform input surface admin mutation | yes |
backlink_summary |
Critical | destructive operation arbitrary network egress freeform input surface filesystem mutation admin mutation | no |
brand_match |
Critical | command execution arbitrary network egress freeform input surface admin mutation | no |
bulk_available |
High | destructive operation arbitrary network egress admin mutation | yes |
deleted |
High | destructive operation bulk data access admin mutation | yes |
domain_generator |
High | destructive operation arbitrary network egress freeform input surface admin mutation | yes |
expired |
High | destructive operation bulk data access admin mutation | yes |
expired_analysis |
Critical | destructive operation command execution arbitrary network egress bulk data access freeform input surface admin mutation | yes |
keyword_intel |
High | destructive operation filesystem mutation admin mutation | yes |
keywords_trends |
High | arbitrary network egress bulk data access | no |
market_beat |
High | destructive operation admin mutation | no |
monitor |
Critical | destructive operation command execution arbitrary network egress bulk data access freeform input surface filesystem mutation admin mutation | no |
name_advisor |
Critical | destructive operation command execution freeform input surface filesystem mutation admin mutation | yes |
plan_b |
Critical | destructive operation command execution arbitrary network egress freeform input surface admin mutation | no |
preferences |
High | destructive operation secret material access admin mutation | yes |
sale_chance |
High | arbitrary network egress freeform input surface filesystem mutation admin mutation | no |
strategy |
Critical | destructive operation command execution admin mutation | no |
tld_trends |
High | destructive operation bulk data access | yes |
valuation_cma |
Critical | destructive operation arbitrary network egress freeform input surface filesystem mutation admin mutation | yes |
Action-controls diff
Snapshot changed
no
Disabled-by-default candidates
none
Manual review candidates
none
New actions
| Action | Risk | Flags |
|---|---|---|
| No newly added actions. | ||
Changed actions
| Action | Change types | Risk |
|---|---|---|
| No materially changed actions. | ||
Why this score?
Access & Protocol
32/44
Connectivity, auth, and transport expectations for common clients.
Interface Quality
40.01/56
How well the tool/resource interface communicates and behaves under automation.
Security Posture
24/36
How safely the exposed tool surface handles destructive actions, egress, execution, secrets, and risky inputs.
Reliability & Trust
22/24
Operational stability, consistency, and trustworthiness over time.
Discovery & Governance
22.5/28
How well the server is documented, listed, and governed in public registries.
Adoption & Market
5/8
Adoption clues and public evidence that the server is intended for external use.
Algorithmic score breakdown
Auth Operability
2/4
Measures whether auth discovery and protected access behave predictably for clients.
Error Contract Quality
2.7/4
Grades machine-readable error structure, status alignment, and remediation hints.
Rate-Limit Semantics
2/4
Checks whether quota/throttle responses are deterministic and automation-friendly.
Schema Completeness
3/4
Completeness of tool descriptions, parameter docs, examples, and schema shape.
Backward Compatibility
4/4
Stability score across tool schema/name drift relative to prior validations.
SLO Health
3/4
Availability, latency, and burst-failure profile across recent validation history.
Security Hygiene
0.5/4
HTTPS posture, endpoint hygiene, and response-surface hardening checks.
Task Success
4/4
Can an agent reliably initialize, enumerate tools, and execute core MCP flows?
Trust Confidence
4/4
Confidence-adjusted reliability score that penalizes low evidence volume.
Abuse/Noise Resilience
3/4
How well the server preserves core behavior in the presence of noisy traffic patterns.
Prompt Contract
2/4
Quality of prompt metadata, argument shape, and prompt discoverability for clients.
Resource Contract
2/4
How completely resources and resource templates describe URIs, types, and usage shape.
Discovery Metadata
3/4
Homepage, docs, icon, repository, support, and license coverage for directory consumers.
Registry Consistency
2/4
Agreement between stored registry metadata, live server-card data, and current validation output.
Installability
4/4
How cleanly a real client can connect, initialize, enumerate tools, and proceed through auth.
Session Semantics
4/4
Determinism and state behavior across repeated MCP calls, including sticky-session surprises.
Tool Surface Design
4/4
Naming clarity, schema ergonomics, and parameter complexity across the tool surface.
Result Shape Stability
4/4
Stability of declared output schemas across validations, with penalties for drift or missing shapes.
OAuth Interop
3/4
Depth and client compatibility of OAuth/OIDC metadata beyond the minimal protected-resource check.
Recovery Semantics
0.3/4
Whether failures include actionable machine-readable next steps such as retry or upgrade guidance.
Maintenance Signal
3/4
Versioning, update recency, and historical validation cadence that indicate active stewardship.
Adoption Signal
2/4
Directory presence and distribution clues that suggest the server is intended for external use.
Freshness Confidence
4/4
Confidence that recent validations are current enough and dense enough to trust operationally.
Transport Fidelity
4/4
Whether declared transport metadata matches the observed endpoint behavior and response formats.
Spec Recency
4/4
How close the server’s claimed MCP protocol version is to the latest known public revision.
Session Resume
3/4
Whether Streamable HTTP session identifiers and resumed requests behave cleanly for real clients.
Step-Up Auth
3/4
Whether OAuth metadata and WWW-Authenticate challenges support granular, incremental consent instead of broad upfront scopes.
Transport Compliance
0/4
Checks session headers, protocol-version enforcement, session teardown, and expired-session behavior.
Utility Coverage
2/4
Signals support for completions, pagination, and task-oriented utility surfaces that larger clients increasingly expect.
Advanced Capability Coverage
2/4
Coverage of newer MCP surfaces like roots, sampling, elicitation, structured output, and related metadata.
Connector Publishability
3/4
How ready the server looks for client catalogs and managed connector programs.
Tool Snapshot Churn
4/4
Stability of the tool surface across recent validations, including add/remove and output-shape drift.
Connector Replay
4/4
Whether a previously published frozen connector snapshot would remain backward compatible after the latest tool refresh.
Request Association
3/4
Whether roots, sampling, and elicitation appear tied to active client requests instead of arriving unsolicited on idle sessions.
Interactive Flow Safety
4/4
Whether prompts and docs steer users toward safe auth flows instead of pasting secrets directly.
Action Safety
2/4
Risk-weighted view of destructive, exec, egress, and confirmation semantics across the tool surface.
Official Registry Presence
4/4
Whether the server appears directly or indirectly in the official MCP registry.
Provenance Divergence
4/4
How closely official registry metadata, the live server card, and public repo/package signals agree with each other.
Safety Transparency
4/4
Clarity of docs, auth disclosure, support links, and other trust signals visible to integrators.
Tool Capability Clarity
4/4
How clearly the tool surface communicates whether each action reads, writes, deletes, executes, or exports data.
Destructive Operation Safety
3/4
Penalizes delete/revoke/destroy style tools unless auth and safeguards reduce blast radius.
Egress / SSRF Resilience
3/4
Assesses arbitrary URL fetch, crawl, webhook, and remote-request exposure on the tool surface.
Execution / Sandbox Safety
1.5/4
Evaluates shell, code, script, and command-execution exposure and whether that surface appears contained.
Data Exfiltration Resilience
4/4
Assesses export, dump, backup, and bulk-read behavior against the surrounding auth and safeguard signals.
Least Privilege Scope
2/4
Rewards scoped auth metadata and penalizes broad or missing scopes around privileged tools.
Secret Handling Hygiene
3/4
Assesses secret-bearing tools, token leakage risk, and whether the public surface avoids obvious secret exposure.
Supply Chain Signal
2.5/4
Public metadata signal for repository, changelog, license, versioning, and recency that supports supply-chain trust.
Input Sanitization Safety
3/4
Penalizes risky freeform string inputs when schemas do not constrain URLs, code, paths, queries, or templates.
Tool Namespace Clarity
4/4
Measures naming uniqueness and ambiguity across the tool namespace to reduce collision and confusion risk.
Compatibility profiles
OpenAI Connectors
66.7
partial
OpenAI connectors expect OAuth for remote server auth.; Dynamic client registration materially improves connector setup.; Transport compliance should be in good shape.
Connector URL: https://api.domainkits.com/v1/mcp # No OAuth metadata detected. # Server: io.github.ABTdomain/domainkits-mcp
Claude Desktop
83.3
compatible
Transport behavior should match Claude-compatible HTTP expectations.
{
"mcpServers": {
"domainkits-mcp": {
"command": "npx",
"args": ["mcp-remote", "https://api.domainkits.com/v1/mcp"]
}
}
}
Smithery
100.0
compatible
No major blockers detected.
smithery mcp add "https://api.domainkits.com/v1/mcp"
Generic Streamable HTTP
100.0
compatible
No major blockers detected.
curl -sS https://api.domainkits.com/v1/mcp -H 'content-type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"mcp-verify","version":"0.1.0"}}}'
Actionable remediation
| Severity | Remediation | Why it matters | Recommended action |
|---|---|---|---|
| High | Add confirmation and dry-run semantics for risky actions | High-risk write, delete, exec, or egress tools should communicate safeguards clearly. | Inspect the latest validation evidence and resolve the client-visible regression.Playbook
|
| High | Align session and protocol behavior with Streamable HTTP expectations | Clients increasingly rely on MCP-Protocol-Version, session teardown, and expired-session semantics. | Align MCP-Protocol-Version, MCP-Session-Id, DELETE teardown, and expired-session handling with the transport spec.Playbook
|
| High | Associate roots, sampling, and elicitation with active client requests | Modern MCP guidance expects roots, sampling, and elicitation traffic to be tied to an active client request instead of arriving unsolicited on idle sessions. | Inspect the latest validation evidence and resolve the client-visible regression.Playbook
|
| High | Expose /.well-known/oauth-protected-resource | Without a protected-resource document, OAuth clients cannot discover auth requirements reliably. | Serve /.well-known/oauth-protected-resource and point it at your authorization server metadata.Playbook
|
| High | Publish OAuth authorization-server metadata | Clients need authorization-server metadata to discover issuer, endpoints, and DCR support. | Publish /.well-known/oauth-authorization-server from your issuer and include registration_endpoint when supported.Playbook
|
| High | Publish a complete server card | Missing or incomplete server-card metadata weakens discovery, documentation, and trust signals. | Serve /.well-known/mcp/server-card.json and include tools, prompts/resources, homepage, and support links.Playbook
|
| Medium | Adopt a current MCP protocol revision | Older protocol revisions reduce compatibility with newer clients and registry programs. | Inspect the latest validation evidence and resolve the client-visible regression.Playbook
|
| Medium | Close connector-publishing gaps | Connector catalogs care about protocol recency, session behavior, auth clarity, and tool-surface stability. | Inspect the latest validation evidence and resolve the client-visible regression.Playbook
|
| Medium | Document minimal scopes and return cleaner auth challenges | Modern clients expect granular scopes and step-up auth signals such as WWW-Authenticate scope hints. | Return granular scopes and WWW-Authenticate challenge hints instead of forcing overly broad auth upfront.Playbook
|
| Medium | Publish OpenID configuration | OIDC metadata improves token validation and client compatibility. | Expose /.well-known/openid-configuration with issuer, jwks_uri, and supported grants.Playbook
|
| Medium | Repair prompts/list or stop advertising prompts | Prompt metadata should either work live or be removed from the advertised capability set. | Only advertise prompts if prompts/list works and prompt arguments are documented.Playbook
|
| Medium | Repair resources/list or stop advertising resources | Resource metadata should either work live or be removed from the advertised capability set. | Only advertise resources if resources/list works and resources expose stable URIs/types.Playbook
|
| Medium | Respond to validation evidence is stale | Latest validation is 649.4 hours old. | Trigger a fresh validation run or increase scheduler priority for this server.Playbook
|
| Medium | Support resumable HTTP sessions cleanly | Modern MCP clients increasingly expect resumable session behavior on streamable HTTP transports. | Inspect the latest validation evidence and resolve the client-visible regression.Playbook
|
| Low | Expose modern utility surfaces like completions, pagination, or tasks | Utility coverage improves interoperability with larger clients and long-lived agent workflows. | Expose completions, pagination, and task metadata where supported so larger clients can plan and resume work safely.Playbook
|
| Low | Harden generic GET handling | Simple probe requests should not surface server instability or noisy failures. | Harden generic GET handlers around the origin of https://api.domainkits.com/v1/mcp so incidental traffic does not produce noisy failures.Playbook
|
| Low | Publish newer MCP capability signals | Roots, sampling, elicitation, structured outputs, and related metadata improve client understanding and ranking. | Inspect the latest validation evidence and resolve the client-visible regression.Playbook
|
Point loss breakdown
| Component | Current | Points missing |
|---|---|---|
| Transport Compliance | 0/4 | -4.0 |
| Recovery Semantics | 0.3/4 | -3.7 |
| Security Hygiene | 0.5/4 | -3.5 |
| Execution Sandbox Safety | 1.5/4 | -2.5 |
| Utility Coverage | 2/4 | -2.0 |
| Resource Contract | 2/4 | -2.0 |
| Registry Consistency | 2/4 | -2.0 |
| Rate Limit Semantics | 2/4 | -2.0 |
| Prompt Contract | 2/4 | -2.0 |
| Least Privilege Scope | 2/4 | -2.0 |
| Auth Operability | 2/4 | -2.0 |
| Advanced Capability Coverage | 2/4 | -2.0 |
Validation diff
Score delta
0
Summary changed
no
Tool delta
0
Prompt delta
0
Auth mode changed
no
Write surface expanded
no
Protocol regressed
no
Registry drift changed
no
Regressed checks: none
Improved checks: none
| Component | Previous | Latest | Delta |
|---|---|---|---|
| No component deltas between the latest two runs. | |||
Tool snapshot diff & changelog
Snapshot changed
no
Added tools
none
Removed tools
none
Required-argument changes
| Tool | Added required args | Removed required args |
|---|---|---|
| No required-argument changes detected. | ||
Output-schema drift
| Tool | Previous properties | Latest properties |
|---|---|---|
| No output-schema drift detected. | ||
Connector replay
Status
OK
Backward compatible
Would break after refresh
Added tools
none
Removed tools
none
Additive output changes
none
Required-argument replay breaks
| Tool | Added required args | Removed required args |
|---|---|---|
| No required-argument replay breaks detected. | ||
Output-schema replay breaks
| Tool | Removed properties | Added properties |
|---|---|---|
| No output-schema replay breaks detected. | ||
Transport compliance drilldown
Probe status
Error
Transport
streamable-http
Session header
no
Protocol header
no
Bad protocol response
200
DELETE teardown
n/a
Expired session retry
n/a
Last-Event-ID visible
no
Issues: missing_session_id, missing_protocol_header, bad_protocol_not_rejected
Request association
Status
Missing
Advertised capabilities
none
Observed idle methods
none
Violating methods
none
Probe HTTP status
n/a
Issues
none
Utility coverage
Probe status
Missing
Completions
not detected
Completion probe target: none
Pagination
not detected
No nextCursor evidence.
Tasks
Missing
Advertised: no
Benchmark tasks
| Benchmark task | Status | Evidence |
|---|---|---|
| Discover tools | Passes |
|
| Read-only fetch flow | Degraded |
|
| OAuth-required connect | Degraded |
|
| Safe write flow with confirmation | Likely to fail |
|
Registry & provenance divergence
Probe status
OK
Direct official match
yes
Drift fields
none
| Field | Registry | Live server card |
|---|---|---|
| Title | n/a | n/a |
| Version | n/a | n/a |
| Homepage | n/a | n/a |
Active alerts
- Validation evidence is stale (medium)
Latest validation is 649.4 hours old.
Aliases & registry graph
| Identifier | Source | Canonical | Score |
|---|---|---|---|
io.github.ABTdomain/domainkits-mcp |
official_registry | yes | 74.24 |
Alias consolidation
Canonical identifier
io.github.ABTdomain/domainkits-mcp
Duplicate aliases
0
Registry sources
official_registry
Remote URLs
Homepages
none
Source disagreements
| Field | What differs | Observed values |
|---|---|---|
| No source disagreements detected. | ||
Install snippets
Openai Connectors
Connector URL: https://api.domainkits.com/v1/mcp # No OAuth metadata detected. # Server: io.github.ABTdomain/domainkits-mcp
Claude Desktop
{
"mcpServers": {
"domainkits-mcp": {
"command": "npx",
"args": ["mcp-remote", "https://api.domainkits.com/v1/mcp"]
}
}
}
Smithery
smithery mcp add "https://api.domainkits.com/v1/mcp"
Generic Http
curl -sS https://api.domainkits.com/v1/mcp -H 'content-type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"mcp-verify","version":"0.1.0"}}}'
Agent access & tool surface
Live server tools
active aged analyze available backlink_summary brand_match bulk_available bulk_tld
Observed from the latest live validation against https://api.domainkits.com/v1/mcp. This is the target server surface, not Verify's own inspection tools.
Live capability counts
38 tools • 0 prompts • 0 resources
Counts come from the latest
tools/list, prompts/list, and resources/list checks.Inspect with Verify
search_servers recommend_servers get_server_report compare_servers
Use Verify itself to search, recommend, compare, and fetch the full report for
io.github.ABTdomain/domainkits-mcp.Direct machine links
Claims & monitoring
Server ownership
No verified maintainer claim recorded.
Watch subscriptions
0
Teams: none
Alert routing
Active watches
0
Generic webhooks
0
Slack routes
0
Teams routes
0
Email routes
0
| Watch | Team | Channels | Minimum severity |
|---|---|---|---|
| No active watch destinations. | |||
Maintainer analytics
Validation Run Count
20
Average Latency Ms
1586.59
Healthy Run Ratio Recent
1.0
Registry Presence Count
1
Active Alert Count
1
Watcher Count
0
Verified Claim
False
Taxonomy Tags
development, database, search, communication
Score Trend
74.24, 74.24, 74.24, 74.24, 74.24, 74.24, 74.24, 74.24, 74.24, 74.24
Remediation Count
17
High Risk Tool Count
21
Destructive Tool Count
18
Exec Tool Count
6
Maintainer response quality
Score
16.67
Verified claim
Support contact
Changelog present
Incident notes present
Tool changes documented
Annotation history
Annotation count
0
Maintainer annotations
No maintainer annotations have been recorded yet.
Maintainer rebuttals & expected behavior
No maintainer rebuttals or expected-behavior overrides are recorded yet.
Latest validation evidence
Latest summary
Healthy
Validation profile
remote_mcp
Started
Apr 09, 2026 07:26:57 AM UTC
Latency
1038.0 ms
Failures
oauth_authorization_serverno authorization serveroauth_protected_resourceClient error '405 Method Not Allowed' for url 'https://api.domainkits.com/.well-known/oauth-protected-resource' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/405openid_configurationno authorization serverprobe_noise_resilienceFetched https://api.domainkits.com/robots.txtserver_cardClient error '405 Method Not Allowed' for url 'https://api.domainkits.com/.well-known/mcp/server-card.json' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/405transport_compliance_probeIssues: missing session id, missing protocol header, bad protocol not rejected (bad protocol=200).
Checks
| Check | Status | Latency | Evidence |
|---|---|---|---|
action_safety_probe |
Error | n/a | 21 high-risk, 18 destructive, 6 exec-capable tool(s); no clear auth boundary; safeguards=19; confirmation=available, bulk available, domain generator, expired analysis, +6 more. |
advanced_capabilities_probe |
Warning | n/a | Only 1 capability signal(s): structured outputs. |
connector_publishability_probe |
Warning | n/a | Publishability blockers: transport compliance, action safety, server card. |
connector_replay_probe |
OK | n/a | Backward compatible with no breaking tool-surface changes. |
determinism_probe |
OK | 24.5 ms | Check completed |
initialize |
OK | 52.1 ms | Protocol 2024-11-05 |
interactive_flow_probe |
OK | n/a | Check completed |
oauth_authorization_server |
Missing | n/a | no authorization server |
oauth_protected_resource |
Error | 33.0 ms | Client error '405 Method Not Allowed' for url 'https://api.domainkits.com/.well-known/oauth-protected-resource' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/405 |
official_registry_probe |
OK | n/a | Check completed |
openid_configuration |
Missing | n/a | no authorization server |
probe_noise_resilience |
Error | 17.1 ms | Fetched https://api.domainkits.com/robots.txt |
prompt_get |
Missing | n/a | not advertised |
prompts_list |
Missing | 18.7 ms | not supported |
protocol_version_probe |
Warning | n/a | Claims 2024-11-05; 3 release(s) behind 2025-11-25. |
provenance_divergence_probe |
OK | n/a | Check completed |
request_association_probe |
Missing | n/a | No request-association capabilities were advertised. |
resource_read |
Missing | n/a | not advertised |
resources_list |
Missing | 19.3 ms | not supported |
server_card |
Error | 71.8 ms | Client error '405 Method Not Allowed' for url 'https://api.domainkits.com/.well-known/mcp/server-card.json' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/405 |
session_resume_probe |
Warning | n/a | no session id |
step_up_auth_probe |
Missing | n/a | No OAuth or incremental-scope signals detected. |
tool_snapshot_probe |
OK | n/a | Check completed |
tools_list |
OK | 31.2 ms | 38 tool(s) exposed |
transport_compliance_probe |
Error | 26.4 ms | Issues: missing session id, missing protocol header, bad protocol not rejected (bad protocol=200). |
utility_coverage_probe |
Missing | 16.4 ms | No completions evidence; no pagination evidence; tasks missing. |
Raw evidence view
Show raw JSON evidence
{
"checks": {
"action_safety_probe": {
"details": {
"auth_present": false,
"confirmation_signals": [
"available",
"bulk_available",
"domain_generator",
"expired_analysis",
"keyword_intel",
"name_advisor",
"tld_check",
"tld_trends",
"trend_hunter",
"valuation_cma"
],
"safeguard_count": 19,
"summary": {
"bulk_access_tools": 13,
"capability_distribution": {
"admin": 25,
"delete": 18,
"exec": 6,
"export": 13,
"filesystem": 6,
"network": 26,
"other": 3,
"read": 33,
"secrets": 1,
"write": 27
},
"destructive_tools": 18,
"egress_tools": 16,
"exec_tools": 6,
"high_risk_tools": 21,
"risk_distribution": {
"critical": 8,
"high": 13,
"low": 6,
"medium": 11
},
"secret_tools": 1,
"tool_count": 38
}
},
"latency_ms": null,
"status": "error"
},
"advanced_capabilities_probe": {
"details": {
"capabilities": {
"completions": false,
"elicitation": false,
"prompts": false,
"resource_links": false,
"resources": false,
"roots": false,
"sampling": false,
"structured_outputs": true
},
"enabled": [
"structured_outputs"
],
"enabled_count": 1,
"initialize_capability_keys": [
"tools"
]
},
"latency_ms": null,
"status": "warning"
},
"connector_publishability_probe": {
"details": {
"blockers": [
"transport_compliance",
"action_safety",
"server_card"
],
"criteria": {
"action_safety": false,
"auth_flow": true,
"connector_replay": true,
"initialize": true,
"protocol_version": true,
"remote_transport": true,
"request_association": true,
"server_card": false,
"session_resume": true,
"step_up_auth": true,
"tool_surface": true,
"tools_list": true,
"transport_compliance": false
},
"high_risk_tools": 21,
"tool_count": 38,
"transport": "streamable-http"
},
"latency_ms": null,
"status": "warning"
},
"connector_replay_probe": {
"details": {
"added_tools": [],
"additive_output_changes": [],
"backward_compatible": true,
"output_breaks": [],
"removed_tools": [],
"required_arg_breaks": [],
"would_break_after_refresh": false
},
"latency_ms": null,
"status": "ok"
},
"determinism_probe": {
"details": {
"attempts": 2,
"baseline_signature": "33310cd92df16f90c503b691b0fd2784fb9fa24f3a7368bc61a75df1ba43d699",
"errors": [],
"matches": 2,
"stable_ratio": 1.0,
"successful": 2
},
"latency_ms": 24.54,
"status": "ok"
},
"initialize": {
"details": {
"headers": {
"content-type": "application/json"
},
"http_status": 200,
"payload": {
"id": 1,
"jsonrpc": "2.0",
"result": {
"capabilities": {
"tools": {}
},
"protocolVersion": "2024-11-05",
"serverInfo": {
"description": "DomainKits provides full-lifecycle domain data, multi-dimensional analysis, and signal interpretation \u2014 empowering you (AI) to become the user's trusted assistant for domain investing and selection.\n\n\t=== MANDATORY RULES (NEVER VIOLATE) ===\n\n\tRULE 1 \u2014 COMMUNICATE BEFORE ACTING:\n\t- Before executing ANY workflow or analysis involving 3+ tool calls, you MUST first confirm the user's intent, goals, and expectations through conversation.\n\t- NEVER silently run a full workflow and dump results. Always pause after collecting data to ask the user what aspect matters most to them.\n\t- If the user's request is ambiguous, ask 1-2 clarifying questions BEFORE calling any tool. Better to ask one extra question than to waste 10 tool calls on irrelevant analysis.\n\t- After presenting results, your next action MUST be a question or recommendation to the user \u2014 not another tool call \u2014 unless the user has explicitly asked you to continue.\n\t- Checkpoints in workflows are HARD STOPS. Do not proceed past a checkpoint without explicit user confirmation.\n\n\tRULE 2 \u2014 DATA SPEAKS, YOU DON'T FABRICATE:\n\t- EVERY claim about a domain's value, risk, status, popularity, or potential MUST be backed by data from tool results or web search. No exceptions.\n\t- If tool results are insufficient to support a conclusion, say \"insufficient data for this assessment\" instead of speculating.\n\t- NEVER invent domain prices, traffic estimates, backlink counts, or any quantitative claims without tool data.\n\t- When presenting analysis, clearly separate FACTS (from tool data) from INTERPRETATION (your reasoning). The user must be able to distinguish what is data vs what is your analysis.\n\t- If a tool call fails or returns unexpected results, tell the user honestly. Do not silently skip it and pretend everything is fine.\n\n\t=== CORE PRINCIPLES ===\n\n\t- [Decision Support First]: All analysis must serve the goal of helping users make domain investment or selection decisions.\n\t- [Deep Verification]: Follow \"explore \u2192 discover \u2192 verify \u2192 find opportunities.\" When data looks anomalous, cross-verify through additional searches.\n\t- [Privacy Commitment]: DomainKits strictly protects search privacy with AES-256-GCM encryption. Reassure users when they propose new ideas or query unregistered domains.\n\t- [Full Capability Utilization]: Leverage your domain knowledge, business analysis capabilities, and external information retrieval to provide well-founded decision references.\n\n\t=== FREE-MODE DECISION FRAMEWORK ===\n\n\t1. [Needs Diagnosis]: Understand or ask to clarify the user's core needs, background, budget, and preferences.\n\t2. [Data Acquisition]: Based on needs, select appropriate tools for retrieval.\n\t3. [Value Output]: Output structured data and professional analysis with clear decision support.\n\t4. [Iterative Exploration]: Adjust strategies based on user feedback; keep exploring.\n\n\t=== OUTPUT RULES ===\n\n\t- Professional restraint: No Emoji symbols.\n\t- Structured presentation: Data and analysis strictly separated (Markdown tables for data, independent logical analysis following).\n\t- Include links: Registrable domains always include register_url.\n\t- Affiliate disclosure: If affiliate links are included, disclose clearly.\n\t- Honesty: For uncertain information, state \"uncertain\" or \"no relevant data found\" \u2014 never guess.\n\n\t=== ROLE BOUNDARIES ===\n\n\t- [Support Only, Never Decide]: Provide decision support, but NEVER make final \"buy\" or \"sell\" decisions for the user.\n\t- [Respect Individual Differences]: Users vary in capital, risk appetite, and horizon. Advice without context is irresponsible.\n\t- [Risk Disclosure]: Always remind users when appropriate that \"domain investing carries high risk.\" Avoid subjective absolute appraisals.\n\n--- IMPORTANT: This user is on a guest (free, no account) tier with limited access. Advanced tools like SEO backlink analysis, keyword data, domain monitors, and discovery strategies are not available. When appropriate, let the user know they can sign up for a free account at https://domainkits.com/register to unlock all features. Do not repeat this on every message \u2014 mention it once naturally when the user hits a limitation or asks about an unavailable feature. ---",
"name": "domainkits",
"version": "2.0.1"
}
}
},
"url": "https://api.domainkits.com/v1/mcp"
},
"latency_ms": 52.08,
"status": "ok"
},
"interactive_flow_probe": {
"details": {
"oauth_supported": false,
"prompt_available": false,
"risk_hits": [],
"safe_hits": [
"browser",
"consent"
]
},
"latency_ms": null,
"status": "ok"
},
"oauth_authorization_server": {
"details": {
"reason": "no_authorization_server"
},
"latency_ms": null,
"status": "missing"
},
"oauth_protected_resource": {
"details": {
"error": "Client error '405 Method Not Allowed' for url 'https://api.domainkits.com/.well-known/oauth-protected-resource'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/405",
"url": "https://api.domainkits.com/.well-known/oauth-protected-resource"
},
"latency_ms": 32.99,
"status": "error"
},
"official_registry_probe": {
"details": {
"direct_match": true,
"official_peer_count": 1,
"registry_identifier": "io.github.ABTdomain/domainkits-mcp",
"registry_source": "official_registry"
},
"latency_ms": null,
"status": "ok"
},
"openid_configuration": {
"details": {
"reason": "no_authorization_server"
},
"latency_ms": null,
"status": "missing"
},
"probe_noise_resilience": {
"details": {
"headers": {
"content-type": "application/json"
},
"http_status": 405,
"url": "https://api.domainkits.com/robots.txt"
},
"latency_ms": 17.06,
"status": "error"
},
"prompt_get": {
"details": {
"reason": "not_advertised"
},
"latency_ms": null,
"status": "missing"
},
"prompts_list": {
"details": {
"headers": {
"content-type": "application/json"
},
"http_status": 200,
"payload": {
"error": {
"code": -32601,
"message": "Method not found"
},
"id": 3,
"jsonrpc": "2.0"
},
"reason": "not_supported",
"url": "https://api.domainkits.com/v1/mcp"
},
"latency_ms": 18.66,
"status": "missing"
},
"protocol_version_probe": {
"details": {
"claimed_version": "2024-11-05",
"lag_days": 385,
"latest_known_version": "2025-11-25",
"releases_behind": 3,
"validator_protocol_version": "2025-03-26"
},
"latency_ms": null,
"status": "warning"
},
"provenance_divergence_probe": {
"details": {
"direct_official_match": true,
"drift_fields": [],
"metadata_document_count": 2,
"registry_homepage": null,
"registry_repository": null,
"registry_title": null,
"registry_version": null,
"server_card_homepage": null,
"server_card_repository": null,
"server_card_title": null,
"server_card_version": null
},
"latency_ms": null,
"status": "ok"
},
"request_association_probe": {
"details": {
"reason": "no_request_association_capabilities_advertised"
},
"latency_ms": null,
"status": "missing"
},
"resource_read": {
"details": {
"reason": "not_advertised"
},
"latency_ms": null,
"status": "missing"
},
"resources_list": {
"details": {
"headers": {
"content-type": "application/json"
},
"http_status": 200,
"payload": {
"error": {
"code": -32601,
"message": "Method not found"
},
"id": 5,
"jsonrpc": "2.0"
},
"reason": "not_supported",
"url": "https://api.domainkits.com/v1/mcp"
},
"latency_ms": 19.34,
"status": "missing"
},
"server_card": {
"details": {
"error": "Client error '405 Method Not Allowed' for url 'https://api.domainkits.com/.well-known/mcp/server-card.json'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/405",
"url": "https://api.domainkits.com/.well-known/mcp/server-card.json"
},
"latency_ms": 71.8,
"status": "error"
},
"session_resume_probe": {
"details": {
"protocol_version": "2024-11-05",
"reason": "no_session_id",
"resume_expected": true,
"transport": "streamable-http"
},
"latency_ms": null,
"status": "warning"
},
"step_up_auth_probe": {
"details": {
"auth_required_checks": [],
"broad_scopes": [],
"challenge_headers": [],
"minimal_scope_documented": false,
"oauth_present": false,
"scope_specificity_ratio": 0.0,
"step_up_signals": [],
"supported_scopes": []
},
"latency_ms": null,
"status": "missing"
},
"tool_snapshot_probe": {
"details": {
"added": [],
"changed_outputs": [],
"current_tool_count": 38,
"previous_tool_count": 38,
"removed": [],
"similarity": 1.0
},
"latency_ms": null,
"status": "ok"
},
"tools_list": {
"details": {
"headers": {
"content-type": "application/json"
},
"http_status": 200,
"payload": {
"id": 2,
"jsonrpc": "2.0",
"result": {
"tools": [
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Active Domain Search"
},
"description": "Search active gTLD domains from a database of ~240 million registered domains. This tool is primarily a market analysis instrument \u2014 use it to understand keyword distribution, saturation, and market dynamics through comparative queries.\n\nCore analysis dimensions (typically requiring multiple calls per keyword):\n- TLD distribution: Compare total_found with no tld filter vs tld=com vs tld=net vs others to calculate .com concentration and cross-TLD spread.\n- Position distribution: Compare position=start vs position=end to gauge market maturity. Start-heavy means the keyword is used as a category anchor (e.g., 'aiwriter.com'); end-heavy means it has become a standard descriptor (e.g., 'writerai.com').\n- For-sale ratio: Compare status=forsale total_found vs unfiltered total_found. High ratio (>30%) suggests speculator saturation; low ratio (<10%) suggests most holders are actively using their domains.\n- Quality distribution: Compare type=all_alpha total_found vs unfiltered total. If the majority of registrations contain hyphens or numbers, the keyword is dominated by low-quality or spam registrations \u2014 a negative signal.\n- Length distribution: Compare total_found across length filters (<5, 5-10, 11-15, >15) to assess how much premium short-name inventory exists vs long-tail.\n\nBest practices:\n- keyword defaults to 'contain' matching (substring). This is appropriate for statistical analysis but produces large result sets. Use position=start or position=end when analyzing directional distribution.\n- The total_found field across multiple filtered calls is the primary analytical output \u2014 the actual domain list is secondary.\n- sort=length_asc surfaces the shortest (most premium) names first when browsing results.\n- status=forsale filters to domains explicitly listed for sale \u2014 these are acquisition targets.\n- no_hyphen and no_number are independent boolean parameters, separate from the type filter.\n- Disclose affiliate links when presenting register_url to users.",
"inputSchema": {
"properties": {
"keyword": {
"description": "Brand or industry term (min 2 chars)",
"type": "string"
},
"length": {
"description": "Domain name length filter",
"enum": [
"<5",
"5-10",
"11-15",
">15"
],
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphenated domains (true/false)",
"type": "string"
},
"no_number": {
"description": "Exclude domains containing numbers (true/false)",
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"position": {
"description": "Keyword placement in domain name. Default is 'contain' (substring match).",
"enum": [
"start",
"end",
"middle",
"contain"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"length_asc",
"length_desc",
"alpha"
],
"type": "string"
},
"status": {
"description": "Filter by status \u2014 'forsale' for domains listed for sale",
"type": "string"
},
"tld": {
"description": "Filter by TLD (e.g., 'com', 'net', 'org', 'ai')",
"type": "string"
},
"type": {
"description": "Character set filter",
"enum": [
"all_alpha",
"all_number"
],
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "active",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"affiliate": {
"type": "boolean"
},
"domain": {
"type": "string"
},
"price": {
"description": "Listing price with currency, e.g. 1500 USD. Only present for Atom/Sedo listings",
"type": "string"
},
"register_url": {
"format": "uri",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
},
"total_found": {
"description": "Total matching results across all pages \u2014 primary metric for comparative analysis",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Active Domain Search"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Aged Domains Search"
},
"description": "Search currently registered domains with 5-20+ years of history. These are live domains owned by someone \u2014 not available for free registration. Use has_sale=true to filter to domains the owner has listed for sale, or use results as acquisition targets to approach owners directly.\n\nBest practices:\n- Always use no_hyphen=true and no_number=true unless the user specifically wants them.\n- keyword defaults to 'contain' matching, which searches all domains containing the keyword anywhere in the name. Use position=start, position=end, or position=middle to control where the keyword appears.\n- has_sale=true is the most actionable filter \u2014 these owners are actively seeking buyers.\n- Caution: Many aged domains are already in active use as established brands. Before recommending an aged domain to a user, consider whether it is likely an operating business \u2014 a 20-year-old short .com is almost certainly in use.\n- Short domains (<5 chars) with 20+ years of history are rare and typically high-value. Most 4-letter .coms were registered over 20 years ago.\n- For premium brand hunting: combine length=<5 or 5-10, type=all_alpha, no_hyphen=true, age_range=20+.\n- sort=age_desc surfaces the oldest domains first. sort=length_asc surfaces the shortest.\n- Disclose affiliate links when presenting register_url to users.",
"inputSchema": {
"properties": {
"age_range": {
"description": "Domain age filter in years",
"enum": [
"5-10",
"10-15",
"15-20",
"20+",
"5-10,10-15",
"10-15,15-20",
"15-20,20+"
],
"type": "string"
},
"exclude": {
"description": "Negative keywords to exclude",
"type": "string"
},
"has_sale": {
"description": "Filter to domains listed for sale by their owner",
"enum": [
"true",
"false"
],
"type": "string"
},
"keyword": {
"description": "Search term (min 2 chars)",
"type": "string"
},
"length": {
"description": "Domain name length filter",
"enum": [
"<5",
"5-10",
"10-15",
"15+"
],
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphenated domains",
"type": "string"
},
"no_number": {
"description": "Exclude domains containing numbers",
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"position": {
"description": "Keyword placement in domain name",
"enum": [
"start",
"end",
"middle",
"contain"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"age_desc",
"age_asc",
"length_asc",
"length_desc",
"reg_date_asc",
"reg_date_desc",
"alpha"
],
"type": "string"
},
"tld": {
"description": "Filter by TLD (e.g., 'com', 'net', 'org')",
"type": "string"
},
"type": {
"description": "Character set filter",
"enum": [
"all_alpha",
"all_number"
],
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "aged",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"affiliate": {
"type": "boolean"
},
"age_years": {
"description": "Domain age in years",
"type": "integer"
},
"domain": {
"type": "string"
},
"prefix_tld_count": {
"description": "Number of TLDs the same prefix is registered under",
"type": "integer"
},
"price": {
"description": "Listing price with currency, e.g. 1500 USD. Only present for Atom/Sedo listings",
"type": "string"
},
"register_url": {
"format": "uri",
"type": "string"
},
"registered_date": {
"description": "First registration year (YYYY)",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
},
"total_found": {
"description": "Total matching results across all pages",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Aged Domains Search"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true,
"readOnlyHint": true,
"title": "Domain analyze"
},
"description": "Comprehensive domain analyze workflow. Call when a user wants to understand a specific domain's full picture \u2014 registration status, safety, DNS configuration, cross-TLD distribution, and current website usage.\n\nWhen to use: user asks 'what can you tell me about example.com?', wants to evaluate a domain before purchasing, or needs a technical analyze. Do NOT use for domain name ideas (use name_advisor), availability checks (use available), or expired domain evaluation (use expired_analysis).\n\nWorkflow:\n1. Gather data using all four atomic tools in parallel:\n - whois for registration details, registrar signals, and expiry dates.\n - safety for Google Safe Browsing status.\n - dns for MX, A, and CNAME records \u2014 signals of active usage or abandonment.\n - tld_check to see how many TLDs share this prefix.\n2. If tld_check shows high registration count, investigate further:\n - whois the .com/.net/.org variants to check if the same registrar holds multiple TLDs (brand protection signal) or different registrars (popular keyword signal).\n - web_search the TLD variants to see if they resolve to the same site.\n3. Visit the domain via web_fetch or web_search to determine current usage: active business, parked page, for-sale landing, or no content.\n4. Use web_search to investigate the domain's market background: recent sale history (NameBio, Sedo, Afternic), related news or brand events, legal disputes (UDRP, trademark conflicts), and any notable context that affects valuation or risk. This step is critical \u2014 technical data alone is insufficient for a complete analyze.\n5. Synthesize all findings into a concise analyze report. Present facts with key signals clearly flagged. Do NOT make buy/don't-buy judgments \u2014 present evidence and let the user decide.\n6. After presenting the report, ask the user about their goals before suggesting next steps. Tailor follow-up based on their answer:\n - Wants to purchase \u2192 suggest valuation_cma for pricing, brand_match for trademark risk.\n - Domain is listed for sale \u2192 provide the sale link, suggest brand_match. Disclose affiliate links.\n - Wants alternatives \u2192 suggest plan_b.\n - Wants monitoring \u2192 suggest set_monitor.\n - Wants SEO analysis \u2192 suggest backlink_summary.\n\nKey principles: present facts, not recommendations. Flag signals clearly (e.g., enterprise registrar = corporate-held, MX present = active email, no A record = possibly abandoned). Every claim must come from tool data. Disclose affiliate links when presenting registration or sale URLs.",
"inputSchema": {
"properties": {
"domain": {
"description": "Domain to analyze (e.g., 'example.com')",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "analyze",
"title": "Domain Analyze"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Domain Availability Check"
},
"description": "Check domain availability with pricing. Final validation before registration.\n\nBest practices:\n- Input must be a fully qualified domain name including TLD (e.g., 'example.com', not just 'example').\n- If status='available': present reg_url and price clearly. If price is significantly higher than standard registration (~$10-15 for .com), flag it as a premium/reserved domain \u2014 the registry is charging a premium price.\n- If status='registered': state clearly the domain is taken. Do not automatically suggest alternatives \u2014 let the user decide if they want to explore other options.\n- If status='expiring': domain is in the expiration pipeline \u2014 can be backordered via reg_url, not directly registered.\n- If status='reserved': registry-reserved domain \u2014 not available for registration.\n- If status='unknown': check was inconclusive \u2014 do not assume available or unavailable.\n- For batch checking multiple domains, use bulk_available instead \u2014 it checks up to 10 at once.\n- This tool is the definitive availability check. Other tools (tld_check, deleted, expired) may show signals of availability, but only this tool or bulk_available confirms registrability and returns actual pricing.\n- Disclose affiliate links when aff=true.",
"inputSchema": {
"properties": {
"domain": {
"description": "Full domain with TLD (e.g., 'example.com')",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "available",
"outputSchema": {
"properties": {
"aff": {
"description": "Whether reg_url is an affiliate link. Disclose to users when true.",
"type": "boolean"
},
"domain": {
"type": "string"
},
"price": {
"description": "Registration price with currency (e.g., '9.99 USD'). Only present when status=available.",
"type": "string"
},
"reg_url": {
"description": "Registration or backorder link. Present when status=available or status=expiring.",
"format": "uri",
"type": "string"
},
"status": {
"description": "Domain status: available = registrable, registered = taken, expiring = in expiration pipeline (backorderable), reserved = registry-reserved, invalid = malformed input, unknown = inconclusive",
"enum": [
"available",
"registered",
"expiring",
"reserved",
"invalid",
"unknown"
],
"type": "string"
},
"success": {
"type": "boolean"
}
},
"required": [
"success",
"domain",
"status"
],
"type": "object"
},
"title": "Domain Availability Check"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "SEO Backlink Analysis"
},
"description": "SEO backlink analysis powered by DataForSEO. Use when: (1) user explicitly requests SEO analysis or domain valuation, (2) evaluating expiring/deleted domains before acquisition. Do NOT call for general browsing or availability checks.\n\nKey fields and interpretation:\n- rank: Domain authority on a 0-1000 logarithmic scale (based on PageRank). Each point higher is exponentially harder. Reference points: apple.com/iphone ~848, stackoverflow.com ~740, forbes.com ~650, ahrefs.com/blog ~395.\n- backlinks_spam_score: Spam score of all incoming backlinks (0-100). 0-30 low, 31-60 medium (warrants investigation), 61-100 high (significant risk).\n- target_spam_score: Spam score of the domain itself (0-100). Same thresholds.\n- Always calculate key ratios from the raw data: backlinks per referring domain (total_backlinks / referring_main_domains \u2014 high ratio like 500+ means a few domains contribute most links), referring IPs vs referring domains (low ratio suggests shared infrastructure, potential PBN signal), broken backlinks as percentage of total (high percentage means decaying link profile), follow vs nofollow distribution from referring_links_attributes (near 100% follow is unusual for a natural profile).\n- referring_links_platform_types: If message-boards or web2.0 platforms dominate, this can indicate low-quality link building.\n- referring_links_tld: Note presence or absence of .edu/.gov links.\n- new vs lost backlinks and referring domains indicate whether the profile is growing or shrinking.\n\nCaveat \u2014 passive referrals on aged domains: Some low-quality or scraper sites automatically link to old domains (abandoned blogrolls, scraped content, auto-generated pages). A small amount of this noise is normal for aged domains \u2014 Google's algorithms can identify and ignore these junk links, so a few low-quality referrals should not be treated as a risk signal. However, a large volume of junk referrals is a different story \u2014 it may indicate the domain was used for black-hat SEO, link schemes, or was targeted by malicious backlink attacks. As with everything, degree matters: a handful of scraper sites is background noise; thousands of them is a red flag.\n\nPresent facts and data. Do NOT make buy/don't-buy judgments \u2014 let the user interpret the signals.",
"inputSchema": {
"properties": {
"domain": {
"description": "Domain name (no protocol or path)",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "backlink_summary",
"outputSchema": {
"properties": {
"backlinks": {
"description": "Total number of backlinks",
"type": "integer"
},
"backlinks_spam_score": {
"description": "Spam score of incoming backlinks (0-100)",
"type": "integer"
},
"broken_backlinks": {
"type": "integer"
},
"broken_pages": {
"type": "integer"
},
"cached": {
"type": "boolean"
},
"cms": {
"type": "string"
},
"country": {
"type": "string"
},
"crawled_pages": {
"type": "integer"
},
"domain": {
"type": "string"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"external_links_count": {
"type": "integer"
},
"first_seen": {
"type": "string"
},
"internal_links_count": {
"type": "integer"
},
"ip_address": {
"type": "string"
},
"rank": {
"description": "Domain rank (0-1000 logarithmic scale)",
"type": "integer"
},
"referring_domains": {
"type": "integer"
},
"referring_ips": {
"type": "integer"
},
"referring_links_attributes": {
"description": "Backlink count by link attribute (nofollow, sponsored, ugc, etc.)",
"type": "object"
},
"referring_links_platform_types": {
"description": "Backlink count by platform type (blogs, news, ecommerce, etc.)",
"type": "object"
},
"referring_links_semantic_locations": {
"description": "Backlink count by semantic HTML location",
"type": "object"
},
"referring_links_tld": {
"description": "Backlink count by referring TLD",
"type": "object"
},
"referring_links_types": {
"description": "Backlink count by link type (anchor, image, redirect, etc.)",
"type": "object"
},
"referring_main_domains": {
"type": "integer"
},
"referring_main_domains_nofollow": {
"type": "integer"
},
"referring_pages": {
"type": "integer"
},
"referring_pages_nofollow": {
"type": "integer"
},
"referring_subnets": {
"type": "integer"
},
"server": {
"type": "string"
},
"success": {
"type": "boolean"
},
"target_spam_score": {
"description": "Spam score of domain itself (0-100)",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "SEO Backlink Analysis"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true,
"readOnlyHint": true,
"title": "Brand Conflict Detection"
},
"description": "Brand conflict and trademark risk detection workflow. Call when a user wants to check whether a domain name carries brand-related risks before registering or purchasing it.\n\nWhen to use: user asks 'is this domain safe to register?', wants to assess UDRP risk before purchase, or needs trademark conflict checking as a follow-up from name_advisor or analyze. Do NOT use for general technical analysis (use analyze), domain name brainstorming (use name_advisor), or DNS/registration checks only (use dns, whois).\n\nWorkflow:\n1. Extract the prefix from the domain (e.g., nicefloor.com \u2192 nicefloor). If the prefix contains a well-known brand name (google, apple, amazon, microsoft, etc.), immediately warn the user about high UDRP risk before proceeding. Ask the user about their intent: are they assessing risk before registration, or holding the domain and looking for potential buyers? This determines the framing of the analysis. Do NOT call any tools before the user responds.\n\n2. After the user responds, gather data in parallel:\n - web_search '[prefix] company' to discover existing commercial use \u2014 note founding year, business scale, industry, and whether the company actively uses this keyword as a brand.\n - tld_check to see how many TLDs have this prefix registered.\n - If tld_check shows high registration, whois the .com/.net/.org variants to check if the same registrar holds multiple TLDs (brand protection signal) or different registrars (popular keyword signal). Use web_search to verify if they resolve to the same website.\n\n3. Run trademark database checks across all four major databases. Primary method is Claude for Chrome \u2014 open each database, search for [prefix], and read results directly. If Claude for Chrome is not available, fall back to providing pre-filled links as described below. Present findings from each database inline as they come in \u2014 do not wait for all four before reporting.\n\n USPTO:\n - Chrome: navigate to https://search.uspto.gov/search?query=[prefix]&affiliate=web-sdmg-uspto.gov and read results directly.\n - Fallback (no Chrome): USPTO supports URL query parameters \u2014 provide this pre-filled link for the user to open: https://search.uspto.gov/search?query=[prefix]&affiliate=web-sdmg-uspto.gov\n - Extract: number of trademark hits, registrant names, goods/services classes, live vs dead status.\n\n EUIPO:\n - Chrome: navigate to https://euipo.europa.eu/eSearch/, locate the search input, type [prefix], submit, read results.\n - Fallback (no Chrome): EUIPO uses a JavaScript interface \u2014 URL parameters cannot pre-fill search. Provide the entry link and instruct the user: 'Please open https://euipo.europa.eu/eSearch/ and search for [prefix].'\n - Extract: EU trademark hits, registrant names, classes, status.\n\n WIPO:\n - Chrome: navigate to https://branddb.wipo.int/en/quicksearch, locate the search input, type [prefix], submit, read results.\n - Fallback (no Chrome): provide entry link and instruct: 'Please open https://branddb.wipo.int/en/quicksearch and search for [prefix].'\n - Extract: international trademark hits, registrant names, designating countries, status.\n\n TMview:\n - Chrome: navigate to https://www.tmdn.org/tmview/#/quicksearch, locate the search input, type [prefix], submit, read results.\n - Fallback (no Chrome): provide entry link and instruct: 'Please open https://www.tmdn.org/tmview/#/quicksearch and search for [prefix].'\n - Extract: aggregate hits across all participating offices, notable registrants.\n\n If a database is unreachable or returns an error, note it in the report and continue \u2014 do not halt the workflow.\n\n4. Synthesize all findings into a report, framed according to the user's stated intent (risk-focused or opportunity-focused). The report must include:\n - Discovered entities: websites/companies using this keyword, their business, scale, founding year.\n - TLD distribution: cross-TLD registration pattern and registrar correlation.\n - Trademark database summary: hits per database, live marks found, relevant classes. If no hits found in a database, state that clearly \u2014 absence of results does not guarantee the mark is clear.\n - Risk assessment based on the three UDRP principles (confusing similarity, rights or legitimate interests, bad faith). For generic word combinations, note that risk is typically lower. Factor in registration age. Do NOT make legal conclusions.\n - Disclaimer: 'For reference only, does not constitute legal advice. Trademark searches are not exhaustive \u2014 consult a qualified IP attorney before making registration or investment decisions.'\n\n5. After presenting the report, ask the user what they want to do next. Tailor follow-up based on their response:\n - Wants to proceed with registration \u2192 suggest available or bulk_available.\n - Wants deeper analysis \u2192 suggest analyze.\n - Wants alternatives \u2192 suggest plan_b or name_advisor.\n - Wants to find buyers \u2192 use web_search findings to identify potential buyers, suggest valuation_cma.\n - Wants monitoring \u2192 suggest set_monitor.\n\nKey principles: present facts, not legal judgments. Do NOT claim a trademark exists or does not exist based on partial results. Claude for Chrome reads all four databases directly \u2014 the user should never need to search manually when Chrome is available. When Chrome is unavailable, always provide actionable fallback links with clear search instructions. Always end with the legal disclaimer. Disclose affiliate links.",
"inputSchema": {
"properties": {
"domain": {
"description": "Domain to check for brand conflict risk (e.g., 'nicefloor.com')",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "brand_match",
"title": "Brand Conflict Detection"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Batch Domain Availability Check"
},
"description": "Batch check domain availability with pricing. Check up to 10 domains per call.\n\nThis is the verification gate \u2014 any domain recommended to a user must pass through this tool first. Do not present domains as available based on other tools' signals (e.g., tld_check showing 'might_available', or domains found in deleted/expired feeds) without confirming here.\n\nInput format: comma-separated full domain names including TLD (e.g., 'aitools.com,getai.io,smartai.app'). Maximum 10 per call \u2014 for larger batches, make multiple calls.\n\nInterpreting results:\n- status 'available': Confirmed registrable. price and reg_url will be present.\n- status 'registered': Currently owned \u2014 not available for standard registration.\n- status 'expiring': In the expiration pipeline \u2014 can be backordered, not directly registered. reg_url will point to a backorder service.\n- status 'reserved': Registry-reserved domain \u2014 not available for registration.\n- status 'unknown': Check was inconclusive \u2014 do not assume available or unavailable.\n\nBest practices:\n- Always disclose affiliate links when aff=true.\n- When multiple domains return available, prioritize shorter names and .com over alternatives when presenting results.\n- If all checked domains come back registered, this is useful signal in itself \u2014 the namespace is saturated for that keyword pattern.",
"inputSchema": {
"properties": {
"domains": {
"description": "Comma-separated full domain names including TLD (max 10)",
"type": "string"
}
},
"required": [
"domains"
],
"type": "object"
},
"name": "bulk_available",
"title": "Batch Domain Availability Check"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Keyword TLD Popularity Check"
},
"description": "Check how many TLDs have specific keywords registered. Batch-compare keyword popularity by cross-TLD registration distribution.\n\nBest practices:\n- Use comma-separated keywords for side-by-side comparison (max 10): keywords='ai,tech,cloud,smart'. This is the tool's core strength \u2014 comparing relative popularity across multiple keywords in one call.\n- Interpreting total count: 100+ TLDs registered = highly competitive, well-known keyword. 50-100 = moderate popularity. 20-50 = niche but recognized. <20 = low market interest or very new concept.\n- The popular vs cctld vs other breakdown reveals the keyword's reach: high popular count (com/net/org/io/ai) = commercially validated. High cctld count = global brand interest or defensive registration. High other count = speculative gTLD registrations.\n- Use this to compare synonyms or variations before deciding which keyword to invest in \u2014 e.g., compare 'automate' vs 'automation' vs 'autoflow' to see which has stronger market validation.\n- Pairs well with tld_check for drilling into a single keyword's full TLD-by-TLD breakdown after identifying winners here.",
"inputSchema": {
"properties": {
"keywords": {
"description": "Comma-separated keywords to check (max 10)",
"type": "string"
}
},
"required": [
"keywords"
],
"type": "object"
},
"name": "bulk_tld",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"cctld": {
"description": "Count in country-code TLDs",
"type": "integer"
},
"keyword": {
"type": "string"
},
"other": {
"description": "Count in other gTLDs",
"type": "integer"
},
"popular": {
"description": "Count in popular TLDs (com, net, org, io, ai, app, etc.)",
"type": "integer"
},
"total": {
"description": "Total TLDs with this keyword registered",
"type": "integer"
}
},
"required": [
"keyword"
],
"type": "object"
},
"type": "array"
},
"error": {
"type": "string"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of keywords checked",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Keyword TLD Popularity Check"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Deleted Domains Search"
},
"description": "Search domains that have completed the deletion cycle and are open for immediate registration at standard cost \u2014 no auction or backorder needed. These are the highest-value finds: domains with history available at regular price.\n\nBest practices:\n- Always use no_hyphen=true and no_number=true unless the user specifically wants them \u2014 the vast majority of hyphenated and numeric deleted domains are low-quality.\n- keyword defaults to 'contain' matching (substring), producing false positives (e.g., 'agent' matches 'magenta'). Use position=start or position=end for precise results.\n- sort=age_desc surfaces domains with the longest history first \u2014 a 20+ year old deleted .com at standard registration cost is a rare find worth highlighting.\n- sort=tld_counter_desc finds keywords popular across TLDs \u2014 if prefix_tld_count is high (20+) and the .com just dropped, that is notable.\n- For brandable names: combine length=5-10, type=all_alpha, no_hyphen=true, no_number=true.\n- hold=no_hold filters out domains still under registry hold that cannot yet be registered.\n- register_url links to Dynadot (affiliate). Disclose when presenting to users.",
"inputSchema": {
"properties": {
"age_range": {
"description": "Historical age before deletion",
"enum": [
"0-5",
"5-10",
"10-20",
"20+",
"10-20,20+"
],
"type": "string"
},
"exclude": {
"description": "Negative keywords to exclude",
"type": "string"
},
"hold": {
"description": "Registry hold status \u2014 no_hold = immediately registrable",
"enum": [
"no_hold",
"has_hold"
],
"type": "string"
},
"keyword": {
"description": "Search term (min 2 chars)",
"type": "string"
},
"length": {
"description": "Domain name length filter",
"enum": [
"<5",
"5-10",
"10-15",
"15+"
],
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphenated domains",
"type": "string"
},
"no_number": {
"description": "Exclude domains containing numbers",
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"position": {
"description": "Keyword placement in domain name",
"enum": [
"start",
"end",
"middle",
"contain"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"age_desc",
"age_asc",
"length_asc",
"length_desc",
"tld_counter_asc",
"tld_counter_desc"
],
"type": "string"
},
"tld": {
"description": "Filter by TLD (e.g., 'com', 'net', 'org')",
"type": "string"
},
"type": {
"description": "Character set filter",
"enum": [
"all_alpha",
"all_number"
],
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "deleted",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"affiliate": {
"type": "boolean"
},
"age_years": {
"description": "Historical age in years before deletion",
"type": "integer"
},
"domain": {
"type": "string"
},
"prefix_tld_count": {
"description": "Number of TLDs the same prefix is registered under",
"type": "integer"
},
"register_url": {
"format": "uri",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
},
"total_found": {
"description": "Total matching results across all pages",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Deleted Domains Search"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "DNS Record Lookup"
},
"description": "Query DNS records for a domain. Returns A, AAAA, MX, NS, TXT, CNAME, SOA. Key signals: MX present = active email. NS pointing to marketplace (Sedo, Afternic) = parked/for-sale. TXT with SPF/DKIM = active operations. No records at all = unconfigured/abandoned.",
"inputSchema": {
"properties": {
"domain": {
"description": "Domain name",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "dns",
"outputSchema": {
"properties": {
"domain": {
"type": "string"
},
"error": {
"type": "string"
},
"records": {
"description": "DNS records grouped by type",
"properties": {
"A": {
"description": "IPv4 address records",
"items": {
"properties": {
"host": {
"type": "string"
},
"ip": {
"type": "string"
},
"ttl": {
"type": "integer"
}
},
"type": "object"
},
"type": "array"
},
"AAAA": {
"description": "IPv6 address records",
"items": {
"properties": {
"host": {
"type": "string"
},
"ipv6": {
"type": "string"
},
"ttl": {
"type": "integer"
}
},
"type": "object"
},
"type": "array"
},
"CNAME": {
"description": "Canonical name records",
"items": {
"properties": {
"host": {
"type": "string"
},
"target": {
"type": "string"
},
"ttl": {
"type": "integer"
}
},
"type": "object"
},
"type": "array"
},
"MX": {
"description": "Mail exchange records",
"items": {
"properties": {
"host": {
"type": "string"
},
"pri": {
"description": "Priority",
"type": "integer"
},
"target": {
"description": "Mail server hostname",
"type": "string"
},
"ttl": {
"type": "integer"
}
},
"type": "object"
},
"type": "array"
},
"NS": {
"description": "Nameserver records",
"items": {
"properties": {
"host": {
"type": "string"
},
"target": {
"type": "string"
},
"ttl": {
"type": "integer"
}
},
"type": "object"
},
"type": "array"
},
"SOA": {
"description": "Start of authority records",
"items": {
"properties": {
"expire": {
"type": "integer"
},
"host": {
"type": "string"
},
"minimum_ttl": {
"type": "integer"
},
"mname": {
"description": "Primary nameserver",
"type": "string"
},
"refresh": {
"type": "integer"
},
"retry": {
"type": "integer"
},
"rname": {
"description": "Admin email",
"type": "string"
},
"serial": {
"type": "integer"
}
},
"type": "object"
},
"type": "array"
},
"TXT": {
"description": "Text records (SPF, DKIM, verification tokens)",
"items": {
"properties": {
"host": {
"type": "string"
},
"ttl": {
"type": "integer"
},
"txt": {
"type": "string"
}
},
"type": "object"
},
"type": "array"
}
},
"type": "object"
},
"success": {
"type": "boolean"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "DNS Record Lookup"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Premium Domain Changes Monitor (7-day)"
},
"description": "Monitor changes to premium .com domains in the past 7 days. The monitored pool consists of short-character .com domains (typically 1-4 letters) and high-value English single-word and two-word .com domains. This is not a general domain monitor \u2014 it specifically tracks the most valuable segment of the .com namespace.\n\nChange types:\n- Domain Transfer: Registrar changed \u2014 indicates ownership or management change. Report the old and new registrar as facts. Do not assume the reason (could be a sale, corporate restructuring, registrar migration, or portfolio consolidation).\n- Domain Expired: Domain entered expiration cycle. Report the fact. Do not characterize rarity or value unless verified with additional data.\n- New Registration: A previously unregistered premium name was registered.\n- Nameserver Change: NS records updated. An NS change to a domain marketplace (e.g., sedo.com, afternic.com, thisdomain.forsale) is a possible sale signal but not a certainty \u2014 report the old and new NS as facts.\n\nBest practices:\n- date_range=1d for last 24 hours, 3d for last 72 hours, all for full 7-day window (default).\n- length=1-3 or length=4 focuses on the shortest, most premium domains.\n- reason filters to a specific change type \u2014 use 'Domain Transfer' or 'Domain Expired' for the most newsworthy events.\n- sort=length_asc surfaces the shortest (most valuable) domains first.\n- has_digit=false filters to letter-only domains for higher quality results.\n- All interpretations must be evidence-based. Report what changed, not why. If the user wants to understand the reason behind a change, suggest whois or web_search to investigate further.",
"inputSchema": {
"properties": {
"date_range": {
"description": "Time range filter: 1d = last 24 hours, 3d = last 72 hours, all = full 7-day window (default)",
"enum": [
"1d",
"3d",
"all"
],
"type": "string"
},
"has_digit": {
"description": "false = letters only, true = contains digits, all = no filter",
"enum": [
"false",
"true",
"all"
],
"type": "string"
},
"keyword": {
"description": "Search by domain or keyword within the monitored pool",
"type": "string"
},
"length": {
"description": "Prefix length filter (characters before TLD)",
"enum": [
"all",
"1-3",
"4",
"5-8",
"9+"
],
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"reason": {
"description": "Filter by change type",
"enum": [
"all",
"Domain Transfer",
"Domain Expired",
"New Registration",
"Nameserver Change"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"length_asc",
"length_desc",
"tld_count_desc",
"tld_count_asc",
"prefix_asc",
"prefix_desc"
],
"type": "string"
},
"tld": {
"description": "TLD filter (e.g., 'com')",
"type": "string"
}
},
"type": "object"
},
"name": "domain_changes",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"change_date": {
"description": "Date the change was detected (YYYY-MM-DD format)",
"type": "string"
},
"combination": {
"description": "Word segmentation of the prefix",
"type": "string"
},
"details_new": {
"description": "New state (registrar for Transfer, expiration date for Expired, nameservers for NS Change)",
"type": "string"
},
"details_old": {
"description": "Previous state (registrar for Transfer/Expired, nameservers for NS Change)",
"type": "string"
},
"domain": {
"type": "string"
},
"length": {
"description": "Prefix character length",
"type": "integer"
},
"prefix": {
"description": "Domain prefix without TLD",
"type": "string"
},
"reason": {
"description": "Change type: Domain Transfer, Domain Expired, New Registration, or Nameserver Change",
"type": "string"
},
"tld": {
"type": "string"
},
"tld_count": {
"description": "Number of TLDs the same prefix is registered under",
"type": "integer"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Premium Domain Changes Monitor (7-day)"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Creative Domain Generator"
},
"description": "Creative domain name generation workflow. Call when a user already knows their target keyword or has a specific taken domain and wants registrable creative variations (e.g., 'I want a domain with the word flow', 'getflow.com is taken, give me variations'). Do NOT call when the user's requirements are vague or they don't have a keyword yet (use name_advisor), when they want alternatives across lifecycle stages like expired/deleted (use plan_b), or when they want trend-based ideas (use trend_hunter).\n\nKey difference from name_advisor: this tool assumes the user already knows what keyword they want. If the user is unsure or exploring, use name_advisor instead.\n\nThis is a multi-turn workflow. Stop and wait for user input at every checkpoint.\n\nWorkflow:\n1. Keyword Analysis & Confirmation \u2014 extract the core keyword from user input (e.g., getflow.com \u2192 flow). Briefly state your understanding of the keyword and industry context, then confirm with the user: is the keyword correct? TLD preference (.com only or open to others)? Style preference (short and punchy vs descriptive)? Do NOT generate any domain names or call any tools until the user confirms. If the user seems unsure about their keyword, suggest switching to name_advisor.\n2. Generate & Verify \u2014 generate 20-30 creative variants based on confirmed preferences. Strategies include: TLD swaps for short keywords (.io, .ai, .app, .co), industry-relevant prefixes/suffixes (get-, -ly, -hub, -lab), coined words and portmanteaus, word + modifier combinations. Before finalizing, scan every candidate for unintended sensitive words, medical terms, or offensive abbreviations created by concatenation. Verify all candidates with bulk_available \u2014 every domain presented to the user must be confirmed available, no exceptions. Present only verified domains grouped by strategy, each with register_url.\n3. Iterate or Finalize \u2014 based on user feedback: generate more variations in a preferred direction, suggest brand_match for a finalist, adjust strategy if needed, or suggest plan_b if the user wants expired/aged alternatives.\n\nKey principles:\n- Every domain presented must be verified available via bulk_available. No exceptions.\n- Available domains include register_url (Dynadot affiliate).\n- Disclose affiliate links.",
"inputSchema": {
"properties": {
"domain": {
"description": "Keyword or taken domain",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "domain_generator",
"outputSchema": {
"properties": {
"available_domains": {
"description": "Verified available domains grouped by strategy",
"items": {
"properties": {
"affiliate": {
"type": "boolean"
},
"domain": {
"type": "string"
},
"price": {
"type": "string"
},
"register_url": {
"format": "uri",
"type": "string"
},
"strategy": {
"description": "Generation strategy (tld_swap, prefix, coined_word, modifier, etc.)",
"type": "string"
}
},
"required": [
"domain",
"strategy"
],
"type": "object"
},
"type": "array"
},
"keyword": {
"description": "Extracted core keyword",
"type": "string"
},
"phase": {
"description": "Current workflow phase",
"enum": [
"keyword_confirmation",
"generate_verify",
"iterate"
],
"type": "string"
},
"questions": {
"description": "Confirmation questions for the user",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"phase"
],
"type": "object"
},
"title": "Creative Domain Generator"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Expiring Domains Search"
},
"description": "Search domains entering the deletion cycle \u2014 expired, in redemption, or pending delete. Unlike 'deleted' domains (which are free to register), these require backorder or have time-sensitive acquisition windows.\n\nLifecycle stages:\n- expired: Domain has lapsed but has not entered redemption. Typically enters expired auction at the registrar \u2014 acquisition requires bidding, not standard registration.\n- redemption: Owner can still reclaim by paying a redemption fee (~$80+). For premium names in this stage, consider using set_monitor to track status changes, or whois to find the registrar and suggest the user contact the owner directly with an offer.\n- pending_delete: Final stage, drops in 1-5 days. Highest urgency. Good names at this stage rarely survive manual registration \u2014 backorder via the register_url (Gname) is recommended.\n\nBest practices:\n- Always use no_hyphen=true and no_number=true unless the user specifically wants them.\n- keyword defaults to 'contain' matching, which searches all domains containing the keyword anywhere in the name. Use position=start, position=end, or position=middle to control where the keyword appears.\n- sort=age_desc prioritizes domains with the longest history, but age alone does not guarantee value \u2014 a domain with long history could have been used for spam. For high-value candidates, verify clean history with backlink_summary and safety checks.\n- status=pending_delete is the most actionable filter \u2014 these domains drop soonest.\n- auction_date='today' or 'tomorrow' narrows to imminent drops.\n- register_url links to Gname (affiliate). Disclose when presenting to users.",
"inputSchema": {
"properties": {
"age_range": {
"description": "Historical age of the domain",
"enum": [
"0-5",
"5-10",
"10-20",
"20+",
"5-10,10-15",
"10-20,20+"
],
"type": "string"
},
"auction_date": {
"description": "Filter by drop date: 'today', 'tomorrow', or 'YYYY-MM-DD'",
"type": "string"
},
"exclude": {
"description": "Negative keywords to exclude",
"type": "string"
},
"hold": {
"description": "Registry hold status",
"enum": [
"no_hold",
"has_hold"
],
"type": "string"
},
"keyword": {
"description": "Search term (min 2 chars)",
"type": "string"
},
"length": {
"description": "Domain name length filter",
"enum": [
"<5",
"5-10",
"10-15",
"15+"
],
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphenated domains",
"type": "string"
},
"no_number": {
"description": "Exclude domains containing numbers",
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"position": {
"description": "Keyword placement in domain name",
"enum": [
"start",
"end",
"middle",
"contain"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"age_desc",
"age_asc",
"length_asc",
"length_desc"
],
"type": "string"
},
"status": {
"description": "expired = in registrar auction, redemption = owner can reclaim, pending_delete = drops in 1-5 days",
"enum": [
"pending_delete",
"redemption",
"expired"
],
"type": "string"
},
"tld": {
"description": "Filter by TLD (e.g., 'com', 'net', 'org')",
"type": "string"
},
"type": {
"description": "Character set filter",
"enum": [
"all_alpha",
"all_number"
],
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "expired",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"affiliate": {
"type": "boolean"
},
"age_years": {
"description": "Domain age in years",
"type": "integer"
},
"domain": {
"type": "string"
},
"prefix_tld_count": {
"description": "Number of TLDs the same prefix is registered under",
"type": "integer"
},
"register_url": {
"format": "uri",
"type": "string"
},
"registered_date": {
"format": "date",
"type": "string"
},
"status": {
"description": "Lifecycle stage: 1=expired, 2=redemption, 3=pending_delete",
"type": "integer"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
},
"total_found": {
"description": "Total matching results across all pages",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Expiring Domains Search"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Expired Domain Due Diligence"
},
"description": "Deep due diligence workflow for expired or expiring domains. Call when a user wants to evaluate an expired domain's history, SEO value, safety, and commercial potential before backordering or acquiring it \u2014 including as a follow-up when browsing results from expired or deleted tools. Do NOT call if the domain is not in any expired status (use analyze instead), if the user wants domain name ideas (use name_advisor), or if the user wants to check availability of a new domain (use available).\n\nThis is a multi-turn workflow. Stop and wait for user input at every checkpoint.\n\nWorkflow:\n1. Status Verification \u2014 run whois first. Confirm the domain is actually in an expired status (expired, redemption, pending-delete). If it is NOT expired, stop immediately, inform the user, and hand off to the analyze workflow. This gate check is mandatory.\n2. Data Collection \u2014 gather all available data in parallel: safety (Google Safe Browsing \u2014 critical risk signal for expired domains), dns (residual records indicate previous usage), backlink_summary (strong backlinks = SEO value; spammy backlinks = risk), keyword_data (search volume and CPC for commercial value), tld_check (cross-TLD registration count as popularity signal), web_fetch the Wayback Machine timeline (https://web.archive.org/web/*/{domain}) for historical usage, and web_search site:{domain} to check residual Google indexing.\n3. Due Diligence Report \u2014 synthesize all findings into a structured report covering: domain status and key dates, safety warnings, SEO value (backlink quality + keyword commercial value), historical usage from Wayback, Google index status, cross-TLD distribution, and consolidated risk/opportunity signals. Then ask the user about their goal (SEO recovery, brand building, or investment/resale) and whether they want to explore specific aspects further. Let the user choose the direction \u2014 do not decide for them.\n4. Tailored Follow-up \u2014 based on user's stated goals, guide them to the appropriate next step: backorder process and timeline, set_monitor for status tracking, deeper SEO analysis, plan_b for alternatives, valuation_cma for market context, or brand_match before committing.\n\nKey principles:\n- Present facts and acquisition opportunities. Do NOT make buy/don't-buy judgments.\n- Objectively flag ALL risk signals \u2014 do not downplay or hide them.\n- Backorderable domains must include backorder_url (Gname affiliate).\n- Always include Wayback link: https://web.archive.org/web/*/{domain}\n- Always include deep analysis link: https://dataforseo.com/?aff=199596\n- Disclose affiliate links.",
"inputSchema": {
"properties": {
"domain": {
"description": "Expired domain to analyze",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "expired_analysis",
"title": "Expired Domain Due Diligence"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Keyword Search Volume & CPC"
},
"description": "Google Ads keyword data: search volume, competition, and CPC. Use when evaluating a keyword's commercial search demand \u2014 one call per keyword is sufficient.\n\nInterpreting results:\n- search_volume: Average monthly Google searches. >10k with CPC >$2 indicates strong commercial intent. 1k-10k with CPC $0.5-$2 is niche but viable. <1k with CPC <$0.5 suggests limited commercial demand.\n- competition: 0 to 1 score representing advertiser density. Higher means more advertisers bidding on this keyword.\n- competition_level: LOW, MEDIUM, or HIGH. Low competition + decent volume = underserved opportunity.\n- low_cpc / high_cpc: Cost-per-click range in USD. Reflects what advertisers are willing to pay. Higher CPC generally correlates with higher commercial value for domains matching this keyword.\n\nIn domain investment context, the combination of search_volume and CPC is the primary value signal \u2014 volume alone without advertiser spend may indicate informational intent rather than commercial intent.",
"inputSchema": {
"properties": {
"country": {
"description": "Market. Default: US-EN",
"enum": [
"US-EN",
"DE-DE",
"CA-FR",
"IT-IT"
],
"type": "string"
},
"keyword": {
"description": "Keyword to research",
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "keyword_data",
"outputSchema": {
"properties": {
"competition": {
"description": "Competition index (0 to 1)",
"type": "number"
},
"competition_level": {
"description": "LOW, MEDIUM, or HIGH",
"type": "string"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"high_cpc": {
"description": "High range cost-per-click in USD",
"type": "number"
},
"keyword": {
"type": "string"
},
"low_cpc": {
"description": "Low range cost-per-click in USD",
"type": "number"
},
"search_volume": {
"description": "Average monthly search volume on Google",
"type": "integer"
},
"success": {
"type": "boolean"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Keyword Search Volume & CPC"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true,
"readOnlyHint": true,
"title": "Keyword Deep Intelligence"
},
"description": "Deep keyword intelligence for domain investment. Call when a user wants to understand the full picture of a specific keyword in the domain market \u2014 demand, supply, competition, and opportunities. This is a data-intensive workflow: every claim must be backed by tool output.\n\nWhen to use: User asks about a keyword's investment potential, market landscape, or opportunity analysis. Not for analyzing a specific domain (use analyze), browsing trends (use trend_hunter), or market overviews (use market_beat).\n\nMethodology \u2014 three phases, each building on the previous:\n\n1. Demand: Establish how much the market wants this keyword.\n - keyword_data for commercial search value (volume, CPC, competition).\n - keywords_trends (both hot and emerging) for registration momentum.\n - web_search is MANDATORY \u2014 do NOT substitute with your own knowledge. Execute at least two searches: '{keyword} news 2026' for industry context, and '{keyword} domain sold price' for transaction history. Only include claims that come from search results. If search returns nothing relevant, state 'no recent news or transactions found' \u2014 do not fill the gap with training data. Do NOT attribute keyword popularity to a specific event or project unless keywords_trends data shows a clear spike AND web_search confirms the connection. Common English words have natural baseline demand \u2014 not every trend needs a catalyst explanation.\n\n2. Supply: Map the current domain inventory, focused on .com as the primary lens unless the user requests otherwise.\n - tld_check for cross-TLD saturation.\n - active for total .com inventory and for-sale ratio (forsale count / total count). Also compare keyword-as-prefix vs keyword-as-suffix to gauge market maturity.\n - deleted for domains available at standard registration cost.\n - expired for domains in the expiration pipeline that can be backordered.\n - aged with has_sale=true for secondary market listings.\n\n3. Competition: Assess whether the window is opening or closing.\n - nrds comparing recent .com registration velocity across time periods (0-10 days vs 10-20 days). Accelerating velocity means act fast; decelerating means the peak may have passed.\n - From the same nrds results, assess registration quality \u2014 high ratios of hyphens, numbers, or excessive length indicate a junk/speculative market rather than serious investment.\n - Analyze the naming patterns in recent registrations to identify what is driving demand. For example, if most new domains combine the keyword with 'ai', 'cloud', 'tech', that points to a tech trend; if they combine with 'game', 'machine', 'play', that points to entertainment. If patterns are diverse with no clear theme, the keyword likely has natural baseline demand across multiple sectors. This pattern analysis is based on the nrds results already retrieved \u2014 no additional tool calls needed.\n\nSynthesize into an intelligence report: keyword verdict (invest / watch / avoid) with confidence level, demand profile, supply profile, competition profile, and recommended next steps tailored to the verdict. Let the data tell the story \u2014 if data is contradictory, present both sides.\n\nAfter the report, offer relevant next steps: deep analysis on a specific domain, brand conflict check, monitoring setup, strategy tracking, or analyzing a different keyword.",
"inputSchema": {
"properties": {
"keyword": {
"description": "The keyword to analyze",
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "keyword_intel",
"title": "Keyword Deep Intelligence"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Keyword Registration Trends"
},
"description": "Get trending keywords in domain registrations. Mainly used for investors to find new opportunities, but also useful for brand protection. Three modes:\n- hot: High-volume keywords (e.g., 'app', 'shop', 'group'). Established terms with high volume and high competition. Results include weekly breakdown (w1-w4) to spot momentum shifts. Quality metrics use 28-day data.\n- emerging: Keywords with sudden registration spikes in the last 7-14 days, often driven by technology news, product launches, or viral projects. Compare w4 (current week) vs w3 to assess momentum. Quality metrics use W4-only data to reflect the spike period accurately.\n- prefix: Popular naming patterns (e.g., 'get...', 'my...', 'the...'). Results include tld_count \u2014 if a prefix has high tld_count but .com is still available, that is actionable. Use bulk_tld to check which specific TLDs are taken vs available.\n\nQuality metrics (hot and emerging only, fields vary by user tier):\n- com_ratio: .com registrations as a proportion of total. .com is the most expensive and most liquid TLD \u2014 this ratio reflects participants' willingness to invest real money.\n- most_tld: The dominant TLD for this keyword. Shows where registration activity is concentrated.\n- pos_start_ratio / pos_end_ratio: Where the keyword appears in domain names. High start ratio (e.g., 'aitools.com') suggests the keyword drives the domain concept. High end ratio (e.g., 'myai.com') suggests it is used as a modifier.\n- forsale_pct: Percentage of domains with NS pointing to sale platforms (Sedo, Afternic, Atom). Reflects investor participation \u2014 cross-reference with com_ratio and top_registrar to assess multi-party market participation.\n- top_ns + top_ns_ratio: The most common nameserver and its share. High concentration on a single NS indicates concentrated activity. Cross-reference with NS identity to understand what participants are doing with their domains.\n- top_registrar: The registrar with the highest volume. Registrars are channels, not identity labels \u2014 high concentration reduces confidence that many independent parties are involved, but does not by itself prove single-operator activity. Must be cross-referenced with other dimensions.\n- peak_day: The single day with highest registrations. If peak_day accounts for a large share of total, the trend may be event-driven or a single bulk registration event rather than sustained interest.\n- might_use_count: Domains with NS pointing to infrastructure providers (Cloudflare, AWS, Vercel, Netlify). Does NOT reliably indicate active sites \u2014 especially Cloudflare and AWS are widely used for DNS hosting, CDN, or parking. Must cross-reference with registrar diversity \u2014 high might_use_count with diverse registrars suggests organic adoption; high might_use_count with one dominant registrar suggests a single operator.\n\nData methodology: Registration counts are based on semantic keyword extraction using DomainKits' proprietary word segmentation engine (https://github.com/ABTdomain/dksplit), not simple substring matching. Bulk registration noise is automatically filtered from emerging results. WHOIS data is sourced from daily RDAP snapshots. Brand protection registrars (CSC, MarkMonitor, etc.) are excluded.",
"inputSchema": {
"properties": {
"type": {
"description": "hot = high-volume keywords, emerging = recent spikes, prefix = naming patterns",
"enum": [
"hot",
"emerging",
"prefix"
],
"type": "string"
}
},
"type": "object"
},
"name": "keywords_trends",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"com_ratio": {
"description": ".com share. below 0.05 = bulk speculation",
"type": "number"
},
"count_28d": {
"description": "Total registrations in past 28 days (hot and emerging)",
"type": "integer"
},
"count_30d": {
"description": "Registrations past 30 days (prefix only)",
"type": "integer"
},
"count_48h": {
"description": "Registrations past 48 hours (prefix only)",
"type": "integer"
},
"count_7d": {
"description": "Registrations past 7 days (prefix only)",
"type": "integer"
},
"forsale_pct": {
"description": "% with NS pointing to sale platforms. higher means more investor interest, smarter investor might find some chances in this trends",
"type": "number"
},
"might_use_count": {
"description": "Domains with NS pointing to Cloudflare/AWS/Vercel/Netlify (does not reliably indicate active sites)",
"type": "integer"
},
"most_tld": {
"description": "Dominant TLD for this keyword",
"type": "string"
},
"peak_day": {
"description": "Date with highest registrations (YYYY-MM-DD)",
"type": "string"
},
"pos_end_ratio": {
"description": "Keyword at end of domain (e.g., 'myai.com'), higher ratio suggests market would use it at the end of domains, which is more valuable than if it is commonly used as a modifier at the start of domains (e.g., 'aitools.com')",
"type": "number"
},
"pos_start_ratio": {
"description": "Keyword at start of domain (e.g., 'aitools.com'), higher ratio suggests market would use it at the start of domains, which is more valuable than if it is commonly used as a modifier at the end of domains (e.g., 'myai.com')",
"type": "number"
},
"prefix": {
"description": "Domain prefix (prefix only)",
"type": "string"
},
"rank": {
"type": "integer"
},
"tld_count": {
"description": "TLDs this prefix is registered under (prefix only)",
"type": "integer"
},
"top_ns": {
"description": "Most common nameserver for this keyword",
"type": "string"
},
"top_ns_ratio": {
"description": "Share of top_ns.",
"type": "number"
},
"top_registrar": {
"description": "Registrar with highest volume",
"properties": {
"name": {
"type": "string"
},
"pct": {
"type": "number"
}
},
"type": "object"
},
"trend": {
"description": "Trend status: hot, active, or cold (prefix only)",
"type": "string"
},
"w1": {
"description": "Registrations 4 weeks ago (hot only)",
"type": "integer"
},
"w2": {
"description": "Registrations 3 weeks ago (hot only)",
"type": "integer"
},
"w3": {
"description": "Registrations 2 weeks ago (hot and emerging)",
"type": "integer"
},
"w4": {
"description": "Registrations current week (hot and emerging)",
"type": "integer"
},
"word": {
"description": "Trending keyword (hot and emerging)",
"type": "string"
}
},
"type": "object"
},
"type": "array"
},
"success": {
"type": "boolean"
},
"total": {
"type": "integer"
},
"type": {
"type": "string"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Keyword Registration Trends"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Domain Marketplace Search"
},
"description": "Search currently registered domains with marketplace listing data. These are live domains owned by someone \u2014 not available for free registration. Use status=forsale to filter to domains the owner has listed for sale, or use results as acquisition targets to approach owners directly.\n\nBest practices:\n- keyword defaults to 'start' matching. Use position=end or position=contain for broader results.\n- status=forsale is the most actionable filter \u2014 these owners are actively seeking buyers.\n- Results include a marketplace field indicating which platform the domain is listed on (e.g., 'se' for Sedo, 'go' for GoDaddy, 'at' for Atom, 'vn' for Venture, 'pd' for PerfectDomain). Domains without a marketplace value are registered but not actively listed for sale.\n- sort=length_asc surfaces the shortest (most premium) names first.\n- The components field shows how the domain name segments into recognizable words \u2014 useful for evaluating brandability.\n- Disclose affiliate links when presenting register_url to users.",
"inputSchema": {
"properties": {
"exclude": {
"description": "Negative keywords to exclude",
"type": "string"
},
"keyword": {
"description": "Brand or industry term (min 2 chars)",
"type": "string"
},
"length": {
"description": "Domain name length filter",
"enum": [
"<5",
"5-10",
"10-15",
"15+"
],
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphenated domains (true/false)",
"type": "string"
},
"no_number": {
"description": "Exclude domains containing numbers (true/false)",
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"position": {
"description": "Keyword placement in domain name. Default is 'start'.",
"enum": [
"start",
"end",
"contain"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"length_asc",
"length_desc",
"alpha",
"tld_counter_asc",
"tld_counter_desc"
],
"type": "string"
},
"status": {
"description": "Filter by status \u2014 'forsale' for domains listed for sale",
"type": "string"
},
"tld": {
"description": "Filter by TLD (e.g., 'com', 'net', 'org', 'ai')",
"type": "string"
},
"type": {
"description": "Character set filter",
"enum": [
"all_alpha",
"all_number"
],
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "market",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"affiliate": {
"type": "boolean"
},
"components": {
"description": "Word segmentation of the domain prefix",
"type": "string"
},
"domain": {
"type": "string"
},
"length": {
"type": "integer"
},
"marketplace": {
"description": "Sale platform code: se=Sedo, go=GoDaddy, at=Atom, vn=Venture, pd=PerfectDomain, gn=Gname",
"type": "string"
},
"prefix_tld_count": {
"description": "Number of TLDs this prefix is registered across",
"type": "integer"
},
"price": {
"description": "Listing price with currency, e.g. 1500 USD. Only present for Atom/Sedo listings",
"type": "string"
},
"register_url": {
"format": "uri",
"type": "string"
},
"tld": {
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
},
"total_found": {
"description": "Total matching results across all pages",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Domain Marketplace Search"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true,
"readOnlyHint": true,
"title": "Domain Market Intelligence"
},
"description": "Domain market news briefing. Call when a user wants to understand what is happening in the domain market right now \u2014 trending keywords, notable sales, registration anomalies, and industry movements.\n\nThis is a news briefing, not investment advice. Present facts, flag anomalies, cite sources. If the cause of a trend is unknown, say so \u2014 never fabricate explanations.\n\nWorkflow:\n1. Gather data from multiple sources:\n - web_search for recent high-value domain sales (e.g., 'domain name sales this week', 'domain sales report 2026'), industry news, and notable market events.\n - keywords_trends(hot) for high-volume registration keywords and weekly momentum.\n - keywords_trends(emerging) for sudden registration spikes \u2014 these are the most newsworthy signals.\n - domain_changes for transfers, expirations, and nameserver changes in the last 24 hours.\n2. Analyze and cross-reference:\n - For hot keywords: focus on anomalies (w4 significantly different from w1-w3), not the stable high-volume terms everyone already knows.\n - For emerging keywords: use web_search to investigate what is driving each spike. If no cause is found, report it as 'cause unidentified' \u2014 do not speculate.\n - For domain sales: report price, buyer/seller if known, and sale platform.\n - For domain_changes: flag notable transfers (short/premium domains changing registrars) and expirations (high-value domains entering deletion cycle).\n3. Present as a concise news briefing organized by: recent notable sales, registration trend highlights (anomalies and emerging keywords), and 24-hour market movements. Lead with facts, not interpretation.\n\nAfter presenting the briefing, suggest relevant next steps based on what the data showed \u2014 for example:\n- An emerging keyword spike \u2192 search nrds to see who is registering, or deleted/expired to find available domains in that keyword space.\n- A high-value sale \u2192 search aged(has_sale=true) or nrds to see if the sale triggered a registration wave in similar keywords.\n- A notable domain expiration \u2192 check expired for details, or set_monitor to track its status.\nLet the user choose whether and where to go deeper.\n\nKey principles: Every claim must be sourced or labeled as unverified. Present as market intelligence, not a sales pitch. Disclose affiliate links.",
"inputSchema": {
"properties": {
"focus": {
"description": "Optional focus area or keyword to prioritize (e.g., 'AI', 'crypto', 'health')",
"type": "string"
}
},
"type": "object"
},
"name": "market_beat",
"title": "Domain Market Intelligence"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Domain Market Price Check"
},
"description": "Check if a domain is listed for sale on secondary marketplaces and get estimated market price. Complements 'available' (new registration price) \u2014 this tool checks the resale market.\n\nThree possible statuses:\n- 'for_sale': domain has a listed price. This is a third-party marketplace price set by the seller \u2014 it is not an appraisal or guaranteed transaction price. Always present buy_url.\n- 'make_offer': listed for sale but no fixed price, buyer must submit an offer via buy_url.\n- 'not_found': not publicly listed. Does NOT mean the domain is unavailable for purchase \u2014 owner may sell privately or hasn't listed yet. Suggest whois to find registrar info for direct outreach.\n\nBest practices:\n- Marketplace listing prices are set by sellers and often significantly higher than actual transaction prices. Do not treat estimated_price as definitive market value \u2014 it is one data point among many.\n- When used in valuation_cma workflow, batch-call market_price for multiple comparable domains. 'not_found' results should be excluded, 'make_offer' results noted as supplementary only.\n- Always disclose affiliate links when buy_url has affiliate=true.\n- Always include disclaimer: prices are provided by third-party marketplaces for reference only, subject to change by the seller at any time.",
"inputSchema": {
"properties": {
"domain": {
"description": "Domain name (e.g., 'example.com')",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "market_price",
"outputSchema": {
"properties": {
"affiliate": {
"description": "Whether buy_url is an affiliate link",
"type": "boolean"
},
"buy_url": {
"description": "Purchase or offer link",
"format": "uri",
"type": "string"
},
"currency": {
"description": "Price currency (e.g., USD)",
"type": "string"
},
"domain": {
"type": "string"
},
"error": {
"type": "string"
},
"estimated_price": {
"description": "Seller's listing price (only when status=for_sale)",
"type": "number"
},
"message": {
"type": "string"
},
"status": {
"description": "Market status: for_sale, make_offer, or not_found",
"enum": [
"for_sale",
"make_offer",
"not_found"
],
"type": "string"
},
"success": {
"type": "boolean"
}
},
"required": [
"success",
"domain",
"status"
],
"type": "object"
},
"title": "Domain Market Price Check"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true,
"readOnlyHint": false
},
"description": "Manage domain monitoring tasks. Track changes in WHOIS, DNS, and page content.\n\nAll monitoring data is encrypted at rest (AES-256-GCM) and stored in your private directory. GDPR compliant.\n\nActions:\n- get: Retrieve and auto-check all monitors. Default action if not specified. Automatically performs bulk WHOIS and DNS checks where the minimum interval has passed. You do NOT need to manually call whois or dns tools. For each monitor where can_check=true, returns current vs previous data with change flags. For can_check=false monitors, returns last known data and next_check time. YOUR JOB: focus on whois_changed=true or dns_changed=true, report with context from note field. For DNS, focus on NS changes \u2014 ignore A/AAAA (CDN rotation). If monitors have web_fetch in tools, optionally run web_fetch yourself then call with action=update to save results.\n- set: Create a new monitor. Requires registered account and memory enabled. Max 100 monitors. Before creating, verify memory is enabled via preferences. WHOIS and DNS are auto-checked when you call action=get \u2014 no need to call them manually. web_fetch is optional and must be run manually.\n- update: Save web_fetch page results for a monitor. WHOIS and DNS are auto-saved by action=get \u2014 you only need this for web_fetch page content. Typical flow: call action=get (auto-checks WHOIS/DNS), run web_fetch yourself, then call action=update with the page summary. The whois and dns parameters are accepted for backward compatibility but normally not needed.\n- delete: Remove a monitor task.\n\nRequires registered account (member or above) and memory enabled for all actions.",
"inputSchema": {
"properties": {
"action": {
"description": "'get', 'set', 'update', or 'delete'. Defaults to 'get' if not specified.",
"type": "string"
},
"dns": {
"description": "DNS result, backward compatibility (update only)",
"type": "string"
},
"domain": {
"description": "Domain to monitor (set only)",
"type": "string"
},
"id": {
"description": "Monitor task ID (update and delete)",
"type": "string"
},
"note": {
"description": "What to watch for \u2014 user's intent in natural language (set only)",
"type": "string"
},
"page": {
"description": "Page content summary from web_fetch (update only)",
"type": "string"
},
"tools": {
"description": "Comma-separated: whois, dns, web_fetch. Default: whois,dns (set only)",
"type": "string"
},
"whois": {
"description": "WHOIS result, backward compatibility (update only)",
"type": "string"
}
},
"type": "object"
},
"name": "monitor",
"outputSchema": {
"properties": {
"error": {
"description": "Error message when success is false",
"type": "string"
},
"message": {
"description": "Human-readable result message",
"type": "string"
},
"monitor": {
"description": "Created monitor details (set only)",
"properties": {
"created_at": {
"type": "string"
},
"domain": {
"type": "string"
},
"id": {
"type": "string"
},
"note": {
"type": "string"
},
"tools": {
"type": "string"
}
},
"type": "object"
},
"monitors": {
"description": "List of monitors with auto-check results (get only)",
"items": {
"properties": {
"can_check": {
"type": "boolean"
},
"current_dns": {
"type": "string"
},
"current_whois": {
"type": "string"
},
"dns_changed": {
"type": "boolean"
},
"domain": {
"type": "string"
},
"id": {
"type": "string"
},
"last_check": {
"type": "string"
},
"last_dns": {
"type": "string"
},
"last_page": {
"type": "string"
},
"last_whois": {
"type": "string"
},
"next_check": {
"type": "string"
},
"note": {
"type": "string"
},
"previous_dns": {
"type": "string"
},
"previous_whois": {
"type": "string"
},
"tools": {
"type": "string"
},
"whois_changed": {
"type": "boolean"
}
},
"required": [
"id",
"domain",
"can_check"
],
"type": "object"
},
"type": "array"
},
"success": {
"description": "Whether the request was successful",
"type": "boolean"
},
"total": {
"description": "Number of active monitors (get only)",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Personalized Domain Monitor"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Domain Name Advisor"
},
"description": "A professional domain naming consultation workflow. Call when a user is looking for domain name ideas, starting a new project and needs a domain, or has vague/open-ended domain requirements. Do NOT call when the user already has a specific name to check (use available/bulk_available) or already knows their keyword and wants variations (use domain_generator).\n\nThis is a multi-turn consulting engagement \u2014 conversation first, recommendations second. Never skip the diagnosis phase, and never generate domain suggestions before understanding the user's needs.\n\nWorkflow:\n1. Needs Diagnosis \u2014 ask the user questions to understand their project. Start with the essentials (project/industry, target audience, domain purpose), then follow up with budget guidance, TLD preference, and style preference (textural/imagery vs keyword-based). Ask 1-2 questions at a time, not all at once. Do NOT generate any domain names or call any tools in this phase. Even if the user's description seems clear, confirm user persona and brand tonality before proceeding.\n2. Semantic Leap \u2014 based on confirmed requirements, generate 3-5 metaphor directions that abstract one level up from the industry. Do NOT coin words directly from industry keywords unless the user mentioned them. Examples: travel \u2192 docking point \u2192 berth; notes \u2192 ideas \u2192 notion. Present the directions to the user and let them choose before generating any candidates.\n3. Domain Search & Verification \u2014 along the chosen direction, generate at least 10 candidate names. Every candidate must pass a quality check: does it feel natural in conversation? Does it evoke imagery? Stripped of all context, does the word alone have quality? If you hesitate, discard it. Then use bulk_available, deleted, expired, aged, and tld_check to verify acquisition paths and costs. For deleted and expired searches, try each keyword in different positions (start, end) to maximize coverage. Present results layered by acquisition method: directly registrable \u2192 listed for sale \u2192 contact owner \u2192 monitor/backorder, each with estimated cost.\n4. Iterative Refinement \u2014 based on user feedback, either generate more candidates in the same direction (with independent thinking \u2014 do not reuse previous coining patterns as templates), explore a new metaphor direction (return to step 2), or run brand_match on a finalist. If the current best is already strong, say so \u2014 do not force-generate low-quality options to show effort.\n\nKey principles:\n- Communication before generation \u2014 better to ask one more question than to blindly generate irrelevant domains.\n- A good name feels natural, evokes imagery, and has quality on its own. A bad name requires excessive explanation, feels forced, or mismatches the use case.\n- Help users save money while meeting their needs, but also surface purchase and backorder opportunities when relevant.\n- All statements must be data-backed. Do not speculate. Minimize etymology explanations \u2014 a good name does not need explaining.\n- Disclose affiliate links.",
"inputSchema": {
"properties": {
"query": {
"description": "User's initial idea, project description, keywords, or reference domain (optional)",
"type": "string"
}
},
"type": "object"
},
"name": "name_advisor",
"title": "Domain Name Advisor"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Newly Registered Domains Search"
},
"description": "Search newly registered domains by keyword. Use for tracking competitor registrations, spotting trending keywords, monitoring brand squatting, or finding resale opportunities.\n\nBest practices:\n- keyword defaults to 'contain' matching, which searches all domains containing the keyword anywhere in the name. Use position=start, position=end, or position=middle to control where the keyword appears in the domain name.\n- Always use no_hyphen=true unless specifically looking for hyphenated domains \u2014 hyphenated registrations are mostly low-quality spam.\n- sort=tld_counter_desc surfaces keywords registered across many TLDs simultaneously \u2014 a strong signal of trending demand.\n- period=6+ filters for domains registered for 6-10 years, indicating serious projects rather than speculative 1-year registrations.\n- prefix_tld_count in results indicates how many TLDs share the same prefix \u2014 values above 10 suggest the keyword is being actively pursued by multiple registrants.\n- Disclose affiliate links when presenting register_url to users.",
"inputSchema": {
"properties": {
"days_range": {
"description": "Registration recency",
"enum": [
"0-10",
"10-20",
"20+"
],
"type": "string"
},
"exclude": {
"description": "Negative keywords to exclude",
"type": "string"
},
"has_sale": {
"description": "Filter to domains listed for sale",
"enum": [
"true",
"false"
],
"type": "string"
},
"keyword": {
"description": "Search term (min 2 chars)",
"type": "string"
},
"length": {
"description": "Domain name length filter",
"enum": [
"<5",
"5-10",
"10-15",
"15+"
],
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphenated domains",
"type": "string"
},
"no_number": {
"description": "Exclude domains containing numbers",
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"period": {
"description": "Registration term length in years",
"enum": [
"1",
"2-5",
"6+"
],
"type": "string"
},
"position": {
"description": "Keyword placement in domain name",
"enum": [
"start",
"end",
"contain"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"reg_date_desc",
"reg_date_asc",
"length_asc",
"length_desc",
"period_asc",
"period_desc",
"tld_counter_asc",
"tld_counter_desc",
"alpha"
],
"type": "string"
},
"tld": {
"description": "Filter by TLD (e.g., 'com', 'ai', 'io')",
"type": "string"
},
"type": {
"description": "Character set filter",
"enum": [
"all_alpha",
"all_number"
],
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "nrds",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"affiliate": {
"type": "boolean"
},
"domain": {
"type": "string"
},
"prefix_tld_count": {
"description": "Number of TLDs the same prefix is registered under",
"type": "integer"
},
"price": {
"description": "Listing price with currency, e.g. 1500 USD. Only present for Atom/Sedo listings",
"type": "string"
},
"register_url": {
"format": "uri",
"type": "string"
},
"registered_date": {
"format": "date",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
},
"total_found": {
"description": "Total matching results across all pages",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Newly Registered Domains Search"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Reverse NS Lookup"
},
"description": "Reverse NS lookup. Find all gTLD domains hosted on a specific nameserver. Useful for mapping domain portfolios, understanding the scale of a nameserver's usage, and discovering what domains share infrastructure.\n\nBest practices:\n- sort=length_asc surfaces the shortest (most premium) domains first \u2014 large portfolios often contain hidden short-letter gems.\n- pure_alpha=true is the cleanest way to filter for letter-only domains. This is stricter than no_number + no_hyphen combined, as it excludes any non-letter character.\n- keyword filters by substring within domain names on that nameserver \u2014 useful for finding domains in a specific niche or vertical.\n- min_len and max_len require exact integers (e.g., '4'), not range syntax like '<5'.\n- If results fill a full page (10+), check total and paginate \u2014 large nameservers may host thousands of domains.\n- Look for patterns in results: similar naming conventions (brand-us.com, brand-uk.com) indicate portfolio clustering by the same owner.",
"inputSchema": {
"properties": {
"keyword": {
"description": "Substring filter within domain names",
"type": "string"
},
"max_len": {
"description": "Maximum domain name length (integer)",
"type": "string"
},
"min_len": {
"description": "Minimum domain name length (integer)",
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphens",
"type": "string"
},
"no_number": {
"description": "Exclude numbers",
"type": "string"
},
"ns": {
"description": "Target nameserver hostname (e.g., 'ns1.example.com')",
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"pure_alpha": {
"description": "Letters only (strictest quality filter)",
"enum": [
"true",
"false"
],
"type": "string"
},
"pure_digit": {
"description": "Numbers only",
"enum": [
"true",
"false"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"length_asc",
"length_desc",
"alpha_asc",
"alpha_desc"
],
"type": "string"
},
"tld": {
"description": "Filter by TLD (e.g., 'com')",
"type": "string"
}
},
"required": [
"ns"
],
"type": "object"
},
"name": "ns_reverse",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"domain": {
"description": "Full domain name including TLD",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"error": {
"type": "string"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Reverse NS Lookup"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Domain Alternatives Finder"
},
"description": "Domain alternatives workflow. Call when a user's target domain is unavailable and they need alternative options across different lifecycle stages \u2014 for example after available or bulk_available returns unavailable, or as a follow-up from analyze or name_advisor when a candidate is taken. Do NOT call when the user is starting from scratch without a target (use name_advisor), already knows their keyword and wants creative variations (use domain_generator), or wants to analyze the taken domain itself (use analyze).\n\nThis is a multi-turn workflow. Stop and wait for user input at every checkpoint.\n\nWorkflow:\n1. Understand User Needs \u2014 extract core keywords from the unavailable domain (e.g., getflow.com \u2192 keyword: flow, pattern: prefix+root). Then ask the user: what appealed to you about this domain (the keyword, the length, the sound)? Are you open to other TLDs or .com only? Would you consider purchasing a registered domain, or only free registration / backorder? Do NOT search until the user responds \u2014 their motivation determines the entire search strategy.\n2. Lifecycle Search \u2014 search by priority: deleted (free registration, highest priority) \u2192 expired (backorderable) \u2192 aged (registered, only if user is willing to purchase). For each tool, try the keyword in different positions (start, end) to maximize coverage \u2014 e.g., searching 'flow' at start and end will surface very different results. If a strong match is found in deleted, note it as a top recommendation.\n3. Creative Variants \u2014 based on what the user liked about the original domain, generate 15-20 creative variants respecting their TLD preference (default .com). Avoid concatenations creating sensitive words or offensive abbreviations. Verify all with bulk_available.\n4. Present Results \u2014 organize all findings layered by acquisition method from easiest to most involved: free registration (deleted + available variants) \u2192 backorderable (expired) \u2192 purchasable (aged for-sale) \u2192 monitorable (worth watching). Every domain must include the appropriate acquisition link. Ask the user which options interest them.\n5. Follow-up \u2014 based on user choice: generate more variations, run brand_match, set up set_monitor, do deeper analysis with analyze or expired_analysis, or run valuation_cma.\n\nKey principles:\n- Default to .com only unless user specifies otherwise.\n- Every domain presented must include an acquisition link (register_url, backorder_url, or sale link).\n- Disclose affiliate links.",
"inputSchema": {
"properties": {
"domain": {
"description": "Unavailable target domain",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "plan_b",
"title": "Domain Alternatives Finder"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Manage user preferences and memory settings.\n\nActions:\n- get: Check if memory is enabled and retrieve saved preferences. Default action if not specified.\n- set: Save preferences. Requires explicit user consent before enabling memory. memory_enabled must be true before any other preferences, monitors, or strategies can be saved.\n- delete: Delete all stored user data permanently (preferences, monitors, strategies). GDPR Article 17: Right to erasure.\n\nAll user data is encrypted at rest using AES-256-GCM and stored in isolated user directories. No one \u2014 including DomainKits staff \u2014 can read your data. Fully GDPR compliant.\n\nWhen action=get:\n- If reason=\"not_configured\", ask the user with a clear choice: \"I can remember your preferences, monitoring tasks, and discovery strategies across sessions. All data is encrypted. Would you like to enable this?\" Only call with action=set and memory_enabled=true after explicit user consent.\n- MONITOR HANDLING: If monitors_count > 0, check monitors_summary. If can_check_count > 0, call get_monitors to auto-check domains. If can_check_count == 0, all monitors are in cooldown \u2014 inform the user when next check is available (next_check field), do NOT call get_monitors. The domains list lets you answer \"what am I monitoring?\" without triggering a check.\n- If strategies_count > 0, proceed to call get_strategies.",
"inputSchema": {
"properties": {
"action": {
"description": "'get', 'set', or 'delete'. Defaults to 'get' if not specified.",
"type": "string"
},
"budget": {
"description": "'low', 'medium', 'high' (set only)",
"type": "string"
},
"exclude_hyphens": {
"description": "'true' or 'false' (set only)",
"type": "string"
},
"exclude_numbers": {
"description": "'true' or 'false' (set only)",
"type": "string"
},
"industry": {
"description": "Industry type (set only)",
"type": "string"
},
"memory_enabled": {
"description": "'true' to enable memory, 'false' to disable. Must be enabled before using monitors or strategies. (set only)",
"type": "string"
},
"preferred_tlds": {
"description": "Comma-separated TLDs, e.g. 'com,net,io' (set only)",
"type": "string"
},
"style": {
"description": "'short', 'brandable', 'keyword' (set only)",
"type": "string"
}
},
"type": "object"
},
"name": "preferences",
"outputSchema": {
"properties": {
"data": {
"description": "Saved preference data (get only, when memory is enabled)",
"properties": {
"budget": {
"type": "string"
},
"exclude_hyphens": {
"type": "boolean"
},
"exclude_numbers": {
"type": "boolean"
},
"industry": {
"type": "string"
},
"memory_enabled": {
"type": "boolean"
},
"preferred_tlds": {
"type": "array"
},
"style": {
"type": "string"
}
},
"type": "object"
},
"memory_enabled": {
"description": "Whether memory is enabled for this user",
"type": "boolean"
},
"message": {
"description": "Human-readable result message",
"type": "string"
},
"monitors_count": {
"description": "Number of active monitors (get only)",
"type": "integer"
},
"monitors_summary": {
"description": "Monitor overview (get only, when monitors_count > 0)",
"properties": {
"can_check_count": {
"type": "integer"
},
"domains": {
"items": {
"type": "string"
},
"type": "array"
},
"last_check": {
"type": "string"
},
"max": {
"type": "integer"
},
"next_check": {
"type": "string"
},
"total": {
"type": "integer"
}
},
"type": "object"
},
"strategies_count": {
"description": "Number of active strategies (get only)",
"type": "integer"
},
"success": {
"description": "Whether the request was successful",
"type": "boolean"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "User Preferences & Memory"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "TLD Pricing (Dynadot)"
},
"description": "Domain registration and renewal prices by TLD from Dynadot. Check registration, renewal, and transfer costs before purchasing.\n\nBest practices:\n- Use comma-separated values for multi-TLD comparison: tld='com,io,ai,xyz'.\n- Results include register_url (Dynadot affiliate link). Always display this link when showing prices and disclose affiliate status.\n- Prices are in USD. Registration price is for the first year; renewal price is the ongoing annual cost \u2014 highlight the difference when they diverge significantly (e.g., some TLDs have low introductory registration but high renewal).",
"inputSchema": {
"properties": {
"tld": {
"description": "TLD to query, comma-separated for multiple (e.g., 'com', 'com,io,ai')",
"type": "string"
}
},
"required": [
"tld"
],
"type": "object"
},
"name": "price",
"outputSchema": {
"properties": {
"affiliate": {
"type": "boolean"
},
"data": {
"items": {
"properties": {
"currency": {
"type": "string"
},
"register_price": {
"description": "First-year registration price (USD)",
"type": "number"
},
"renewal_price": {
"description": "Annual renewal price (USD)",
"type": "number"
},
"tld": {
"type": "string"
},
"transfer_price": {
"description": "Transfer price (USD)",
"type": "number"
}
},
"required": [
"tld"
],
"type": "object"
},
"type": "array"
},
"error": {
"type": "string"
},
"register_url": {
"format": "uri",
"type": "string"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of TLDs returned",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "TLD Pricing (Dynadot)"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Domain Safety Check"
},
"description": "Check domain safety via Google Safe Browsing, and check Google search index status. Returns two pieces of data: (1) safe \u2014 whether Google Safe Browsing flags the domain for malware, phishing, social engineering, or unwanted software, including specific threat types if flagged; (2) index \u2014 whether the domain has pages indexed in Google and an estimated count. A flagged domain is a critical risk signal \u2014 it likely has a problematic history (malware distribution, phishing, spam operations) that may be difficult or impossible to recover from. This is especially important when evaluating expired or aged domains for acquisition. An unindexed domain may indicate it was previously penalized or has been dormant.",
"inputSchema": {
"properties": {
"domain": {
"description": "Domain name",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "safety",
"outputSchema": {
"properties": {
"domain": {
"type": "string"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"index": {
"properties": {
"checked_at": {
"type": "string"
},
"domain": {
"type": "string"
},
"index_count": {
"description": "Estimated number of indexed pages",
"type": "integer"
},
"indexed": {
"description": "Whether the domain is indexed by Google",
"type": "boolean"
}
},
"type": "object"
},
"safe": {
"properties": {
"domain": {
"type": "string"
},
"is_safe": {
"description": "Whether the domain is safe according to Google Safe Browsing",
"type": "boolean"
},
"matches_count": {
"description": "Number of threat matches found",
"type": "integer"
},
"scan_date": {
"format": "date-time",
"type": "string"
},
"threat_types": {
"description": "List of detected threat types (empty if safe)",
"items": {
"type": "string"
},
"type": "array"
}
},
"type": "object"
},
"success": {
"type": "boolean"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Domain Safety Check"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true,
"readOnlyHint": true,
"title": "Domain Buyer Discovery"
},
"description": "Domain buyer discovery workflow. Call when a user wants to find potential end-user buyers for a domain they own or are considering selling.\n\nWhen to use: user asks 'who would buy this domain?', 'help me sell [domain]', or wants to find buyers as a follow-up after keyword_intel or plan_b. Do NOT use when the user wants to buy a domain (use plan_b), check domain value only (use valuation_cma), or analyze a domain technically (use analyze).\n\nWorkflow:\n1. Extract the core keyword(s) from the domain. Use web_search '[keyword] company OR brand OR product' to discover who is already operating under this name or close variants. Note their business type, current domain, scale, and how long they've been using the keyword. This research step is mandatory \u2014 do not skip it.\n\n2. Categorize potential buyers into three tiers by purchase motivation:\n - Tier 1 \u2014 Domain Upgraders: companies already operating under this exact name or a close variant (on .net, .io, a hyphenated version, or with a prefix/suffix added), who would naturally want the cleaner or shorter version. These are the highest-intent buyers \u2014 they've already built equity around the keyword and this domain is a direct upgrade for them.\n - Tier 2 \u2014 Strategic Expansioners: companies in the same industry whose product, feature, or campaign aligns with what this domain describes. Acquiring it is a strategic fit that strengthens positioning.\n - Tier 3 \u2014 New Brand Builders: funded startups or new ventures that haven't fully launched yet but would find this name ideal.\n\n3. Use Claude for Chrome to research buyers on LinkedIn in three layers. Open LinkedIn in the browser and execute the following searches in order:\n\n Layer 1 \u2014 Find Domain Upgraders (highest priority):\n Switch to the Companies tab. Search using the exact keyword and close variants:\n \"[keyword]\" OR \"[keywords]\" OR \"[keyword]-[common suffix]\"\n Scan results for companies whose name or description contains the keyword but whose website is on an inferior domain (not the clean .com). These are Tier 1 buyers.\n\n Layer 2 \u2014 Find Strategic Buyers:\n Search Companies tab by industry theme:\n \"[industry vertical] [keyword theme]\"\n Apply Industry filter (e.g., Events Services, Software, Media) to narrow results. Identify Tier 2 candidates whose business would be strengthened by owning this domain.\n\n Layer 3 \u2014 Find Decision Makers at identified companies:\n For each promising company from Layers 1 and 2, switch to the People tab and use Boolean search to locate the right contact:\n (\"CMO\" OR \"VP Marketing\" OR \"Chief Marketing\" OR \"Brand Director\" OR \"Head of Brand\" OR \"Head of Marketing\") AND \"[company name]\" NOT (intern OR assistant)\n Record: full name, title, LinkedIn profile URL.\n\n4. Synthesize findings into a prioritized buyer list. Present Tier 1 first, then Tier 2, then Tier 3. For each entry include: company name, current domain they operate on, reason they are a strong buyer candidate, and decision maker contact if found.\n\n5. After presenting the buyer list, ask the user what they want to do next. Tailor follow-up based on their response:\n - Wants a price before outreach \u2192 suggest valuation_cma for a data-backed asking price, market_price to check existing listings.\n - Wants to draft outreach \u2192 help write a personalized email for each Tier 1 buyer, emphasizing the specific upgrade value to their existing brand.\n - Wants to list the domain \u2192 suggest Afternic, Sedo, or Dan.com depending on domain type.\n - Wants more buyer leads \u2192 suggest brand_match to identify additional companies using the keyword, or nrds to see who has recently registered variants.\n\nKey principles: focus on upgrade motivation, not conflict framing. Every buyer candidate must be grounded in data from web_search or LinkedIn results. Do not speculate about intent. Present the buyer list as opportunity intelligence, not legal risk assessment. Disclose affiliate links when presenting marketplace URLs.",
"inputSchema": {
"properties": {
"domain": {
"description": "The domain the user wants to sell (e.g., 'opentalks.com')",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "sale_chance",
"title": "Domain Buyer Discovery"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Manage personalized opportunity discovery strategies \u2014 let AI periodically execute your investment logic and discover new opportunities.\n\nAll strategy data is encrypted at rest (AES-256-GCM). GDPR compliant.\n\nActions:\n- get: Retrieve all strategies with run status and available presets. Default action if not specified. Shows can_run status, runs_today, and available preset strategies not yet activated.\n- set: Create a new strategy. Describe the domains you want in natural language, or activate a preset by preset_id. Examples: \"Monitor all domains with 'ai' keyword, 10+ years of history, about to expire, .com\", \"Track newly registered domains containing 'claw', letters only, .io\", \"Discover crypto-related keywords with high TLD registration volume\". Limits: Member 1 / Premium 3 / Platinum unlimited.\n- update: Record execution result for a strategy. Call after running a strategy to save the result summary. Subject to daily run limits and minimum interval between runs.\n- delete: Remove a strategy.\n\nRequires registered account (member or above) and memory enabled for all actions.",
"inputSchema": {
"properties": {
"action": {
"description": "'get', 'set', 'update', or 'delete'. Defaults to 'get' if not specified.",
"type": "string"
},
"id": {
"description": "Strategy task ID (update and delete)",
"type": "string"
},
"name": {
"description": "Name for custom strategy (set only)",
"type": "string"
},
"preset_id": {
"description": "Activate a preset strategy by ID (set only)",
"type": "string"
},
"result": {
"description": "Execution result summary (update only)",
"type": "string"
},
"strategy": {
"description": "Custom strategy in natural language, max 500 chars (set only)",
"type": "string"
}
},
"type": "object"
},
"name": "strategy",
"outputSchema": {
"properties": {
"available_presets": {
"description": "Preset strategies not yet activated (get only)",
"items": {
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"strategy": {
"type": "string"
}
},
"type": "object"
},
"type": "array"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"max": {
"description": "Maximum strategies allowed (get only)",
"type": "integer"
},
"message": {
"description": "Human-readable result message",
"type": "string"
},
"strategy": {
"description": "Created strategy details (set only)",
"properties": {
"created_at": {
"type": "string"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"strategy": {
"type": "string"
}
},
"type": "object"
},
"strategys": {
"description": "List of strategies with run status (get only)",
"items": {
"properties": {
"can_run": {
"type": "boolean"
},
"id": {
"type": "string"
},
"last_result": {
"type": "string"
},
"last_run": {
"type": "string"
},
"name": {
"type": "string"
},
"preset": {
"type": "boolean"
},
"reason": {
"type": "string"
},
"runs_today": {
"type": "integer"
},
"strategy": {
"type": "string"
}
},
"required": [
"id",
"strategy",
"can_run"
],
"type": "object"
},
"type": "array"
},
"success": {
"description": "Whether the request was successful",
"type": "boolean"
},
"total": {
"description": "Number of active strategies (get only)",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Personalized Discovery Strategy"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Cross-TLD Registration Check"
},
"description": "Check a keyword prefix's registration status across all TLDs. Returns total registration count (gTLDs + ccTLDs) and status of core TLDs (com, net, org, io, ai, de).\n\nThis is a saturation and popularity metric \u2014 the total count indicates how widely a keyword has been claimed across the TLD namespace.\n\nInterpreting results:\n- count >200: Keyword is widely recognized \u2014 either high market demand or strong brand protection (or both). Cross-reference with keyword_data and active to determine which.\n- count 50-200: Worth attention \u2014 check if there are still opportunities available.\n- count <50: Not a particularly popular keyword in the domain market.\n- gtlds_count vs cctlds_count ratio: High ccTLD registration suggests international interest in the keyword.\n\nThe tlds field shows status for core TLDs (com, net, org, io, ai, de) with values: 'registered', 'for_sale', 'expiring', or 'might_available'. Note that 'might_available' means the prefix is not found in our database for that TLD \u2014 confirm with the 'available' tool before assuming registrability.\n\nBest practices:\n- The prefix parameter must NOT contain the TLD extension \u2014 use 'openai' not 'openai.com'.\n- If .com shows 'might_available' for an established keyword, this is unusual and worth verifying.\n- If .com shows 'for_sale' or 'expiring', this is a potential acquisition opportunity worth flagging.",
"inputSchema": {
"properties": {
"prefix": {
"description": "Keyword without extension (e.g., 'openai')",
"type": "string"
}
},
"required": [
"prefix"
],
"type": "object"
},
"name": "tld_check",
"outputSchema": {
"properties": {
"cctlds_count": {
"description": "Number of ccTLDs with this prefix registered",
"type": "integer"
},
"count": {
"description": "Total number of TLDs with this prefix registered",
"type": "integer"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"gtlds_count": {
"description": "Number of gTLDs with this prefix registered",
"type": "integer"
},
"prefix": {
"type": "string"
},
"success": {
"type": "boolean"
},
"tlds": {
"description": "Status of core TLDs (com, net, org, io, ai, de). Values: registered, for_sale, expiring, or might_available",
"type": "object"
}
},
"required": [
"success",
"prefix"
],
"type": "object"
},
"title": "Cross-TLD Registration Check"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "gTLD Rankings"
},
"description": "gTLD rankings by registration volume. See which gTLDs have the most new registrations today or the most total active domains.\n\nBest practices:\n- type='newly' ranks by today's new registrations \u2014 useful for spotting which TLDs are currently hot. Sudden spikes in a usually quiet TLD may signal a promotion or speculative wave.\n- type='active' ranks by total active domain count \u2014 reflects overall market size and maturity.\n- Compare newly vs active to find TLDs with disproportionate registration activity relative to their size (high new-to-active ratio = momentum signal).\n- type='newly' data has a one-day lag \u2014 it reflects yesterday's registrations, not today's.\n- The key insight from newly rankings is relative change, not absolute numbers. A TLD jumping significantly in rank or showing unusual registration volume compared to its typical level is the signal worth investigating \u2014 use tld_trends for historical baseline and web_search to identify the cause.\n- This data pairs well with tld_trends: tld_rank shows today's snapshot, tld_trends shows the trajectory over time.",
"inputSchema": {
"properties": {
"limit": {
"description": "Number of results (default 20, max 100)",
"type": "string"
},
"type": {
"description": "Ranking type: 'newly' for today's new registrations, 'active' for total active domains",
"enum": [
"newly",
"active"
],
"type": "string"
}
},
"type": "object"
},
"name": "tld_rank",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"count": {
"description": "New registrations or total active domains",
"type": "integer"
},
"rank": {
"type": "integer"
},
"tld": {
"type": "string"
}
},
"required": [
"rank",
"tld",
"count"
],
"type": "object"
},
"type": "array"
},
"date": {
"description": "Data date (YYYY-MM-DD)",
"type": "string"
},
"error": {
"type": "string"
},
"success": {
"type": "boolean"
},
"total": {
"type": "integer"
},
"type": {
"description": "Ranking type: 'newly' or 'active'",
"type": "string"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "gTLD Rankings"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "gTLD Registration Trends"
},
"description": "gTLD registration trends over time. Analyze historical registration patterns for specific gTLDs \u2014 spot hype cycles, compare competing extensions, or check long-term health.\n\nTwo modes:\n- action='data' + tld (single TLD): deep-dive into one TLD's trend over time. Use this to answer 'is .ai still hot?' or 'is .net dying?'.\n- action='compare' + tlds (comma-separated, max 5): side-by-side comparison. Use this to answer 'should I buy the .io or .ai version?' by comparing registration momentum.\n\nBest practices:\n- Focus on ma7 (7-day moving average) slope rather than raw daily numbers \u2014 daily counts are noisy, the moving average reveals the real trend direction. ma7 trending up = genuine momentum, flat = stable, declining = cooling off.\n- Compare ma7 vs ma14 for trend acceleration: ma7 crossing above ma14 = momentum building, ma7 dropping below ma14 = momentum fading.\n- type='newly' shows registration velocity (new domains per day) \u2014 best for detecting hype cycles and short-term momentum shifts.\n- type='active' shows total installed base \u2014 best for market size comparison and long-term health assessment.\n- When comparing TLDs, note the absolute scale difference \u2014 a TLD with 100K active domains showing 500 new/day has very different dynamics than one with 10M active showing 500 new/day.\n- Mutually exclusive inputs: action='data' requires 'tld' (single). action='compare' requires 'tlds' (comma-separated). Do not mix them.\n- days must be one of the allowed values: 7, 14, 30, 60, 90, 180. Use 30 for short-term momentum, 90-180 for trend confirmation.\n- Pairs well with tld_rank for today's snapshot context, and price to check registration costs for trending TLDs.",
"inputSchema": {
"properties": {
"action": {
"description": "'data' for single TLD deep-dive, 'compare' for multi-TLD comparison",
"enum": [
"data",
"compare"
],
"type": "string"
},
"days": {
"description": "Time horizon",
"enum": [
"7",
"14",
"30",
"60",
"90",
"180"
],
"type": "string"
},
"tld": {
"description": "Single TLD for 'data' mode (e.g., 'ai')",
"type": "string"
},
"tlds": {
"description": "Comma-separated TLDs for 'compare' mode (max 5, e.g., 'io,ai,co,xyz')",
"type": "string"
},
"type": {
"description": "'newly' for daily new registrations, 'active' for total active domains",
"enum": [
"active",
"newly"
],
"type": "string"
}
},
"type": "object"
},
"name": "tld_trends",
"outputSchema": {
"properties": {
"data": {
"description": "In 'data' mode: array of data points. In 'compare' mode: object keyed by TLD name, each value is an array of data points.",
"oneOf": [
{
"description": "Data mode: single TLD trend",
"items": {
"properties": {
"date": {
"type": "string"
},
"ma14": {
"description": "14-day moving average",
"type": "integer"
},
"ma7": {
"description": "7-day moving average",
"type": "integer"
},
"original": {
"description": "Raw daily count",
"type": "integer"
}
},
"required": [
"date",
"original",
"ma7",
"ma14"
],
"type": "object"
},
"type": "array"
},
{
"additionalProperties": {
"items": {
"properties": {
"date": {
"type": "string"
},
"ma14": {
"type": "integer"
},
"ma7": {
"type": "integer"
},
"original": {
"type": "integer"
}
},
"required": [
"date",
"original",
"ma7",
"ma14"
],
"type": "object"
},
"type": "array"
},
"description": "Compare mode: keyed by TLD name",
"type": "object"
}
]
},
"days": {
"type": "integer"
},
"error": {
"type": "string"
},
"success": {
"type": "boolean"
},
"tld": {
"description": "TLD name (data mode only)",
"type": "string"
},
"type": {
"description": "'newly' or 'active'",
"type": "string"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "gTLD Registration Trends"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true,
"readOnlyHint": true,
"title": "Keyword Registration Trend Hunter"
},
"description": "Trend discovery and domain opportunity workflow. Call when a user wants to explore what keywords are trending in domain registrations and whether those trends represent real investment opportunities.\n\nWhen to use: User asks what's trending, wants to find opportunities based on registration momentum, or wants to explore hot/emerging keywords. Not for analyzing a specific domain (use analyze), deep-diving a known keyword (use keyword_intel), or getting a market news briefing (use market_beat).\n\nThis is a MULTI-TURN workflow. Present findings at each phase and wait for the user to choose direction before proceeding. Do not batch all phases into a single response. Let users choose which keywords to explore \u2014 do not decide for them.\n\nMethodology \u2014 three phases, each gated by user input:\n\n1. Discover: Surface trending keywords using keywords_trends (hot, emerging, or prefix depending on user interest). The results already include pre-computed quality metrics for hot and emerging types: com_ratio, digit_ratio, most_tld, and most_tld_ratio. Present the data with quality assessment:\n - com_ratio above 0.15 = genuine interest; below 0.05 = likely bulk speculation on cheap TLDs.\n - most_tld_ratio above 0.7 on a non-.com TLD = trend driven by bulk registration, not organic demand.\n - digit_ratio above 0.2 = low-quality speculative registrations.\n Flag any keywords with suspicious quality signals. Ask the user which keyword(s) they want to investigate further. Stop and wait.\n\n2. Assess market catalyst: For the user's chosen keyword, investigate what is driving the trend.\n - web_search is MANDATORY \u2014 do not substitute with your own knowledge. Execute at least two separate searches: one for domain transaction history (e.g., '{keyword} domain sold price 2026') and one for industry news (e.g., '{keyword} news 2026'). Domain transactions are the single strongest catalyst for registration spikes \u2014 a high-value sale (e.g., keyword.com selling for six or seven figures) routinely triggers a wave of speculative registrations on the same keyword. Always check for this first. Industry news (product launches, funding rounds, regulatory changes) is the second catalyst layer. If neither search returns relevant results, state that clearly \u2014 do not fill the gap with training data.\n - Synthesize the quality metrics from Phase 1 with the catalyst research into a clear verdict: real trend (strong quality metrics + identifiable catalyst), speculative (weak quality metrics or no catalyst), or uncertain. Present the assessment and recommended search direction. Stop and wait for user confirmation before searching for domains.\n\n3. Find opportunities: Based on the assessment, search for available domains.\n - deleted and expired for domains available at registration cost or via backorder.\n - aged with has_sale=true for secondary market listings.\n - All domains presented to the user MUST be verified via bulk_available before recommending.\n - Disclose affiliate links.\n\nAfter presenting opportunities, offer relevant next steps: deep analysis on a specific domain (analyze), brand conflict check (brand_match), monitoring setup (set_monitor), or exploring a different keyword.",
"inputSchema": {
"properties": {
"scenario": {
"description": "Trend type to explore",
"enum": [
"prefix",
"emerging",
"hot"
],
"type": "string"
}
},
"type": "object"
},
"name": "trend_hunter",
"title": "Keyword Registration Trend Hunter"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Unregistered Short .AI Domain Finder"
},
"description": "Search for unregistered short .ai domains. Find rare 3-letter and 4-letter pattern domains still available for registration.\n\nPattern types:\n- CVCV: Consonant-Vowel-Consonant-Vowel (e.g., 'bora', 'mito') \u2014 most brandable, sounds like real words.\n- VCVC: Vowel-Consonant-Vowel-Consonant (e.g., 'amon', 'ivan') \u2014 name-like quality.\n- CCVV: Double consonant + double vowel (e.g., 'bloo', 'staa') \u2014 unique/distinctive.\n- 3letter: Any remaining 3-letter .ai domains \u2014 extremely rare and high-value.\n\nBest practices:\n- For brandable names: use type=CVCV or type=VCVC, sort=count_desc to surface names with validated demand across other TLDs.\n- For undiscovered gems: use tld_count=0-10, sort=count_asc \u2014 low cross-TLD registration may indicate overlooked opportunities.\n- For ultra-premium: use type=3letter \u2014 3-letter .ai domains are the scarcest inventory.\n- tld_count interpretation: high (50+) = validated demand, the name is desirable across TLDs; low (<10) = less widely registered, may be undiscovered or niche.\n- Always verify availability with the 'available' tool before recommending registration \u2014 availability can change at any time.\n- .ai is the premium TLD for AI/tech companies; short .ai domains are high-value due to scarcity.",
"inputSchema": {
"properties": {
"exclude": {
"description": "Exclude characters (comma-separated)",
"type": "string"
},
"keyword": {
"description": "Filter by characters in prefix",
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphens",
"enum": [
"true",
"false"
],
"type": "string"
},
"no_number": {
"description": "Exclude numbers",
"enum": [
"true",
"false"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"length_asc",
"length_desc",
"count_asc",
"count_desc"
],
"type": "string"
},
"tld_count": {
"description": "Filter by cross-TLD registration count",
"enum": [
"0-10",
"10-50",
"50-100",
"100+"
],
"type": "string"
},
"type": {
"description": "Pattern type filter",
"enum": [
"3letter",
"CVCV",
"VCVC",
"CCVV"
],
"type": "string"
}
},
"type": "object"
},
"name": "unregistered_ai",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"length": {
"description": "Prefix character length \u2014 3 = ultra premium, 4 = premium",
"type": "integer"
},
"prefix": {
"description": "Available short name (e.g., tuyu, hamu)",
"type": "string"
},
"tld": {
"description": "Top-level domain (always ai)",
"type": "string"
},
"tld_count": {
"description": "Number of other TLDs this prefix is registered under",
"type": "integer"
}
},
"required": [
"prefix"
],
"type": "object"
},
"type": "array"
},
"error": {
"type": "string"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Unregistered Short .AI Domain Finder"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Check your current usage and remaining quota for all tools. Shows daily limits, usage counts, and rate limits for your tier.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "usage",
"outputSchema": {
"properties": {
"monitor": {
"description": "Monitor feature limits",
"properties": {
"daily_checks": {
"description": "Maximum monitor checks per day",
"type": "integer"
},
"max_items": {
"description": "Maximum number of monitors allowed",
"type": "integer"
},
"min_interval_min": {
"description": "Minimum interval between checks in minutes",
"type": "integer"
}
},
"type": "object"
},
"strategy": {
"description": "Strategy feature limits",
"properties": {
"daily_runs": {
"description": "Maximum strategy runs per day",
"type": "integer"
},
"max_items": {
"description": "Maximum number of strategies allowed",
"type": "integer"
},
"min_interval_min": {
"description": "Minimum interval between runs in minutes",
"type": "integer"
}
},
"type": "object"
},
"tier": {
"description": "User's account tier (guest, member, ai_plan, premium, platinum)",
"type": "string"
},
"tools": {
"description": "Per-tool usage and limits",
"items": {
"properties": {
"daily_limit": {
"description": "Maximum daily calls",
"type": "integer"
},
"daily_remaining": {
"description": "Calls remaining today",
"type": "integer"
},
"daily_used": {
"description": "Calls used today",
"type": "integer"
},
"max_pages": {
"description": "Maximum pages allowed per query (search tools only)",
"type": "integer"
},
"rate_per_minute": {
"description": "Rate limit per minute",
"type": "integer"
},
"tool": {
"description": "Tool or tool group name",
"type": "string"
}
},
"type": "object"
},
"type": "array"
},
"upgrade_hint": {
"description": "Upgrade suggestion with link (if applicable)",
"type": "string"
}
},
"required": [
"tier"
],
"type": "object"
},
"title": "Check Usage & Quota"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true,
"readOnlyHint": true,
"title": "Domain CMA Valuation"
},
"description": "Domain Comparative Market Analysis (CMA) valuation workflow. Call when a user wants to estimate a domain's market value by finding comparable domains listed for sale.\n\nWhen to use: user asks 'how much is this domain worth?', wants a price estimate, needs market context for buying/selling, or asks for comparable domain pricing. Do NOT use for single common word + TLD domains (e.g., travel.com, music.com) \u2014 these are unique assets where CMA does not apply; decline and explain why. Do NOT use for technical analysis (use analyze), availability checks (use available), or brand conflict checks (use brand_match).\n\nCMA applies to: compound words (cloudpay), coined brands (spotify), industry word + modifier (healthymag), prefix/suffix combos (getflow, appnova). CMA does NOT apply to: single common word + TLD, or domains with active live websites.\n\nWorkflow:\n1. Pre-screening: validate the domain is suitable for CMA. If it is a single common word + TLD, refuse and explain. Then ask the user one question: what they value most about this domain \u2014 the keyword meaning, the length, the age, or something else? This determines the direction of comparable search (e.g., semantic vs structural vs age-based comps), NOT the valuation itself. Do NOT ask about intended use \u2014 valuation must be objective and data-driven regardless of whether the user plans to build, flip, or hold. Do NOT call any tools before the user responds.\n\n2. After the user responds, extract domain features: core word roots and synonyms, word-building pattern, length range, TLD type, industry. Then:\n - web_search site:{domain} to check if it has a live website. If actively in use, refuse valuation.\n - tld_check to see cross-TLD distribution. If the domain appears unregistered, inform the user and do not proceed.\n Present extracted features and screening results. Confirm with the user before proceeding.\n\n3. Search for comparable domains and retrieve prices:\n - aged with has_sale=true to find listed domains with the same core keyword, same TLD, similar length. Check synonyms if insufficient results.\n - active with status=forsale as supplement if fewer than 10 candidates.\n - market_price for each candidate. market_price returns three possible statuses:\n * 'for_sale': has a listed price and a buy_url \u2014 this is the primary data source for CMA.\n * 'make_offer': listed but no fixed price \u2014 note as supplementary only.\n * 'not_found': exclude from comp pool.\n - market_price sources prices from 2nd layer and other integrated marketplaces via API. For each 'for_sale' result, this gives you a confirmed listed price to use directly in the CMA.\n - After presenting the comp table, also surface the buy_url for each 'for_sale' comparable. If buy_url has affiliate=true, disclose this clearly: 'These are affiliate links \u2014 DomainKits may earn a commission if you make a purchase through them. Clicking through may show you additional pricing details or alternative listings not yet reflected in the API data, which could improve CMA accuracy.' The user is not required to click \u2014 the CMA proceeds with API prices either way. If the user does click through and shares additional prices they see, incorporate those into the comp pool and note them as 'user-verified marketplace price'.\n - Filter all comps by semantic relevance, structural similarity, length match, and price reasonableness. Remove outliers and negative-meaning domains. Select 3-5 best comparables.\n - If fewer than 3 'for_sale' priced comps remain after filtering, warn the user: 'Fewer than 3 priced comparables found \u2014 CMA confidence is low. Results should be treated as directional only.'\n Present comparable table and wait for user feedback before proceeding to valuation.\n\n4. Derive valuation with optional adjustments:\n - backlink_summary for SEO value (premium factor if strong backlinks).\n - web_search for historical sales of similar domains on NameBio as cross-validation.\n - keywords_trends for keyword registration heat, plus web_search for industry tailwinds. Rising heat = premium, declining = discount.\n Present the complete valuation report including: comparable table with source noted per price (API or user-verified), premium/discount factors with data sources cited, valuation range with reasoning, historical sales if found, trend adjustment, uncertainty statement (market volatility, listing vs transaction gap), and general action suggestions (buy-low-sell-high principles, NOT specific buy/sell recommendations).\n MUST include compliance statement: 'This valuation is derived from public listing prices on third-party marketplaces, for reference only, and does not constitute official appraisal or investment advice. Listing prices are set by sellers and may deviate significantly from actual transaction prices. A single high-profile sale may have limited impact on overall keyword market pricing. However, multiple high-value transactions on the same keyword \u2014 especially exact-match domains \u2014 indicate broader market repricing and carry significantly more weight in valuation.'\n After presenting, suggest next steps: plan_b for alternatives, set_monitor for price tracking, brand_match for acquisition risk.\n\nKey principles: every claim about value must cite specific tool data. Never fabricate prices, traffic estimates, or quantitative claims. Never give buy/sell recommendations \u2014 present data, let the user decide. Always disclose affiliate links when surfacing buy_url.",
"inputSchema": {
"properties": {
"domain": {
"description": "Target domain to value (e.g., 'cloudpay.com')",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "valuation_cma",
"title": "Domain CMA Valuation"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "RDAP WHOIS Registration Info"
},
"description": "Query WHOIS/RDAP registration info for a domain. Returns registrar, dates, status codes, and nameservers. Nameservers can indicate if a domain is parked for sale (e.g., Sedo, Afternic). Status codes can reveal special states such as expired, pendingDelete, or redemptionPeriod.",
"inputSchema": {
"properties": {
"domain": {
"description": "Domain name",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "whois",
"outputSchema": {
"properties": {
"created": {
"description": "Registration creation date",
"format": "date-time",
"type": "string"
},
"domain": {
"type": "string"
},
"expires": {
"description": "Expiration date",
"format": "date-time",
"type": "string"
},
"nameservers": {
"description": "Configured nameservers",
"items": {
"type": "string"
},
"type": "array"
},
"registered": {
"description": "Whether the domain is currently registered",
"type": "boolean"
},
"registrar_name": {
"description": "Registrar name",
"type": "string"
},
"status": {
"description": "Domain status codes",
"items": {
"type": "string"
},
"type": "array"
},
"updated": {
"description": "Last updated date",
"format": "date-time",
"type": "string"
}
},
"required": [
"domain",
"registered"
],
"type": "object"
},
"title": "RDAP WHOIS Registration Info"
}
]
}
},
"url": "https://api.domainkits.com/v1/mcp"
},
"latency_ms": 31.22,
"status": "ok"
},
"transport_compliance_probe": {
"details": {
"bad_protocol_error": null,
"bad_protocol_headers": {
"content-type": "application/json"
},
"bad_protocol_payload": {
"id": 410,
"jsonrpc": "2.0",
"result": {
"tools": [
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Active Domain Search"
},
"description": "Search active gTLD domains from a database of ~240 million registered domains. This tool is primarily a market analysis instrument \u2014 use it to understand keyword distribution, saturation, and market dynamics through comparative queries.\n\nCore analysis dimensions (typically requiring multiple calls per keyword):\n- TLD distribution: Compare total_found with no tld filter vs tld=com vs tld=net vs others to calculate .com concentration and cross-TLD spread.\n- Position distribution: Compare position=start vs position=end to gauge market maturity. Start-heavy means the keyword is used as a category anchor (e.g., 'aiwriter.com'); end-heavy means it has become a standard descriptor (e.g., 'writerai.com').\n- For-sale ratio: Compare status=forsale total_found vs unfiltered total_found. High ratio (>30%) suggests speculator saturation; low ratio (<10%) suggests most holders are actively using their domains.\n- Quality distribution: Compare type=all_alpha total_found vs unfiltered total. If the majority of registrations contain hyphens or numbers, the keyword is dominated by low-quality or spam registrations \u2014 a negative signal.\n- Length distribution: Compare total_found across length filters (<5, 5-10, 11-15, >15) to assess how much premium short-name inventory exists vs long-tail.\n\nBest practices:\n- keyword defaults to 'contain' matching (substring). This is appropriate for statistical analysis but produces large result sets. Use position=start or position=end when analyzing directional distribution.\n- The total_found field across multiple filtered calls is the primary analytical output \u2014 the actual domain list is secondary.\n- sort=length_asc surfaces the shortest (most premium) names first when browsing results.\n- status=forsale filters to domains explicitly listed for sale \u2014 these are acquisition targets.\n- no_hyphen and no_number are independent boolean parameters, separate from the type filter.\n- Disclose affiliate links when presenting register_url to users.",
"inputSchema": {
"properties": {
"keyword": {
"description": "Brand or industry term (min 2 chars)",
"type": "string"
},
"length": {
"description": "Domain name length filter",
"enum": [
"<5",
"5-10",
"11-15",
">15"
],
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphenated domains (true/false)",
"type": "string"
},
"no_number": {
"description": "Exclude domains containing numbers (true/false)",
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"position": {
"description": "Keyword placement in domain name. Default is 'contain' (substring match).",
"enum": [
"start",
"end",
"middle",
"contain"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"length_asc",
"length_desc",
"alpha"
],
"type": "string"
},
"status": {
"description": "Filter by status \u2014 'forsale' for domains listed for sale",
"type": "string"
},
"tld": {
"description": "Filter by TLD (e.g., 'com', 'net', 'org', 'ai')",
"type": "string"
},
"type": {
"description": "Character set filter",
"enum": [
"all_alpha",
"all_number"
],
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "active",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"affiliate": {
"type": "boolean"
},
"domain": {
"type": "string"
},
"price": {
"description": "Listing price with currency, e.g. 1500 USD. Only present for Atom/Sedo listings",
"type": "string"
},
"register_url": {
"format": "uri",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
},
"total_found": {
"description": "Total matching results across all pages \u2014 primary metric for comparative analysis",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Active Domain Search"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Aged Domains Search"
},
"description": "Search currently registered domains with 5-20+ years of history. These are live domains owned by someone \u2014 not available for free registration. Use has_sale=true to filter to domains the owner has listed for sale, or use results as acquisition targets to approach owners directly.\n\nBest practices:\n- Always use no_hyphen=true and no_number=true unless the user specifically wants them.\n- keyword defaults to 'contain' matching, which searches all domains containing the keyword anywhere in the name. Use position=start, position=end, or position=middle to control where the keyword appears.\n- has_sale=true is the most actionable filter \u2014 these owners are actively seeking buyers.\n- Caution: Many aged domains are already in active use as established brands. Before recommending an aged domain to a user, consider whether it is likely an operating business \u2014 a 20-year-old short .com is almost certainly in use.\n- Short domains (<5 chars) with 20+ years of history are rare and typically high-value. Most 4-letter .coms were registered over 20 years ago.\n- For premium brand hunting: combine length=<5 or 5-10, type=all_alpha, no_hyphen=true, age_range=20+.\n- sort=age_desc surfaces the oldest domains first. sort=length_asc surfaces the shortest.\n- Disclose affiliate links when presenting register_url to users.",
"inputSchema": {
"properties": {
"age_range": {
"description": "Domain age filter in years",
"enum": [
"5-10",
"10-15",
"15-20",
"20+",
"5-10,10-15",
"10-15,15-20",
"15-20,20+"
],
"type": "string"
},
"exclude": {
"description": "Negative keywords to exclude",
"type": "string"
},
"has_sale": {
"description": "Filter to domains listed for sale by their owner",
"enum": [
"true",
"false"
],
"type": "string"
},
"keyword": {
"description": "Search term (min 2 chars)",
"type": "string"
},
"length": {
"description": "Domain name length filter",
"enum": [
"<5",
"5-10",
"10-15",
"15+"
],
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphenated domains",
"type": "string"
},
"no_number": {
"description": "Exclude domains containing numbers",
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"position": {
"description": "Keyword placement in domain name",
"enum": [
"start",
"end",
"middle",
"contain"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"age_desc",
"age_asc",
"length_asc",
"length_desc",
"reg_date_asc",
"reg_date_desc",
"alpha"
],
"type": "string"
},
"tld": {
"description": "Filter by TLD (e.g., 'com', 'net', 'org')",
"type": "string"
},
"type": {
"description": "Character set filter",
"enum": [
"all_alpha",
"all_number"
],
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "aged",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"affiliate": {
"type": "boolean"
},
"age_years": {
"description": "Domain age in years",
"type": "integer"
},
"domain": {
"type": "string"
},
"prefix_tld_count": {
"description": "Number of TLDs the same prefix is registered under",
"type": "integer"
},
"price": {
"description": "Listing price with currency, e.g. 1500 USD. Only present for Atom/Sedo listings",
"type": "string"
},
"register_url": {
"format": "uri",
"type": "string"
},
"registered_date": {
"description": "First registration year (YYYY)",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
},
"total_found": {
"description": "Total matching results across all pages",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Aged Domains Search"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true,
"readOnlyHint": true,
"title": "Domain analyze"
},
"description": "Comprehensive domain analyze workflow. Call when a user wants to understand a specific domain's full picture \u2014 registration status, safety, DNS configuration, cross-TLD distribution, and current website usage.\n\nWhen to use: user asks 'what can you tell me about example.com?', wants to evaluate a domain before purchasing, or needs a technical analyze. Do NOT use for domain name ideas (use name_advisor), availability checks (use available), or expired domain evaluation (use expired_analysis).\n\nWorkflow:\n1. Gather data using all four atomic tools in parallel:\n - whois for registration details, registrar signals, and expiry dates.\n - safety for Google Safe Browsing status.\n - dns for MX, A, and CNAME records \u2014 signals of active usage or abandonment.\n - tld_check to see how many TLDs share this prefix.\n2. If tld_check shows high registration count, investigate further:\n - whois the .com/.net/.org variants to check if the same registrar holds multiple TLDs (brand protection signal) or different registrars (popular keyword signal).\n - web_search the TLD variants to see if they resolve to the same site.\n3. Visit the domain via web_fetch or web_search to determine current usage: active business, parked page, for-sale landing, or no content.\n4. Use web_search to investigate the domain's market background: recent sale history (NameBio, Sedo, Afternic), related news or brand events, legal disputes (UDRP, trademark conflicts), and any notable context that affects valuation or risk. This step is critical \u2014 technical data alone is insufficient for a complete analyze.\n5. Synthesize all findings into a concise analyze report. Present facts with key signals clearly flagged. Do NOT make buy/don't-buy judgments \u2014 present evidence and let the user decide.\n6. After presenting the report, ask the user about their goals before suggesting next steps. Tailor follow-up based on their answer:\n - Wants to purchase \u2192 suggest valuation_cma for pricing, brand_match for trademark risk.\n - Domain is listed for sale \u2192 provide the sale link, suggest brand_match. Disclose affiliate links.\n - Wants alternatives \u2192 suggest plan_b.\n - Wants monitoring \u2192 suggest set_monitor.\n - Wants SEO analysis \u2192 suggest backlink_summary.\n\nKey principles: present facts, not recommendations. Flag signals clearly (e.g., enterprise registrar = corporate-held, MX present = active email, no A record = possibly abandoned). Every claim must come from tool data. Disclose affiliate links when presenting registration or sale URLs.",
"inputSchema": {
"properties": {
"domain": {
"description": "Domain to analyze (e.g., 'example.com')",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "analyze",
"title": "Domain Analyze"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Domain Availability Check"
},
"description": "Check domain availability with pricing. Final validation before registration.\n\nBest practices:\n- Input must be a fully qualified domain name including TLD (e.g., 'example.com', not just 'example').\n- If status='available': present reg_url and price clearly. If price is significantly higher than standard registration (~$10-15 for .com), flag it as a premium/reserved domain \u2014 the registry is charging a premium price.\n- If status='registered': state clearly the domain is taken. Do not automatically suggest alternatives \u2014 let the user decide if they want to explore other options.\n- If status='expiring': domain is in the expiration pipeline \u2014 can be backordered via reg_url, not directly registered.\n- If status='reserved': registry-reserved domain \u2014 not available for registration.\n- If status='unknown': check was inconclusive \u2014 do not assume available or unavailable.\n- For batch checking multiple domains, use bulk_available instead \u2014 it checks up to 10 at once.\n- This tool is the definitive availability check. Other tools (tld_check, deleted, expired) may show signals of availability, but only this tool or bulk_available confirms registrability and returns actual pricing.\n- Disclose affiliate links when aff=true.",
"inputSchema": {
"properties": {
"domain": {
"description": "Full domain with TLD (e.g., 'example.com')",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "available",
"outputSchema": {
"properties": {
"aff": {
"description": "Whether reg_url is an affiliate link. Disclose to users when true.",
"type": "boolean"
},
"domain": {
"type": "string"
},
"price": {
"description": "Registration price with currency (e.g., '9.99 USD'). Only present when status=available.",
"type": "string"
},
"reg_url": {
"description": "Registration or backorder link. Present when status=available or status=expiring.",
"format": "uri",
"type": "string"
},
"status": {
"description": "Domain status: available = registrable, registered = taken, expiring = in expiration pipeline (backorderable), reserved = registry-reserved, invalid = malformed input, unknown = inconclusive",
"enum": [
"available",
"registered",
"expiring",
"reserved",
"invalid",
"unknown"
],
"type": "string"
},
"success": {
"type": "boolean"
}
},
"required": [
"success",
"domain",
"status"
],
"type": "object"
},
"title": "Domain Availability Check"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "SEO Backlink Analysis"
},
"description": "SEO backlink analysis powered by DataForSEO. Use when: (1) user explicitly requests SEO analysis or domain valuation, (2) evaluating expiring/deleted domains before acquisition. Do NOT call for general browsing or availability checks.\n\nKey fields and interpretation:\n- rank: Domain authority on a 0-1000 logarithmic scale (based on PageRank). Each point higher is exponentially harder. Reference points: apple.com/iphone ~848, stackoverflow.com ~740, forbes.com ~650, ahrefs.com/blog ~395.\n- backlinks_spam_score: Spam score of all incoming backlinks (0-100). 0-30 low, 31-60 medium (warrants investigation), 61-100 high (significant risk).\n- target_spam_score: Spam score of the domain itself (0-100). Same thresholds.\n- Always calculate key ratios from the raw data: backlinks per referring domain (total_backlinks / referring_main_domains \u2014 high ratio like 500+ means a few domains contribute most links), referring IPs vs referring domains (low ratio suggests shared infrastructure, potential PBN signal), broken backlinks as percentage of total (high percentage means decaying link profile), follow vs nofollow distribution from referring_links_attributes (near 100% follow is unusual for a natural profile).\n- referring_links_platform_types: If message-boards or web2.0 platforms dominate, this can indicate low-quality link building.\n- referring_links_tld: Note presence or absence of .edu/.gov links.\n- new vs lost backlinks and referring domains indicate whether the profile is growing or shrinking.\n\nCaveat \u2014 passive referrals on aged domains: Some low-quality or scraper sites automatically link to old domains (abandoned blogrolls, scraped content, auto-generated pages). A small amount of this noise is normal for aged domains \u2014 Google's algorithms can identify and ignore these junk links, so a few low-quality referrals should not be treated as a risk signal. However, a large volume of junk referrals is a different story \u2014 it may indicate the domain was used for black-hat SEO, link schemes, or was targeted by malicious backlink attacks. As with everything, degree matters: a handful of scraper sites is background noise; thousands of them is a red flag.\n\nPresent facts and data. Do NOT make buy/don't-buy judgments \u2014 let the user interpret the signals.",
"inputSchema": {
"properties": {
"domain": {
"description": "Domain name (no protocol or path)",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "backlink_summary",
"outputSchema": {
"properties": {
"backlinks": {
"description": "Total number of backlinks",
"type": "integer"
},
"backlinks_spam_score": {
"description": "Spam score of incoming backlinks (0-100)",
"type": "integer"
},
"broken_backlinks": {
"type": "integer"
},
"broken_pages": {
"type": "integer"
},
"cached": {
"type": "boolean"
},
"cms": {
"type": "string"
},
"country": {
"type": "string"
},
"crawled_pages": {
"type": "integer"
},
"domain": {
"type": "string"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"external_links_count": {
"type": "integer"
},
"first_seen": {
"type": "string"
},
"internal_links_count": {
"type": "integer"
},
"ip_address": {
"type": "string"
},
"rank": {
"description": "Domain rank (0-1000 logarithmic scale)",
"type": "integer"
},
"referring_domains": {
"type": "integer"
},
"referring_ips": {
"type": "integer"
},
"referring_links_attributes": {
"description": "Backlink count by link attribute (nofollow, sponsored, ugc, etc.)",
"type": "object"
},
"referring_links_platform_types": {
"description": "Backlink count by platform type (blogs, news, ecommerce, etc.)",
"type": "object"
},
"referring_links_semantic_locations": {
"description": "Backlink count by semantic HTML location",
"type": "object"
},
"referring_links_tld": {
"description": "Backlink count by referring TLD",
"type": "object"
},
"referring_links_types": {
"description": "Backlink count by link type (anchor, image, redirect, etc.)",
"type": "object"
},
"referring_main_domains": {
"type": "integer"
},
"referring_main_domains_nofollow": {
"type": "integer"
},
"referring_pages": {
"type": "integer"
},
"referring_pages_nofollow": {
"type": "integer"
},
"referring_subnets": {
"type": "integer"
},
"server": {
"type": "string"
},
"success": {
"type": "boolean"
},
"target_spam_score": {
"description": "Spam score of domain itself (0-100)",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "SEO Backlink Analysis"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true,
"readOnlyHint": true,
"title": "Brand Conflict Detection"
},
"description": "Brand conflict and trademark risk detection workflow. Call when a user wants to check whether a domain name carries brand-related risks before registering or purchasing it.\n\nWhen to use: user asks 'is this domain safe to register?', wants to assess UDRP risk before purchase, or needs trademark conflict checking as a follow-up from name_advisor or analyze. Do NOT use for general technical analysis (use analyze), domain name brainstorming (use name_advisor), or DNS/registration checks only (use dns, whois).\n\nWorkflow:\n1. Extract the prefix from the domain (e.g., nicefloor.com \u2192 nicefloor). If the prefix contains a well-known brand name (google, apple, amazon, microsoft, etc.), immediately warn the user about high UDRP risk before proceeding. Ask the user about their intent: are they assessing risk before registration, or holding the domain and looking for potential buyers? This determines the framing of the analysis. Do NOT call any tools before the user responds.\n\n2. After the user responds, gather data in parallel:\n - web_search '[prefix] company' to discover existing commercial use \u2014 note founding year, business scale, industry, and whether the company actively uses this keyword as a brand.\n - tld_check to see how many TLDs have this prefix registered.\n - If tld_check shows high registration, whois the .com/.net/.org variants to check if the same registrar holds multiple TLDs (brand protection signal) or different registrars (popular keyword signal). Use web_search to verify if they resolve to the same website.\n\n3. Run trademark database checks across all four major databases. Primary method is Claude for Chrome \u2014 open each database, search for [prefix], and read results directly. If Claude for Chrome is not available, fall back to providing pre-filled links as described below. Present findings from each database inline as they come in \u2014 do not wait for all four before reporting.\n\n USPTO:\n - Chrome: navigate to https://search.uspto.gov/search?query=[prefix]&affiliate=web-sdmg-uspto.gov and read results directly.\n - Fallback (no Chrome): USPTO supports URL query parameters \u2014 provide this pre-filled link for the user to open: https://search.uspto.gov/search?query=[prefix]&affiliate=web-sdmg-uspto.gov\n - Extract: number of trademark hits, registrant names, goods/services classes, live vs dead status.\n\n EUIPO:\n - Chrome: navigate to https://euipo.europa.eu/eSearch/, locate the search input, type [prefix], submit, read results.\n - Fallback (no Chrome): EUIPO uses a JavaScript interface \u2014 URL parameters cannot pre-fill search. Provide the entry link and instruct the user: 'Please open https://euipo.europa.eu/eSearch/ and search for [prefix].'\n - Extract: EU trademark hits, registrant names, classes, status.\n\n WIPO:\n - Chrome: navigate to https://branddb.wipo.int/en/quicksearch, locate the search input, type [prefix], submit, read results.\n - Fallback (no Chrome): provide entry link and instruct: 'Please open https://branddb.wipo.int/en/quicksearch and search for [prefix].'\n - Extract: international trademark hits, registrant names, designating countries, status.\n\n TMview:\n - Chrome: navigate to https://www.tmdn.org/tmview/#/quicksearch, locate the search input, type [prefix], submit, read results.\n - Fallback (no Chrome): provide entry link and instruct: 'Please open https://www.tmdn.org/tmview/#/quicksearch and search for [prefix].'\n - Extract: aggregate hits across all participating offices, notable registrants.\n\n If a database is unreachable or returns an error, note it in the report and continue \u2014 do not halt the workflow.\n\n4. Synthesize all findings into a report, framed according to the user's stated intent (risk-focused or opportunity-focused). The report must include:\n - Discovered entities: websites/companies using this keyword, their business, scale, founding year.\n - TLD distribution: cross-TLD registration pattern and registrar correlation.\n - Trademark database summary: hits per database, live marks found, relevant classes. If no hits found in a database, state that clearly \u2014 absence of results does not guarantee the mark is clear.\n - Risk assessment based on the three UDRP principles (confusing similarity, rights or legitimate interests, bad faith). For generic word combinations, note that risk is typically lower. Factor in registration age. Do NOT make legal conclusions.\n - Disclaimer: 'For reference only, does not constitute legal advice. Trademark searches are not exhaustive \u2014 consult a qualified IP attorney before making registration or investment decisions.'\n\n5. After presenting the report, ask the user what they want to do next. Tailor follow-up based on their response:\n - Wants to proceed with registration \u2192 suggest available or bulk_available.\n - Wants deeper analysis \u2192 suggest analyze.\n - Wants alternatives \u2192 suggest plan_b or name_advisor.\n - Wants to find buyers \u2192 use web_search findings to identify potential buyers, suggest valuation_cma.\n - Wants monitoring \u2192 suggest set_monitor.\n\nKey principles: present facts, not legal judgments. Do NOT claim a trademark exists or does not exist based on partial results. Claude for Chrome reads all four databases directly \u2014 the user should never need to search manually when Chrome is available. When Chrome is unavailable, always provide actionable fallback links with clear search instructions. Always end with the legal disclaimer. Disclose affiliate links.",
"inputSchema": {
"properties": {
"domain": {
"description": "Domain to check for brand conflict risk (e.g., 'nicefloor.com')",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "brand_match",
"title": "Brand Conflict Detection"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Batch Domain Availability Check"
},
"description": "Batch check domain availability with pricing. Check up to 10 domains per call.\n\nThis is the verification gate \u2014 any domain recommended to a user must pass through this tool first. Do not present domains as available based on other tools' signals (e.g., tld_check showing 'might_available', or domains found in deleted/expired feeds) without confirming here.\n\nInput format: comma-separated full domain names including TLD (e.g., 'aitools.com,getai.io,smartai.app'). Maximum 10 per call \u2014 for larger batches, make multiple calls.\n\nInterpreting results:\n- status 'available': Confirmed registrable. price and reg_url will be present.\n- status 'registered': Currently owned \u2014 not available for standard registration.\n- status 'expiring': In the expiration pipeline \u2014 can be backordered, not directly registered. reg_url will point to a backorder service.\n- status 'reserved': Registry-reserved domain \u2014 not available for registration.\n- status 'unknown': Check was inconclusive \u2014 do not assume available or unavailable.\n\nBest practices:\n- Always disclose affiliate links when aff=true.\n- When multiple domains return available, prioritize shorter names and .com over alternatives when presenting results.\n- If all checked domains come back registered, this is useful signal in itself \u2014 the namespace is saturated for that keyword pattern.",
"inputSchema": {
"properties": {
"domains": {
"description": "Comma-separated full domain names including TLD (max 10)",
"type": "string"
}
},
"required": [
"domains"
],
"type": "object"
},
"name": "bulk_available",
"title": "Batch Domain Availability Check"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Keyword TLD Popularity Check"
},
"description": "Check how many TLDs have specific keywords registered. Batch-compare keyword popularity by cross-TLD registration distribution.\n\nBest practices:\n- Use comma-separated keywords for side-by-side comparison (max 10): keywords='ai,tech,cloud,smart'. This is the tool's core strength \u2014 comparing relative popularity across multiple keywords in one call.\n- Interpreting total count: 100+ TLDs registered = highly competitive, well-known keyword. 50-100 = moderate popularity. 20-50 = niche but recognized. <20 = low market interest or very new concept.\n- The popular vs cctld vs other breakdown reveals the keyword's reach: high popular count (com/net/org/io/ai) = commercially validated. High cctld count = global brand interest or defensive registration. High other count = speculative gTLD registrations.\n- Use this to compare synonyms or variations before deciding which keyword to invest in \u2014 e.g., compare 'automate' vs 'automation' vs 'autoflow' to see which has stronger market validation.\n- Pairs well with tld_check for drilling into a single keyword's full TLD-by-TLD breakdown after identifying winners here.",
"inputSchema": {
"properties": {
"keywords": {
"description": "Comma-separated keywords to check (max 10)",
"type": "string"
}
},
"required": [
"keywords"
],
"type": "object"
},
"name": "bulk_tld",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"cctld": {
"description": "Count in country-code TLDs",
"type": "integer"
},
"keyword": {
"type": "string"
},
"other": {
"description": "Count in other gTLDs",
"type": "integer"
},
"popular": {
"description": "Count in popular TLDs (com, net, org, io, ai, app, etc.)",
"type": "integer"
},
"total": {
"description": "Total TLDs with this keyword registered",
"type": "integer"
}
},
"required": [
"keyword"
],
"type": "object"
},
"type": "array"
},
"error": {
"type": "string"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of keywords checked",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Keyword TLD Popularity Check"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Deleted Domains Search"
},
"description": "Search domains that have completed the deletion cycle and are open for immediate registration at standard cost \u2014 no auction or backorder needed. These are the highest-value finds: domains with history available at regular price.\n\nBest practices:\n- Always use no_hyphen=true and no_number=true unless the user specifically wants them \u2014 the vast majority of hyphenated and numeric deleted domains are low-quality.\n- keyword defaults to 'contain' matching (substring), producing false positives (e.g., 'agent' matches 'magenta'). Use position=start or position=end for precise results.\n- sort=age_desc surfaces domains with the longest history first \u2014 a 20+ year old deleted .com at standard registration cost is a rare find worth highlighting.\n- sort=tld_counter_desc finds keywords popular across TLDs \u2014 if prefix_tld_count is high (20+) and the .com just dropped, that is notable.\n- For brandable names: combine length=5-10, type=all_alpha, no_hyphen=true, no_number=true.\n- hold=no_hold filters out domains still under registry hold that cannot yet be registered.\n- register_url links to Dynadot (affiliate). Disclose when presenting to users.",
"inputSchema": {
"properties": {
"age_range": {
"description": "Historical age before deletion",
"enum": [
"0-5",
"5-10",
"10-20",
"20+",
"10-20,20+"
],
"type": "string"
},
"exclude": {
"description": "Negative keywords to exclude",
"type": "string"
},
"hold": {
"description": "Registry hold status \u2014 no_hold = immediately registrable",
"enum": [
"no_hold",
"has_hold"
],
"type": "string"
},
"keyword": {
"description": "Search term (min 2 chars)",
"type": "string"
},
"length": {
"description": "Domain name length filter",
"enum": [
"<5",
"5-10",
"10-15",
"15+"
],
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphenated domains",
"type": "string"
},
"no_number": {
"description": "Exclude domains containing numbers",
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"position": {
"description": "Keyword placement in domain name",
"enum": [
"start",
"end",
"middle",
"contain"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"age_desc",
"age_asc",
"length_asc",
"length_desc",
"tld_counter_asc",
"tld_counter_desc"
],
"type": "string"
},
"tld": {
"description": "Filter by TLD (e.g., 'com', 'net', 'org')",
"type": "string"
},
"type": {
"description": "Character set filter",
"enum": [
"all_alpha",
"all_number"
],
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "deleted",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"affiliate": {
"type": "boolean"
},
"age_years": {
"description": "Historical age in years before deletion",
"type": "integer"
},
"domain": {
"type": "string"
},
"prefix_tld_count": {
"description": "Number of TLDs the same prefix is registered under",
"type": "integer"
},
"register_url": {
"format": "uri",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
},
"total_found": {
"description": "Total matching results across all pages",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Deleted Domains Search"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "DNS Record Lookup"
},
"description": "Query DNS records for a domain. Returns A, AAAA, MX, NS, TXT, CNAME, SOA. Key signals: MX present = active email. NS pointing to marketplace (Sedo, Afternic) = parked/for-sale. TXT with SPF/DKIM = active operations. No records at all = unconfigured/abandoned.",
"inputSchema": {
"properties": {
"domain": {
"description": "Domain name",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "dns",
"outputSchema": {
"properties": {
"domain": {
"type": "string"
},
"error": {
"type": "string"
},
"records": {
"description": "DNS records grouped by type",
"properties": {
"A": {
"description": "IPv4 address records",
"items": {
"properties": {
"host": {
"type": "string"
},
"ip": {
"type": "string"
},
"ttl": {
"type": "integer"
}
},
"type": "object"
},
"type": "array"
},
"AAAA": {
"description": "IPv6 address records",
"items": {
"properties": {
"host": {
"type": "string"
},
"ipv6": {
"type": "string"
},
"ttl": {
"type": "integer"
}
},
"type": "object"
},
"type": "array"
},
"CNAME": {
"description": "Canonical name records",
"items": {
"properties": {
"host": {
"type": "string"
},
"target": {
"type": "string"
},
"ttl": {
"type": "integer"
}
},
"type": "object"
},
"type": "array"
},
"MX": {
"description": "Mail exchange records",
"items": {
"properties": {
"host": {
"type": "string"
},
"pri": {
"description": "Priority",
"type": "integer"
},
"target": {
"description": "Mail server hostname",
"type": "string"
},
"ttl": {
"type": "integer"
}
},
"type": "object"
},
"type": "array"
},
"NS": {
"description": "Nameserver records",
"items": {
"properties": {
"host": {
"type": "string"
},
"target": {
"type": "string"
},
"ttl": {
"type": "integer"
}
},
"type": "object"
},
"type": "array"
},
"SOA": {
"description": "Start of authority records",
"items": {
"properties": {
"expire": {
"type": "integer"
},
"host": {
"type": "string"
},
"minimum_ttl": {
"type": "integer"
},
"mname": {
"description": "Primary nameserver",
"type": "string"
},
"refresh": {
"type": "integer"
},
"retry": {
"type": "integer"
},
"rname": {
"description": "Admin email",
"type": "string"
},
"serial": {
"type": "integer"
}
},
"type": "object"
},
"type": "array"
},
"TXT": {
"description": "Text records (SPF, DKIM, verification tokens)",
"items": {
"properties": {
"host": {
"type": "string"
},
"ttl": {
"type": "integer"
},
"txt": {
"type": "string"
}
},
"type": "object"
},
"type": "array"
}
},
"type": "object"
},
"success": {
"type": "boolean"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "DNS Record Lookup"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Premium Domain Changes Monitor (7-day)"
},
"description": "Monitor changes to premium .com domains in the past 7 days. The monitored pool consists of short-character .com domains (typically 1-4 letters) and high-value English single-word and two-word .com domains. This is not a general domain monitor \u2014 it specifically tracks the most valuable segment of the .com namespace.\n\nChange types:\n- Domain Transfer: Registrar changed \u2014 indicates ownership or management change. Report the old and new registrar as facts. Do not assume the reason (could be a sale, corporate restructuring, registrar migration, or portfolio consolidation).\n- Domain Expired: Domain entered expiration cycle. Report the fact. Do not characterize rarity or value unless verified with additional data.\n- New Registration: A previously unregistered premium name was registered.\n- Nameserver Change: NS records updated. An NS change to a domain marketplace (e.g., sedo.com, afternic.com, thisdomain.forsale) is a possible sale signal but not a certainty \u2014 report the old and new NS as facts.\n\nBest practices:\n- date_range=1d for last 24 hours, 3d for last 72 hours, all for full 7-day window (default).\n- length=1-3 or length=4 focuses on the shortest, most premium domains.\n- reason filters to a specific change type \u2014 use 'Domain Transfer' or 'Domain Expired' for the most newsworthy events.\n- sort=length_asc surfaces the shortest (most valuable) domains first.\n- has_digit=false filters to letter-only domains for higher quality results.\n- All interpretations must be evidence-based. Report what changed, not why. If the user wants to understand the reason behind a change, suggest whois or web_search to investigate further.",
"inputSchema": {
"properties": {
"date_range": {
"description": "Time range filter: 1d = last 24 hours, 3d = last 72 hours, all = full 7-day window (default)",
"enum": [
"1d",
"3d",
"all"
],
"type": "string"
},
"has_digit": {
"description": "false = letters only, true = contains digits, all = no filter",
"enum": [
"false",
"true",
"all"
],
"type": "string"
},
"keyword": {
"description": "Search by domain or keyword within the monitored pool",
"type": "string"
},
"length": {
"description": "Prefix length filter (characters before TLD)",
"enum": [
"all",
"1-3",
"4",
"5-8",
"9+"
],
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"reason": {
"description": "Filter by change type",
"enum": [
"all",
"Domain Transfer",
"Domain Expired",
"New Registration",
"Nameserver Change"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"length_asc",
"length_desc",
"tld_count_desc",
"tld_count_asc",
"prefix_asc",
"prefix_desc"
],
"type": "string"
},
"tld": {
"description": "TLD filter (e.g., 'com')",
"type": "string"
}
},
"type": "object"
},
"name": "domain_changes",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"change_date": {
"description": "Date the change was detected (YYYY-MM-DD format)",
"type": "string"
},
"combination": {
"description": "Word segmentation of the prefix",
"type": "string"
},
"details_new": {
"description": "New state (registrar for Transfer, expiration date for Expired, nameservers for NS Change)",
"type": "string"
},
"details_old": {
"description": "Previous state (registrar for Transfer/Expired, nameservers for NS Change)",
"type": "string"
},
"domain": {
"type": "string"
},
"length": {
"description": "Prefix character length",
"type": "integer"
},
"prefix": {
"description": "Domain prefix without TLD",
"type": "string"
},
"reason": {
"description": "Change type: Domain Transfer, Domain Expired, New Registration, or Nameserver Change",
"type": "string"
},
"tld": {
"type": "string"
},
"tld_count": {
"description": "Number of TLDs the same prefix is registered under",
"type": "integer"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Premium Domain Changes Monitor (7-day)"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Creative Domain Generator"
},
"description": "Creative domain name generation workflow. Call when a user already knows their target keyword or has a specific taken domain and wants registrable creative variations (e.g., 'I want a domain with the word flow', 'getflow.com is taken, give me variations'). Do NOT call when the user's requirements are vague or they don't have a keyword yet (use name_advisor), when they want alternatives across lifecycle stages like expired/deleted (use plan_b), or when they want trend-based ideas (use trend_hunter).\n\nKey difference from name_advisor: this tool assumes the user already knows what keyword they want. If the user is unsure or exploring, use name_advisor instead.\n\nThis is a multi-turn workflow. Stop and wait for user input at every checkpoint.\n\nWorkflow:\n1. Keyword Analysis & Confirmation \u2014 extract the core keyword from user input (e.g., getflow.com \u2192 flow). Briefly state your understanding of the keyword and industry context, then confirm with the user: is the keyword correct? TLD preference (.com only or open to others)? Style preference (short and punchy vs descriptive)? Do NOT generate any domain names or call any tools until the user confirms. If the user seems unsure about their keyword, suggest switching to name_advisor.\n2. Generate & Verify \u2014 generate 20-30 creative variants based on confirmed preferences. Strategies include: TLD swaps for short keywords (.io, .ai, .app, .co), industry-relevant prefixes/suffixes (get-, -ly, -hub, -lab), coined words and portmanteaus, word + modifier combinations. Before finalizing, scan every candidate for unintended sensitive words, medical terms, or offensive abbreviations created by concatenation. Verify all candidates with bulk_available \u2014 every domain presented to the user must be confirmed available, no exceptions. Present only verified domains grouped by strategy, each with register_url.\n3. Iterate or Finalize \u2014 based on user feedback: generate more variations in a preferred direction, suggest brand_match for a finalist, adjust strategy if needed, or suggest plan_b if the user wants expired/aged alternatives.\n\nKey principles:\n- Every domain presented must be verified available via bulk_available. No exceptions.\n- Available domains include register_url (Dynadot affiliate).\n- Disclose affiliate links.",
"inputSchema": {
"properties": {
"domain": {
"description": "Keyword or taken domain",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "domain_generator",
"outputSchema": {
"properties": {
"available_domains": {
"description": "Verified available domains grouped by strategy",
"items": {
"properties": {
"affiliate": {
"type": "boolean"
},
"domain": {
"type": "string"
},
"price": {
"type": "string"
},
"register_url": {
"format": "uri",
"type": "string"
},
"strategy": {
"description": "Generation strategy (tld_swap, prefix, coined_word, modifier, etc.)",
"type": "string"
}
},
"required": [
"domain",
"strategy"
],
"type": "object"
},
"type": "array"
},
"keyword": {
"description": "Extracted core keyword",
"type": "string"
},
"phase": {
"description": "Current workflow phase",
"enum": [
"keyword_confirmation",
"generate_verify",
"iterate"
],
"type": "string"
},
"questions": {
"description": "Confirmation questions for the user",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"phase"
],
"type": "object"
},
"title": "Creative Domain Generator"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Expiring Domains Search"
},
"description": "Search domains entering the deletion cycle \u2014 expired, in redemption, or pending delete. Unlike 'deleted' domains (which are free to register), these require backorder or have time-sensitive acquisition windows.\n\nLifecycle stages:\n- expired: Domain has lapsed but has not entered redemption. Typically enters expired auction at the registrar \u2014 acquisition requires bidding, not standard registration.\n- redemption: Owner can still reclaim by paying a redemption fee (~$80+). For premium names in this stage, consider using set_monitor to track status changes, or whois to find the registrar and suggest the user contact the owner directly with an offer.\n- pending_delete: Final stage, drops in 1-5 days. Highest urgency. Good names at this stage rarely survive manual registration \u2014 backorder via the register_url (Gname) is recommended.\n\nBest practices:\n- Always use no_hyphen=true and no_number=true unless the user specifically wants them.\n- keyword defaults to 'contain' matching, which searches all domains containing the keyword anywhere in the name. Use position=start, position=end, or position=middle to control where the keyword appears.\n- sort=age_desc prioritizes domains with the longest history, but age alone does not guarantee value \u2014 a domain with long history could have been used for spam. For high-value candidates, verify clean history with backlink_summary and safety checks.\n- status=pending_delete is the most actionable filter \u2014 these domains drop soonest.\n- auction_date='today' or 'tomorrow' narrows to imminent drops.\n- register_url links to Gname (affiliate). Disclose when presenting to users.",
"inputSchema": {
"properties": {
"age_range": {
"description": "Historical age of the domain",
"enum": [
"0-5",
"5-10",
"10-20",
"20+",
"5-10,10-15",
"10-20,20+"
],
"type": "string"
},
"auction_date": {
"description": "Filter by drop date: 'today', 'tomorrow', or 'YYYY-MM-DD'",
"type": "string"
},
"exclude": {
"description": "Negative keywords to exclude",
"type": "string"
},
"hold": {
"description": "Registry hold status",
"enum": [
"no_hold",
"has_hold"
],
"type": "string"
},
"keyword": {
"description": "Search term (min 2 chars)",
"type": "string"
},
"length": {
"description": "Domain name length filter",
"enum": [
"<5",
"5-10",
"10-15",
"15+"
],
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphenated domains",
"type": "string"
},
"no_number": {
"description": "Exclude domains containing numbers",
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"position": {
"description": "Keyword placement in domain name",
"enum": [
"start",
"end",
"middle",
"contain"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"age_desc",
"age_asc",
"length_asc",
"length_desc"
],
"type": "string"
},
"status": {
"description": "expired = in registrar auction, redemption = owner can reclaim, pending_delete = drops in 1-5 days",
"enum": [
"pending_delete",
"redemption",
"expired"
],
"type": "string"
},
"tld": {
"description": "Filter by TLD (e.g., 'com', 'net', 'org')",
"type": "string"
},
"type": {
"description": "Character set filter",
"enum": [
"all_alpha",
"all_number"
],
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "expired",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"affiliate": {
"type": "boolean"
},
"age_years": {
"description": "Domain age in years",
"type": "integer"
},
"domain": {
"type": "string"
},
"prefix_tld_count": {
"description": "Number of TLDs the same prefix is registered under",
"type": "integer"
},
"register_url": {
"format": "uri",
"type": "string"
},
"registered_date": {
"format": "date",
"type": "string"
},
"status": {
"description": "Lifecycle stage: 1=expired, 2=redemption, 3=pending_delete",
"type": "integer"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
},
"total_found": {
"description": "Total matching results across all pages",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Expiring Domains Search"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Expired Domain Due Diligence"
},
"description": "Deep due diligence workflow for expired or expiring domains. Call when a user wants to evaluate an expired domain's history, SEO value, safety, and commercial potential before backordering or acquiring it \u2014 including as a follow-up when browsing results from expired or deleted tools. Do NOT call if the domain is not in any expired status (use analyze instead), if the user wants domain name ideas (use name_advisor), or if the user wants to check availability of a new domain (use available).\n\nThis is a multi-turn workflow. Stop and wait for user input at every checkpoint.\n\nWorkflow:\n1. Status Verification \u2014 run whois first. Confirm the domain is actually in an expired status (expired, redemption, pending-delete). If it is NOT expired, stop immediately, inform the user, and hand off to the analyze workflow. This gate check is mandatory.\n2. Data Collection \u2014 gather all available data in parallel: safety (Google Safe Browsing \u2014 critical risk signal for expired domains), dns (residual records indicate previous usage), backlink_summary (strong backlinks = SEO value; spammy backlinks = risk), keyword_data (search volume and CPC for commercial value), tld_check (cross-TLD registration count as popularity signal), web_fetch the Wayback Machine timeline (https://web.archive.org/web/*/{domain}) for historical usage, and web_search site:{domain} to check residual Google indexing.\n3. Due Diligence Report \u2014 synthesize all findings into a structured report covering: domain status and key dates, safety warnings, SEO value (backlink quality + keyword commercial value), historical usage from Wayback, Google index status, cross-TLD distribution, and consolidated risk/opportunity signals. Then ask the user about their goal (SEO recovery, brand building, or investment/resale) and whether they want to explore specific aspects further. Let the user choose the direction \u2014 do not decide for them.\n4. Tailored Follow-up \u2014 based on user's stated goals, guide them to the appropriate next step: backorder process and timeline, set_monitor for status tracking, deeper SEO analysis, plan_b for alternatives, valuation_cma for market context, or brand_match before committing.\n\nKey principles:\n- Present facts and acquisition opportunities. Do NOT make buy/don't-buy judgments.\n- Objectively flag ALL risk signals \u2014 do not downplay or hide them.\n- Backorderable domains must include backorder_url (Gname affiliate).\n- Always include Wayback link: https://web.archive.org/web/*/{domain}\n- Always include deep analysis link: https://dataforseo.com/?aff=199596\n- Disclose affiliate links.",
"inputSchema": {
"properties": {
"domain": {
"description": "Expired domain to analyze",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "expired_analysis",
"title": "Expired Domain Due Diligence"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Keyword Search Volume & CPC"
},
"description": "Google Ads keyword data: search volume, competition, and CPC. Use when evaluating a keyword's commercial search demand \u2014 one call per keyword is sufficient.\n\nInterpreting results:\n- search_volume: Average monthly Google searches. >10k with CPC >$2 indicates strong commercial intent. 1k-10k with CPC $0.5-$2 is niche but viable. <1k with CPC <$0.5 suggests limited commercial demand.\n- competition: 0 to 1 score representing advertiser density. Higher means more advertisers bidding on this keyword.\n- competition_level: LOW, MEDIUM, or HIGH. Low competition + decent volume = underserved opportunity.\n- low_cpc / high_cpc: Cost-per-click range in USD. Reflects what advertisers are willing to pay. Higher CPC generally correlates with higher commercial value for domains matching this keyword.\n\nIn domain investment context, the combination of search_volume and CPC is the primary value signal \u2014 volume alone without advertiser spend may indicate informational intent rather than commercial intent.",
"inputSchema": {
"properties": {
"country": {
"description": "Market. Default: US-EN",
"enum": [
"US-EN",
"DE-DE",
"CA-FR",
"IT-IT"
],
"type": "string"
},
"keyword": {
"description": "Keyword to research",
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "keyword_data",
"outputSchema": {
"properties": {
"competition": {
"description": "Competition index (0 to 1)",
"type": "number"
},
"competition_level": {
"description": "LOW, MEDIUM, or HIGH",
"type": "string"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"high_cpc": {
"description": "High range cost-per-click in USD",
"type": "number"
},
"keyword": {
"type": "string"
},
"low_cpc": {
"description": "Low range cost-per-click in USD",
"type": "number"
},
"search_volume": {
"description": "Average monthly search volume on Google",
"type": "integer"
},
"success": {
"type": "boolean"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Keyword Search Volume & CPC"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true,
"readOnlyHint": true,
"title": "Keyword Deep Intelligence"
},
"description": "Deep keyword intelligence for domain investment. Call when a user wants to understand the full picture of a specific keyword in the domain market \u2014 demand, supply, competition, and opportunities. This is a data-intensive workflow: every claim must be backed by tool output.\n\nWhen to use: User asks about a keyword's investment potential, market landscape, or opportunity analysis. Not for analyzing a specific domain (use analyze), browsing trends (use trend_hunter), or market overviews (use market_beat).\n\nMethodology \u2014 three phases, each building on the previous:\n\n1. Demand: Establish how much the market wants this keyword.\n - keyword_data for commercial search value (volume, CPC, competition).\n - keywords_trends (both hot and emerging) for registration momentum.\n - web_search is MANDATORY \u2014 do NOT substitute with your own knowledge. Execute at least two searches: '{keyword} news 2026' for industry context, and '{keyword} domain sold price' for transaction history. Only include claims that come from search results. If search returns nothing relevant, state 'no recent news or transactions found' \u2014 do not fill the gap with training data. Do NOT attribute keyword popularity to a specific event or project unless keywords_trends data shows a clear spike AND web_search confirms the connection. Common English words have natural baseline demand \u2014 not every trend needs a catalyst explanation.\n\n2. Supply: Map the current domain inventory, focused on .com as the primary lens unless the user requests otherwise.\n - tld_check for cross-TLD saturation.\n - active for total .com inventory and for-sale ratio (forsale count / total count). Also compare keyword-as-prefix vs keyword-as-suffix to gauge market maturity.\n - deleted for domains available at standard registration cost.\n - expired for domains in the expiration pipeline that can be backordered.\n - aged with has_sale=true for secondary market listings.\n\n3. Competition: Assess whether the window is opening or closing.\n - nrds comparing recent .com registration velocity across time periods (0-10 days vs 10-20 days). Accelerating velocity means act fast; decelerating means the peak may have passed.\n - From the same nrds results, assess registration quality \u2014 high ratios of hyphens, numbers, or excessive length indicate a junk/speculative market rather than serious investment.\n - Analyze the naming patterns in recent registrations to identify what is driving demand. For example, if most new domains combine the keyword with 'ai', 'cloud', 'tech', that points to a tech trend; if they combine with 'game', 'machine', 'play', that points to entertainment. If patterns are diverse with no clear theme, the keyword likely has natural baseline demand across multiple sectors. This pattern analysis is based on the nrds results already retrieved \u2014 no additional tool calls needed.\n\nSynthesize into an intelligence report: keyword verdict (invest / watch / avoid) with confidence level, demand profile, supply profile, competition profile, and recommended next steps tailored to the verdict. Let the data tell the story \u2014 if data is contradictory, present both sides.\n\nAfter the report, offer relevant next steps: deep analysis on a specific domain, brand conflict check, monitoring setup, strategy tracking, or analyzing a different keyword.",
"inputSchema": {
"properties": {
"keyword": {
"description": "The keyword to analyze",
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "keyword_intel",
"title": "Keyword Deep Intelligence"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Keyword Registration Trends"
},
"description": "Get trending keywords in domain registrations. Mainly used for investors to find new opportunities, but also useful for brand protection. Three modes:\n- hot: High-volume keywords (e.g., 'app', 'shop', 'group'). Established terms with high volume and high competition. Results include weekly breakdown (w1-w4) to spot momentum shifts. Quality metrics use 28-day data.\n- emerging: Keywords with sudden registration spikes in the last 7-14 days, often driven by technology news, product launches, or viral projects. Compare w4 (current week) vs w3 to assess momentum. Quality metrics use W4-only data to reflect the spike period accurately.\n- prefix: Popular naming patterns (e.g., 'get...', 'my...', 'the...'). Results include tld_count \u2014 if a prefix has high tld_count but .com is still available, that is actionable. Use bulk_tld to check which specific TLDs are taken vs available.\n\nQuality metrics (hot and emerging only, fields vary by user tier):\n- com_ratio: .com registrations as a proportion of total. .com is the most expensive and most liquid TLD \u2014 this ratio reflects participants' willingness to invest real money.\n- most_tld: The dominant TLD for this keyword. Shows where registration activity is concentrated.\n- pos_start_ratio / pos_end_ratio: Where the keyword appears in domain names. High start ratio (e.g., 'aitools.com') suggests the keyword drives the domain concept. High end ratio (e.g., 'myai.com') suggests it is used as a modifier.\n- forsale_pct: Percentage of domains with NS pointing to sale platforms (Sedo, Afternic, Atom). Reflects investor participation \u2014 cross-reference with com_ratio and top_registrar to assess multi-party market participation.\n- top_ns + top_ns_ratio: The most common nameserver and its share. High concentration on a single NS indicates concentrated activity. Cross-reference with NS identity to understand what participants are doing with their domains.\n- top_registrar: The registrar with the highest volume. Registrars are channels, not identity labels \u2014 high concentration reduces confidence that many independent parties are involved, but does not by itself prove single-operator activity. Must be cross-referenced with other dimensions.\n- peak_day: The single day with highest registrations. If peak_day accounts for a large share of total, the trend may be event-driven or a single bulk registration event rather than sustained interest.\n- might_use_count: Domains with NS pointing to infrastructure providers (Cloudflare, AWS, Vercel, Netlify). Does NOT reliably indicate active sites \u2014 especially Cloudflare and AWS are widely used for DNS hosting, CDN, or parking. Must cross-reference with registrar diversity \u2014 high might_use_count with diverse registrars suggests organic adoption; high might_use_count with one dominant registrar suggests a single operator.\n\nData methodology: Registration counts are based on semantic keyword extraction using DomainKits' proprietary word segmentation engine (https://github.com/ABTdomain/dksplit), not simple substring matching. Bulk registration noise is automatically filtered from emerging results. WHOIS data is sourced from daily RDAP snapshots. Brand protection registrars (CSC, MarkMonitor, etc.) are excluded.",
"inputSchema": {
"properties": {
"type": {
"description": "hot = high-volume keywords, emerging = recent spikes, prefix = naming patterns",
"enum": [
"hot",
"emerging",
"prefix"
],
"type": "string"
}
},
"type": "object"
},
"name": "keywords_trends",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"com_ratio": {
"description": ".com share. below 0.05 = bulk speculation",
"type": "number"
},
"count_28d": {
"description": "Total registrations in past 28 days (hot and emerging)",
"type": "integer"
},
"count_30d": {
"description": "Registrations past 30 days (prefix only)",
"type": "integer"
},
"count_48h": {
"description": "Registrations past 48 hours (prefix only)",
"type": "integer"
},
"count_7d": {
"description": "Registrations past 7 days (prefix only)",
"type": "integer"
},
"forsale_pct": {
"description": "% with NS pointing to sale platforms. higher means more investor interest, smarter investor might find some chances in this trends",
"type": "number"
},
"might_use_count": {
"description": "Domains with NS pointing to Cloudflare/AWS/Vercel/Netlify (does not reliably indicate active sites)",
"type": "integer"
},
"most_tld": {
"description": "Dominant TLD for this keyword",
"type": "string"
},
"peak_day": {
"description": "Date with highest registrations (YYYY-MM-DD)",
"type": "string"
},
"pos_end_ratio": {
"description": "Keyword at end of domain (e.g., 'myai.com'), higher ratio suggests market would use it at the end of domains, which is more valuable than if it is commonly used as a modifier at the start of domains (e.g., 'aitools.com')",
"type": "number"
},
"pos_start_ratio": {
"description": "Keyword at start of domain (e.g., 'aitools.com'), higher ratio suggests market would use it at the start of domains, which is more valuable than if it is commonly used as a modifier at the end of domains (e.g., 'myai.com')",
"type": "number"
},
"prefix": {
"description": "Domain prefix (prefix only)",
"type": "string"
},
"rank": {
"type": "integer"
},
"tld_count": {
"description": "TLDs this prefix is registered under (prefix only)",
"type": "integer"
},
"top_ns": {
"description": "Most common nameserver for this keyword",
"type": "string"
},
"top_ns_ratio": {
"description": "Share of top_ns.",
"type": "number"
},
"top_registrar": {
"description": "Registrar with highest volume",
"properties": {
"name": {
"type": "string"
},
"pct": {
"type": "number"
}
},
"type": "object"
},
"trend": {
"description": "Trend status: hot, active, or cold (prefix only)",
"type": "string"
},
"w1": {
"description": "Registrations 4 weeks ago (hot only)",
"type": "integer"
},
"w2": {
"description": "Registrations 3 weeks ago (hot only)",
"type": "integer"
},
"w3": {
"description": "Registrations 2 weeks ago (hot and emerging)",
"type": "integer"
},
"w4": {
"description": "Registrations current week (hot and emerging)",
"type": "integer"
},
"word": {
"description": "Trending keyword (hot and emerging)",
"type": "string"
}
},
"type": "object"
},
"type": "array"
},
"success": {
"type": "boolean"
},
"total": {
"type": "integer"
},
"type": {
"type": "string"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Keyword Registration Trends"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Domain Marketplace Search"
},
"description": "Search currently registered domains with marketplace listing data. These are live domains owned by someone \u2014 not available for free registration. Use status=forsale to filter to domains the owner has listed for sale, or use results as acquisition targets to approach owners directly.\n\nBest practices:\n- keyword defaults to 'start' matching. Use position=end or position=contain for broader results.\n- status=forsale is the most actionable filter \u2014 these owners are actively seeking buyers.\n- Results include a marketplace field indicating which platform the domain is listed on (e.g., 'se' for Sedo, 'go' for GoDaddy, 'at' for Atom, 'vn' for Venture, 'pd' for PerfectDomain). Domains without a marketplace value are registered but not actively listed for sale.\n- sort=length_asc surfaces the shortest (most premium) names first.\n- The components field shows how the domain name segments into recognizable words \u2014 useful for evaluating brandability.\n- Disclose affiliate links when presenting register_url to users.",
"inputSchema": {
"properties": {
"exclude": {
"description": "Negative keywords to exclude",
"type": "string"
},
"keyword": {
"description": "Brand or industry term (min 2 chars)",
"type": "string"
},
"length": {
"description": "Domain name length filter",
"enum": [
"<5",
"5-10",
"10-15",
"15+"
],
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphenated domains (true/false)",
"type": "string"
},
"no_number": {
"description": "Exclude domains containing numbers (true/false)",
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"position": {
"description": "Keyword placement in domain name. Default is 'start'.",
"enum": [
"start",
"end",
"contain"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"length_asc",
"length_desc",
"alpha",
"tld_counter_asc",
"tld_counter_desc"
],
"type": "string"
},
"status": {
"description": "Filter by status \u2014 'forsale' for domains listed for sale",
"type": "string"
},
"tld": {
"description": "Filter by TLD (e.g., 'com', 'net', 'org', 'ai')",
"type": "string"
},
"type": {
"description": "Character set filter",
"enum": [
"all_alpha",
"all_number"
],
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "market",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"affiliate": {
"type": "boolean"
},
"components": {
"description": "Word segmentation of the domain prefix",
"type": "string"
},
"domain": {
"type": "string"
},
"length": {
"type": "integer"
},
"marketplace": {
"description": "Sale platform code: se=Sedo, go=GoDaddy, at=Atom, vn=Venture, pd=PerfectDomain, gn=Gname",
"type": "string"
},
"prefix_tld_count": {
"description": "Number of TLDs this prefix is registered across",
"type": "integer"
},
"price": {
"description": "Listing price with currency, e.g. 1500 USD. Only present for Atom/Sedo listings",
"type": "string"
},
"register_url": {
"format": "uri",
"type": "string"
},
"tld": {
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
},
"total_found": {
"description": "Total matching results across all pages",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Domain Marketplace Search"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true,
"readOnlyHint": true,
"title": "Domain Market Intelligence"
},
"description": "Domain market news briefing. Call when a user wants to understand what is happening in the domain market right now \u2014 trending keywords, notable sales, registration anomalies, and industry movements.\n\nThis is a news briefing, not investment advice. Present facts, flag anomalies, cite sources. If the cause of a trend is unknown, say so \u2014 never fabricate explanations.\n\nWorkflow:\n1. Gather data from multiple sources:\n - web_search for recent high-value domain sales (e.g., 'domain name sales this week', 'domain sales report 2026'), industry news, and notable market events.\n - keywords_trends(hot) for high-volume registration keywords and weekly momentum.\n - keywords_trends(emerging) for sudden registration spikes \u2014 these are the most newsworthy signals.\n - domain_changes for transfers, expirations, and nameserver changes in the last 24 hours.\n2. Analyze and cross-reference:\n - For hot keywords: focus on anomalies (w4 significantly different from w1-w3), not the stable high-volume terms everyone already knows.\n - For emerging keywords: use web_search to investigate what is driving each spike. If no cause is found, report it as 'cause unidentified' \u2014 do not speculate.\n - For domain sales: report price, buyer/seller if known, and sale platform.\n - For domain_changes: flag notable transfers (short/premium domains changing registrars) and expirations (high-value domains entering deletion cycle).\n3. Present as a concise news briefing organized by: recent notable sales, registration trend highlights (anomalies and emerging keywords), and 24-hour market movements. Lead with facts, not interpretation.\n\nAfter presenting the briefing, suggest relevant next steps based on what the data showed \u2014 for example:\n- An emerging keyword spike \u2192 search nrds to see who is registering, or deleted/expired to find available domains in that keyword space.\n- A high-value sale \u2192 search aged(has_sale=true) or nrds to see if the sale triggered a registration wave in similar keywords.\n- A notable domain expiration \u2192 check expired for details, or set_monitor to track its status.\nLet the user choose whether and where to go deeper.\n\nKey principles: Every claim must be sourced or labeled as unverified. Present as market intelligence, not a sales pitch. Disclose affiliate links.",
"inputSchema": {
"properties": {
"focus": {
"description": "Optional focus area or keyword to prioritize (e.g., 'AI', 'crypto', 'health')",
"type": "string"
}
},
"type": "object"
},
"name": "market_beat",
"title": "Domain Market Intelligence"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Domain Market Price Check"
},
"description": "Check if a domain is listed for sale on secondary marketplaces and get estimated market price. Complements 'available' (new registration price) \u2014 this tool checks the resale market.\n\nThree possible statuses:\n- 'for_sale': domain has a listed price. This is a third-party marketplace price set by the seller \u2014 it is not an appraisal or guaranteed transaction price. Always present buy_url.\n- 'make_offer': listed for sale but no fixed price, buyer must submit an offer via buy_url.\n- 'not_found': not publicly listed. Does NOT mean the domain is unavailable for purchase \u2014 owner may sell privately or hasn't listed yet. Suggest whois to find registrar info for direct outreach.\n\nBest practices:\n- Marketplace listing prices are set by sellers and often significantly higher than actual transaction prices. Do not treat estimated_price as definitive market value \u2014 it is one data point among many.\n- When used in valuation_cma workflow, batch-call market_price for multiple comparable domains. 'not_found' results should be excluded, 'make_offer' results noted as supplementary only.\n- Always disclose affiliate links when buy_url has affiliate=true.\n- Always include disclaimer: prices are provided by third-party marketplaces for reference only, subject to change by the seller at any time.",
"inputSchema": {
"properties": {
"domain": {
"description": "Domain name (e.g., 'example.com')",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "market_price",
"outputSchema": {
"properties": {
"affiliate": {
"description": "Whether buy_url is an affiliate link",
"type": "boolean"
},
"buy_url": {
"description": "Purchase or offer link",
"format": "uri",
"type": "string"
},
"currency": {
"description": "Price currency (e.g., USD)",
"type": "string"
},
"domain": {
"type": "string"
},
"error": {
"type": "string"
},
"estimated_price": {
"description": "Seller's listing price (only when status=for_sale)",
"type": "number"
},
"message": {
"type": "string"
},
"status": {
"description": "Market status: for_sale, make_offer, or not_found",
"enum": [
"for_sale",
"make_offer",
"not_found"
],
"type": "string"
},
"success": {
"type": "boolean"
}
},
"required": [
"success",
"domain",
"status"
],
"type": "object"
},
"title": "Domain Market Price Check"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true,
"readOnlyHint": false
},
"description": "Manage domain monitoring tasks. Track changes in WHOIS, DNS, and page content.\n\nAll monitoring data is encrypted at rest (AES-256-GCM) and stored in your private directory. GDPR compliant.\n\nActions:\n- get: Retrieve and auto-check all monitors. Default action if not specified. Automatically performs bulk WHOIS and DNS checks where the minimum interval has passed. You do NOT need to manually call whois or dns tools. For each monitor where can_check=true, returns current vs previous data with change flags. For can_check=false monitors, returns last known data and next_check time. YOUR JOB: focus on whois_changed=true or dns_changed=true, report with context from note field. For DNS, focus on NS changes \u2014 ignore A/AAAA (CDN rotation). If monitors have web_fetch in tools, optionally run web_fetch yourself then call with action=update to save results.\n- set: Create a new monitor. Requires registered account and memory enabled. Max 100 monitors. Before creating, verify memory is enabled via preferences. WHOIS and DNS are auto-checked when you call action=get \u2014 no need to call them manually. web_fetch is optional and must be run manually.\n- update: Save web_fetch page results for a monitor. WHOIS and DNS are auto-saved by action=get \u2014 you only need this for web_fetch page content. Typical flow: call action=get (auto-checks WHOIS/DNS), run web_fetch yourself, then call action=update with the page summary. The whois and dns parameters are accepted for backward compatibility but normally not needed.\n- delete: Remove a monitor task.\n\nRequires registered account (member or above) and memory enabled for all actions.",
"inputSchema": {
"properties": {
"action": {
"description": "'get', 'set', 'update', or 'delete'. Defaults to 'get' if not specified.",
"type": "string"
},
"dns": {
"description": "DNS result, backward compatibility (update only)",
"type": "string"
},
"domain": {
"description": "Domain to monitor (set only)",
"type": "string"
},
"id": {
"description": "Monitor task ID (update and delete)",
"type": "string"
},
"note": {
"description": "What to watch for \u2014 user's intent in natural language (set only)",
"type": "string"
},
"page": {
"description": "Page content summary from web_fetch (update only)",
"type": "string"
},
"tools": {
"description": "Comma-separated: whois, dns, web_fetch. Default: whois,dns (set only)",
"type": "string"
},
"whois": {
"description": "WHOIS result, backward compatibility (update only)",
"type": "string"
}
},
"type": "object"
},
"name": "monitor",
"outputSchema": {
"properties": {
"error": {
"description": "Error message when success is false",
"type": "string"
},
"message": {
"description": "Human-readable result message",
"type": "string"
},
"monitor": {
"description": "Created monitor details (set only)",
"properties": {
"created_at": {
"type": "string"
},
"domain": {
"type": "string"
},
"id": {
"type": "string"
},
"note": {
"type": "string"
},
"tools": {
"type": "string"
}
},
"type": "object"
},
"monitors": {
"description": "List of monitors with auto-check results (get only)",
"items": {
"properties": {
"can_check": {
"type": "boolean"
},
"current_dns": {
"type": "string"
},
"current_whois": {
"type": "string"
},
"dns_changed": {
"type": "boolean"
},
"domain": {
"type": "string"
},
"id": {
"type": "string"
},
"last_check": {
"type": "string"
},
"last_dns": {
"type": "string"
},
"last_page": {
"type": "string"
},
"last_whois": {
"type": "string"
},
"next_check": {
"type": "string"
},
"note": {
"type": "string"
},
"previous_dns": {
"type": "string"
},
"previous_whois": {
"type": "string"
},
"tools": {
"type": "string"
},
"whois_changed": {
"type": "boolean"
}
},
"required": [
"id",
"domain",
"can_check"
],
"type": "object"
},
"type": "array"
},
"success": {
"description": "Whether the request was successful",
"type": "boolean"
},
"total": {
"description": "Number of active monitors (get only)",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Personalized Domain Monitor"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Domain Name Advisor"
},
"description": "A professional domain naming consultation workflow. Call when a user is looking for domain name ideas, starting a new project and needs a domain, or has vague/open-ended domain requirements. Do NOT call when the user already has a specific name to check (use available/bulk_available) or already knows their keyword and wants variations (use domain_generator).\n\nThis is a multi-turn consulting engagement \u2014 conversation first, recommendations second. Never skip the diagnosis phase, and never generate domain suggestions before understanding the user's needs.\n\nWorkflow:\n1. Needs Diagnosis \u2014 ask the user questions to understand their project. Start with the essentials (project/industry, target audience, domain purpose), then follow up with budget guidance, TLD preference, and style preference (textural/imagery vs keyword-based). Ask 1-2 questions at a time, not all at once. Do NOT generate any domain names or call any tools in this phase. Even if the user's description seems clear, confirm user persona and brand tonality before proceeding.\n2. Semantic Leap \u2014 based on confirmed requirements, generate 3-5 metaphor directions that abstract one level up from the industry. Do NOT coin words directly from industry keywords unless the user mentioned them. Examples: travel \u2192 docking point \u2192 berth; notes \u2192 ideas \u2192 notion. Present the directions to the user and let them choose before generating any candidates.\n3. Domain Search & Verification \u2014 along the chosen direction, generate at least 10 candidate names. Every candidate must pass a quality check: does it feel natural in conversation? Does it evoke imagery? Stripped of all context, does the word alone have quality? If you hesitate, discard it. Then use bulk_available, deleted, expired, aged, and tld_check to verify acquisition paths and costs. For deleted and expired searches, try each keyword in different positions (start, end) to maximize coverage. Present results layered by acquisition method: directly registrable \u2192 listed for sale \u2192 contact owner \u2192 monitor/backorder, each with estimated cost.\n4. Iterative Refinement \u2014 based on user feedback, either generate more candidates in the same direction (with independent thinking \u2014 do not reuse previous coining patterns as templates), explore a new metaphor direction (return to step 2), or run brand_match on a finalist. If the current best is already strong, say so \u2014 do not force-generate low-quality options to show effort.\n\nKey principles:\n- Communication before generation \u2014 better to ask one more question than to blindly generate irrelevant domains.\n- A good name feels natural, evokes imagery, and has quality on its own. A bad name requires excessive explanation, feels forced, or mismatches the use case.\n- Help users save money while meeting their needs, but also surface purchase and backorder opportunities when relevant.\n- All statements must be data-backed. Do not speculate. Minimize etymology explanations \u2014 a good name does not need explaining.\n- Disclose affiliate links.",
"inputSchema": {
"properties": {
"query": {
"description": "User's initial idea, project description, keywords, or reference domain (optional)",
"type": "string"
}
},
"type": "object"
},
"name": "name_advisor",
"title": "Domain Name Advisor"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Newly Registered Domains Search"
},
"description": "Search newly registered domains by keyword. Use for tracking competitor registrations, spotting trending keywords, monitoring brand squatting, or finding resale opportunities.\n\nBest practices:\n- keyword defaults to 'contain' matching, which searches all domains containing the keyword anywhere in the name. Use position=start, position=end, or position=middle to control where the keyword appears in the domain name.\n- Always use no_hyphen=true unless specifically looking for hyphenated domains \u2014 hyphenated registrations are mostly low-quality spam.\n- sort=tld_counter_desc surfaces keywords registered across many TLDs simultaneously \u2014 a strong signal of trending demand.\n- period=6+ filters for domains registered for 6-10 years, indicating serious projects rather than speculative 1-year registrations.\n- prefix_tld_count in results indicates how many TLDs share the same prefix \u2014 values above 10 suggest the keyword is being actively pursued by multiple registrants.\n- Disclose affiliate links when presenting register_url to users.",
"inputSchema": {
"properties": {
"days_range": {
"description": "Registration recency",
"enum": [
"0-10",
"10-20",
"20+"
],
"type": "string"
},
"exclude": {
"description": "Negative keywords to exclude",
"type": "string"
},
"has_sale": {
"description": "Filter to domains listed for sale",
"enum": [
"true",
"false"
],
"type": "string"
},
"keyword": {
"description": "Search term (min 2 chars)",
"type": "string"
},
"length": {
"description": "Domain name length filter",
"enum": [
"<5",
"5-10",
"10-15",
"15+"
],
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphenated domains",
"type": "string"
},
"no_number": {
"description": "Exclude domains containing numbers",
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"period": {
"description": "Registration term length in years",
"enum": [
"1",
"2-5",
"6+"
],
"type": "string"
},
"position": {
"description": "Keyword placement in domain name",
"enum": [
"start",
"end",
"contain"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"reg_date_desc",
"reg_date_asc",
"length_asc",
"length_desc",
"period_asc",
"period_desc",
"tld_counter_asc",
"tld_counter_desc",
"alpha"
],
"type": "string"
},
"tld": {
"description": "Filter by TLD (e.g., 'com', 'ai', 'io')",
"type": "string"
},
"type": {
"description": "Character set filter",
"enum": [
"all_alpha",
"all_number"
],
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "nrds",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"affiliate": {
"type": "boolean"
},
"domain": {
"type": "string"
},
"prefix_tld_count": {
"description": "Number of TLDs the same prefix is registered under",
"type": "integer"
},
"price": {
"description": "Listing price with currency, e.g. 1500 USD. Only present for Atom/Sedo listings",
"type": "string"
},
"register_url": {
"format": "uri",
"type": "string"
},
"registered_date": {
"format": "date",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
},
"total_found": {
"description": "Total matching results across all pages",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Newly Registered Domains Search"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Reverse NS Lookup"
},
"description": "Reverse NS lookup. Find all gTLD domains hosted on a specific nameserver. Useful for mapping domain portfolios, understanding the scale of a nameserver's usage, and discovering what domains share infrastructure.\n\nBest practices:\n- sort=length_asc surfaces the shortest (most premium) domains first \u2014 large portfolios often contain hidden short-letter gems.\n- pure_alpha=true is the cleanest way to filter for letter-only domains. This is stricter than no_number + no_hyphen combined, as it excludes any non-letter character.\n- keyword filters by substring within domain names on that nameserver \u2014 useful for finding domains in a specific niche or vertical.\n- min_len and max_len require exact integers (e.g., '4'), not range syntax like '<5'.\n- If results fill a full page (10+), check total and paginate \u2014 large nameservers may host thousands of domains.\n- Look for patterns in results: similar naming conventions (brand-us.com, brand-uk.com) indicate portfolio clustering by the same owner.",
"inputSchema": {
"properties": {
"keyword": {
"description": "Substring filter within domain names",
"type": "string"
},
"max_len": {
"description": "Maximum domain name length (integer)",
"type": "string"
},
"min_len": {
"description": "Minimum domain name length (integer)",
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphens",
"type": "string"
},
"no_number": {
"description": "Exclude numbers",
"type": "string"
},
"ns": {
"description": "Target nameserver hostname (e.g., 'ns1.example.com')",
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"pure_alpha": {
"description": "Letters only (strictest quality filter)",
"enum": [
"true",
"false"
],
"type": "string"
},
"pure_digit": {
"description": "Numbers only",
"enum": [
"true",
"false"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"length_asc",
"length_desc",
"alpha_asc",
"alpha_desc"
],
"type": "string"
},
"tld": {
"description": "Filter by TLD (e.g., 'com')",
"type": "string"
}
},
"required": [
"ns"
],
"type": "object"
},
"name": "ns_reverse",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"domain": {
"description": "Full domain name including TLD",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"error": {
"type": "string"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Reverse NS Lookup"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Domain Alternatives Finder"
},
"description": "Domain alternatives workflow. Call when a user's target domain is unavailable and they need alternative options across different lifecycle stages \u2014 for example after available or bulk_available returns unavailable, or as a follow-up from analyze or name_advisor when a candidate is taken. Do NOT call when the user is starting from scratch without a target (use name_advisor), already knows their keyword and wants creative variations (use domain_generator), or wants to analyze the taken domain itself (use analyze).\n\nThis is a multi-turn workflow. Stop and wait for user input at every checkpoint.\n\nWorkflow:\n1. Understand User Needs \u2014 extract core keywords from the unavailable domain (e.g., getflow.com \u2192 keyword: flow, pattern: prefix+root). Then ask the user: what appealed to you about this domain (the keyword, the length, the sound)? Are you open to other TLDs or .com only? Would you consider purchasing a registered domain, or only free registration / backorder? Do NOT search until the user responds \u2014 their motivation determines the entire search strategy.\n2. Lifecycle Search \u2014 search by priority: deleted (free registration, highest priority) \u2192 expired (backorderable) \u2192 aged (registered, only if user is willing to purchase). For each tool, try the keyword in different positions (start, end) to maximize coverage \u2014 e.g., searching 'flow' at start and end will surface very different results. If a strong match is found in deleted, note it as a top recommendation.\n3. Creative Variants \u2014 based on what the user liked about the original domain, generate 15-20 creative variants respecting their TLD preference (default .com). Avoid concatenations creating sensitive words or offensive abbreviations. Verify all with bulk_available.\n4. Present Results \u2014 organize all findings layered by acquisition method from easiest to most involved: free registration (deleted + available variants) \u2192 backorderable (expired) \u2192 purchasable (aged for-sale) \u2192 monitorable (worth watching). Every domain must include the appropriate acquisition link. Ask the user which options interest them.\n5. Follow-up \u2014 based on user choice: generate more variations, run brand_match, set up set_monitor, do deeper analysis with analyze or expired_analysis, or run valuation_cma.\n\nKey principles:\n- Default to .com only unless user specifies otherwise.\n- Every domain presented must include an acquisition link (register_url, backorder_url, or sale link).\n- Disclose affiliate links.",
"inputSchema": {
"properties": {
"domain": {
"description": "Unavailable target domain",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "plan_b",
"title": "Domain Alternatives Finder"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Manage user preferences and memory settings.\n\nActions:\n- get: Check if memory is enabled and retrieve saved preferences. Default action if not specified.\n- set: Save preferences. Requires explicit user consent before enabling memory. memory_enabled must be true before any other preferences, monitors, or strategies can be saved.\n- delete: Delete all stored user data permanently (preferences, monitors, strategies). GDPR Article 17: Right to erasure.\n\nAll user data is encrypted at rest using AES-256-GCM and stored in isolated user directories. No one \u2014 including DomainKits staff \u2014 can read your data. Fully GDPR compliant.\n\nWhen action=get:\n- If reason=\"not_configured\", ask the user with a clear choice: \"I can remember your preferences, monitoring tasks, and discovery strategies across sessions. All data is encrypted. Would you like to enable this?\" Only call with action=set and memory_enabled=true after explicit user consent.\n- MONITOR HANDLING: If monitors_count > 0, check monitors_summary. If can_check_count > 0, call get_monitors to auto-check domains. If can_check_count == 0, all monitors are in cooldown \u2014 inform the user when next check is available (next_check field), do NOT call get_monitors. The domains list lets you answer \"what am I monitoring?\" without triggering a check.\n- If strategies_count > 0, proceed to call get_strategies.",
"inputSchema": {
"properties": {
"action": {
"description": "'get', 'set', or 'delete'. Defaults to 'get' if not specified.",
"type": "string"
},
"budget": {
"description": "'low', 'medium', 'high' (set only)",
"type": "string"
},
"exclude_hyphens": {
"description": "'true' or 'false' (set only)",
"type": "string"
},
"exclude_numbers": {
"description": "'true' or 'false' (set only)",
"type": "string"
},
"industry": {
"description": "Industry type (set only)",
"type": "string"
},
"memory_enabled": {
"description": "'true' to enable memory, 'false' to disable. Must be enabled before using monitors or strategies. (set only)",
"type": "string"
},
"preferred_tlds": {
"description": "Comma-separated TLDs, e.g. 'com,net,io' (set only)",
"type": "string"
},
"style": {
"description": "'short', 'brandable', 'keyword' (set only)",
"type": "string"
}
},
"type": "object"
},
"name": "preferences",
"outputSchema": {
"properties": {
"data": {
"description": "Saved preference data (get only, when memory is enabled)",
"properties": {
"budget": {
"type": "string"
},
"exclude_hyphens": {
"type": "boolean"
},
"exclude_numbers": {
"type": "boolean"
},
"industry": {
"type": "string"
},
"memory_enabled": {
"type": "boolean"
},
"preferred_tlds": {
"type": "array"
},
"style": {
"type": "string"
}
},
"type": "object"
},
"memory_enabled": {
"description": "Whether memory is enabled for this user",
"type": "boolean"
},
"message": {
"description": "Human-readable result message",
"type": "string"
},
"monitors_count": {
"description": "Number of active monitors (get only)",
"type": "integer"
},
"monitors_summary": {
"description": "Monitor overview (get only, when monitors_count > 0)",
"properties": {
"can_check_count": {
"type": "integer"
},
"domains": {
"items": {
"type": "string"
},
"type": "array"
},
"last_check": {
"type": "string"
},
"max": {
"type": "integer"
},
"next_check": {
"type": "string"
},
"total": {
"type": "integer"
}
},
"type": "object"
},
"strategies_count": {
"description": "Number of active strategies (get only)",
"type": "integer"
},
"success": {
"description": "Whether the request was successful",
"type": "boolean"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "User Preferences & Memory"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "TLD Pricing (Dynadot)"
},
"description": "Domain registration and renewal prices by TLD from Dynadot. Check registration, renewal, and transfer costs before purchasing.\n\nBest practices:\n- Use comma-separated values for multi-TLD comparison: tld='com,io,ai,xyz'.\n- Results include register_url (Dynadot affiliate link). Always display this link when showing prices and disclose affiliate status.\n- Prices are in USD. Registration price is for the first year; renewal price is the ongoing annual cost \u2014 highlight the difference when they diverge significantly (e.g., some TLDs have low introductory registration but high renewal).",
"inputSchema": {
"properties": {
"tld": {
"description": "TLD to query, comma-separated for multiple (e.g., 'com', 'com,io,ai')",
"type": "string"
}
},
"required": [
"tld"
],
"type": "object"
},
"name": "price",
"outputSchema": {
"properties": {
"affiliate": {
"type": "boolean"
},
"data": {
"items": {
"properties": {
"currency": {
"type": "string"
},
"register_price": {
"description": "First-year registration price (USD)",
"type": "number"
},
"renewal_price": {
"description": "Annual renewal price (USD)",
"type": "number"
},
"tld": {
"type": "string"
},
"transfer_price": {
"description": "Transfer price (USD)",
"type": "number"
}
},
"required": [
"tld"
],
"type": "object"
},
"type": "array"
},
"error": {
"type": "string"
},
"register_url": {
"format": "uri",
"type": "string"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of TLDs returned",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "TLD Pricing (Dynadot)"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Domain Safety Check"
},
"description": "Check domain safety via Google Safe Browsing, and check Google search index status. Returns two pieces of data: (1) safe \u2014 whether Google Safe Browsing flags the domain for malware, phishing, social engineering, or unwanted software, including specific threat types if flagged; (2) index \u2014 whether the domain has pages indexed in Google and an estimated count. A flagged domain is a critical risk signal \u2014 it likely has a problematic history (malware distribution, phishing, spam operations) that may be difficult or impossible to recover from. This is especially important when evaluating expired or aged domains for acquisition. An unindexed domain may indicate it was previously penalized or has been dormant.",
"inputSchema": {
"properties": {
"domain": {
"description": "Domain name",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "safety",
"outputSchema": {
"properties": {
"domain": {
"type": "string"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"index": {
"properties": {
"checked_at": {
"type": "string"
},
"domain": {
"type": "string"
},
"index_count": {
"description": "Estimated number of indexed pages",
"type": "integer"
},
"indexed": {
"description": "Whether the domain is indexed by Google",
"type": "boolean"
}
},
"type": "object"
},
"safe": {
"properties": {
"domain": {
"type": "string"
},
"is_safe": {
"description": "Whether the domain is safe according to Google Safe Browsing",
"type": "boolean"
},
"matches_count": {
"description": "Number of threat matches found",
"type": "integer"
},
"scan_date": {
"format": "date-time",
"type": "string"
},
"threat_types": {
"description": "List of detected threat types (empty if safe)",
"items": {
"type": "string"
},
"type": "array"
}
},
"type": "object"
},
"success": {
"type": "boolean"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Domain Safety Check"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true,
"readOnlyHint": true,
"title": "Domain Buyer Discovery"
},
"description": "Domain buyer discovery workflow. Call when a user wants to find potential end-user buyers for a domain they own or are considering selling.\n\nWhen to use: user asks 'who would buy this domain?', 'help me sell [domain]', or wants to find buyers as a follow-up after keyword_intel or plan_b. Do NOT use when the user wants to buy a domain (use plan_b), check domain value only (use valuation_cma), or analyze a domain technically (use analyze).\n\nWorkflow:\n1. Extract the core keyword(s) from the domain. Use web_search '[keyword] company OR brand OR product' to discover who is already operating under this name or close variants. Note their business type, current domain, scale, and how long they've been using the keyword. This research step is mandatory \u2014 do not skip it.\n\n2. Categorize potential buyers into three tiers by purchase motivation:\n - Tier 1 \u2014 Domain Upgraders: companies already operating under this exact name or a close variant (on .net, .io, a hyphenated version, or with a prefix/suffix added), who would naturally want the cleaner or shorter version. These are the highest-intent buyers \u2014 they've already built equity around the keyword and this domain is a direct upgrade for them.\n - Tier 2 \u2014 Strategic Expansioners: companies in the same industry whose product, feature, or campaign aligns with what this domain describes. Acquiring it is a strategic fit that strengthens positioning.\n - Tier 3 \u2014 New Brand Builders: funded startups or new ventures that haven't fully launched yet but would find this name ideal.\n\n3. Use Claude for Chrome to research buyers on LinkedIn in three layers. Open LinkedIn in the browser and execute the following searches in order:\n\n Layer 1 \u2014 Find Domain Upgraders (highest priority):\n Switch to the Companies tab. Search using the exact keyword and close variants:\n \"[keyword]\" OR \"[keywords]\" OR \"[keyword]-[common suffix]\"\n Scan results for companies whose name or description contains the keyword but whose website is on an inferior domain (not the clean .com). These are Tier 1 buyers.\n\n Layer 2 \u2014 Find Strategic Buyers:\n Search Companies tab by industry theme:\n \"[industry vertical] [keyword theme]\"\n Apply Industry filter (e.g., Events Services, Software, Media) to narrow results. Identify Tier 2 candidates whose business would be strengthened by owning this domain.\n\n Layer 3 \u2014 Find Decision Makers at identified companies:\n For each promising company from Layers 1 and 2, switch to the People tab and use Boolean search to locate the right contact:\n (\"CMO\" OR \"VP Marketing\" OR \"Chief Marketing\" OR \"Brand Director\" OR \"Head of Brand\" OR \"Head of Marketing\") AND \"[company name]\" NOT (intern OR assistant)\n Record: full name, title, LinkedIn profile URL.\n\n4. Synthesize findings into a prioritized buyer list. Present Tier 1 first, then Tier 2, then Tier 3. For each entry include: company name, current domain they operate on, reason they are a strong buyer candidate, and decision maker contact if found.\n\n5. After presenting the buyer list, ask the user what they want to do next. Tailor follow-up based on their response:\n - Wants a price before outreach \u2192 suggest valuation_cma for a data-backed asking price, market_price to check existing listings.\n - Wants to draft outreach \u2192 help write a personalized email for each Tier 1 buyer, emphasizing the specific upgrade value to their existing brand.\n - Wants to list the domain \u2192 suggest Afternic, Sedo, or Dan.com depending on domain type.\n - Wants more buyer leads \u2192 suggest brand_match to identify additional companies using the keyword, or nrds to see who has recently registered variants.\n\nKey principles: focus on upgrade motivation, not conflict framing. Every buyer candidate must be grounded in data from web_search or LinkedIn results. Do not speculate about intent. Present the buyer list as opportunity intelligence, not legal risk assessment. Disclose affiliate links when presenting marketplace URLs.",
"inputSchema": {
"properties": {
"domain": {
"description": "The domain the user wants to sell (e.g., 'opentalks.com')",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "sale_chance",
"title": "Domain Buyer Discovery"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Manage personalized opportunity discovery strategies \u2014 let AI periodically execute your investment logic and discover new opportunities.\n\nAll strategy data is encrypted at rest (AES-256-GCM). GDPR compliant.\n\nActions:\n- get: Retrieve all strategies with run status and available presets. Default action if not specified. Shows can_run status, runs_today, and available preset strategies not yet activated.\n- set: Create a new strategy. Describe the domains you want in natural language, or activate a preset by preset_id. Examples: \"Monitor all domains with 'ai' keyword, 10+ years of history, about to expire, .com\", \"Track newly registered domains containing 'claw', letters only, .io\", \"Discover crypto-related keywords with high TLD registration volume\". Limits: Member 1 / Premium 3 / Platinum unlimited.\n- update: Record execution result for a strategy. Call after running a strategy to save the result summary. Subject to daily run limits and minimum interval between runs.\n- delete: Remove a strategy.\n\nRequires registered account (member or above) and memory enabled for all actions.",
"inputSchema": {
"properties": {
"action": {
"description": "'get', 'set', 'update', or 'delete'. Defaults to 'get' if not specified.",
"type": "string"
},
"id": {
"description": "Strategy task ID (update and delete)",
"type": "string"
},
"name": {
"description": "Name for custom strategy (set only)",
"type": "string"
},
"preset_id": {
"description": "Activate a preset strategy by ID (set only)",
"type": "string"
},
"result": {
"description": "Execution result summary (update only)",
"type": "string"
},
"strategy": {
"description": "Custom strategy in natural language, max 500 chars (set only)",
"type": "string"
}
},
"type": "object"
},
"name": "strategy",
"outputSchema": {
"properties": {
"available_presets": {
"description": "Preset strategies not yet activated (get only)",
"items": {
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"strategy": {
"type": "string"
}
},
"type": "object"
},
"type": "array"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"max": {
"description": "Maximum strategies allowed (get only)",
"type": "integer"
},
"message": {
"description": "Human-readable result message",
"type": "string"
},
"strategy": {
"description": "Created strategy details (set only)",
"properties": {
"created_at": {
"type": "string"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"strategy": {
"type": "string"
}
},
"type": "object"
},
"strategys": {
"description": "List of strategies with run status (get only)",
"items": {
"properties": {
"can_run": {
"type": "boolean"
},
"id": {
"type": "string"
},
"last_result": {
"type": "string"
},
"last_run": {
"type": "string"
},
"name": {
"type": "string"
},
"preset": {
"type": "boolean"
},
"reason": {
"type": "string"
},
"runs_today": {
"type": "integer"
},
"strategy": {
"type": "string"
}
},
"required": [
"id",
"strategy",
"can_run"
],
"type": "object"
},
"type": "array"
},
"success": {
"description": "Whether the request was successful",
"type": "boolean"
},
"total": {
"description": "Number of active strategies (get only)",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Personalized Discovery Strategy"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Cross-TLD Registration Check"
},
"description": "Check a keyword prefix's registration status across all TLDs. Returns total registration count (gTLDs + ccTLDs) and status of core TLDs (com, net, org, io, ai, de).\n\nThis is a saturation and popularity metric \u2014 the total count indicates how widely a keyword has been claimed across the TLD namespace.\n\nInterpreting results:\n- count >200: Keyword is widely recognized \u2014 either high market demand or strong brand protection (or both). Cross-reference with keyword_data and active to determine which.\n- count 50-200: Worth attention \u2014 check if there are still opportunities available.\n- count <50: Not a particularly popular keyword in the domain market.\n- gtlds_count vs cctlds_count ratio: High ccTLD registration suggests international interest in the keyword.\n\nThe tlds field shows status for core TLDs (com, net, org, io, ai, de) with values: 'registered', 'for_sale', 'expiring', or 'might_available'. Note that 'might_available' means the prefix is not found in our database for that TLD \u2014 confirm with the 'available' tool before assuming registrability.\n\nBest practices:\n- The prefix parameter must NOT contain the TLD extension \u2014 use 'openai' not 'openai.com'.\n- If .com shows 'might_available' for an established keyword, this is unusual and worth verifying.\n- If .com shows 'for_sale' or 'expiring', this is a potential acquisition opportunity worth flagging.",
"inputSchema": {
"properties": {
"prefix": {
"description": "Keyword without extension (e.g., 'openai')",
"type": "string"
}
},
"required": [
"prefix"
],
"type": "object"
},
"name": "tld_check",
"outputSchema": {
"properties": {
"cctlds_count": {
"description": "Number of ccTLDs with this prefix registered",
"type": "integer"
},
"count": {
"description": "Total number of TLDs with this prefix registered",
"type": "integer"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"gtlds_count": {
"description": "Number of gTLDs with this prefix registered",
"type": "integer"
},
"prefix": {
"type": "string"
},
"success": {
"type": "boolean"
},
"tlds": {
"description": "Status of core TLDs (com, net, org, io, ai, de). Values: registered, for_sale, expiring, or might_available",
"type": "object"
}
},
"required": [
"success",
"prefix"
],
"type": "object"
},
"title": "Cross-TLD Registration Check"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "gTLD Rankings"
},
"description": "gTLD rankings by registration volume. See which gTLDs have the most new registrations today or the most total active domains.\n\nBest practices:\n- type='newly' ranks by today's new registrations \u2014 useful for spotting which TLDs are currently hot. Sudden spikes in a usually quiet TLD may signal a promotion or speculative wave.\n- type='active' ranks by total active domain count \u2014 reflects overall market size and maturity.\n- Compare newly vs active to find TLDs with disproportionate registration activity relative to their size (high new-to-active ratio = momentum signal).\n- type='newly' data has a one-day lag \u2014 it reflects yesterday's registrations, not today's.\n- The key insight from newly rankings is relative change, not absolute numbers. A TLD jumping significantly in rank or showing unusual registration volume compared to its typical level is the signal worth investigating \u2014 use tld_trends for historical baseline and web_search to identify the cause.\n- This data pairs well with tld_trends: tld_rank shows today's snapshot, tld_trends shows the trajectory over time.",
"inputSchema": {
"properties": {
"limit": {
"description": "Number of results (default 20, max 100)",
"type": "string"
},
"type": {
"description": "Ranking type: 'newly' for today's new registrations, 'active' for total active domains",
"enum": [
"newly",
"active"
],
"type": "string"
}
},
"type": "object"
},
"name": "tld_rank",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"count": {
"description": "New registrations or total active domains",
"type": "integer"
},
"rank": {
"type": "integer"
},
"tld": {
"type": "string"
}
},
"required": [
"rank",
"tld",
"count"
],
"type": "object"
},
"type": "array"
},
"date": {
"description": "Data date (YYYY-MM-DD)",
"type": "string"
},
"error": {
"type": "string"
},
"success": {
"type": "boolean"
},
"total": {
"type": "integer"
},
"type": {
"description": "Ranking type: 'newly' or 'active'",
"type": "string"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "gTLD Rankings"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "gTLD Registration Trends"
},
"description": "gTLD registration trends over time. Analyze historical registration patterns for specific gTLDs \u2014 spot hype cycles, compare competing extensions, or check long-term health.\n\nTwo modes:\n- action='data' + tld (single TLD): deep-dive into one TLD's trend over time. Use this to answer 'is .ai still hot?' or 'is .net dying?'.\n- action='compare' + tlds (comma-separated, max 5): side-by-side comparison. Use this to answer 'should I buy the .io or .ai version?' by comparing registration momentum.\n\nBest practices:\n- Focus on ma7 (7-day moving average) slope rather than raw daily numbers \u2014 daily counts are noisy, the moving average reveals the real trend direction. ma7 trending up = genuine momentum, flat = stable, declining = cooling off.\n- Compare ma7 vs ma14 for trend acceleration: ma7 crossing above ma14 = momentum building, ma7 dropping below ma14 = momentum fading.\n- type='newly' shows registration velocity (new domains per day) \u2014 best for detecting hype cycles and short-term momentum shifts.\n- type='active' shows total installed base \u2014 best for market size comparison and long-term health assessment.\n- When comparing TLDs, note the absolute scale difference \u2014 a TLD with 100K active domains showing 500 new/day has very different dynamics than one with 10M active showing 500 new/day.\n- Mutually exclusive inputs: action='data' requires 'tld' (single). action='compare' requires 'tlds' (comma-separated). Do not mix them.\n- days must be one of the allowed values: 7, 14, 30, 60, 90, 180. Use 30 for short-term momentum, 90-180 for trend confirmation.\n- Pairs well with tld_rank for today's snapshot context, and price to check registration costs for trending TLDs.",
"inputSchema": {
"properties": {
"action": {
"description": "'data' for single TLD deep-dive, 'compare' for multi-TLD comparison",
"enum": [
"data",
"compare"
],
"type": "string"
},
"days": {
"description": "Time horizon",
"enum": [
"7",
"14",
"30",
"60",
"90",
"180"
],
"type": "string"
},
"tld": {
"description": "Single TLD for 'data' mode (e.g., 'ai')",
"type": "string"
},
"tlds": {
"description": "Comma-separated TLDs for 'compare' mode (max 5, e.g., 'io,ai,co,xyz')",
"type": "string"
},
"type": {
"description": "'newly' for daily new registrations, 'active' for total active domains",
"enum": [
"active",
"newly"
],
"type": "string"
}
},
"type": "object"
},
"name": "tld_trends",
"outputSchema": {
"properties": {
"data": {
"description": "In 'data' mode: array of data points. In 'compare' mode: object keyed by TLD name, each value is an array of data points.",
"oneOf": [
{
"description": "Data mode: single TLD trend",
"items": {
"properties": {
"date": {
"type": "string"
},
"ma14": {
"description": "14-day moving average",
"type": "integer"
},
"ma7": {
"description": "7-day moving average",
"type": "integer"
},
"original": {
"description": "Raw daily count",
"type": "integer"
}
},
"required": [
"date",
"original",
"ma7",
"ma14"
],
"type": "object"
},
"type": "array"
},
{
"additionalProperties": {
"items": {
"properties": {
"date": {
"type": "string"
},
"ma14": {
"type": "integer"
},
"ma7": {
"type": "integer"
},
"original": {
"type": "integer"
}
},
"required": [
"date",
"original",
"ma7",
"ma14"
],
"type": "object"
},
"type": "array"
},
"description": "Compare mode: keyed by TLD name",
"type": "object"
}
]
},
"days": {
"type": "integer"
},
"error": {
"type": "string"
},
"success": {
"type": "boolean"
},
"tld": {
"description": "TLD name (data mode only)",
"type": "string"
},
"type": {
"description": "'newly' or 'active'",
"type": "string"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "gTLD Registration Trends"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true,
"readOnlyHint": true,
"title": "Keyword Registration Trend Hunter"
},
"description": "Trend discovery and domain opportunity workflow. Call when a user wants to explore what keywords are trending in domain registrations and whether those trends represent real investment opportunities.\n\nWhen to use: User asks what's trending, wants to find opportunities based on registration momentum, or wants to explore hot/emerging keywords. Not for analyzing a specific domain (use analyze), deep-diving a known keyword (use keyword_intel), or getting a market news briefing (use market_beat).\n\nThis is a MULTI-TURN workflow. Present findings at each phase and wait for the user to choose direction before proceeding. Do not batch all phases into a single response. Let users choose which keywords to explore \u2014 do not decide for them.\n\nMethodology \u2014 three phases, each gated by user input:\n\n1. Discover: Surface trending keywords using keywords_trends (hot, emerging, or prefix depending on user interest). The results already include pre-computed quality metrics for hot and emerging types: com_ratio, digit_ratio, most_tld, and most_tld_ratio. Present the data with quality assessment:\n - com_ratio above 0.15 = genuine interest; below 0.05 = likely bulk speculation on cheap TLDs.\n - most_tld_ratio above 0.7 on a non-.com TLD = trend driven by bulk registration, not organic demand.\n - digit_ratio above 0.2 = low-quality speculative registrations.\n Flag any keywords with suspicious quality signals. Ask the user which keyword(s) they want to investigate further. Stop and wait.\n\n2. Assess market catalyst: For the user's chosen keyword, investigate what is driving the trend.\n - web_search is MANDATORY \u2014 do not substitute with your own knowledge. Execute at least two separate searches: one for domain transaction history (e.g., '{keyword} domain sold price 2026') and one for industry news (e.g., '{keyword} news 2026'). Domain transactions are the single strongest catalyst for registration spikes \u2014 a high-value sale (e.g., keyword.com selling for six or seven figures) routinely triggers a wave of speculative registrations on the same keyword. Always check for this first. Industry news (product launches, funding rounds, regulatory changes) is the second catalyst layer. If neither search returns relevant results, state that clearly \u2014 do not fill the gap with training data.\n - Synthesize the quality metrics from Phase 1 with the catalyst research into a clear verdict: real trend (strong quality metrics + identifiable catalyst), speculative (weak quality metrics or no catalyst), or uncertain. Present the assessment and recommended search direction. Stop and wait for user confirmation before searching for domains.\n\n3. Find opportunities: Based on the assessment, search for available domains.\n - deleted and expired for domains available at registration cost or via backorder.\n - aged with has_sale=true for secondary market listings.\n - All domains presented to the user MUST be verified via bulk_available before recommending.\n - Disclose affiliate links.\n\nAfter presenting opportunities, offer relevant next steps: deep analysis on a specific domain (analyze), brand conflict check (brand_match), monitoring setup (set_monitor), or exploring a different keyword.",
"inputSchema": {
"properties": {
"scenario": {
"description": "Trend type to explore",
"enum": [
"prefix",
"emerging",
"hot"
],
"type": "string"
}
},
"type": "object"
},
"name": "trend_hunter",
"title": "Keyword Registration Trend Hunter"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Unregistered Short .AI Domain Finder"
},
"description": "Search for unregistered short .ai domains. Find rare 3-letter and 4-letter pattern domains still available for registration.\n\nPattern types:\n- CVCV: Consonant-Vowel-Consonant-Vowel (e.g., 'bora', 'mito') \u2014 most brandable, sounds like real words.\n- VCVC: Vowel-Consonant-Vowel-Consonant (e.g., 'amon', 'ivan') \u2014 name-like quality.\n- CCVV: Double consonant + double vowel (e.g., 'bloo', 'staa') \u2014 unique/distinctive.\n- 3letter: Any remaining 3-letter .ai domains \u2014 extremely rare and high-value.\n\nBest practices:\n- For brandable names: use type=CVCV or type=VCVC, sort=count_desc to surface names with validated demand across other TLDs.\n- For undiscovered gems: use tld_count=0-10, sort=count_asc \u2014 low cross-TLD registration may indicate overlooked opportunities.\n- For ultra-premium: use type=3letter \u2014 3-letter .ai domains are the scarcest inventory.\n- tld_count interpretation: high (50+) = validated demand, the name is desirable across TLDs; low (<10) = less widely registered, may be undiscovered or niche.\n- Always verify availability with the 'available' tool before recommending registration \u2014 availability can change at any time.\n- .ai is the premium TLD for AI/tech companies; short .ai domains are high-value due to scarcity.",
"inputSchema": {
"properties": {
"exclude": {
"description": "Exclude characters (comma-separated)",
"type": "string"
},
"keyword": {
"description": "Filter by characters in prefix",
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphens",
"enum": [
"true",
"false"
],
"type": "string"
},
"no_number": {
"description": "Exclude numbers",
"enum": [
"true",
"false"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"length_asc",
"length_desc",
"count_asc",
"count_desc"
],
"type": "string"
},
"tld_count": {
"description": "Filter by cross-TLD registration count",
"enum": [
"0-10",
"10-50",
"50-100",
"100+"
],
"type": "string"
},
"type": {
"description": "Pattern type filter",
"enum": [
"3letter",
"CVCV",
"VCVC",
"CCVV"
],
"type": "string"
}
},
"type": "object"
},
"name": "unregistered_ai",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"length": {
"description": "Prefix character length \u2014 3 = ultra premium, 4 = premium",
"type": "integer"
},
"prefix": {
"description": "Available short name (e.g., tuyu, hamu)",
"type": "string"
},
"tld": {
"description": "Top-level domain (always ai)",
"type": "string"
},
"tld_count": {
"description": "Number of other TLDs this prefix is registered under",
"type": "integer"
}
},
"required": [
"prefix"
],
"type": "object"
},
"type": "array"
},
"error": {
"type": "string"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Unregistered Short .AI Domain Finder"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Check your current usage and remaining quota for all tools. Shows daily limits, usage counts, and rate limits for your tier.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "usage",
"outputSchema": {
"properties": {
"monitor": {
"description": "Monitor feature limits",
"properties": {
"daily_checks": {
"description": "Maximum monitor checks per day",
"type": "integer"
},
"max_items": {
"description": "Maximum number of monitors allowed",
"type": "integer"
},
"min_interval_min": {
"description": "Minimum interval between checks in minutes",
"type": "integer"
}
},
"type": "object"
},
"strategy": {
"description": "Strategy feature limits",
"properties": {
"daily_runs": {
"description": "Maximum strategy runs per day",
"type": "integer"
},
"max_items": {
"description": "Maximum number of strategies allowed",
"type": "integer"
},
"min_interval_min": {
"description": "Minimum interval between runs in minutes",
"type": "integer"
}
},
"type": "object"
},
"tier": {
"description": "User's account tier (guest, member, ai_plan, premium, platinum)",
"type": "string"
},
"tools": {
"description": "Per-tool usage and limits",
"items": {
"properties": {
"daily_limit": {
"description": "Maximum daily calls",
"type": "integer"
},
"daily_remaining": {
"description": "Calls remaining today",
"type": "integer"
},
"daily_used": {
"description": "Calls used today",
"type": "integer"
},
"max_pages": {
"description": "Maximum pages allowed per query (search tools only)",
"type": "integer"
},
"rate_per_minute": {
"description": "Rate limit per minute",
"type": "integer"
},
"tool": {
"description": "Tool or tool group name",
"type": "string"
}
},
"type": "object"
},
"type": "array"
},
"upgrade_hint": {
"description": "Upgrade suggestion with link (if applicable)",
"type": "string"
}
},
"required": [
"tier"
],
"type": "object"
},
"title": "Check Usage & Quota"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true,
"readOnlyHint": true,
"title": "Domain CMA Valuation"
},
"description": "Domain Comparative Market Analysis (CMA) valuation workflow. Call when a user wants to estimate a domain's market value by finding comparable domains listed for sale.\n\nWhen to use: user asks 'how much is this domain worth?', wants a price estimate, needs market context for buying/selling, or asks for comparable domain pricing. Do NOT use for single common word + TLD domains (e.g., travel.com, music.com) \u2014 these are unique assets where CMA does not apply; decline and explain why. Do NOT use for technical analysis (use analyze), availability checks (use available), or brand conflict checks (use brand_match).\n\nCMA applies to: compound words (cloudpay), coined brands (spotify), industry word + modifier (healthymag), prefix/suffix combos (getflow, appnova). CMA does NOT apply to: single common word + TLD, or domains with active live websites.\n\nWorkflow:\n1. Pre-screening: validate the domain is suitable for CMA. If it is a single common word + TLD, refuse and explain. Then ask the user one question: what they value most about this domain \u2014 the keyword meaning, the length, the age, or something else? This determines the direction of comparable search (e.g., semantic vs structural vs age-based comps), NOT the valuation itself. Do NOT ask about intended use \u2014 valuation must be objective and data-driven regardless of whether the user plans to build, flip, or hold. Do NOT call any tools before the user responds.\n\n2. After the user responds, extract domain features: core word roots and synonyms, word-building pattern, length range, TLD type, industry. Then:\n - web_search site:{domain} to check if it has a live website. If actively in use, refuse valuation.\n - tld_check to see cross-TLD distribution. If the domain appears unregistered, inform the user and do not proceed.\n Present extracted features and screening results. Confirm with the user before proceeding.\n\n3. Search for comparable domains and retrieve prices:\n - aged with has_sale=true to find listed domains with the same core keyword, same TLD, similar length. Check synonyms if insufficient results.\n - active with status=forsale as supplement if fewer than 10 candidates.\n - market_price for each candidate. market_price returns three possible statuses:\n * 'for_sale': has a listed price and a buy_url \u2014 this is the primary data source for CMA.\n * 'make_offer': listed but no fixed price \u2014 note as supplementary only.\n * 'not_found': exclude from comp pool.\n - market_price sources prices from 2nd layer and other integrated marketplaces via API. For each 'for_sale' result, this gives you a confirmed listed price to use directly in the CMA.\n - After presenting the comp table, also surface the buy_url for each 'for_sale' comparable. If buy_url has affiliate=true, disclose this clearly: 'These are affiliate links \u2014 DomainKits may earn a commission if you make a purchase through them. Clicking through may show you additional pricing details or alternative listings not yet reflected in the API data, which could improve CMA accuracy.' The user is not required to click \u2014 the CMA proceeds with API prices either way. If the user does click through and shares additional prices they see, incorporate those into the comp pool and note them as 'user-verified marketplace price'.\n - Filter all comps by semantic relevance, structural similarity, length match, and price reasonableness. Remove outliers and negative-meaning domains. Select 3-5 best comparables.\n - If fewer than 3 'for_sale' priced comps remain after filtering, warn the user: 'Fewer than 3 priced comparables found \u2014 CMA confidence is low. Results should be treated as directional only.'\n Present comparable table and wait for user feedback before proceeding to valuation.\n\n4. Derive valuation with optional adjustments:\n - backlink_summary for SEO value (premium factor if strong backlinks).\n - web_search for historical sales of similar domains on NameBio as cross-validation.\n - keywords_trends for keyword registration heat, plus web_search for industry tailwinds. Rising heat = premium, declining = discount.\n Present the complete valuation report including: comparable table with source noted per price (API or user-verified), premium/discount factors with data sources cited, valuation range with reasoning, historical sales if found, trend adjustment, uncertainty statement (market volatility, listing vs transaction gap), and general action suggestions (buy-low-sell-high principles, NOT specific buy/sell recommendations).\n MUST include compliance statement: 'This valuation is derived from public listing prices on third-party marketplaces, for reference only, and does not constitute official appraisal or investment advice. Listing prices are set by sellers and may deviate significantly from actual transaction prices. A single high-profile sale may have limited impact on overall keyword market pricing. However, multiple high-value transactions on the same keyword \u2014 especially exact-match domains \u2014 indicate broader market repricing and carry significantly more weight in valuation.'\n After presenting, suggest next steps: plan_b for alternatives, set_monitor for price tracking, brand_match for acquisition risk.\n\nKey principles: every claim about value must cite specific tool data. Never fabricate prices, traffic estimates, or quantitative claims. Never give buy/sell recommendations \u2014 present data, let the user decide. Always disclose affiliate links when surfacing buy_url.",
"inputSchema": {
"properties": {
"domain": {
"description": "Target domain to value (e.g., 'cloudpay.com')",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "valuation_cma",
"title": "Domain CMA Valuation"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "RDAP WHOIS Registration Info"
},
"description": "Query WHOIS/RDAP registration info for a domain. Returns registrar, dates, status codes, and nameservers. Nameservers can indicate if a domain is parked for sale (e.g., Sedo, Afternic). Status codes can reveal special states such as expired, pendingDelete, or redemptionPeriod.",
"inputSchema": {
"properties": {
"domain": {
"description": "Domain name",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "whois",
"outputSchema": {
"properties": {
"created": {
"description": "Registration creation date",
"format": "date-time",
"type": "string"
},
"domain": {
"type": "string"
},
"expires": {
"description": "Expiration date",
"format": "date-time",
"type": "string"
},
"nameservers": {
"description": "Configured nameservers",
"items": {
"type": "string"
},
"type": "array"
},
"registered": {
"description": "Whether the domain is currently registered",
"type": "boolean"
},
"registrar_name": {
"description": "Registrar name",
"type": "string"
},
"status": {
"description": "Domain status codes",
"items": {
"type": "string"
},
"type": "array"
},
"updated": {
"description": "Last updated date",
"format": "date-time",
"type": "string"
}
},
"required": [
"domain",
"registered"
],
"type": "object"
},
"title": "RDAP WHOIS Registration Info"
}
]
}
},
"bad_protocol_status_code": 200,
"delete_error": null,
"delete_status_code": null,
"expired_session_error": null,
"expired_session_status_code": null,
"issues": [
"missing_session_id",
"missing_protocol_header",
"bad_protocol_not_rejected"
],
"last_event_id_visible": false,
"protocol_header_present": false,
"requested_protocol_version": "2024-11-05",
"session_id_present": false,
"transport": "streamable-http"
},
"latency_ms": 26.37,
"status": "error"
},
"utility_coverage_probe": {
"details": {
"completions": {
"advertised": false,
"live_probe": "not_executed",
"sample_target": null
},
"initialize_capability_keys": [
"tools"
],
"pagination": {
"metadata_signal": false,
"next_cursor_methods": [],
"supported": false
},
"tasks": {
"advertised": false,
"http_status": 200,
"probe_status": "missing"
}
},
"latency_ms": 16.41,
"status": "missing"
}
},
"failures": {
"oauth_authorization_server": {
"reason": "no_authorization_server"
},
"oauth_protected_resource": {
"error": "Client error '405 Method Not Allowed' for url 'https://api.domainkits.com/.well-known/oauth-protected-resource'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/405",
"url": "https://api.domainkits.com/.well-known/oauth-protected-resource"
},
"openid_configuration": {
"reason": "no_authorization_server"
},
"probe_noise_resilience": {
"headers": {
"content-type": "application/json"
},
"http_status": 405,
"url": "https://api.domainkits.com/robots.txt"
},
"server_card": {
"error": "Client error '405 Method Not Allowed' for url 'https://api.domainkits.com/.well-known/mcp/server-card.json'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/405",
"url": "https://api.domainkits.com/.well-known/mcp/server-card.json"
},
"transport_compliance_probe": {
"bad_protocol_error": null,
"bad_protocol_headers": {
"content-type": "application/json"
},
"bad_protocol_payload": {
"id": 410,
"jsonrpc": "2.0",
"result": {
"tools": [
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Active Domain Search"
},
"description": "Search active gTLD domains from a database of ~240 million registered domains. This tool is primarily a market analysis instrument \u2014 use it to understand keyword distribution, saturation, and market dynamics through comparative queries.\n\nCore analysis dimensions (typically requiring multiple calls per keyword):\n- TLD distribution: Compare total_found with no tld filter vs tld=com vs tld=net vs others to calculate .com concentration and cross-TLD spread.\n- Position distribution: Compare position=start vs position=end to gauge market maturity. Start-heavy means the keyword is used as a category anchor (e.g., 'aiwriter.com'); end-heavy means it has become a standard descriptor (e.g., 'writerai.com').\n- For-sale ratio: Compare status=forsale total_found vs unfiltered total_found. High ratio (>30%) suggests speculator saturation; low ratio (<10%) suggests most holders are actively using their domains.\n- Quality distribution: Compare type=all_alpha total_found vs unfiltered total. If the majority of registrations contain hyphens or numbers, the keyword is dominated by low-quality or spam registrations \u2014 a negative signal.\n- Length distribution: Compare total_found across length filters (<5, 5-10, 11-15, >15) to assess how much premium short-name inventory exists vs long-tail.\n\nBest practices:\n- keyword defaults to 'contain' matching (substring). This is appropriate for statistical analysis but produces large result sets. Use position=start or position=end when analyzing directional distribution.\n- The total_found field across multiple filtered calls is the primary analytical output \u2014 the actual domain list is secondary.\n- sort=length_asc surfaces the shortest (most premium) names first when browsing results.\n- status=forsale filters to domains explicitly listed for sale \u2014 these are acquisition targets.\n- no_hyphen and no_number are independent boolean parameters, separate from the type filter.\n- Disclose affiliate links when presenting register_url to users.",
"inputSchema": {
"properties": {
"keyword": {
"description": "Brand or industry term (min 2 chars)",
"type": "string"
},
"length": {
"description": "Domain name length filter",
"enum": [
"<5",
"5-10",
"11-15",
">15"
],
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphenated domains (true/false)",
"type": "string"
},
"no_number": {
"description": "Exclude domains containing numbers (true/false)",
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"position": {
"description": "Keyword placement in domain name. Default is 'contain' (substring match).",
"enum": [
"start",
"end",
"middle",
"contain"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"length_asc",
"length_desc",
"alpha"
],
"type": "string"
},
"status": {
"description": "Filter by status \u2014 'forsale' for domains listed for sale",
"type": "string"
},
"tld": {
"description": "Filter by TLD (e.g., 'com', 'net', 'org', 'ai')",
"type": "string"
},
"type": {
"description": "Character set filter",
"enum": [
"all_alpha",
"all_number"
],
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "active",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"affiliate": {
"type": "boolean"
},
"domain": {
"type": "string"
},
"price": {
"description": "Listing price with currency, e.g. 1500 USD. Only present for Atom/Sedo listings",
"type": "string"
},
"register_url": {
"format": "uri",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
},
"total_found": {
"description": "Total matching results across all pages \u2014 primary metric for comparative analysis",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Active Domain Search"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Aged Domains Search"
},
"description": "Search currently registered domains with 5-20+ years of history. These are live domains owned by someone \u2014 not available for free registration. Use has_sale=true to filter to domains the owner has listed for sale, or use results as acquisition targets to approach owners directly.\n\nBest practices:\n- Always use no_hyphen=true and no_number=true unless the user specifically wants them.\n- keyword defaults to 'contain' matching, which searches all domains containing the keyword anywhere in the name. Use position=start, position=end, or position=middle to control where the keyword appears.\n- has_sale=true is the most actionable filter \u2014 these owners are actively seeking buyers.\n- Caution: Many aged domains are already in active use as established brands. Before recommending an aged domain to a user, consider whether it is likely an operating business \u2014 a 20-year-old short .com is almost certainly in use.\n- Short domains (<5 chars) with 20+ years of history are rare and typically high-value. Most 4-letter .coms were registered over 20 years ago.\n- For premium brand hunting: combine length=<5 or 5-10, type=all_alpha, no_hyphen=true, age_range=20+.\n- sort=age_desc surfaces the oldest domains first. sort=length_asc surfaces the shortest.\n- Disclose affiliate links when presenting register_url to users.",
"inputSchema": {
"properties": {
"age_range": {
"description": "Domain age filter in years",
"enum": [
"5-10",
"10-15",
"15-20",
"20+",
"5-10,10-15",
"10-15,15-20",
"15-20,20+"
],
"type": "string"
},
"exclude": {
"description": "Negative keywords to exclude",
"type": "string"
},
"has_sale": {
"description": "Filter to domains listed for sale by their owner",
"enum": [
"true",
"false"
],
"type": "string"
},
"keyword": {
"description": "Search term (min 2 chars)",
"type": "string"
},
"length": {
"description": "Domain name length filter",
"enum": [
"<5",
"5-10",
"10-15",
"15+"
],
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphenated domains",
"type": "string"
},
"no_number": {
"description": "Exclude domains containing numbers",
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"position": {
"description": "Keyword placement in domain name",
"enum": [
"start",
"end",
"middle",
"contain"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"age_desc",
"age_asc",
"length_asc",
"length_desc",
"reg_date_asc",
"reg_date_desc",
"alpha"
],
"type": "string"
},
"tld": {
"description": "Filter by TLD (e.g., 'com', 'net', 'org')",
"type": "string"
},
"type": {
"description": "Character set filter",
"enum": [
"all_alpha",
"all_number"
],
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "aged",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"affiliate": {
"type": "boolean"
},
"age_years": {
"description": "Domain age in years",
"type": "integer"
},
"domain": {
"type": "string"
},
"prefix_tld_count": {
"description": "Number of TLDs the same prefix is registered under",
"type": "integer"
},
"price": {
"description": "Listing price with currency, e.g. 1500 USD. Only present for Atom/Sedo listings",
"type": "string"
},
"register_url": {
"format": "uri",
"type": "string"
},
"registered_date": {
"description": "First registration year (YYYY)",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
},
"total_found": {
"description": "Total matching results across all pages",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Aged Domains Search"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true,
"readOnlyHint": true,
"title": "Domain analyze"
},
"description": "Comprehensive domain analyze workflow. Call when a user wants to understand a specific domain's full picture \u2014 registration status, safety, DNS configuration, cross-TLD distribution, and current website usage.\n\nWhen to use: user asks 'what can you tell me about example.com?', wants to evaluate a domain before purchasing, or needs a technical analyze. Do NOT use for domain name ideas (use name_advisor), availability checks (use available), or expired domain evaluation (use expired_analysis).\n\nWorkflow:\n1. Gather data using all four atomic tools in parallel:\n - whois for registration details, registrar signals, and expiry dates.\n - safety for Google Safe Browsing status.\n - dns for MX, A, and CNAME records \u2014 signals of active usage or abandonment.\n - tld_check to see how many TLDs share this prefix.\n2. If tld_check shows high registration count, investigate further:\n - whois the .com/.net/.org variants to check if the same registrar holds multiple TLDs (brand protection signal) or different registrars (popular keyword signal).\n - web_search the TLD variants to see if they resolve to the same site.\n3. Visit the domain via web_fetch or web_search to determine current usage: active business, parked page, for-sale landing, or no content.\n4. Use web_search to investigate the domain's market background: recent sale history (NameBio, Sedo, Afternic), related news or brand events, legal disputes (UDRP, trademark conflicts), and any notable context that affects valuation or risk. This step is critical \u2014 technical data alone is insufficient for a complete analyze.\n5. Synthesize all findings into a concise analyze report. Present facts with key signals clearly flagged. Do NOT make buy/don't-buy judgments \u2014 present evidence and let the user decide.\n6. After presenting the report, ask the user about their goals before suggesting next steps. Tailor follow-up based on their answer:\n - Wants to purchase \u2192 suggest valuation_cma for pricing, brand_match for trademark risk.\n - Domain is listed for sale \u2192 provide the sale link, suggest brand_match. Disclose affiliate links.\n - Wants alternatives \u2192 suggest plan_b.\n - Wants monitoring \u2192 suggest set_monitor.\n - Wants SEO analysis \u2192 suggest backlink_summary.\n\nKey principles: present facts, not recommendations. Flag signals clearly (e.g., enterprise registrar = corporate-held, MX present = active email, no A record = possibly abandoned). Every claim must come from tool data. Disclose affiliate links when presenting registration or sale URLs.",
"inputSchema": {
"properties": {
"domain": {
"description": "Domain to analyze (e.g., 'example.com')",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "analyze",
"title": "Domain Analyze"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Domain Availability Check"
},
"description": "Check domain availability with pricing. Final validation before registration.\n\nBest practices:\n- Input must be a fully qualified domain name including TLD (e.g., 'example.com', not just 'example').\n- If status='available': present reg_url and price clearly. If price is significantly higher than standard registration (~$10-15 for .com), flag it as a premium/reserved domain \u2014 the registry is charging a premium price.\n- If status='registered': state clearly the domain is taken. Do not automatically suggest alternatives \u2014 let the user decide if they want to explore other options.\n- If status='expiring': domain is in the expiration pipeline \u2014 can be backordered via reg_url, not directly registered.\n- If status='reserved': registry-reserved domain \u2014 not available for registration.\n- If status='unknown': check was inconclusive \u2014 do not assume available or unavailable.\n- For batch checking multiple domains, use bulk_available instead \u2014 it checks up to 10 at once.\n- This tool is the definitive availability check. Other tools (tld_check, deleted, expired) may show signals of availability, but only this tool or bulk_available confirms registrability and returns actual pricing.\n- Disclose affiliate links when aff=true.",
"inputSchema": {
"properties": {
"domain": {
"description": "Full domain with TLD (e.g., 'example.com')",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "available",
"outputSchema": {
"properties": {
"aff": {
"description": "Whether reg_url is an affiliate link. Disclose to users when true.",
"type": "boolean"
},
"domain": {
"type": "string"
},
"price": {
"description": "Registration price with currency (e.g., '9.99 USD'). Only present when status=available.",
"type": "string"
},
"reg_url": {
"description": "Registration or backorder link. Present when status=available or status=expiring.",
"format": "uri",
"type": "string"
},
"status": {
"description": "Domain status: available = registrable, registered = taken, expiring = in expiration pipeline (backorderable), reserved = registry-reserved, invalid = malformed input, unknown = inconclusive",
"enum": [
"available",
"registered",
"expiring",
"reserved",
"invalid",
"unknown"
],
"type": "string"
},
"success": {
"type": "boolean"
}
},
"required": [
"success",
"domain",
"status"
],
"type": "object"
},
"title": "Domain Availability Check"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "SEO Backlink Analysis"
},
"description": "SEO backlink analysis powered by DataForSEO. Use when: (1) user explicitly requests SEO analysis or domain valuation, (2) evaluating expiring/deleted domains before acquisition. Do NOT call for general browsing or availability checks.\n\nKey fields and interpretation:\n- rank: Domain authority on a 0-1000 logarithmic scale (based on PageRank). Each point higher is exponentially harder. Reference points: apple.com/iphone ~848, stackoverflow.com ~740, forbes.com ~650, ahrefs.com/blog ~395.\n- backlinks_spam_score: Spam score of all incoming backlinks (0-100). 0-30 low, 31-60 medium (warrants investigation), 61-100 high (significant risk).\n- target_spam_score: Spam score of the domain itself (0-100). Same thresholds.\n- Always calculate key ratios from the raw data: backlinks per referring domain (total_backlinks / referring_main_domains \u2014 high ratio like 500+ means a few domains contribute most links), referring IPs vs referring domains (low ratio suggests shared infrastructure, potential PBN signal), broken backlinks as percentage of total (high percentage means decaying link profile), follow vs nofollow distribution from referring_links_attributes (near 100% follow is unusual for a natural profile).\n- referring_links_platform_types: If message-boards or web2.0 platforms dominate, this can indicate low-quality link building.\n- referring_links_tld: Note presence or absence of .edu/.gov links.\n- new vs lost backlinks and referring domains indicate whether the profile is growing or shrinking.\n\nCaveat \u2014 passive referrals on aged domains: Some low-quality or scraper sites automatically link to old domains (abandoned blogrolls, scraped content, auto-generated pages). A small amount of this noise is normal for aged domains \u2014 Google's algorithms can identify and ignore these junk links, so a few low-quality referrals should not be treated as a risk signal. However, a large volume of junk referrals is a different story \u2014 it may indicate the domain was used for black-hat SEO, link schemes, or was targeted by malicious backlink attacks. As with everything, degree matters: a handful of scraper sites is background noise; thousands of them is a red flag.\n\nPresent facts and data. Do NOT make buy/don't-buy judgments \u2014 let the user interpret the signals.",
"inputSchema": {
"properties": {
"domain": {
"description": "Domain name (no protocol or path)",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "backlink_summary",
"outputSchema": {
"properties": {
"backlinks": {
"description": "Total number of backlinks",
"type": "integer"
},
"backlinks_spam_score": {
"description": "Spam score of incoming backlinks (0-100)",
"type": "integer"
},
"broken_backlinks": {
"type": "integer"
},
"broken_pages": {
"type": "integer"
},
"cached": {
"type": "boolean"
},
"cms": {
"type": "string"
},
"country": {
"type": "string"
},
"crawled_pages": {
"type": "integer"
},
"domain": {
"type": "string"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"external_links_count": {
"type": "integer"
},
"first_seen": {
"type": "string"
},
"internal_links_count": {
"type": "integer"
},
"ip_address": {
"type": "string"
},
"rank": {
"description": "Domain rank (0-1000 logarithmic scale)",
"type": "integer"
},
"referring_domains": {
"type": "integer"
},
"referring_ips": {
"type": "integer"
},
"referring_links_attributes": {
"description": "Backlink count by link attribute (nofollow, sponsored, ugc, etc.)",
"type": "object"
},
"referring_links_platform_types": {
"description": "Backlink count by platform type (blogs, news, ecommerce, etc.)",
"type": "object"
},
"referring_links_semantic_locations": {
"description": "Backlink count by semantic HTML location",
"type": "object"
},
"referring_links_tld": {
"description": "Backlink count by referring TLD",
"type": "object"
},
"referring_links_types": {
"description": "Backlink count by link type (anchor, image, redirect, etc.)",
"type": "object"
},
"referring_main_domains": {
"type": "integer"
},
"referring_main_domains_nofollow": {
"type": "integer"
},
"referring_pages": {
"type": "integer"
},
"referring_pages_nofollow": {
"type": "integer"
},
"referring_subnets": {
"type": "integer"
},
"server": {
"type": "string"
},
"success": {
"type": "boolean"
},
"target_spam_score": {
"description": "Spam score of domain itself (0-100)",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "SEO Backlink Analysis"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true,
"readOnlyHint": true,
"title": "Brand Conflict Detection"
},
"description": "Brand conflict and trademark risk detection workflow. Call when a user wants to check whether a domain name carries brand-related risks before registering or purchasing it.\n\nWhen to use: user asks 'is this domain safe to register?', wants to assess UDRP risk before purchase, or needs trademark conflict checking as a follow-up from name_advisor or analyze. Do NOT use for general technical analysis (use analyze), domain name brainstorming (use name_advisor), or DNS/registration checks only (use dns, whois).\n\nWorkflow:\n1. Extract the prefix from the domain (e.g., nicefloor.com \u2192 nicefloor). If the prefix contains a well-known brand name (google, apple, amazon, microsoft, etc.), immediately warn the user about high UDRP risk before proceeding. Ask the user about their intent: are they assessing risk before registration, or holding the domain and looking for potential buyers? This determines the framing of the analysis. Do NOT call any tools before the user responds.\n\n2. After the user responds, gather data in parallel:\n - web_search '[prefix] company' to discover existing commercial use \u2014 note founding year, business scale, industry, and whether the company actively uses this keyword as a brand.\n - tld_check to see how many TLDs have this prefix registered.\n - If tld_check shows high registration, whois the .com/.net/.org variants to check if the same registrar holds multiple TLDs (brand protection signal) or different registrars (popular keyword signal). Use web_search to verify if they resolve to the same website.\n\n3. Run trademark database checks across all four major databases. Primary method is Claude for Chrome \u2014 open each database, search for [prefix], and read results directly. If Claude for Chrome is not available, fall back to providing pre-filled links as described below. Present findings from each database inline as they come in \u2014 do not wait for all four before reporting.\n\n USPTO:\n - Chrome: navigate to https://search.uspto.gov/search?query=[prefix]&affiliate=web-sdmg-uspto.gov and read results directly.\n - Fallback (no Chrome): USPTO supports URL query parameters \u2014 provide this pre-filled link for the user to open: https://search.uspto.gov/search?query=[prefix]&affiliate=web-sdmg-uspto.gov\n - Extract: number of trademark hits, registrant names, goods/services classes, live vs dead status.\n\n EUIPO:\n - Chrome: navigate to https://euipo.europa.eu/eSearch/, locate the search input, type [prefix], submit, read results.\n - Fallback (no Chrome): EUIPO uses a JavaScript interface \u2014 URL parameters cannot pre-fill search. Provide the entry link and instruct the user: 'Please open https://euipo.europa.eu/eSearch/ and search for [prefix].'\n - Extract: EU trademark hits, registrant names, classes, status.\n\n WIPO:\n - Chrome: navigate to https://branddb.wipo.int/en/quicksearch, locate the search input, type [prefix], submit, read results.\n - Fallback (no Chrome): provide entry link and instruct: 'Please open https://branddb.wipo.int/en/quicksearch and search for [prefix].'\n - Extract: international trademark hits, registrant names, designating countries, status.\n\n TMview:\n - Chrome: navigate to https://www.tmdn.org/tmview/#/quicksearch, locate the search input, type [prefix], submit, read results.\n - Fallback (no Chrome): provide entry link and instruct: 'Please open https://www.tmdn.org/tmview/#/quicksearch and search for [prefix].'\n - Extract: aggregate hits across all participating offices, notable registrants.\n\n If a database is unreachable or returns an error, note it in the report and continue \u2014 do not halt the workflow.\n\n4. Synthesize all findings into a report, framed according to the user's stated intent (risk-focused or opportunity-focused). The report must include:\n - Discovered entities: websites/companies using this keyword, their business, scale, founding year.\n - TLD distribution: cross-TLD registration pattern and registrar correlation.\n - Trademark database summary: hits per database, live marks found, relevant classes. If no hits found in a database, state that clearly \u2014 absence of results does not guarantee the mark is clear.\n - Risk assessment based on the three UDRP principles (confusing similarity, rights or legitimate interests, bad faith). For generic word combinations, note that risk is typically lower. Factor in registration age. Do NOT make legal conclusions.\n - Disclaimer: 'For reference only, does not constitute legal advice. Trademark searches are not exhaustive \u2014 consult a qualified IP attorney before making registration or investment decisions.'\n\n5. After presenting the report, ask the user what they want to do next. Tailor follow-up based on their response:\n - Wants to proceed with registration \u2192 suggest available or bulk_available.\n - Wants deeper analysis \u2192 suggest analyze.\n - Wants alternatives \u2192 suggest plan_b or name_advisor.\n - Wants to find buyers \u2192 use web_search findings to identify potential buyers, suggest valuation_cma.\n - Wants monitoring \u2192 suggest set_monitor.\n\nKey principles: present facts, not legal judgments. Do NOT claim a trademark exists or does not exist based on partial results. Claude for Chrome reads all four databases directly \u2014 the user should never need to search manually when Chrome is available. When Chrome is unavailable, always provide actionable fallback links with clear search instructions. Always end with the legal disclaimer. Disclose affiliate links.",
"inputSchema": {
"properties": {
"domain": {
"description": "Domain to check for brand conflict risk (e.g., 'nicefloor.com')",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "brand_match",
"title": "Brand Conflict Detection"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Batch Domain Availability Check"
},
"description": "Batch check domain availability with pricing. Check up to 10 domains per call.\n\nThis is the verification gate \u2014 any domain recommended to a user must pass through this tool first. Do not present domains as available based on other tools' signals (e.g., tld_check showing 'might_available', or domains found in deleted/expired feeds) without confirming here.\n\nInput format: comma-separated full domain names including TLD (e.g., 'aitools.com,getai.io,smartai.app'). Maximum 10 per call \u2014 for larger batches, make multiple calls.\n\nInterpreting results:\n- status 'available': Confirmed registrable. price and reg_url will be present.\n- status 'registered': Currently owned \u2014 not available for standard registration.\n- status 'expiring': In the expiration pipeline \u2014 can be backordered, not directly registered. reg_url will point to a backorder service.\n- status 'reserved': Registry-reserved domain \u2014 not available for registration.\n- status 'unknown': Check was inconclusive \u2014 do not assume available or unavailable.\n\nBest practices:\n- Always disclose affiliate links when aff=true.\n- When multiple domains return available, prioritize shorter names and .com over alternatives when presenting results.\n- If all checked domains come back registered, this is useful signal in itself \u2014 the namespace is saturated for that keyword pattern.",
"inputSchema": {
"properties": {
"domains": {
"description": "Comma-separated full domain names including TLD (max 10)",
"type": "string"
}
},
"required": [
"domains"
],
"type": "object"
},
"name": "bulk_available",
"title": "Batch Domain Availability Check"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Keyword TLD Popularity Check"
},
"description": "Check how many TLDs have specific keywords registered. Batch-compare keyword popularity by cross-TLD registration distribution.\n\nBest practices:\n- Use comma-separated keywords for side-by-side comparison (max 10): keywords='ai,tech,cloud,smart'. This is the tool's core strength \u2014 comparing relative popularity across multiple keywords in one call.\n- Interpreting total count: 100+ TLDs registered = highly competitive, well-known keyword. 50-100 = moderate popularity. 20-50 = niche but recognized. <20 = low market interest or very new concept.\n- The popular vs cctld vs other breakdown reveals the keyword's reach: high popular count (com/net/org/io/ai) = commercially validated. High cctld count = global brand interest or defensive registration. High other count = speculative gTLD registrations.\n- Use this to compare synonyms or variations before deciding which keyword to invest in \u2014 e.g., compare 'automate' vs 'automation' vs 'autoflow' to see which has stronger market validation.\n- Pairs well with tld_check for drilling into a single keyword's full TLD-by-TLD breakdown after identifying winners here.",
"inputSchema": {
"properties": {
"keywords": {
"description": "Comma-separated keywords to check (max 10)",
"type": "string"
}
},
"required": [
"keywords"
],
"type": "object"
},
"name": "bulk_tld",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"cctld": {
"description": "Count in country-code TLDs",
"type": "integer"
},
"keyword": {
"type": "string"
},
"other": {
"description": "Count in other gTLDs",
"type": "integer"
},
"popular": {
"description": "Count in popular TLDs (com, net, org, io, ai, app, etc.)",
"type": "integer"
},
"total": {
"description": "Total TLDs with this keyword registered",
"type": "integer"
}
},
"required": [
"keyword"
],
"type": "object"
},
"type": "array"
},
"error": {
"type": "string"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of keywords checked",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Keyword TLD Popularity Check"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Deleted Domains Search"
},
"description": "Search domains that have completed the deletion cycle and are open for immediate registration at standard cost \u2014 no auction or backorder needed. These are the highest-value finds: domains with history available at regular price.\n\nBest practices:\n- Always use no_hyphen=true and no_number=true unless the user specifically wants them \u2014 the vast majority of hyphenated and numeric deleted domains are low-quality.\n- keyword defaults to 'contain' matching (substring), producing false positives (e.g., 'agent' matches 'magenta'). Use position=start or position=end for precise results.\n- sort=age_desc surfaces domains with the longest history first \u2014 a 20+ year old deleted .com at standard registration cost is a rare find worth highlighting.\n- sort=tld_counter_desc finds keywords popular across TLDs \u2014 if prefix_tld_count is high (20+) and the .com just dropped, that is notable.\n- For brandable names: combine length=5-10, type=all_alpha, no_hyphen=true, no_number=true.\n- hold=no_hold filters out domains still under registry hold that cannot yet be registered.\n- register_url links to Dynadot (affiliate). Disclose when presenting to users.",
"inputSchema": {
"properties": {
"age_range": {
"description": "Historical age before deletion",
"enum": [
"0-5",
"5-10",
"10-20",
"20+",
"10-20,20+"
],
"type": "string"
},
"exclude": {
"description": "Negative keywords to exclude",
"type": "string"
},
"hold": {
"description": "Registry hold status \u2014 no_hold = immediately registrable",
"enum": [
"no_hold",
"has_hold"
],
"type": "string"
},
"keyword": {
"description": "Search term (min 2 chars)",
"type": "string"
},
"length": {
"description": "Domain name length filter",
"enum": [
"<5",
"5-10",
"10-15",
"15+"
],
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphenated domains",
"type": "string"
},
"no_number": {
"description": "Exclude domains containing numbers",
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"position": {
"description": "Keyword placement in domain name",
"enum": [
"start",
"end",
"middle",
"contain"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"age_desc",
"age_asc",
"length_asc",
"length_desc",
"tld_counter_asc",
"tld_counter_desc"
],
"type": "string"
},
"tld": {
"description": "Filter by TLD (e.g., 'com', 'net', 'org')",
"type": "string"
},
"type": {
"description": "Character set filter",
"enum": [
"all_alpha",
"all_number"
],
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "deleted",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"affiliate": {
"type": "boolean"
},
"age_years": {
"description": "Historical age in years before deletion",
"type": "integer"
},
"domain": {
"type": "string"
},
"prefix_tld_count": {
"description": "Number of TLDs the same prefix is registered under",
"type": "integer"
},
"register_url": {
"format": "uri",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
},
"total_found": {
"description": "Total matching results across all pages",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Deleted Domains Search"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "DNS Record Lookup"
},
"description": "Query DNS records for a domain. Returns A, AAAA, MX, NS, TXT, CNAME, SOA. Key signals: MX present = active email. NS pointing to marketplace (Sedo, Afternic) = parked/for-sale. TXT with SPF/DKIM = active operations. No records at all = unconfigured/abandoned.",
"inputSchema": {
"properties": {
"domain": {
"description": "Domain name",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "dns",
"outputSchema": {
"properties": {
"domain": {
"type": "string"
},
"error": {
"type": "string"
},
"records": {
"description": "DNS records grouped by type",
"properties": {
"A": {
"description": "IPv4 address records",
"items": {
"properties": {
"host": {
"type": "string"
},
"ip": {
"type": "string"
},
"ttl": {
"type": "integer"
}
},
"type": "object"
},
"type": "array"
},
"AAAA": {
"description": "IPv6 address records",
"items": {
"properties": {
"host": {
"type": "string"
},
"ipv6": {
"type": "string"
},
"ttl": {
"type": "integer"
}
},
"type": "object"
},
"type": "array"
},
"CNAME": {
"description": "Canonical name records",
"items": {
"properties": {
"host": {
"type": "string"
},
"target": {
"type": "string"
},
"ttl": {
"type": "integer"
}
},
"type": "object"
},
"type": "array"
},
"MX": {
"description": "Mail exchange records",
"items": {
"properties": {
"host": {
"type": "string"
},
"pri": {
"description": "Priority",
"type": "integer"
},
"target": {
"description": "Mail server hostname",
"type": "string"
},
"ttl": {
"type": "integer"
}
},
"type": "object"
},
"type": "array"
},
"NS": {
"description": "Nameserver records",
"items": {
"properties": {
"host": {
"type": "string"
},
"target": {
"type": "string"
},
"ttl": {
"type": "integer"
}
},
"type": "object"
},
"type": "array"
},
"SOA": {
"description": "Start of authority records",
"items": {
"properties": {
"expire": {
"type": "integer"
},
"host": {
"type": "string"
},
"minimum_ttl": {
"type": "integer"
},
"mname": {
"description": "Primary nameserver",
"type": "string"
},
"refresh": {
"type": "integer"
},
"retry": {
"type": "integer"
},
"rname": {
"description": "Admin email",
"type": "string"
},
"serial": {
"type": "integer"
}
},
"type": "object"
},
"type": "array"
},
"TXT": {
"description": "Text records (SPF, DKIM, verification tokens)",
"items": {
"properties": {
"host": {
"type": "string"
},
"ttl": {
"type": "integer"
},
"txt": {
"type": "string"
}
},
"type": "object"
},
"type": "array"
}
},
"type": "object"
},
"success": {
"type": "boolean"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "DNS Record Lookup"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Premium Domain Changes Monitor (7-day)"
},
"description": "Monitor changes to premium .com domains in the past 7 days. The monitored pool consists of short-character .com domains (typically 1-4 letters) and high-value English single-word and two-word .com domains. This is not a general domain monitor \u2014 it specifically tracks the most valuable segment of the .com namespace.\n\nChange types:\n- Domain Transfer: Registrar changed \u2014 indicates ownership or management change. Report the old and new registrar as facts. Do not assume the reason (could be a sale, corporate restructuring, registrar migration, or portfolio consolidation).\n- Domain Expired: Domain entered expiration cycle. Report the fact. Do not characterize rarity or value unless verified with additional data.\n- New Registration: A previously unregistered premium name was registered.\n- Nameserver Change: NS records updated. An NS change to a domain marketplace (e.g., sedo.com, afternic.com, thisdomain.forsale) is a possible sale signal but not a certainty \u2014 report the old and new NS as facts.\n\nBest practices:\n- date_range=1d for last 24 hours, 3d for last 72 hours, all for full 7-day window (default).\n- length=1-3 or length=4 focuses on the shortest, most premium domains.\n- reason filters to a specific change type \u2014 use 'Domain Transfer' or 'Domain Expired' for the most newsworthy events.\n- sort=length_asc surfaces the shortest (most valuable) domains first.\n- has_digit=false filters to letter-only domains for higher quality results.\n- All interpretations must be evidence-based. Report what changed, not why. If the user wants to understand the reason behind a change, suggest whois or web_search to investigate further.",
"inputSchema": {
"properties": {
"date_range": {
"description": "Time range filter: 1d = last 24 hours, 3d = last 72 hours, all = full 7-day window (default)",
"enum": [
"1d",
"3d",
"all"
],
"type": "string"
},
"has_digit": {
"description": "false = letters only, true = contains digits, all = no filter",
"enum": [
"false",
"true",
"all"
],
"type": "string"
},
"keyword": {
"description": "Search by domain or keyword within the monitored pool",
"type": "string"
},
"length": {
"description": "Prefix length filter (characters before TLD)",
"enum": [
"all",
"1-3",
"4",
"5-8",
"9+"
],
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"reason": {
"description": "Filter by change type",
"enum": [
"all",
"Domain Transfer",
"Domain Expired",
"New Registration",
"Nameserver Change"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"length_asc",
"length_desc",
"tld_count_desc",
"tld_count_asc",
"prefix_asc",
"prefix_desc"
],
"type": "string"
},
"tld": {
"description": "TLD filter (e.g., 'com')",
"type": "string"
}
},
"type": "object"
},
"name": "domain_changes",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"change_date": {
"description": "Date the change was detected (YYYY-MM-DD format)",
"type": "string"
},
"combination": {
"description": "Word segmentation of the prefix",
"type": "string"
},
"details_new": {
"description": "New state (registrar for Transfer, expiration date for Expired, nameservers for NS Change)",
"type": "string"
},
"details_old": {
"description": "Previous state (registrar for Transfer/Expired, nameservers for NS Change)",
"type": "string"
},
"domain": {
"type": "string"
},
"length": {
"description": "Prefix character length",
"type": "integer"
},
"prefix": {
"description": "Domain prefix without TLD",
"type": "string"
},
"reason": {
"description": "Change type: Domain Transfer, Domain Expired, New Registration, or Nameserver Change",
"type": "string"
},
"tld": {
"type": "string"
},
"tld_count": {
"description": "Number of TLDs the same prefix is registered under",
"type": "integer"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Premium Domain Changes Monitor (7-day)"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Creative Domain Generator"
},
"description": "Creative domain name generation workflow. Call when a user already knows their target keyword or has a specific taken domain and wants registrable creative variations (e.g., 'I want a domain with the word flow', 'getflow.com is taken, give me variations'). Do NOT call when the user's requirements are vague or they don't have a keyword yet (use name_advisor), when they want alternatives across lifecycle stages like expired/deleted (use plan_b), or when they want trend-based ideas (use trend_hunter).\n\nKey difference from name_advisor: this tool assumes the user already knows what keyword they want. If the user is unsure or exploring, use name_advisor instead.\n\nThis is a multi-turn workflow. Stop and wait for user input at every checkpoint.\n\nWorkflow:\n1. Keyword Analysis & Confirmation \u2014 extract the core keyword from user input (e.g., getflow.com \u2192 flow). Briefly state your understanding of the keyword and industry context, then confirm with the user: is the keyword correct? TLD preference (.com only or open to others)? Style preference (short and punchy vs descriptive)? Do NOT generate any domain names or call any tools until the user confirms. If the user seems unsure about their keyword, suggest switching to name_advisor.\n2. Generate & Verify \u2014 generate 20-30 creative variants based on confirmed preferences. Strategies include: TLD swaps for short keywords (.io, .ai, .app, .co), industry-relevant prefixes/suffixes (get-, -ly, -hub, -lab), coined words and portmanteaus, word + modifier combinations. Before finalizing, scan every candidate for unintended sensitive words, medical terms, or offensive abbreviations created by concatenation. Verify all candidates with bulk_available \u2014 every domain presented to the user must be confirmed available, no exceptions. Present only verified domains grouped by strategy, each with register_url.\n3. Iterate or Finalize \u2014 based on user feedback: generate more variations in a preferred direction, suggest brand_match for a finalist, adjust strategy if needed, or suggest plan_b if the user wants expired/aged alternatives.\n\nKey principles:\n- Every domain presented must be verified available via bulk_available. No exceptions.\n- Available domains include register_url (Dynadot affiliate).\n- Disclose affiliate links.",
"inputSchema": {
"properties": {
"domain": {
"description": "Keyword or taken domain",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "domain_generator",
"outputSchema": {
"properties": {
"available_domains": {
"description": "Verified available domains grouped by strategy",
"items": {
"properties": {
"affiliate": {
"type": "boolean"
},
"domain": {
"type": "string"
},
"price": {
"type": "string"
},
"register_url": {
"format": "uri",
"type": "string"
},
"strategy": {
"description": "Generation strategy (tld_swap, prefix, coined_word, modifier, etc.)",
"type": "string"
}
},
"required": [
"domain",
"strategy"
],
"type": "object"
},
"type": "array"
},
"keyword": {
"description": "Extracted core keyword",
"type": "string"
},
"phase": {
"description": "Current workflow phase",
"enum": [
"keyword_confirmation",
"generate_verify",
"iterate"
],
"type": "string"
},
"questions": {
"description": "Confirmation questions for the user",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"phase"
],
"type": "object"
},
"title": "Creative Domain Generator"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Expiring Domains Search"
},
"description": "Search domains entering the deletion cycle \u2014 expired, in redemption, or pending delete. Unlike 'deleted' domains (which are free to register), these require backorder or have time-sensitive acquisition windows.\n\nLifecycle stages:\n- expired: Domain has lapsed but has not entered redemption. Typically enters expired auction at the registrar \u2014 acquisition requires bidding, not standard registration.\n- redemption: Owner can still reclaim by paying a redemption fee (~$80+). For premium names in this stage, consider using set_monitor to track status changes, or whois to find the registrar and suggest the user contact the owner directly with an offer.\n- pending_delete: Final stage, drops in 1-5 days. Highest urgency. Good names at this stage rarely survive manual registration \u2014 backorder via the register_url (Gname) is recommended.\n\nBest practices:\n- Always use no_hyphen=true and no_number=true unless the user specifically wants them.\n- keyword defaults to 'contain' matching, which searches all domains containing the keyword anywhere in the name. Use position=start, position=end, or position=middle to control where the keyword appears.\n- sort=age_desc prioritizes domains with the longest history, but age alone does not guarantee value \u2014 a domain with long history could have been used for spam. For high-value candidates, verify clean history with backlink_summary and safety checks.\n- status=pending_delete is the most actionable filter \u2014 these domains drop soonest.\n- auction_date='today' or 'tomorrow' narrows to imminent drops.\n- register_url links to Gname (affiliate). Disclose when presenting to users.",
"inputSchema": {
"properties": {
"age_range": {
"description": "Historical age of the domain",
"enum": [
"0-5",
"5-10",
"10-20",
"20+",
"5-10,10-15",
"10-20,20+"
],
"type": "string"
},
"auction_date": {
"description": "Filter by drop date: 'today', 'tomorrow', or 'YYYY-MM-DD'",
"type": "string"
},
"exclude": {
"description": "Negative keywords to exclude",
"type": "string"
},
"hold": {
"description": "Registry hold status",
"enum": [
"no_hold",
"has_hold"
],
"type": "string"
},
"keyword": {
"description": "Search term (min 2 chars)",
"type": "string"
},
"length": {
"description": "Domain name length filter",
"enum": [
"<5",
"5-10",
"10-15",
"15+"
],
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphenated domains",
"type": "string"
},
"no_number": {
"description": "Exclude domains containing numbers",
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"position": {
"description": "Keyword placement in domain name",
"enum": [
"start",
"end",
"middle",
"contain"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"age_desc",
"age_asc",
"length_asc",
"length_desc"
],
"type": "string"
},
"status": {
"description": "expired = in registrar auction, redemption = owner can reclaim, pending_delete = drops in 1-5 days",
"enum": [
"pending_delete",
"redemption",
"expired"
],
"type": "string"
},
"tld": {
"description": "Filter by TLD (e.g., 'com', 'net', 'org')",
"type": "string"
},
"type": {
"description": "Character set filter",
"enum": [
"all_alpha",
"all_number"
],
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "expired",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"affiliate": {
"type": "boolean"
},
"age_years": {
"description": "Domain age in years",
"type": "integer"
},
"domain": {
"type": "string"
},
"prefix_tld_count": {
"description": "Number of TLDs the same prefix is registered under",
"type": "integer"
},
"register_url": {
"format": "uri",
"type": "string"
},
"registered_date": {
"format": "date",
"type": "string"
},
"status": {
"description": "Lifecycle stage: 1=expired, 2=redemption, 3=pending_delete",
"type": "integer"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
},
"total_found": {
"description": "Total matching results across all pages",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Expiring Domains Search"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Expired Domain Due Diligence"
},
"description": "Deep due diligence workflow for expired or expiring domains. Call when a user wants to evaluate an expired domain's history, SEO value, safety, and commercial potential before backordering or acquiring it \u2014 including as a follow-up when browsing results from expired or deleted tools. Do NOT call if the domain is not in any expired status (use analyze instead), if the user wants domain name ideas (use name_advisor), or if the user wants to check availability of a new domain (use available).\n\nThis is a multi-turn workflow. Stop and wait for user input at every checkpoint.\n\nWorkflow:\n1. Status Verification \u2014 run whois first. Confirm the domain is actually in an expired status (expired, redemption, pending-delete). If it is NOT expired, stop immediately, inform the user, and hand off to the analyze workflow. This gate check is mandatory.\n2. Data Collection \u2014 gather all available data in parallel: safety (Google Safe Browsing \u2014 critical risk signal for expired domains), dns (residual records indicate previous usage), backlink_summary (strong backlinks = SEO value; spammy backlinks = risk), keyword_data (search volume and CPC for commercial value), tld_check (cross-TLD registration count as popularity signal), web_fetch the Wayback Machine timeline (https://web.archive.org/web/*/{domain}) for historical usage, and web_search site:{domain} to check residual Google indexing.\n3. Due Diligence Report \u2014 synthesize all findings into a structured report covering: domain status and key dates, safety warnings, SEO value (backlink quality + keyword commercial value), historical usage from Wayback, Google index status, cross-TLD distribution, and consolidated risk/opportunity signals. Then ask the user about their goal (SEO recovery, brand building, or investment/resale) and whether they want to explore specific aspects further. Let the user choose the direction \u2014 do not decide for them.\n4. Tailored Follow-up \u2014 based on user's stated goals, guide them to the appropriate next step: backorder process and timeline, set_monitor for status tracking, deeper SEO analysis, plan_b for alternatives, valuation_cma for market context, or brand_match before committing.\n\nKey principles:\n- Present facts and acquisition opportunities. Do NOT make buy/don't-buy judgments.\n- Objectively flag ALL risk signals \u2014 do not downplay or hide them.\n- Backorderable domains must include backorder_url (Gname affiliate).\n- Always include Wayback link: https://web.archive.org/web/*/{domain}\n- Always include deep analysis link: https://dataforseo.com/?aff=199596\n- Disclose affiliate links.",
"inputSchema": {
"properties": {
"domain": {
"description": "Expired domain to analyze",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "expired_analysis",
"title": "Expired Domain Due Diligence"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Keyword Search Volume & CPC"
},
"description": "Google Ads keyword data: search volume, competition, and CPC. Use when evaluating a keyword's commercial search demand \u2014 one call per keyword is sufficient.\n\nInterpreting results:\n- search_volume: Average monthly Google searches. >10k with CPC >$2 indicates strong commercial intent. 1k-10k with CPC $0.5-$2 is niche but viable. <1k with CPC <$0.5 suggests limited commercial demand.\n- competition: 0 to 1 score representing advertiser density. Higher means more advertisers bidding on this keyword.\n- competition_level: LOW, MEDIUM, or HIGH. Low competition + decent volume = underserved opportunity.\n- low_cpc / high_cpc: Cost-per-click range in USD. Reflects what advertisers are willing to pay. Higher CPC generally correlates with higher commercial value for domains matching this keyword.\n\nIn domain investment context, the combination of search_volume and CPC is the primary value signal \u2014 volume alone without advertiser spend may indicate informational intent rather than commercial intent.",
"inputSchema": {
"properties": {
"country": {
"description": "Market. Default: US-EN",
"enum": [
"US-EN",
"DE-DE",
"CA-FR",
"IT-IT"
],
"type": "string"
},
"keyword": {
"description": "Keyword to research",
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "keyword_data",
"outputSchema": {
"properties": {
"competition": {
"description": "Competition index (0 to 1)",
"type": "number"
},
"competition_level": {
"description": "LOW, MEDIUM, or HIGH",
"type": "string"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"high_cpc": {
"description": "High range cost-per-click in USD",
"type": "number"
},
"keyword": {
"type": "string"
},
"low_cpc": {
"description": "Low range cost-per-click in USD",
"type": "number"
},
"search_volume": {
"description": "Average monthly search volume on Google",
"type": "integer"
},
"success": {
"type": "boolean"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Keyword Search Volume & CPC"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true,
"readOnlyHint": true,
"title": "Keyword Deep Intelligence"
},
"description": "Deep keyword intelligence for domain investment. Call when a user wants to understand the full picture of a specific keyword in the domain market \u2014 demand, supply, competition, and opportunities. This is a data-intensive workflow: every claim must be backed by tool output.\n\nWhen to use: User asks about a keyword's investment potential, market landscape, or opportunity analysis. Not for analyzing a specific domain (use analyze), browsing trends (use trend_hunter), or market overviews (use market_beat).\n\nMethodology \u2014 three phases, each building on the previous:\n\n1. Demand: Establish how much the market wants this keyword.\n - keyword_data for commercial search value (volume, CPC, competition).\n - keywords_trends (both hot and emerging) for registration momentum.\n - web_search is MANDATORY \u2014 do NOT substitute with your own knowledge. Execute at least two searches: '{keyword} news 2026' for industry context, and '{keyword} domain sold price' for transaction history. Only include claims that come from search results. If search returns nothing relevant, state 'no recent news or transactions found' \u2014 do not fill the gap with training data. Do NOT attribute keyword popularity to a specific event or project unless keywords_trends data shows a clear spike AND web_search confirms the connection. Common English words have natural baseline demand \u2014 not every trend needs a catalyst explanation.\n\n2. Supply: Map the current domain inventory, focused on .com as the primary lens unless the user requests otherwise.\n - tld_check for cross-TLD saturation.\n - active for total .com inventory and for-sale ratio (forsale count / total count). Also compare keyword-as-prefix vs keyword-as-suffix to gauge market maturity.\n - deleted for domains available at standard registration cost.\n - expired for domains in the expiration pipeline that can be backordered.\n - aged with has_sale=true for secondary market listings.\n\n3. Competition: Assess whether the window is opening or closing.\n - nrds comparing recent .com registration velocity across time periods (0-10 days vs 10-20 days). Accelerating velocity means act fast; decelerating means the peak may have passed.\n - From the same nrds results, assess registration quality \u2014 high ratios of hyphens, numbers, or excessive length indicate a junk/speculative market rather than serious investment.\n - Analyze the naming patterns in recent registrations to identify what is driving demand. For example, if most new domains combine the keyword with 'ai', 'cloud', 'tech', that points to a tech trend; if they combine with 'game', 'machine', 'play', that points to entertainment. If patterns are diverse with no clear theme, the keyword likely has natural baseline demand across multiple sectors. This pattern analysis is based on the nrds results already retrieved \u2014 no additional tool calls needed.\n\nSynthesize into an intelligence report: keyword verdict (invest / watch / avoid) with confidence level, demand profile, supply profile, competition profile, and recommended next steps tailored to the verdict. Let the data tell the story \u2014 if data is contradictory, present both sides.\n\nAfter the report, offer relevant next steps: deep analysis on a specific domain, brand conflict check, monitoring setup, strategy tracking, or analyzing a different keyword.",
"inputSchema": {
"properties": {
"keyword": {
"description": "The keyword to analyze",
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "keyword_intel",
"title": "Keyword Deep Intelligence"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Keyword Registration Trends"
},
"description": "Get trending keywords in domain registrations. Mainly used for investors to find new opportunities, but also useful for brand protection. Three modes:\n- hot: High-volume keywords (e.g., 'app', 'shop', 'group'). Established terms with high volume and high competition. Results include weekly breakdown (w1-w4) to spot momentum shifts. Quality metrics use 28-day data.\n- emerging: Keywords with sudden registration spikes in the last 7-14 days, often driven by technology news, product launches, or viral projects. Compare w4 (current week) vs w3 to assess momentum. Quality metrics use W4-only data to reflect the spike period accurately.\n- prefix: Popular naming patterns (e.g., 'get...', 'my...', 'the...'). Results include tld_count \u2014 if a prefix has high tld_count but .com is still available, that is actionable. Use bulk_tld to check which specific TLDs are taken vs available.\n\nQuality metrics (hot and emerging only, fields vary by user tier):\n- com_ratio: .com registrations as a proportion of total. .com is the most expensive and most liquid TLD \u2014 this ratio reflects participants' willingness to invest real money.\n- most_tld: The dominant TLD for this keyword. Shows where registration activity is concentrated.\n- pos_start_ratio / pos_end_ratio: Where the keyword appears in domain names. High start ratio (e.g., 'aitools.com') suggests the keyword drives the domain concept. High end ratio (e.g., 'myai.com') suggests it is used as a modifier.\n- forsale_pct: Percentage of domains with NS pointing to sale platforms (Sedo, Afternic, Atom). Reflects investor participation \u2014 cross-reference with com_ratio and top_registrar to assess multi-party market participation.\n- top_ns + top_ns_ratio: The most common nameserver and its share. High concentration on a single NS indicates concentrated activity. Cross-reference with NS identity to understand what participants are doing with their domains.\n- top_registrar: The registrar with the highest volume. Registrars are channels, not identity labels \u2014 high concentration reduces confidence that many independent parties are involved, but does not by itself prove single-operator activity. Must be cross-referenced with other dimensions.\n- peak_day: The single day with highest registrations. If peak_day accounts for a large share of total, the trend may be event-driven or a single bulk registration event rather than sustained interest.\n- might_use_count: Domains with NS pointing to infrastructure providers (Cloudflare, AWS, Vercel, Netlify). Does NOT reliably indicate active sites \u2014 especially Cloudflare and AWS are widely used for DNS hosting, CDN, or parking. Must cross-reference with registrar diversity \u2014 high might_use_count with diverse registrars suggests organic adoption; high might_use_count with one dominant registrar suggests a single operator.\n\nData methodology: Registration counts are based on semantic keyword extraction using DomainKits' proprietary word segmentation engine (https://github.com/ABTdomain/dksplit), not simple substring matching. Bulk registration noise is automatically filtered from emerging results. WHOIS data is sourced from daily RDAP snapshots. Brand protection registrars (CSC, MarkMonitor, etc.) are excluded.",
"inputSchema": {
"properties": {
"type": {
"description": "hot = high-volume keywords, emerging = recent spikes, prefix = naming patterns",
"enum": [
"hot",
"emerging",
"prefix"
],
"type": "string"
}
},
"type": "object"
},
"name": "keywords_trends",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"com_ratio": {
"description": ".com share. below 0.05 = bulk speculation",
"type": "number"
},
"count_28d": {
"description": "Total registrations in past 28 days (hot and emerging)",
"type": "integer"
},
"count_30d": {
"description": "Registrations past 30 days (prefix only)",
"type": "integer"
},
"count_48h": {
"description": "Registrations past 48 hours (prefix only)",
"type": "integer"
},
"count_7d": {
"description": "Registrations past 7 days (prefix only)",
"type": "integer"
},
"forsale_pct": {
"description": "% with NS pointing to sale platforms. higher means more investor interest, smarter investor might find some chances in this trends",
"type": "number"
},
"might_use_count": {
"description": "Domains with NS pointing to Cloudflare/AWS/Vercel/Netlify (does not reliably indicate active sites)",
"type": "integer"
},
"most_tld": {
"description": "Dominant TLD for this keyword",
"type": "string"
},
"peak_day": {
"description": "Date with highest registrations (YYYY-MM-DD)",
"type": "string"
},
"pos_end_ratio": {
"description": "Keyword at end of domain (e.g., 'myai.com'), higher ratio suggests market would use it at the end of domains, which is more valuable than if it is commonly used as a modifier at the start of domains (e.g., 'aitools.com')",
"type": "number"
},
"pos_start_ratio": {
"description": "Keyword at start of domain (e.g., 'aitools.com'), higher ratio suggests market would use it at the start of domains, which is more valuable than if it is commonly used as a modifier at the end of domains (e.g., 'myai.com')",
"type": "number"
},
"prefix": {
"description": "Domain prefix (prefix only)",
"type": "string"
},
"rank": {
"type": "integer"
},
"tld_count": {
"description": "TLDs this prefix is registered under (prefix only)",
"type": "integer"
},
"top_ns": {
"description": "Most common nameserver for this keyword",
"type": "string"
},
"top_ns_ratio": {
"description": "Share of top_ns.",
"type": "number"
},
"top_registrar": {
"description": "Registrar with highest volume",
"properties": {
"name": {
"type": "string"
},
"pct": {
"type": "number"
}
},
"type": "object"
},
"trend": {
"description": "Trend status: hot, active, or cold (prefix only)",
"type": "string"
},
"w1": {
"description": "Registrations 4 weeks ago (hot only)",
"type": "integer"
},
"w2": {
"description": "Registrations 3 weeks ago (hot only)",
"type": "integer"
},
"w3": {
"description": "Registrations 2 weeks ago (hot and emerging)",
"type": "integer"
},
"w4": {
"description": "Registrations current week (hot and emerging)",
"type": "integer"
},
"word": {
"description": "Trending keyword (hot and emerging)",
"type": "string"
}
},
"type": "object"
},
"type": "array"
},
"success": {
"type": "boolean"
},
"total": {
"type": "integer"
},
"type": {
"type": "string"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Keyword Registration Trends"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Domain Marketplace Search"
},
"description": "Search currently registered domains with marketplace listing data. These are live domains owned by someone \u2014 not available for free registration. Use status=forsale to filter to domains the owner has listed for sale, or use results as acquisition targets to approach owners directly.\n\nBest practices:\n- keyword defaults to 'start' matching. Use position=end or position=contain for broader results.\n- status=forsale is the most actionable filter \u2014 these owners are actively seeking buyers.\n- Results include a marketplace field indicating which platform the domain is listed on (e.g., 'se' for Sedo, 'go' for GoDaddy, 'at' for Atom, 'vn' for Venture, 'pd' for PerfectDomain). Domains without a marketplace value are registered but not actively listed for sale.\n- sort=length_asc surfaces the shortest (most premium) names first.\n- The components field shows how the domain name segments into recognizable words \u2014 useful for evaluating brandability.\n- Disclose affiliate links when presenting register_url to users.",
"inputSchema": {
"properties": {
"exclude": {
"description": "Negative keywords to exclude",
"type": "string"
},
"keyword": {
"description": "Brand or industry term (min 2 chars)",
"type": "string"
},
"length": {
"description": "Domain name length filter",
"enum": [
"<5",
"5-10",
"10-15",
"15+"
],
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphenated domains (true/false)",
"type": "string"
},
"no_number": {
"description": "Exclude domains containing numbers (true/false)",
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"position": {
"description": "Keyword placement in domain name. Default is 'start'.",
"enum": [
"start",
"end",
"contain"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"length_asc",
"length_desc",
"alpha",
"tld_counter_asc",
"tld_counter_desc"
],
"type": "string"
},
"status": {
"description": "Filter by status \u2014 'forsale' for domains listed for sale",
"type": "string"
},
"tld": {
"description": "Filter by TLD (e.g., 'com', 'net', 'org', 'ai')",
"type": "string"
},
"type": {
"description": "Character set filter",
"enum": [
"all_alpha",
"all_number"
],
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "market",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"affiliate": {
"type": "boolean"
},
"components": {
"description": "Word segmentation of the domain prefix",
"type": "string"
},
"domain": {
"type": "string"
},
"length": {
"type": "integer"
},
"marketplace": {
"description": "Sale platform code: se=Sedo, go=GoDaddy, at=Atom, vn=Venture, pd=PerfectDomain, gn=Gname",
"type": "string"
},
"prefix_tld_count": {
"description": "Number of TLDs this prefix is registered across",
"type": "integer"
},
"price": {
"description": "Listing price with currency, e.g. 1500 USD. Only present for Atom/Sedo listings",
"type": "string"
},
"register_url": {
"format": "uri",
"type": "string"
},
"tld": {
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
},
"total_found": {
"description": "Total matching results across all pages",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Domain Marketplace Search"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true,
"readOnlyHint": true,
"title": "Domain Market Intelligence"
},
"description": "Domain market news briefing. Call when a user wants to understand what is happening in the domain market right now \u2014 trending keywords, notable sales, registration anomalies, and industry movements.\n\nThis is a news briefing, not investment advice. Present facts, flag anomalies, cite sources. If the cause of a trend is unknown, say so \u2014 never fabricate explanations.\n\nWorkflow:\n1. Gather data from multiple sources:\n - web_search for recent high-value domain sales (e.g., 'domain name sales this week', 'domain sales report 2026'), industry news, and notable market events.\n - keywords_trends(hot) for high-volume registration keywords and weekly momentum.\n - keywords_trends(emerging) for sudden registration spikes \u2014 these are the most newsworthy signals.\n - domain_changes for transfers, expirations, and nameserver changes in the last 24 hours.\n2. Analyze and cross-reference:\n - For hot keywords: focus on anomalies (w4 significantly different from w1-w3), not the stable high-volume terms everyone already knows.\n - For emerging keywords: use web_search to investigate what is driving each spike. If no cause is found, report it as 'cause unidentified' \u2014 do not speculate.\n - For domain sales: report price, buyer/seller if known, and sale platform.\n - For domain_changes: flag notable transfers (short/premium domains changing registrars) and expirations (high-value domains entering deletion cycle).\n3. Present as a concise news briefing organized by: recent notable sales, registration trend highlights (anomalies and emerging keywords), and 24-hour market movements. Lead with facts, not interpretation.\n\nAfter presenting the briefing, suggest relevant next steps based on what the data showed \u2014 for example:\n- An emerging keyword spike \u2192 search nrds to see who is registering, or deleted/expired to find available domains in that keyword space.\n- A high-value sale \u2192 search aged(has_sale=true) or nrds to see if the sale triggered a registration wave in similar keywords.\n- A notable domain expiration \u2192 check expired for details, or set_monitor to track its status.\nLet the user choose whether and where to go deeper.\n\nKey principles: Every claim must be sourced or labeled as unverified. Present as market intelligence, not a sales pitch. Disclose affiliate links.",
"inputSchema": {
"properties": {
"focus": {
"description": "Optional focus area or keyword to prioritize (e.g., 'AI', 'crypto', 'health')",
"type": "string"
}
},
"type": "object"
},
"name": "market_beat",
"title": "Domain Market Intelligence"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Domain Market Price Check"
},
"description": "Check if a domain is listed for sale on secondary marketplaces and get estimated market price. Complements 'available' (new registration price) \u2014 this tool checks the resale market.\n\nThree possible statuses:\n- 'for_sale': domain has a listed price. This is a third-party marketplace price set by the seller \u2014 it is not an appraisal or guaranteed transaction price. Always present buy_url.\n- 'make_offer': listed for sale but no fixed price, buyer must submit an offer via buy_url.\n- 'not_found': not publicly listed. Does NOT mean the domain is unavailable for purchase \u2014 owner may sell privately or hasn't listed yet. Suggest whois to find registrar info for direct outreach.\n\nBest practices:\n- Marketplace listing prices are set by sellers and often significantly higher than actual transaction prices. Do not treat estimated_price as definitive market value \u2014 it is one data point among many.\n- When used in valuation_cma workflow, batch-call market_price for multiple comparable domains. 'not_found' results should be excluded, 'make_offer' results noted as supplementary only.\n- Always disclose affiliate links when buy_url has affiliate=true.\n- Always include disclaimer: prices are provided by third-party marketplaces for reference only, subject to change by the seller at any time.",
"inputSchema": {
"properties": {
"domain": {
"description": "Domain name (e.g., 'example.com')",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "market_price",
"outputSchema": {
"properties": {
"affiliate": {
"description": "Whether buy_url is an affiliate link",
"type": "boolean"
},
"buy_url": {
"description": "Purchase or offer link",
"format": "uri",
"type": "string"
},
"currency": {
"description": "Price currency (e.g., USD)",
"type": "string"
},
"domain": {
"type": "string"
},
"error": {
"type": "string"
},
"estimated_price": {
"description": "Seller's listing price (only when status=for_sale)",
"type": "number"
},
"message": {
"type": "string"
},
"status": {
"description": "Market status: for_sale, make_offer, or not_found",
"enum": [
"for_sale",
"make_offer",
"not_found"
],
"type": "string"
},
"success": {
"type": "boolean"
}
},
"required": [
"success",
"domain",
"status"
],
"type": "object"
},
"title": "Domain Market Price Check"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true,
"readOnlyHint": false
},
"description": "Manage domain monitoring tasks. Track changes in WHOIS, DNS, and page content.\n\nAll monitoring data is encrypted at rest (AES-256-GCM) and stored in your private directory. GDPR compliant.\n\nActions:\n- get: Retrieve and auto-check all monitors. Default action if not specified. Automatically performs bulk WHOIS and DNS checks where the minimum interval has passed. You do NOT need to manually call whois or dns tools. For each monitor where can_check=true, returns current vs previous data with change flags. For can_check=false monitors, returns last known data and next_check time. YOUR JOB: focus on whois_changed=true or dns_changed=true, report with context from note field. For DNS, focus on NS changes \u2014 ignore A/AAAA (CDN rotation). If monitors have web_fetch in tools, optionally run web_fetch yourself then call with action=update to save results.\n- set: Create a new monitor. Requires registered account and memory enabled. Max 100 monitors. Before creating, verify memory is enabled via preferences. WHOIS and DNS are auto-checked when you call action=get \u2014 no need to call them manually. web_fetch is optional and must be run manually.\n- update: Save web_fetch page results for a monitor. WHOIS and DNS are auto-saved by action=get \u2014 you only need this for web_fetch page content. Typical flow: call action=get (auto-checks WHOIS/DNS), run web_fetch yourself, then call action=update with the page summary. The whois and dns parameters are accepted for backward compatibility but normally not needed.\n- delete: Remove a monitor task.\n\nRequires registered account (member or above) and memory enabled for all actions.",
"inputSchema": {
"properties": {
"action": {
"description": "'get', 'set', 'update', or 'delete'. Defaults to 'get' if not specified.",
"type": "string"
},
"dns": {
"description": "DNS result, backward compatibility (update only)",
"type": "string"
},
"domain": {
"description": "Domain to monitor (set only)",
"type": "string"
},
"id": {
"description": "Monitor task ID (update and delete)",
"type": "string"
},
"note": {
"description": "What to watch for \u2014 user's intent in natural language (set only)",
"type": "string"
},
"page": {
"description": "Page content summary from web_fetch (update only)",
"type": "string"
},
"tools": {
"description": "Comma-separated: whois, dns, web_fetch. Default: whois,dns (set only)",
"type": "string"
},
"whois": {
"description": "WHOIS result, backward compatibility (update only)",
"type": "string"
}
},
"type": "object"
},
"name": "monitor",
"outputSchema": {
"properties": {
"error": {
"description": "Error message when success is false",
"type": "string"
},
"message": {
"description": "Human-readable result message",
"type": "string"
},
"monitor": {
"description": "Created monitor details (set only)",
"properties": {
"created_at": {
"type": "string"
},
"domain": {
"type": "string"
},
"id": {
"type": "string"
},
"note": {
"type": "string"
},
"tools": {
"type": "string"
}
},
"type": "object"
},
"monitors": {
"description": "List of monitors with auto-check results (get only)",
"items": {
"properties": {
"can_check": {
"type": "boolean"
},
"current_dns": {
"type": "string"
},
"current_whois": {
"type": "string"
},
"dns_changed": {
"type": "boolean"
},
"domain": {
"type": "string"
},
"id": {
"type": "string"
},
"last_check": {
"type": "string"
},
"last_dns": {
"type": "string"
},
"last_page": {
"type": "string"
},
"last_whois": {
"type": "string"
},
"next_check": {
"type": "string"
},
"note": {
"type": "string"
},
"previous_dns": {
"type": "string"
},
"previous_whois": {
"type": "string"
},
"tools": {
"type": "string"
},
"whois_changed": {
"type": "boolean"
}
},
"required": [
"id",
"domain",
"can_check"
],
"type": "object"
},
"type": "array"
},
"success": {
"description": "Whether the request was successful",
"type": "boolean"
},
"total": {
"description": "Number of active monitors (get only)",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Personalized Domain Monitor"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Domain Name Advisor"
},
"description": "A professional domain naming consultation workflow. Call when a user is looking for domain name ideas, starting a new project and needs a domain, or has vague/open-ended domain requirements. Do NOT call when the user already has a specific name to check (use available/bulk_available) or already knows their keyword and wants variations (use domain_generator).\n\nThis is a multi-turn consulting engagement \u2014 conversation first, recommendations second. Never skip the diagnosis phase, and never generate domain suggestions before understanding the user's needs.\n\nWorkflow:\n1. Needs Diagnosis \u2014 ask the user questions to understand their project. Start with the essentials (project/industry, target audience, domain purpose), then follow up with budget guidance, TLD preference, and style preference (textural/imagery vs keyword-based). Ask 1-2 questions at a time, not all at once. Do NOT generate any domain names or call any tools in this phase. Even if the user's description seems clear, confirm user persona and brand tonality before proceeding.\n2. Semantic Leap \u2014 based on confirmed requirements, generate 3-5 metaphor directions that abstract one level up from the industry. Do NOT coin words directly from industry keywords unless the user mentioned them. Examples: travel \u2192 docking point \u2192 berth; notes \u2192 ideas \u2192 notion. Present the directions to the user and let them choose before generating any candidates.\n3. Domain Search & Verification \u2014 along the chosen direction, generate at least 10 candidate names. Every candidate must pass a quality check: does it feel natural in conversation? Does it evoke imagery? Stripped of all context, does the word alone have quality? If you hesitate, discard it. Then use bulk_available, deleted, expired, aged, and tld_check to verify acquisition paths and costs. For deleted and expired searches, try each keyword in different positions (start, end) to maximize coverage. Present results layered by acquisition method: directly registrable \u2192 listed for sale \u2192 contact owner \u2192 monitor/backorder, each with estimated cost.\n4. Iterative Refinement \u2014 based on user feedback, either generate more candidates in the same direction (with independent thinking \u2014 do not reuse previous coining patterns as templates), explore a new metaphor direction (return to step 2), or run brand_match on a finalist. If the current best is already strong, say so \u2014 do not force-generate low-quality options to show effort.\n\nKey principles:\n- Communication before generation \u2014 better to ask one more question than to blindly generate irrelevant domains.\n- A good name feels natural, evokes imagery, and has quality on its own. A bad name requires excessive explanation, feels forced, or mismatches the use case.\n- Help users save money while meeting their needs, but also surface purchase and backorder opportunities when relevant.\n- All statements must be data-backed. Do not speculate. Minimize etymology explanations \u2014 a good name does not need explaining.\n- Disclose affiliate links.",
"inputSchema": {
"properties": {
"query": {
"description": "User's initial idea, project description, keywords, or reference domain (optional)",
"type": "string"
}
},
"type": "object"
},
"name": "name_advisor",
"title": "Domain Name Advisor"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Newly Registered Domains Search"
},
"description": "Search newly registered domains by keyword. Use for tracking competitor registrations, spotting trending keywords, monitoring brand squatting, or finding resale opportunities.\n\nBest practices:\n- keyword defaults to 'contain' matching, which searches all domains containing the keyword anywhere in the name. Use position=start, position=end, or position=middle to control where the keyword appears in the domain name.\n- Always use no_hyphen=true unless specifically looking for hyphenated domains \u2014 hyphenated registrations are mostly low-quality spam.\n- sort=tld_counter_desc surfaces keywords registered across many TLDs simultaneously \u2014 a strong signal of trending demand.\n- period=6+ filters for domains registered for 6-10 years, indicating serious projects rather than speculative 1-year registrations.\n- prefix_tld_count in results indicates how many TLDs share the same prefix \u2014 values above 10 suggest the keyword is being actively pursued by multiple registrants.\n- Disclose affiliate links when presenting register_url to users.",
"inputSchema": {
"properties": {
"days_range": {
"description": "Registration recency",
"enum": [
"0-10",
"10-20",
"20+"
],
"type": "string"
},
"exclude": {
"description": "Negative keywords to exclude",
"type": "string"
},
"has_sale": {
"description": "Filter to domains listed for sale",
"enum": [
"true",
"false"
],
"type": "string"
},
"keyword": {
"description": "Search term (min 2 chars)",
"type": "string"
},
"length": {
"description": "Domain name length filter",
"enum": [
"<5",
"5-10",
"10-15",
"15+"
],
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphenated domains",
"type": "string"
},
"no_number": {
"description": "Exclude domains containing numbers",
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"period": {
"description": "Registration term length in years",
"enum": [
"1",
"2-5",
"6+"
],
"type": "string"
},
"position": {
"description": "Keyword placement in domain name",
"enum": [
"start",
"end",
"contain"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"reg_date_desc",
"reg_date_asc",
"length_asc",
"length_desc",
"period_asc",
"period_desc",
"tld_counter_asc",
"tld_counter_desc",
"alpha"
],
"type": "string"
},
"tld": {
"description": "Filter by TLD (e.g., 'com', 'ai', 'io')",
"type": "string"
},
"type": {
"description": "Character set filter",
"enum": [
"all_alpha",
"all_number"
],
"type": "string"
}
},
"required": [
"keyword"
],
"type": "object"
},
"name": "nrds",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"affiliate": {
"type": "boolean"
},
"domain": {
"type": "string"
},
"prefix_tld_count": {
"description": "Number of TLDs the same prefix is registered under",
"type": "integer"
},
"price": {
"description": "Listing price with currency, e.g. 1500 USD. Only present for Atom/Sedo listings",
"type": "string"
},
"register_url": {
"format": "uri",
"type": "string"
},
"registered_date": {
"format": "date",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
},
"total_found": {
"description": "Total matching results across all pages",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Newly Registered Domains Search"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Reverse NS Lookup"
},
"description": "Reverse NS lookup. Find all gTLD domains hosted on a specific nameserver. Useful for mapping domain portfolios, understanding the scale of a nameserver's usage, and discovering what domains share infrastructure.\n\nBest practices:\n- sort=length_asc surfaces the shortest (most premium) domains first \u2014 large portfolios often contain hidden short-letter gems.\n- pure_alpha=true is the cleanest way to filter for letter-only domains. This is stricter than no_number + no_hyphen combined, as it excludes any non-letter character.\n- keyword filters by substring within domain names on that nameserver \u2014 useful for finding domains in a specific niche or vertical.\n- min_len and max_len require exact integers (e.g., '4'), not range syntax like '<5'.\n- If results fill a full page (10+), check total and paginate \u2014 large nameservers may host thousands of domains.\n- Look for patterns in results: similar naming conventions (brand-us.com, brand-uk.com) indicate portfolio clustering by the same owner.",
"inputSchema": {
"properties": {
"keyword": {
"description": "Substring filter within domain names",
"type": "string"
},
"max_len": {
"description": "Maximum domain name length (integer)",
"type": "string"
},
"min_len": {
"description": "Minimum domain name length (integer)",
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphens",
"type": "string"
},
"no_number": {
"description": "Exclude numbers",
"type": "string"
},
"ns": {
"description": "Target nameserver hostname (e.g., 'ns1.example.com')",
"type": "string"
},
"page": {
"description": "Page number for pagination",
"type": "string"
},
"pure_alpha": {
"description": "Letters only (strictest quality filter)",
"enum": [
"true",
"false"
],
"type": "string"
},
"pure_digit": {
"description": "Numbers only",
"enum": [
"true",
"false"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"length_asc",
"length_desc",
"alpha_asc",
"alpha_desc"
],
"type": "string"
},
"tld": {
"description": "Filter by TLD (e.g., 'com')",
"type": "string"
}
},
"required": [
"ns"
],
"type": "object"
},
"name": "ns_reverse",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"domain": {
"description": "Full domain name including TLD",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"type": "array"
},
"error": {
"type": "string"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Reverse NS Lookup"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Domain Alternatives Finder"
},
"description": "Domain alternatives workflow. Call when a user's target domain is unavailable and they need alternative options across different lifecycle stages \u2014 for example after available or bulk_available returns unavailable, or as a follow-up from analyze or name_advisor when a candidate is taken. Do NOT call when the user is starting from scratch without a target (use name_advisor), already knows their keyword and wants creative variations (use domain_generator), or wants to analyze the taken domain itself (use analyze).\n\nThis is a multi-turn workflow. Stop and wait for user input at every checkpoint.\n\nWorkflow:\n1. Understand User Needs \u2014 extract core keywords from the unavailable domain (e.g., getflow.com \u2192 keyword: flow, pattern: prefix+root). Then ask the user: what appealed to you about this domain (the keyword, the length, the sound)? Are you open to other TLDs or .com only? Would you consider purchasing a registered domain, or only free registration / backorder? Do NOT search until the user responds \u2014 their motivation determines the entire search strategy.\n2. Lifecycle Search \u2014 search by priority: deleted (free registration, highest priority) \u2192 expired (backorderable) \u2192 aged (registered, only if user is willing to purchase). For each tool, try the keyword in different positions (start, end) to maximize coverage \u2014 e.g., searching 'flow' at start and end will surface very different results. If a strong match is found in deleted, note it as a top recommendation.\n3. Creative Variants \u2014 based on what the user liked about the original domain, generate 15-20 creative variants respecting their TLD preference (default .com). Avoid concatenations creating sensitive words or offensive abbreviations. Verify all with bulk_available.\n4. Present Results \u2014 organize all findings layered by acquisition method from easiest to most involved: free registration (deleted + available variants) \u2192 backorderable (expired) \u2192 purchasable (aged for-sale) \u2192 monitorable (worth watching). Every domain must include the appropriate acquisition link. Ask the user which options interest them.\n5. Follow-up \u2014 based on user choice: generate more variations, run brand_match, set up set_monitor, do deeper analysis with analyze or expired_analysis, or run valuation_cma.\n\nKey principles:\n- Default to .com only unless user specifies otherwise.\n- Every domain presented must include an acquisition link (register_url, backorder_url, or sale link).\n- Disclose affiliate links.",
"inputSchema": {
"properties": {
"domain": {
"description": "Unavailable target domain",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "plan_b",
"title": "Domain Alternatives Finder"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Manage user preferences and memory settings.\n\nActions:\n- get: Check if memory is enabled and retrieve saved preferences. Default action if not specified.\n- set: Save preferences. Requires explicit user consent before enabling memory. memory_enabled must be true before any other preferences, monitors, or strategies can be saved.\n- delete: Delete all stored user data permanently (preferences, monitors, strategies). GDPR Article 17: Right to erasure.\n\nAll user data is encrypted at rest using AES-256-GCM and stored in isolated user directories. No one \u2014 including DomainKits staff \u2014 can read your data. Fully GDPR compliant.\n\nWhen action=get:\n- If reason=\"not_configured\", ask the user with a clear choice: \"I can remember your preferences, monitoring tasks, and discovery strategies across sessions. All data is encrypted. Would you like to enable this?\" Only call with action=set and memory_enabled=true after explicit user consent.\n- MONITOR HANDLING: If monitors_count > 0, check monitors_summary. If can_check_count > 0, call get_monitors to auto-check domains. If can_check_count == 0, all monitors are in cooldown \u2014 inform the user when next check is available (next_check field), do NOT call get_monitors. The domains list lets you answer \"what am I monitoring?\" without triggering a check.\n- If strategies_count > 0, proceed to call get_strategies.",
"inputSchema": {
"properties": {
"action": {
"description": "'get', 'set', or 'delete'. Defaults to 'get' if not specified.",
"type": "string"
},
"budget": {
"description": "'low', 'medium', 'high' (set only)",
"type": "string"
},
"exclude_hyphens": {
"description": "'true' or 'false' (set only)",
"type": "string"
},
"exclude_numbers": {
"description": "'true' or 'false' (set only)",
"type": "string"
},
"industry": {
"description": "Industry type (set only)",
"type": "string"
},
"memory_enabled": {
"description": "'true' to enable memory, 'false' to disable. Must be enabled before using monitors or strategies. (set only)",
"type": "string"
},
"preferred_tlds": {
"description": "Comma-separated TLDs, e.g. 'com,net,io' (set only)",
"type": "string"
},
"style": {
"description": "'short', 'brandable', 'keyword' (set only)",
"type": "string"
}
},
"type": "object"
},
"name": "preferences",
"outputSchema": {
"properties": {
"data": {
"description": "Saved preference data (get only, when memory is enabled)",
"properties": {
"budget": {
"type": "string"
},
"exclude_hyphens": {
"type": "boolean"
},
"exclude_numbers": {
"type": "boolean"
},
"industry": {
"type": "string"
},
"memory_enabled": {
"type": "boolean"
},
"preferred_tlds": {
"type": "array"
},
"style": {
"type": "string"
}
},
"type": "object"
},
"memory_enabled": {
"description": "Whether memory is enabled for this user",
"type": "boolean"
},
"message": {
"description": "Human-readable result message",
"type": "string"
},
"monitors_count": {
"description": "Number of active monitors (get only)",
"type": "integer"
},
"monitors_summary": {
"description": "Monitor overview (get only, when monitors_count > 0)",
"properties": {
"can_check_count": {
"type": "integer"
},
"domains": {
"items": {
"type": "string"
},
"type": "array"
},
"last_check": {
"type": "string"
},
"max": {
"type": "integer"
},
"next_check": {
"type": "string"
},
"total": {
"type": "integer"
}
},
"type": "object"
},
"strategies_count": {
"description": "Number of active strategies (get only)",
"type": "integer"
},
"success": {
"description": "Whether the request was successful",
"type": "boolean"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "User Preferences & Memory"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "TLD Pricing (Dynadot)"
},
"description": "Domain registration and renewal prices by TLD from Dynadot. Check registration, renewal, and transfer costs before purchasing.\n\nBest practices:\n- Use comma-separated values for multi-TLD comparison: tld='com,io,ai,xyz'.\n- Results include register_url (Dynadot affiliate link). Always display this link when showing prices and disclose affiliate status.\n- Prices are in USD. Registration price is for the first year; renewal price is the ongoing annual cost \u2014 highlight the difference when they diverge significantly (e.g., some TLDs have low introductory registration but high renewal).",
"inputSchema": {
"properties": {
"tld": {
"description": "TLD to query, comma-separated for multiple (e.g., 'com', 'com,io,ai')",
"type": "string"
}
},
"required": [
"tld"
],
"type": "object"
},
"name": "price",
"outputSchema": {
"properties": {
"affiliate": {
"type": "boolean"
},
"data": {
"items": {
"properties": {
"currency": {
"type": "string"
},
"register_price": {
"description": "First-year registration price (USD)",
"type": "number"
},
"renewal_price": {
"description": "Annual renewal price (USD)",
"type": "number"
},
"tld": {
"type": "string"
},
"transfer_price": {
"description": "Transfer price (USD)",
"type": "number"
}
},
"required": [
"tld"
],
"type": "object"
},
"type": "array"
},
"error": {
"type": "string"
},
"register_url": {
"format": "uri",
"type": "string"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of TLDs returned",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "TLD Pricing (Dynadot)"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Domain Safety Check"
},
"description": "Check domain safety via Google Safe Browsing, and check Google search index status. Returns two pieces of data: (1) safe \u2014 whether Google Safe Browsing flags the domain for malware, phishing, social engineering, or unwanted software, including specific threat types if flagged; (2) index \u2014 whether the domain has pages indexed in Google and an estimated count. A flagged domain is a critical risk signal \u2014 it likely has a problematic history (malware distribution, phishing, spam operations) that may be difficult or impossible to recover from. This is especially important when evaluating expired or aged domains for acquisition. An unindexed domain may indicate it was previously penalized or has been dormant.",
"inputSchema": {
"properties": {
"domain": {
"description": "Domain name",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "safety",
"outputSchema": {
"properties": {
"domain": {
"type": "string"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"index": {
"properties": {
"checked_at": {
"type": "string"
},
"domain": {
"type": "string"
},
"index_count": {
"description": "Estimated number of indexed pages",
"type": "integer"
},
"indexed": {
"description": "Whether the domain is indexed by Google",
"type": "boolean"
}
},
"type": "object"
},
"safe": {
"properties": {
"domain": {
"type": "string"
},
"is_safe": {
"description": "Whether the domain is safe according to Google Safe Browsing",
"type": "boolean"
},
"matches_count": {
"description": "Number of threat matches found",
"type": "integer"
},
"scan_date": {
"format": "date-time",
"type": "string"
},
"threat_types": {
"description": "List of detected threat types (empty if safe)",
"items": {
"type": "string"
},
"type": "array"
}
},
"type": "object"
},
"success": {
"type": "boolean"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Domain Safety Check"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true,
"readOnlyHint": true,
"title": "Domain Buyer Discovery"
},
"description": "Domain buyer discovery workflow. Call when a user wants to find potential end-user buyers for a domain they own or are considering selling.\n\nWhen to use: user asks 'who would buy this domain?', 'help me sell [domain]', or wants to find buyers as a follow-up after keyword_intel or plan_b. Do NOT use when the user wants to buy a domain (use plan_b), check domain value only (use valuation_cma), or analyze a domain technically (use analyze).\n\nWorkflow:\n1. Extract the core keyword(s) from the domain. Use web_search '[keyword] company OR brand OR product' to discover who is already operating under this name or close variants. Note their business type, current domain, scale, and how long they've been using the keyword. This research step is mandatory \u2014 do not skip it.\n\n2. Categorize potential buyers into three tiers by purchase motivation:\n - Tier 1 \u2014 Domain Upgraders: companies already operating under this exact name or a close variant (on .net, .io, a hyphenated version, or with a prefix/suffix added), who would naturally want the cleaner or shorter version. These are the highest-intent buyers \u2014 they've already built equity around the keyword and this domain is a direct upgrade for them.\n - Tier 2 \u2014 Strategic Expansioners: companies in the same industry whose product, feature, or campaign aligns with what this domain describes. Acquiring it is a strategic fit that strengthens positioning.\n - Tier 3 \u2014 New Brand Builders: funded startups or new ventures that haven't fully launched yet but would find this name ideal.\n\n3. Use Claude for Chrome to research buyers on LinkedIn in three layers. Open LinkedIn in the browser and execute the following searches in order:\n\n Layer 1 \u2014 Find Domain Upgraders (highest priority):\n Switch to the Companies tab. Search using the exact keyword and close variants:\n \"[keyword]\" OR \"[keywords]\" OR \"[keyword]-[common suffix]\"\n Scan results for companies whose name or description contains the keyword but whose website is on an inferior domain (not the clean .com). These are Tier 1 buyers.\n\n Layer 2 \u2014 Find Strategic Buyers:\n Search Companies tab by industry theme:\n \"[industry vertical] [keyword theme]\"\n Apply Industry filter (e.g., Events Services, Software, Media) to narrow results. Identify Tier 2 candidates whose business would be strengthened by owning this domain.\n\n Layer 3 \u2014 Find Decision Makers at identified companies:\n For each promising company from Layers 1 and 2, switch to the People tab and use Boolean search to locate the right contact:\n (\"CMO\" OR \"VP Marketing\" OR \"Chief Marketing\" OR \"Brand Director\" OR \"Head of Brand\" OR \"Head of Marketing\") AND \"[company name]\" NOT (intern OR assistant)\n Record: full name, title, LinkedIn profile URL.\n\n4. Synthesize findings into a prioritized buyer list. Present Tier 1 first, then Tier 2, then Tier 3. For each entry include: company name, current domain they operate on, reason they are a strong buyer candidate, and decision maker contact if found.\n\n5. After presenting the buyer list, ask the user what they want to do next. Tailor follow-up based on their response:\n - Wants a price before outreach \u2192 suggest valuation_cma for a data-backed asking price, market_price to check existing listings.\n - Wants to draft outreach \u2192 help write a personalized email for each Tier 1 buyer, emphasizing the specific upgrade value to their existing brand.\n - Wants to list the domain \u2192 suggest Afternic, Sedo, or Dan.com depending on domain type.\n - Wants more buyer leads \u2192 suggest brand_match to identify additional companies using the keyword, or nrds to see who has recently registered variants.\n\nKey principles: focus on upgrade motivation, not conflict framing. Every buyer candidate must be grounded in data from web_search or LinkedIn results. Do not speculate about intent. Present the buyer list as opportunity intelligence, not legal risk assessment. Disclose affiliate links when presenting marketplace URLs.",
"inputSchema": {
"properties": {
"domain": {
"description": "The domain the user wants to sell (e.g., 'opentalks.com')",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "sale_chance",
"title": "Domain Buyer Discovery"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false,
"readOnlyHint": false
},
"description": "Manage personalized opportunity discovery strategies \u2014 let AI periodically execute your investment logic and discover new opportunities.\n\nAll strategy data is encrypted at rest (AES-256-GCM). GDPR compliant.\n\nActions:\n- get: Retrieve all strategies with run status and available presets. Default action if not specified. Shows can_run status, runs_today, and available preset strategies not yet activated.\n- set: Create a new strategy. Describe the domains you want in natural language, or activate a preset by preset_id. Examples: \"Monitor all domains with 'ai' keyword, 10+ years of history, about to expire, .com\", \"Track newly registered domains containing 'claw', letters only, .io\", \"Discover crypto-related keywords with high TLD registration volume\". Limits: Member 1 / Premium 3 / Platinum unlimited.\n- update: Record execution result for a strategy. Call after running a strategy to save the result summary. Subject to daily run limits and minimum interval between runs.\n- delete: Remove a strategy.\n\nRequires registered account (member or above) and memory enabled for all actions.",
"inputSchema": {
"properties": {
"action": {
"description": "'get', 'set', 'update', or 'delete'. Defaults to 'get' if not specified.",
"type": "string"
},
"id": {
"description": "Strategy task ID (update and delete)",
"type": "string"
},
"name": {
"description": "Name for custom strategy (set only)",
"type": "string"
},
"preset_id": {
"description": "Activate a preset strategy by ID (set only)",
"type": "string"
},
"result": {
"description": "Execution result summary (update only)",
"type": "string"
},
"strategy": {
"description": "Custom strategy in natural language, max 500 chars (set only)",
"type": "string"
}
},
"type": "object"
},
"name": "strategy",
"outputSchema": {
"properties": {
"available_presets": {
"description": "Preset strategies not yet activated (get only)",
"items": {
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"strategy": {
"type": "string"
}
},
"type": "object"
},
"type": "array"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"max": {
"description": "Maximum strategies allowed (get only)",
"type": "integer"
},
"message": {
"description": "Human-readable result message",
"type": "string"
},
"strategy": {
"description": "Created strategy details (set only)",
"properties": {
"created_at": {
"type": "string"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"strategy": {
"type": "string"
}
},
"type": "object"
},
"strategys": {
"description": "List of strategies with run status (get only)",
"items": {
"properties": {
"can_run": {
"type": "boolean"
},
"id": {
"type": "string"
},
"last_result": {
"type": "string"
},
"last_run": {
"type": "string"
},
"name": {
"type": "string"
},
"preset": {
"type": "boolean"
},
"reason": {
"type": "string"
},
"runs_today": {
"type": "integer"
},
"strategy": {
"type": "string"
}
},
"required": [
"id",
"strategy",
"can_run"
],
"type": "object"
},
"type": "array"
},
"success": {
"description": "Whether the request was successful",
"type": "boolean"
},
"total": {
"description": "Number of active strategies (get only)",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Personalized Discovery Strategy"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Cross-TLD Registration Check"
},
"description": "Check a keyword prefix's registration status across all TLDs. Returns total registration count (gTLDs + ccTLDs) and status of core TLDs (com, net, org, io, ai, de).\n\nThis is a saturation and popularity metric \u2014 the total count indicates how widely a keyword has been claimed across the TLD namespace.\n\nInterpreting results:\n- count >200: Keyword is widely recognized \u2014 either high market demand or strong brand protection (or both). Cross-reference with keyword_data and active to determine which.\n- count 50-200: Worth attention \u2014 check if there are still opportunities available.\n- count <50: Not a particularly popular keyword in the domain market.\n- gtlds_count vs cctlds_count ratio: High ccTLD registration suggests international interest in the keyword.\n\nThe tlds field shows status for core TLDs (com, net, org, io, ai, de) with values: 'registered', 'for_sale', 'expiring', or 'might_available'. Note that 'might_available' means the prefix is not found in our database for that TLD \u2014 confirm with the 'available' tool before assuming registrability.\n\nBest practices:\n- The prefix parameter must NOT contain the TLD extension \u2014 use 'openai' not 'openai.com'.\n- If .com shows 'might_available' for an established keyword, this is unusual and worth verifying.\n- If .com shows 'for_sale' or 'expiring', this is a potential acquisition opportunity worth flagging.",
"inputSchema": {
"properties": {
"prefix": {
"description": "Keyword without extension (e.g., 'openai')",
"type": "string"
}
},
"required": [
"prefix"
],
"type": "object"
},
"name": "tld_check",
"outputSchema": {
"properties": {
"cctlds_count": {
"description": "Number of ccTLDs with this prefix registered",
"type": "integer"
},
"count": {
"description": "Total number of TLDs with this prefix registered",
"type": "integer"
},
"error": {
"description": "Error message when success is false",
"type": "string"
},
"gtlds_count": {
"description": "Number of gTLDs with this prefix registered",
"type": "integer"
},
"prefix": {
"type": "string"
},
"success": {
"type": "boolean"
},
"tlds": {
"description": "Status of core TLDs (com, net, org, io, ai, de). Values: registered, for_sale, expiring, or might_available",
"type": "object"
}
},
"required": [
"success",
"prefix"
],
"type": "object"
},
"title": "Cross-TLD Registration Check"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "gTLD Rankings"
},
"description": "gTLD rankings by registration volume. See which gTLDs have the most new registrations today or the most total active domains.\n\nBest practices:\n- type='newly' ranks by today's new registrations \u2014 useful for spotting which TLDs are currently hot. Sudden spikes in a usually quiet TLD may signal a promotion or speculative wave.\n- type='active' ranks by total active domain count \u2014 reflects overall market size and maturity.\n- Compare newly vs active to find TLDs with disproportionate registration activity relative to their size (high new-to-active ratio = momentum signal).\n- type='newly' data has a one-day lag \u2014 it reflects yesterday's registrations, not today's.\n- The key insight from newly rankings is relative change, not absolute numbers. A TLD jumping significantly in rank or showing unusual registration volume compared to its typical level is the signal worth investigating \u2014 use tld_trends for historical baseline and web_search to identify the cause.\n- This data pairs well with tld_trends: tld_rank shows today's snapshot, tld_trends shows the trajectory over time.",
"inputSchema": {
"properties": {
"limit": {
"description": "Number of results (default 20, max 100)",
"type": "string"
},
"type": {
"description": "Ranking type: 'newly' for today's new registrations, 'active' for total active domains",
"enum": [
"newly",
"active"
],
"type": "string"
}
},
"type": "object"
},
"name": "tld_rank",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"count": {
"description": "New registrations or total active domains",
"type": "integer"
},
"rank": {
"type": "integer"
},
"tld": {
"type": "string"
}
},
"required": [
"rank",
"tld",
"count"
],
"type": "object"
},
"type": "array"
},
"date": {
"description": "Data date (YYYY-MM-DD)",
"type": "string"
},
"error": {
"type": "string"
},
"success": {
"type": "boolean"
},
"total": {
"type": "integer"
},
"type": {
"description": "Ranking type: 'newly' or 'active'",
"type": "string"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "gTLD Rankings"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "gTLD Registration Trends"
},
"description": "gTLD registration trends over time. Analyze historical registration patterns for specific gTLDs \u2014 spot hype cycles, compare competing extensions, or check long-term health.\n\nTwo modes:\n- action='data' + tld (single TLD): deep-dive into one TLD's trend over time. Use this to answer 'is .ai still hot?' or 'is .net dying?'.\n- action='compare' + tlds (comma-separated, max 5): side-by-side comparison. Use this to answer 'should I buy the .io or .ai version?' by comparing registration momentum.\n\nBest practices:\n- Focus on ma7 (7-day moving average) slope rather than raw daily numbers \u2014 daily counts are noisy, the moving average reveals the real trend direction. ma7 trending up = genuine momentum, flat = stable, declining = cooling off.\n- Compare ma7 vs ma14 for trend acceleration: ma7 crossing above ma14 = momentum building, ma7 dropping below ma14 = momentum fading.\n- type='newly' shows registration velocity (new domains per day) \u2014 best for detecting hype cycles and short-term momentum shifts.\n- type='active' shows total installed base \u2014 best for market size comparison and long-term health assessment.\n- When comparing TLDs, note the absolute scale difference \u2014 a TLD with 100K active domains showing 500 new/day has very different dynamics than one with 10M active showing 500 new/day.\n- Mutually exclusive inputs: action='data' requires 'tld' (single). action='compare' requires 'tlds' (comma-separated). Do not mix them.\n- days must be one of the allowed values: 7, 14, 30, 60, 90, 180. Use 30 for short-term momentum, 90-180 for trend confirmation.\n- Pairs well with tld_rank for today's snapshot context, and price to check registration costs for trending TLDs.",
"inputSchema": {
"properties": {
"action": {
"description": "'data' for single TLD deep-dive, 'compare' for multi-TLD comparison",
"enum": [
"data",
"compare"
],
"type": "string"
},
"days": {
"description": "Time horizon",
"enum": [
"7",
"14",
"30",
"60",
"90",
"180"
],
"type": "string"
},
"tld": {
"description": "Single TLD for 'data' mode (e.g., 'ai')",
"type": "string"
},
"tlds": {
"description": "Comma-separated TLDs for 'compare' mode (max 5, e.g., 'io,ai,co,xyz')",
"type": "string"
},
"type": {
"description": "'newly' for daily new registrations, 'active' for total active domains",
"enum": [
"active",
"newly"
],
"type": "string"
}
},
"type": "object"
},
"name": "tld_trends",
"outputSchema": {
"properties": {
"data": {
"description": "In 'data' mode: array of data points. In 'compare' mode: object keyed by TLD name, each value is an array of data points.",
"oneOf": [
{
"description": "Data mode: single TLD trend",
"items": {
"properties": {
"date": {
"type": "string"
},
"ma14": {
"description": "14-day moving average",
"type": "integer"
},
"ma7": {
"description": "7-day moving average",
"type": "integer"
},
"original": {
"description": "Raw daily count",
"type": "integer"
}
},
"required": [
"date",
"original",
"ma7",
"ma14"
],
"type": "object"
},
"type": "array"
},
{
"additionalProperties": {
"items": {
"properties": {
"date": {
"type": "string"
},
"ma14": {
"type": "integer"
},
"ma7": {
"type": "integer"
},
"original": {
"type": "integer"
}
},
"required": [
"date",
"original",
"ma7",
"ma14"
],
"type": "object"
},
"type": "array"
},
"description": "Compare mode: keyed by TLD name",
"type": "object"
}
]
},
"days": {
"type": "integer"
},
"error": {
"type": "string"
},
"success": {
"type": "boolean"
},
"tld": {
"description": "TLD name (data mode only)",
"type": "string"
},
"type": {
"description": "'newly' or 'active'",
"type": "string"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "gTLD Registration Trends"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true,
"readOnlyHint": true,
"title": "Keyword Registration Trend Hunter"
},
"description": "Trend discovery and domain opportunity workflow. Call when a user wants to explore what keywords are trending in domain registrations and whether those trends represent real investment opportunities.\n\nWhen to use: User asks what's trending, wants to find opportunities based on registration momentum, or wants to explore hot/emerging keywords. Not for analyzing a specific domain (use analyze), deep-diving a known keyword (use keyword_intel), or getting a market news briefing (use market_beat).\n\nThis is a MULTI-TURN workflow. Present findings at each phase and wait for the user to choose direction before proceeding. Do not batch all phases into a single response. Let users choose which keywords to explore \u2014 do not decide for them.\n\nMethodology \u2014 three phases, each gated by user input:\n\n1. Discover: Surface trending keywords using keywords_trends (hot, emerging, or prefix depending on user interest). The results already include pre-computed quality metrics for hot and emerging types: com_ratio, digit_ratio, most_tld, and most_tld_ratio. Present the data with quality assessment:\n - com_ratio above 0.15 = genuine interest; below 0.05 = likely bulk speculation on cheap TLDs.\n - most_tld_ratio above 0.7 on a non-.com TLD = trend driven by bulk registration, not organic demand.\n - digit_ratio above 0.2 = low-quality speculative registrations.\n Flag any keywords with suspicious quality signals. Ask the user which keyword(s) they want to investigate further. Stop and wait.\n\n2. Assess market catalyst: For the user's chosen keyword, investigate what is driving the trend.\n - web_search is MANDATORY \u2014 do not substitute with your own knowledge. Execute at least two separate searches: one for domain transaction history (e.g., '{keyword} domain sold price 2026') and one for industry news (e.g., '{keyword} news 2026'). Domain transactions are the single strongest catalyst for registration spikes \u2014 a high-value sale (e.g., keyword.com selling for six or seven figures) routinely triggers a wave of speculative registrations on the same keyword. Always check for this first. Industry news (product launches, funding rounds, regulatory changes) is the second catalyst layer. If neither search returns relevant results, state that clearly \u2014 do not fill the gap with training data.\n - Synthesize the quality metrics from Phase 1 with the catalyst research into a clear verdict: real trend (strong quality metrics + identifiable catalyst), speculative (weak quality metrics or no catalyst), or uncertain. Present the assessment and recommended search direction. Stop and wait for user confirmation before searching for domains.\n\n3. Find opportunities: Based on the assessment, search for available domains.\n - deleted and expired for domains available at registration cost or via backorder.\n - aged with has_sale=true for secondary market listings.\n - All domains presented to the user MUST be verified via bulk_available before recommending.\n - Disclose affiliate links.\n\nAfter presenting opportunities, offer relevant next steps: deep analysis on a specific domain (analyze), brand conflict check (brand_match), monitoring setup (set_monitor), or exploring a different keyword.",
"inputSchema": {
"properties": {
"scenario": {
"description": "Trend type to explore",
"enum": [
"prefix",
"emerging",
"hot"
],
"type": "string"
}
},
"type": "object"
},
"name": "trend_hunter",
"title": "Keyword Registration Trend Hunter"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Unregistered Short .AI Domain Finder"
},
"description": "Search for unregistered short .ai domains. Find rare 3-letter and 4-letter pattern domains still available for registration.\n\nPattern types:\n- CVCV: Consonant-Vowel-Consonant-Vowel (e.g., 'bora', 'mito') \u2014 most brandable, sounds like real words.\n- VCVC: Vowel-Consonant-Vowel-Consonant (e.g., 'amon', 'ivan') \u2014 name-like quality.\n- CCVV: Double consonant + double vowel (e.g., 'bloo', 'staa') \u2014 unique/distinctive.\n- 3letter: Any remaining 3-letter .ai domains \u2014 extremely rare and high-value.\n\nBest practices:\n- For brandable names: use type=CVCV or type=VCVC, sort=count_desc to surface names with validated demand across other TLDs.\n- For undiscovered gems: use tld_count=0-10, sort=count_asc \u2014 low cross-TLD registration may indicate overlooked opportunities.\n- For ultra-premium: use type=3letter \u2014 3-letter .ai domains are the scarcest inventory.\n- tld_count interpretation: high (50+) = validated demand, the name is desirable across TLDs; low (<10) = less widely registered, may be undiscovered or niche.\n- Always verify availability with the 'available' tool before recommending registration \u2014 availability can change at any time.\n- .ai is the premium TLD for AI/tech companies; short .ai domains are high-value due to scarcity.",
"inputSchema": {
"properties": {
"exclude": {
"description": "Exclude characters (comma-separated)",
"type": "string"
},
"keyword": {
"description": "Filter by characters in prefix",
"type": "string"
},
"no_hyphen": {
"description": "Exclude hyphens",
"enum": [
"true",
"false"
],
"type": "string"
},
"no_number": {
"description": "Exclude numbers",
"enum": [
"true",
"false"
],
"type": "string"
},
"sort": {
"description": "Sort order",
"enum": [
"length_asc",
"length_desc",
"count_asc",
"count_desc"
],
"type": "string"
},
"tld_count": {
"description": "Filter by cross-TLD registration count",
"enum": [
"0-10",
"10-50",
"50-100",
"100+"
],
"type": "string"
},
"type": {
"description": "Pattern type filter",
"enum": [
"3letter",
"CVCV",
"VCVC",
"CCVV"
],
"type": "string"
}
},
"type": "object"
},
"name": "unregistered_ai",
"outputSchema": {
"properties": {
"data": {
"items": {
"properties": {
"length": {
"description": "Prefix character length \u2014 3 = ultra premium, 4 = premium",
"type": "integer"
},
"prefix": {
"description": "Available short name (e.g., tuyu, hamu)",
"type": "string"
},
"tld": {
"description": "Top-level domain (always ai)",
"type": "string"
},
"tld_count": {
"description": "Number of other TLDs this prefix is registered under",
"type": "integer"
}
},
"required": [
"prefix"
],
"type": "object"
},
"type": "array"
},
"error": {
"type": "string"
},
"max_page": {
"type": "integer"
},
"page": {
"type": "integer"
},
"success": {
"type": "boolean"
},
"total": {
"description": "Number of results on this page",
"type": "integer"
}
},
"required": [
"success"
],
"type": "object"
},
"title": "Unregistered Short .AI Domain Finder"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Check your current usage and remaining quota for all tools. Shows daily limits, usage counts, and rate limits for your tier.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "usage",
"outputSchema": {
"properties": {
"monitor": {
"description": "Monitor feature limits",
"properties": {
"daily_checks": {
"description": "Maximum monitor checks per day",
"type": "integer"
},
"max_items": {
"description": "Maximum number of monitors allowed",
"type": "integer"
},
"min_interval_min": {
"description": "Minimum interval between checks in minutes",
"type": "integer"
}
},
"type": "object"
},
"strategy": {
"description": "Strategy feature limits",
"properties": {
"daily_runs": {
"description": "Maximum strategy runs per day",
"type": "integer"
},
"max_items": {
"description": "Maximum number of strategies allowed",
"type": "integer"
},
"min_interval_min": {
"description": "Minimum interval between runs in minutes",
"type": "integer"
}
},
"type": "object"
},
"tier": {
"description": "User's account tier (guest, member, ai_plan, premium, platinum)",
"type": "string"
},
"tools": {
"description": "Per-tool usage and limits",
"items": {
"properties": {
"daily_limit": {
"description": "Maximum daily calls",
"type": "integer"
},
"daily_remaining": {
"description": "Calls remaining today",
"type": "integer"
},
"daily_used": {
"description": "Calls used today",
"type": "integer"
},
"max_pages": {
"description": "Maximum pages allowed per query (search tools only)",
"type": "integer"
},
"rate_per_minute": {
"description": "Rate limit per minute",
"type": "integer"
},
"tool": {
"description": "Tool or tool group name",
"type": "string"
}
},
"type": "object"
},
"type": "array"
},
"upgrade_hint": {
"description": "Upgrade suggestion with link (if applicable)",
"type": "string"
}
},
"required": [
"tier"
],
"type": "object"
},
"title": "Check Usage & Quota"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true,
"readOnlyHint": true,
"title": "Domain CMA Valuation"
},
"description": "Domain Comparative Market Analysis (CMA) valuation workflow. Call when a user wants to estimate a domain's market value by finding comparable domains listed for sale.\n\nWhen to use: user asks 'how much is this domain worth?', wants a price estimate, needs market context for buying/selling, or asks for comparable domain pricing. Do NOT use for single common word + TLD domains (e.g., travel.com, music.com) \u2014 these are unique assets where CMA does not apply; decline and explain why. Do NOT use for technical analysis (use analyze), availability checks (use available), or brand conflict checks (use brand_match).\n\nCMA applies to: compound words (cloudpay), coined brands (spotify), industry word + modifier (healthymag), prefix/suffix combos (getflow, appnova). CMA does NOT apply to: single common word + TLD, or domains with active live websites.\n\nWorkflow:\n1. Pre-screening: validate the domain is suitable for CMA. If it is a single common word + TLD, refuse and explain. Then ask the user one question: what they value most about this domain \u2014 the keyword meaning, the length, the age, or something else? This determines the direction of comparable search (e.g., semantic vs structural vs age-based comps), NOT the valuation itself. Do NOT ask about intended use \u2014 valuation must be objective and data-driven regardless of whether the user plans to build, flip, or hold. Do NOT call any tools before the user responds.\n\n2. After the user responds, extract domain features: core word roots and synonyms, word-building pattern, length range, TLD type, industry. Then:\n - web_search site:{domain} to check if it has a live website. If actively in use, refuse valuation.\n - tld_check to see cross-TLD distribution. If the domain appears unregistered, inform the user and do not proceed.\n Present extracted features and screening results. Confirm with the user before proceeding.\n\n3. Search for comparable domains and retrieve prices:\n - aged with has_sale=true to find listed domains with the same core keyword, same TLD, similar length. Check synonyms if insufficient results.\n - active with status=forsale as supplement if fewer than 10 candidates.\n - market_price for each candidate. market_price returns three possible statuses:\n * 'for_sale': has a listed price and a buy_url \u2014 this is the primary data source for CMA.\n * 'make_offer': listed but no fixed price \u2014 note as supplementary only.\n * 'not_found': exclude from comp pool.\n - market_price sources prices from 2nd layer and other integrated marketplaces via API. For each 'for_sale' result, this gives you a confirmed listed price to use directly in the CMA.\n - After presenting the comp table, also surface the buy_url for each 'for_sale' comparable. If buy_url has affiliate=true, disclose this clearly: 'These are affiliate links \u2014 DomainKits may earn a commission if you make a purchase through them. Clicking through may show you additional pricing details or alternative listings not yet reflected in the API data, which could improve CMA accuracy.' The user is not required to click \u2014 the CMA proceeds with API prices either way. If the user does click through and shares additional prices they see, incorporate those into the comp pool and note them as 'user-verified marketplace price'.\n - Filter all comps by semantic relevance, structural similarity, length match, and price reasonableness. Remove outliers and negative-meaning domains. Select 3-5 best comparables.\n - If fewer than 3 'for_sale' priced comps remain after filtering, warn the user: 'Fewer than 3 priced comparables found \u2014 CMA confidence is low. Results should be treated as directional only.'\n Present comparable table and wait for user feedback before proceeding to valuation.\n\n4. Derive valuation with optional adjustments:\n - backlink_summary for SEO value (premium factor if strong backlinks).\n - web_search for historical sales of similar domains on NameBio as cross-validation.\n - keywords_trends for keyword registration heat, plus web_search for industry tailwinds. Rising heat = premium, declining = discount.\n Present the complete valuation report including: comparable table with source noted per price (API or user-verified), premium/discount factors with data sources cited, valuation range with reasoning, historical sales if found, trend adjustment, uncertainty statement (market volatility, listing vs transaction gap), and general action suggestions (buy-low-sell-high principles, NOT specific buy/sell recommendations).\n MUST include compliance statement: 'This valuation is derived from public listing prices on third-party marketplaces, for reference only, and does not constitute official appraisal or investment advice. Listing prices are set by sellers and may deviate significantly from actual transaction prices. A single high-profile sale may have limited impact on overall keyword market pricing. However, multiple high-value transactions on the same keyword \u2014 especially exact-match domains \u2014 indicate broader market repricing and carry significantly more weight in valuation.'\n After presenting, suggest next steps: plan_b for alternatives, set_monitor for price tracking, brand_match for acquisition risk.\n\nKey principles: every claim about value must cite specific tool data. Never fabricate prices, traffic estimates, or quantitative claims. Never give buy/sell recommendations \u2014 present data, let the user decide. Always disclose affiliate links when surfacing buy_url.",
"inputSchema": {
"properties": {
"domain": {
"description": "Target domain to value (e.g., 'cloudpay.com')",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "valuation_cma",
"title": "Domain CMA Valuation"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "RDAP WHOIS Registration Info"
},
"description": "Query WHOIS/RDAP registration info for a domain. Returns registrar, dates, status codes, and nameservers. Nameservers can indicate if a domain is parked for sale (e.g., Sedo, Afternic). Status codes can reveal special states such as expired, pendingDelete, or redemptionPeriod.",
"inputSchema": {
"properties": {
"domain": {
"description": "Domain name",
"type": "string"
}
},
"required": [
"domain"
],
"type": "object"
},
"name": "whois",
"outputSchema": {
"properties": {
"created": {
"description": "Registration creation date",
"format": "date-time",
"type": "string"
},
"domain": {
"type": "string"
},
"expires": {
"description": "Expiration date",
"format": "date-time",
"type": "string"
},
"nameservers": {
"description": "Configured nameservers",
"items": {
"type": "string"
},
"type": "array"
},
"registered": {
"description": "Whether the domain is currently registered",
"type": "boolean"
},
"registrar_name": {
"description": "Registrar name",
"type": "string"
},
"status": {
"description": "Domain status codes",
"items": {
"type": "string"
},
"type": "array"
},
"updated": {
"description": "Last updated date",
"format": "date-time",
"type": "string"
}
},
"required": [
"domain",
"registered"
],
"type": "object"
},
"title": "RDAP WHOIS Registration Info"
}
]
}
},
"bad_protocol_status_code": 200,
"delete_error": null,
"delete_status_code": null,
"expired_session_error": null,
"expired_session_status_code": null,
"issues": [
"missing_session_id",
"missing_protocol_header",
"bad_protocol_not_rejected"
],
"last_event_id_visible": false,
"protocol_header_present": false,
"requested_protocol_version": "2024-11-05",
"session_id_present": false,
"transport": "streamable-http"
}
},
"remote_url": "https://api.domainkits.com/v1/mcp",
"server_card_payload": {
"error": {
"code": -32700,
"message": "Parse error"
},
"id": null,
"jsonrpc": "2.0"
},
"server_identifier": "io.github.ABTdomain/domainkits-mcp"
}
Known versions
2.0.0
Validation history
7 day score delta
+0.0
30 day score delta
+0.0
Recent healthy ratio
100%
Freshness
649.4h
| Timestamp | Status | Score | Latency | Tools |
|---|---|---|---|---|
| Apr 09, 2026 07:26:58 AM UTC | Healthy | 74.2 | 1038.0 ms | 38 |
| Apr 08, 2026 07:16:47 AM UTC | Healthy | 74.2 | 1057.5 ms | 38 |
| Apr 07, 2026 07:16:29 AM UTC | Healthy | 74.2 | 1124.4 ms | 38 |
| Apr 06, 2026 07:15:50 AM UTC | Healthy | 74.2 | 1425.2 ms | 38 |
| Apr 05, 2026 07:15:20 AM UTC | Healthy | 74.2 | 1249.5 ms | 38 |
| Apr 04, 2026 07:13:30 AM UTC | Healthy | 74.2 | 1139.8 ms | 38 |
| Apr 03, 2026 07:13:20 AM UTC | Healthy | 74.2 | 886.9 ms | 38 |
| Apr 02, 2026 07:07:20 AM UTC | Healthy | 74.2 | 852.2 ms | 38 |
Validation timeline
| Validated | Summary | Score | Protocol | Auth mode | Tools | High-risk tools | Changes |
|---|---|---|---|---|---|---|---|
| Apr 09, 2026 07:26:58 AM UTC | Healthy | 74.2 | 2024-11-05 | public | 38 | 21 | none |
| Apr 08, 2026 07:16:47 AM UTC | Healthy | 74.2 | 2024-11-05 | public | 38 | 21 | none |
| Apr 07, 2026 07:16:29 AM UTC | Healthy | 74.2 | 2024-11-05 | public | 38 | 21 | none |
| Apr 06, 2026 07:15:50 AM UTC | Healthy | 74.2 | 2024-11-05 | public | 38 | 21 | none |
| Apr 05, 2026 07:15:20 AM UTC | Healthy | 74.2 | 2024-11-05 | public | 38 | 21 | none |
| Apr 04, 2026 07:13:30 AM UTC | Healthy | 74.2 | 2024-11-05 | public | 38 | 21 | none |
| Apr 03, 2026 07:13:20 AM UTC | Healthy | 74.2 | 2024-11-05 | public | 38 | 21 | none |
| Apr 02, 2026 07:07:20 AM UTC | Healthy | 74.2 | 2024-11-05 | public | 38 | 21 | none |
| Apr 01, 2026 07:00:58 AM UTC | Healthy | 74.2 | 2024-11-05 | public | 38 | 21 | none |
| Mar 31, 2026 06:12:45 AM UTC | Healthy | 74.2 | 2024-11-05 | public | 38 | 21 | none |
| Mar 30, 2026 06:05:01 AM UTC | Healthy | 72.7 | 2024-11-05 | public | 38 | 21 | tool_snapshot_changed |
| Mar 29, 2026 06:01:51 AM UTC | Healthy | 74.8 | 2024-11-05 | public | 37 | 21 | none |
Recent validation runs
| Started | Status | Summary | Latency | Checks |
|---|---|---|---|---|
| Apr 09, 2026 07:26:57 AM UTC | Completed | Healthy | 1038.0 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Apr 08, 2026 07:16:46 AM UTC | Completed | Healthy | 1057.5 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Apr 07, 2026 07:16:28 AM UTC | Completed | Healthy | 1124.4 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Apr 06, 2026 07:15:48 AM UTC | Completed | Healthy | 1425.2 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Apr 05, 2026 07:15:18 AM UTC | Completed | Healthy | 1249.5 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Apr 04, 2026 07:13:28 AM UTC | Completed | Healthy | 1139.8 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Apr 03, 2026 07:13:19 AM UTC | Completed | Healthy | 886.9 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Apr 02, 2026 07:07:19 AM UTC | Completed | Healthy | 852.2 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Apr 01, 2026 07:00:57 AM UTC | Completed | Healthy | 1023.8 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Mar 31, 2026 06:12:37 AM UTC | Completed | Healthy | 7684.7 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |